11package ai .timefold .solver .core .impl .bavet .common ;
22
3+ import java .lang .reflect .Method ;
34import java .util .ArrayList ;
5+ import java .util .Arrays ;
46import java .util .List ;
57import java .util .Objects ;
68import java .util .Set ;
79import java .util .SortedSet ;
810import java .util .TreeSet ;
11+ import java .util .stream .Collectors ;
12+ import java .util .stream .Stream ;
913
1014import ai .timefold .solver .core .api .score .Score ;
1115import ai .timefold .solver .core .api .score .constraint .ConstraintRef ;
1216import ai .timefold .solver .core .api .score .stream .Constraint ;
17+ import ai .timefold .solver .core .api .score .stream .ConstraintFactory ;
18+ import ai .timefold .solver .core .api .score .stream .ConstraintStream ;
19+ import ai .timefold .solver .core .api .score .stream .bi .BiConstraintStream ;
20+ import ai .timefold .solver .core .api .score .stream .quad .QuadConstraintStream ;
21+ import ai .timefold .solver .core .api .score .stream .tri .TriConstraintStream ;
22+ import ai .timefold .solver .core .api .score .stream .uni .UniConstraintStream ;
1323import ai .timefold .solver .core .impl .score .stream .bavet .BavetConstraint ;
1424import ai .timefold .solver .core .impl .score .stream .bavet .BavetConstraintFactory ;
1525import ai .timefold .solver .core .impl .score .stream .bavet .common .BavetScoringConstraintStream ;
@@ -24,9 +34,14 @@ public abstract class BavetAbstractConstraintStream<Solution_>
2434 extends AbstractConstraintStream <Solution_ >
2535 implements BavetStream {
2636
27- private static final String BAVET_IMPL_PACKAGE = "ai.timefold.solver.core.impl.bavet" ;
28- private static final String BAVET_SCORE_IMPL_PACKAGE = "ai.timefold.solver.core.impl.score.stream" ;
29- private static final String BAVET_SCORE_API_PACKAGE = "ai.timefold.solver.core.api.score.stream" ;
37+ private static final Set <String > constraintStreamApiMethodSet = Stream .of (
38+ UniConstraintStream .class ,
39+ BiConstraintStream .class ,
40+ TriConstraintStream .class ,
41+ QuadConstraintStream .class )
42+ .flatMap (clazz -> Arrays .stream (clazz .getMethods ()))
43+ .map (Method ::getName )
44+ .collect (Collectors .toUnmodifiableSet ());
3045
3146 protected final BavetConstraintFactory <Solution_ > constraintFactory ;
3247 protected final BavetAbstractConstraintStream <Solution_ > parent ;
@@ -54,10 +69,11 @@ protected BavetAbstractConstraintStream(BavetConstraintFactory<Solution_> constr
5469 public abstract StreamKind getStreamKind ();
5570
5671 private ConstraintNodeLocation determineStreamLocation () {
57- return StackWalker .getInstance ().walk (stack -> stack
58- .dropWhile (stackFrame -> stackFrame .getClassName ().startsWith (BAVET_IMPL_PACKAGE ) ||
59- stackFrame .getClassName ().startsWith (BAVET_SCORE_IMPL_PACKAGE ) ||
60- stackFrame .getClassName ().startsWith (BAVET_SCORE_API_PACKAGE ))
72+ return StackWalker .getInstance (StackWalker .Option .RETAIN_CLASS_REFERENCE ).walk (stack -> stack
73+ .dropWhile (stackFrame -> !ConstraintStream .class .isAssignableFrom (stackFrame .getDeclaringClass ())
74+ && !constraintStreamApiMethodSet .contains (stackFrame .getMethodName ()))
75+ .dropWhile (stackFrame -> ConstraintStream .class .isAssignableFrom (stackFrame .getDeclaringClass ()) ||
76+ ConstraintFactory .class .isAssignableFrom (stackFrame .getDeclaringClass ()))
6177 .map (stackFrame -> new ConstraintNodeLocation (
6278 getStreamKind (),
6379 stackFrame .getClassName (),
0 commit comments