Skip to content

Commit

Permalink
Merge pull request #9372 from ge0ffrey/optaplannerSyncForErrorMessages
Browse files Browse the repository at this point in the history
OptaPlanner: Fail fast if no constraint implementations are found
  • Loading branch information
geoand authored May 18, 2020
2 parents b5eda6e + a43662e commit cc8421f
Showing 1 changed file with 30 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -151,21 +151,7 @@ private void applySolverProperties(RecorderContext recorderContext,
if (solverConfig.getEntityClassList() == null) {
solverConfig.setEntityClassList(findEntityClassList(recorderContext, indexView));
}
if (solverConfig.getScoreDirectorFactoryConfig() == null) {
ScoreDirectorFactoryConfig scoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig();
scoreDirectorFactoryConfig.setEasyScoreCalculatorClass(
findImplementingClass(EasyScoreCalculator.class, indexView));
scoreDirectorFactoryConfig.setConstraintProviderClass(
findImplementingClass(ConstraintProvider.class, indexView));
scoreDirectorFactoryConfig.setIncrementalScoreCalculatorClass(
findImplementingClass(IncrementalScoreCalculator.class, indexView));
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader.getResource(SolverBuildTimeConfig.DEFAULT_SCORE_DRL_URL) != null) {
scoreDirectorFactoryConfig.setScoreDrlList(Collections.singletonList(
SolverBuildTimeConfig.DEFAULT_SCORE_DRL_URL));
}
solverConfig.setScoreDirectorFactoryConfig(scoreDirectorFactoryConfig);
}
applyScoreDirectorFactoryProperties(indexView, solverConfig);
optaPlannerBuildTimeConfig.solver.environmentMode.ifPresent(solverConfig::setEnvironmentMode);
optaPlannerBuildTimeConfig.solver.moveThreadCount.ifPresent(solverConfig::setMoveThreadCount);
applyTerminationProperties(solverConfig);
Expand Down Expand Up @@ -208,6 +194,35 @@ private List<Class<?>> findEntityClassList(RecorderContext recorderContext, Inde
.collect(Collectors.toList());
}

private void applyScoreDirectorFactoryProperties(IndexView indexView, SolverConfig solverConfig) {
if (solverConfig.getScoreDirectorFactoryConfig() == null) {
ScoreDirectorFactoryConfig scoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig();
scoreDirectorFactoryConfig.setEasyScoreCalculatorClass(
findImplementingClass(EasyScoreCalculator.class, indexView));
scoreDirectorFactoryConfig.setConstraintProviderClass(
findImplementingClass(ConstraintProvider.class, indexView));
scoreDirectorFactoryConfig.setIncrementalScoreCalculatorClass(
findImplementingClass(IncrementalScoreCalculator.class, indexView));
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader.getResource(SolverBuildTimeConfig.DEFAULT_SCORE_DRL_URL) != null) {
scoreDirectorFactoryConfig.setScoreDrlList(Collections.singletonList(
SolverBuildTimeConfig.DEFAULT_SCORE_DRL_URL));
}
if (scoreDirectorFactoryConfig.getEasyScoreCalculatorClass() == null
&& scoreDirectorFactoryConfig.getEasyScoreCalculatorClass() == null
&& scoreDirectorFactoryConfig.getConstraintProviderClass() == null
&& scoreDirectorFactoryConfig.getIncrementalScoreCalculatorClass() == null
&& scoreDirectorFactoryConfig.getScoreDrlList() == null) {
throw new IllegalStateException("No classes found that implement "
+ EasyScoreCalculator.class.getSimpleName() + ", "
+ ConstraintProvider.class.getSimpleName() + " or "
+ IncrementalScoreCalculator.class.getSimpleName() + ", nor a "
+ SolverBuildTimeConfig.DEFAULT_SCORE_DRL_URL + " resource.");
}
solverConfig.setScoreDirectorFactoryConfig(scoreDirectorFactoryConfig);
}
}

private <T> Class<? extends T> findImplementingClass(Class<T> targetClass, IndexView indexView) {
Collection<ClassInfo> classInfos = indexView.getAllKnownImplementors(
DotName.createSimple(targetClass.getName()));
Expand Down

0 comments on commit cc8421f

Please sign in to comment.