diff --git a/src/main/java/ai/timefold/solver/benchmarks/examples/examination/domain/FollowingExam.java b/src/main/java/ai/timefold/solver/benchmarks/examples/examination/domain/FollowingExam.java index eefd15af..05d7cc61 100644 --- a/src/main/java/ai/timefold/solver/benchmarks/examples/examination/domain/FollowingExam.java +++ b/src/main/java/ai/timefold/solver/benchmarks/examples/examination/domain/FollowingExam.java @@ -1,8 +1,8 @@ package ai.timefold.solver.benchmarks.examples.examination.domain; -import ai.timefold.solver.benchmarks.examples.examination.domain.solver.PeriodUpdatingVariableListener; import ai.timefold.solver.core.api.domain.entity.PlanningEntity; import ai.timefold.solver.core.api.domain.variable.ShadowVariable; +import ai.timefold.solver.core.preview.api.domain.variable.declarative.ShadowSources; @PlanningEntity public class FollowingExam extends Exam { @@ -21,9 +21,7 @@ public void setLeadingExam(LeadingExam leadingExam) { } @Override - @ShadowVariable(variableListenerClass = PeriodUpdatingVariableListener.class, - sourceEntityClass = LeadingExam.class, - sourceVariableName = "period") + @ShadowVariable(supplierName = "periodSupplier") public Period getPeriod() { return period; } @@ -32,6 +30,11 @@ public void setPeriod(Period period) { this.period = period; } + @ShadowSources("leadingExam.period") + public Period periodSupplier() { + return leadingExam.getPeriod(); + } + // ************************************************************************ // With methods // ************************************************************************ diff --git a/src/main/java/ai/timefold/solver/benchmarks/examples/examination/domain/solver/PeriodUpdatingVariableListener.java b/src/main/java/ai/timefold/solver/benchmarks/examples/examination/domain/solver/PeriodUpdatingVariableListener.java deleted file mode 100644 index 3ba11cbd..00000000 --- a/src/main/java/ai/timefold/solver/benchmarks/examples/examination/domain/solver/PeriodUpdatingVariableListener.java +++ /dev/null @@ -1,51 +0,0 @@ -package ai.timefold.solver.benchmarks.examples.examination.domain.solver; - -import ai.timefold.solver.benchmarks.examples.examination.domain.Examination; -import ai.timefold.solver.benchmarks.examples.examination.domain.FollowingExam; -import ai.timefold.solver.benchmarks.examples.examination.domain.LeadingExam; -import ai.timefold.solver.benchmarks.examples.examination.domain.Period; -import ai.timefold.solver.core.api.domain.variable.VariableListener; -import ai.timefold.solver.core.api.score.director.ScoreDirector; - -public class PeriodUpdatingVariableListener implements VariableListener { - - @Override - public void beforeEntityAdded(ScoreDirector scoreDirector, LeadingExam leadingExam) { - // Do nothing - } - - @Override - public void afterEntityAdded(ScoreDirector scoreDirector, LeadingExam leadingExam) { - updatePeriod(scoreDirector, leadingExam); - } - - @Override - public void beforeVariableChanged(ScoreDirector scoreDirector, LeadingExam leadingExam) { - // Do nothing - } - - @Override - public void afterVariableChanged(ScoreDirector scoreDirector, LeadingExam leadingExam) { - updatePeriod(scoreDirector, leadingExam); - } - - @Override - public void beforeEntityRemoved(ScoreDirector scoreDirector, LeadingExam leadingExam) { - // Do nothing - } - - @Override - public void afterEntityRemoved(ScoreDirector scoreDirector, LeadingExam leadingExam) { - // Do nothing - } - - protected void updatePeriod(ScoreDirector scoreDirector, LeadingExam leadingExam) { - Period period = leadingExam.getPeriod(); - for (FollowingExam followingExam : leadingExam.getFollowingExamList()) { - scoreDirector.beforeVariableChanged(followingExam, "period"); - followingExam.setPeriod(period); - scoreDirector.afterVariableChanged(followingExam, "period"); - } - } - -} diff --git a/src/main/java/ai/timefold/solver/benchmarks/micro/scoredirector/problems/ExaminationProblem.java b/src/main/java/ai/timefold/solver/benchmarks/micro/scoredirector/problems/ExaminationProblem.java index 33cc1922..3f3b9def 100644 --- a/src/main/java/ai/timefold/solver/benchmarks/micro/scoredirector/problems/ExaminationProblem.java +++ b/src/main/java/ai/timefold/solver/benchmarks/micro/scoredirector/problems/ExaminationProblem.java @@ -1,5 +1,6 @@ package ai.timefold.solver.benchmarks.micro.scoredirector.problems; +import java.util.EnumSet; import java.util.Objects; import ai.timefold.solver.benchmarks.examples.examination.domain.Exam; @@ -11,6 +12,7 @@ import ai.timefold.solver.benchmarks.micro.scoredirector.Example; import ai.timefold.solver.benchmarks.micro.scoredirector.ScoreDirectorType; import ai.timefold.solver.core.config.score.director.ScoreDirectorFactoryConfig; +import ai.timefold.solver.core.config.solver.PreviewFeature; import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor; import ai.timefold.solver.persistence.common.api.domain.solution.SolutionFileIO; @@ -33,8 +35,8 @@ protected ScoreDirectorFactoryConfig buildScoreDirectorFactoryConfig(ScoreDirect @Override protected SolutionDescriptor buildSolutionDescriptor() { - return SolutionDescriptor.buildSolutionDescriptor(Examination.class, Exam.class, LeadingExam.class, - FollowingExam.class); + return SolutionDescriptor.buildSolutionDescriptor(EnumSet.of(PreviewFeature.DECLARATIVE_SHADOW_VARIABLES), + Examination.class, Exam.class, LeadingExam.class, FollowingExam.class); } @Override diff --git a/src/main/resources/ai/timefold/solver/benchmarks/examples/examination/examinationSolverConfig.xml b/src/main/resources/ai/timefold/solver/benchmarks/examples/examination/examinationSolverConfig.xml index df344efc..04b6a4a8 100644 --- a/src/main/resources/ai/timefold/solver/benchmarks/examples/examination/examinationSolverConfig.xml +++ b/src/main/resources/ai/timefold/solver/benchmarks/examples/examination/examinationSolverConfig.xml @@ -5,7 +5,7 @@ - + DECLARATIVE_SHADOW_VARIABLES ai.timefold.solver.benchmarks.examples.examination.domain.Examination ai.timefold.solver.benchmarks.examples.examination.domain.Exam ai.timefold.solver.benchmarks.examples.examination.domain.LeadingExam