Skip to content

Commit e9da086

Browse files
committed
fix: make non-existent classes in solver detectable
1 parent 82596cf commit e9da086

22 files changed

Lines changed: 348 additions & 260 deletions

core/src/build/revapi-differences.json

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,48 @@
33
"extension": "revapi.differences",
44
"configuration": {
55
"differences": [
6+
{
7+
"ignore": true,
8+
"code": "java.field.typeChanged",
9+
"old": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.comparatorClass",
10+
"new": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.comparatorClass",
11+
"justification": "Internal protected fields; safe."
12+
},
13+
{
14+
"ignore": true,
15+
"code": "java.field.typeChanged",
16+
"old": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.comparatorFactoryClass",
17+
"new": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.comparatorFactoryClass",
18+
"justification": "Internal protected fields; safe."
19+
},
20+
{
21+
"ignore": true,
22+
"code": "java.field.typeChanged",
23+
"old": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.filterClass",
24+
"new": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.filterClass",
25+
"justification": "Internal protected fields; safe."
26+
},
27+
{
28+
"ignore": true,
29+
"code": "java.field.typeChanged",
30+
"old": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.probabilityWeightFactoryClass",
31+
"new": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.probabilityWeightFactoryClass",
32+
"justification": "Internal protected fields; safe."
33+
},
34+
{
35+
"ignore": true,
36+
"code": "java.field.typeChanged",
37+
"old": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.sorterClass",
38+
"new": "field ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.MoveSelectorConfig<Config_>>.sorterClass",
39+
"justification": "Internal protected fields; safe."
40+
},
41+
{
42+
"ignore": true,
43+
"code": "java.field.typeChanged",
44+
"old": "field ai.timefold.solver.core.config.heuristic.selector.move.generic.AbstractPillarMoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.generic.AbstractPillarMoveSelectorConfig<Config_>>.subPillarSequenceComparatorClass",
45+
"new": "field ai.timefold.solver.core.config.heuristic.selector.move.generic.AbstractPillarMoveSelectorConfig<Config_ extends ai.timefold.solver.core.config.heuristic.selector.move.generic.AbstractPillarMoveSelectorConfig<Config_>>.subPillarSequenceComparatorClass",
46+
"justification": "Internal protected fields; safe."
47+
}
648
]
749
}
850
}

core/src/main/java/ai/timefold/solver/core/config/constructionheuristic/placer/QueuedValuePlacerConfig.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class QueuedValuePlacerConfig extends EntityPlacerConfig<QueuedValu
3030

3131
public static final String XML_ELEMENT_NAME = "queuedValuePlacer";
3232

33-
private Class<?> entityClass = null;
33+
private String entityClass = null;
3434

3535
@XmlElement(name = "valueSelector")
3636
private ValueSelectorConfig valueSelectorConfig = null;
@@ -50,11 +50,11 @@ public final class QueuedValuePlacerConfig extends EntityPlacerConfig<QueuedValu
5050
private MoveSelectorConfig moveSelectorConfig = null;
5151

5252
public @Nullable Class<?> getEntityClass() {
53-
return entityClass;
53+
return ConfigUtils.resolveClass(entityClass, "entityClass", this);
5454
}
5555

5656
public void setEntityClass(@Nullable Class<?> entityClass) {
57-
this.entityClass = entityClass;
57+
this.entityClass = entityClass == null ? null : entityClass.getName();
5858
}
5959

6060
public @Nullable ValueSelectorConfig getValueSelectorConfig() {
@@ -78,7 +78,7 @@ public void setMoveSelectorConfig(@Nullable MoveSelectorConfig moveSelectorConfi
7878
// ************************************************************************
7979

8080
public @NonNull QueuedValuePlacerConfig withEntityClass(@NonNull Class<?> entityClass) {
81-
this.setEntityClass(entityClass);
81+
this.entityClass = entityClass.getName();
8282
return this;
8383
}
8484

@@ -98,7 +98,7 @@ public void setMoveSelectorConfig(@Nullable MoveSelectorConfig moveSelectorConfi
9898

9999
@Override
100100
public @NonNull QueuedValuePlacerConfig inherit(@NonNull QueuedValuePlacerConfig inheritedConfig) {
101-
entityClass = ConfigUtils.inheritOverwritableProperty(entityClass, inheritedConfig.getEntityClass());
101+
entityClass = ConfigUtils.inheritOverwritableProperty(entityClass, inheritedConfig.entityClass);
102102
valueSelectorConfig = ConfigUtils.inheritConfig(valueSelectorConfig, inheritedConfig.getValueSelectorConfig());
103103
setMoveSelectorConfig(
104104
ConfigUtils.inheritOverwritableProperty(getMoveSelectorConfig(), inheritedConfig.getMoveSelectorConfig()));
@@ -112,7 +112,7 @@ public void setMoveSelectorConfig(@Nullable MoveSelectorConfig moveSelectorConfi
112112

113113
@Override
114114
public void visitReferencedClasses(@NonNull Consumer<Class<?>> classVisitor) {
115-
classVisitor.accept(entityClass);
115+
classVisitor.accept(getEntityClass());
116116
if (valueSelectorConfig != null) {
117117
valueSelectorConfig.visitReferencedClasses(classVisitor);
118118
}

core/src/main/java/ai/timefold/solver/core/config/heuristic/selector/common/nearby/NearbySelectionConfig.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public final class NearbySelectionConfig extends SelectorConfig<NearbySelectionC
4444
private SubListSelectorConfig originSubListSelectorConfig = null;
4545
@XmlElement(name = "originValueSelector")
4646
private ValueSelectorConfig originValueSelectorConfig = null;
47-
private Class<? extends NearbyDistanceMeter> nearbyDistanceMeterClass = null;
47+
private String nearbyDistanceMeterClass = null;
4848

4949
private NearbySelectionDistributionType nearbySelectionDistributionType = null;
5050

@@ -85,11 +85,11 @@ public void setOriginValueSelectorConfig(@Nullable ValueSelectorConfig originVal
8585
}
8686

8787
public @Nullable Class<? extends NearbyDistanceMeter> getNearbyDistanceMeterClass() {
88-
return nearbyDistanceMeterClass;
88+
return ConfigUtils.resolveClass(nearbyDistanceMeterClass, "nearbyDistanceMeterClass", this);
8989
}
9090

9191
public void setNearbyDistanceMeterClass(@Nullable Class<? extends NearbyDistanceMeter> nearbyDistanceMeterClass) {
92-
this.nearbyDistanceMeterClass = nearbyDistanceMeterClass;
92+
this.nearbyDistanceMeterClass = nearbyDistanceMeterClass == null ? null : nearbyDistanceMeterClass.getName();
9393
}
9494

9595
public @Nullable NearbySelectionDistributionType getNearbySelectionDistributionType() {
@@ -189,7 +189,7 @@ public void setBetaDistributionBeta(@Nullable Double betaDistributionBeta) {
189189

190190
public @NonNull NearbySelectionConfig
191191
withNearbyDistanceMeterClass(@NonNull Class<? extends NearbyDistanceMeter> nearbyDistanceMeterClass) {
192-
this.setNearbyDistanceMeterClass(nearbyDistanceMeterClass);
192+
this.nearbyDistanceMeterClass = nearbyDistanceMeterClass.getName();
193193
return this;
194194
}
195195

@@ -316,7 +316,7 @@ has a resolvedCacheType (%s) that is cached."""
316316
originValueSelectorConfig = ConfigUtils.inheritConfig(originValueSelectorConfig,
317317
inheritedConfig.getOriginValueSelectorConfig());
318318
nearbyDistanceMeterClass = ConfigUtils.inheritOverwritableProperty(nearbyDistanceMeterClass,
319-
inheritedConfig.getNearbyDistanceMeterClass());
319+
inheritedConfig.nearbyDistanceMeterClass);
320320
nearbySelectionDistributionType = ConfigUtils.inheritOverwritableProperty(nearbySelectionDistributionType,
321321
inheritedConfig.getNearbySelectionDistributionType());
322322
blockDistributionSizeMinimum = ConfigUtils.inheritOverwritableProperty(blockDistributionSizeMinimum,
@@ -355,7 +355,7 @@ public void visitReferencedClasses(@NonNull Consumer<Class<?>> classVisitor) {
355355
if (originValueSelectorConfig != null) {
356356
originValueSelectorConfig.visitReferencedClasses(classVisitor);
357357
}
358-
classVisitor.accept(nearbyDistanceMeterClass);
358+
classVisitor.accept(getNearbyDistanceMeterClass());
359359
}
360360

361361
@Override

core/src/main/java/ai/timefold/solver/core/config/heuristic/selector/entity/EntitySelectorConfig.java

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public static EntitySelectorConfig newMimicSelectorConfig(String mimicSelectorRe
5555
private String mimicSelectorRef = null;
5656

5757
@Nullable
58-
private Class<?> entityClass = null;
58+
private String entityClass = null;
5959
@Nullable
6060
private SelectionCacheType cacheType = null;
6161
@Nullable
@@ -66,30 +66,30 @@ public static EntitySelectorConfig newMimicSelectorConfig(String mimicSelectorRe
6666
private NearbySelectionConfig nearbySelectionConfig = null;
6767

6868
@Nullable
69-
private Class<? extends SelectionFilter> filterClass = null;
69+
private String filterClass = null;
7070

7171
@Nullable
7272
private EntitySorterManner sorterManner = null;
7373
@Nullable
74-
private Class<? extends Comparator> comparatorClass = null;
74+
private String comparatorClass = null;
7575
@Nullable
76-
private Class<? extends ComparatorFactory> comparatorFactoryClass = null;
76+
private String comparatorFactoryClass = null;
7777
@Nullable
7878
private SelectionSorterOrder sorterOrder = null;
7979
@Nullable
80-
private Class<? extends SelectionSorter> sorterClass = null;
80+
private String sorterClass = null;
8181

8282
@Nullable
83-
private Class<? extends SelectionProbabilityWeightFactory> probabilityWeightFactoryClass = null;
83+
private String probabilityWeightFactoryClass = null;
8484

8585
@Nullable
8686
private Long selectedCountLimit = null;
8787

8888
public EntitySelectorConfig() {
8989
}
9090

91-
public EntitySelectorConfig(Class<?> entityClass) {
92-
this.entityClass = entityClass;
91+
public EntitySelectorConfig(@Nullable Class<?> entityClass) {
92+
this.entityClass = entityClass == null ? null : entityClass.getName();
9393
}
9494

9595
public EntitySelectorConfig(@Nullable EntitySelectorConfig inheritedConfig) {
@@ -115,11 +115,11 @@ public void setMimicSelectorRef(@Nullable String mimicSelectorRef) {
115115
}
116116

117117
public @Nullable Class<?> getEntityClass() {
118-
return entityClass;
118+
return ConfigUtils.resolveClass(entityClass, "entityClass", this);
119119
}
120120

121121
public void setEntityClass(@Nullable Class<?> entityClass) {
122-
this.entityClass = entityClass;
122+
this.entityClass = entityClass == null ? null : entityClass.getName();
123123
}
124124

125125
public @Nullable SelectionCacheType getCacheType() {
@@ -147,11 +147,11 @@ public void setNearbySelectionConfig(@Nullable NearbySelectionConfig nearbySelec
147147
}
148148

149149
public @Nullable Class<? extends SelectionFilter> getFilterClass() {
150-
return filterClass;
150+
return ConfigUtils.resolveClass(filterClass, "filterClass", this);
151151
}
152152

153153
public void setFilterClass(@Nullable Class<? extends SelectionFilter> filterClass) {
154-
this.filterClass = filterClass;
154+
this.filterClass = filterClass == null ? null : filterClass.getName();
155155
}
156156

157157
public @Nullable EntitySorterManner getSorterManner() {
@@ -163,19 +163,19 @@ public void setSorterManner(@Nullable EntitySorterManner sorterManner) {
163163
}
164164

165165
public @Nullable Class<? extends Comparator> getComparatorClass() {
166-
return comparatorClass;
166+
return ConfigUtils.resolveClass(comparatorClass, "comparatorClass", this);
167167
}
168168

169169
public void setComparatorClass(@Nullable Class<? extends Comparator> comparatorClass) {
170-
this.comparatorClass = comparatorClass;
170+
this.comparatorClass = comparatorClass == null ? null : comparatorClass.getName();
171171
}
172172

173173
public @Nullable Class<? extends ComparatorFactory> getComparatorFactoryClass() {
174-
return comparatorFactoryClass;
174+
return ConfigUtils.resolveClass(comparatorFactoryClass, "comparatorFactoryClass", this);
175175
}
176176

177177
public void setComparatorFactoryClass(@Nullable Class<? extends ComparatorFactory> comparatorFactoryClass) {
178-
this.comparatorFactoryClass = comparatorFactoryClass;
178+
this.comparatorFactoryClass = comparatorFactoryClass == null ? null : comparatorFactoryClass.getName();
179179
}
180180

181181
public @Nullable SelectionSorterOrder getSorterOrder() {
@@ -187,20 +187,21 @@ public void setSorterOrder(@Nullable SelectionSorterOrder sorterOrder) {
187187
}
188188

189189
public @Nullable Class<? extends SelectionSorter> getSorterClass() {
190-
return sorterClass;
190+
return ConfigUtils.resolveClass(sorterClass, "sorterClass", this);
191191
}
192192

193193
public void setSorterClass(@Nullable Class<? extends SelectionSorter> sorterClass) {
194-
this.sorterClass = sorterClass;
194+
this.sorterClass = sorterClass == null ? null : sorterClass.getName();
195195
}
196196

197197
public @Nullable Class<? extends SelectionProbabilityWeightFactory> getProbabilityWeightFactoryClass() {
198-
return probabilityWeightFactoryClass;
198+
return ConfigUtils.resolveClass(probabilityWeightFactoryClass, "probabilityWeightFactoryClass", this);
199199
}
200200

201201
public void setProbabilityWeightFactoryClass(
202202
@Nullable Class<? extends SelectionProbabilityWeightFactory> probabilityWeightFactoryClass) {
203-
this.probabilityWeightFactoryClass = probabilityWeightFactoryClass;
203+
this.probabilityWeightFactoryClass =
204+
probabilityWeightFactoryClass == null ? null : probabilityWeightFactoryClass.getName();
204205
}
205206

206207
public @Nullable Long getSelectedCountLimit() {
@@ -226,7 +227,7 @@ public EntitySelectorConfig withMimicSelectorRef(String mimicSelectorRef) {
226227
}
227228

228229
public EntitySelectorConfig withEntityClass(Class<?> entityClass) {
229-
this.setEntityClass(entityClass);
230+
this.entityClass = entityClass.getName();
230231
return this;
231232
}
232233

@@ -246,7 +247,7 @@ public EntitySelectorConfig withNearbySelectionConfig(NearbySelectionConfig near
246247
}
247248

248249
public EntitySelectorConfig withFilterClass(Class<? extends SelectionFilter> filterClass) {
249-
this.setFilterClass(filterClass);
250+
this.filterClass = filterClass.getName();
250251
return this;
251252
}
252253

@@ -256,13 +257,12 @@ public EntitySelectorConfig withSorterManner(EntitySorterManner sorterManner) {
256257
}
257258

258259
public EntitySelectorConfig withComparatorClass(Class<? extends Comparator> comparatorClass) {
259-
this.setComparatorClass(comparatorClass);
260+
this.comparatorClass = comparatorClass.getName();
260261
return this;
261262
}
262263

263-
public EntitySelectorConfig
264-
withComparatorFactoryClass(Class<? extends ComparatorFactory> comparatorFactoryClass) {
265-
this.setComparatorFactoryClass(comparatorFactoryClass);
264+
public EntitySelectorConfig withComparatorFactoryClass(Class<? extends ComparatorFactory> comparatorFactoryClass) {
265+
this.comparatorFactoryClass = comparatorFactoryClass.getName();
266266
return this;
267267
}
268268

@@ -272,13 +272,13 @@ public EntitySelectorConfig withSorterOrder(SelectionSorterOrder sorterOrder) {
272272
}
273273

274274
public EntitySelectorConfig withSorterClass(Class<? extends SelectionSorter> sorterClass) {
275-
this.setSorterClass(sorterClass);
275+
this.sorterClass = sorterClass.getName();
276276
return this;
277277
}
278278

279279
public EntitySelectorConfig
280280
withProbabilityWeightFactoryClass(Class<? extends SelectionProbabilityWeightFactory> factoryClass) {
281-
this.setProbabilityWeightFactoryClass(factoryClass);
281+
this.probabilityWeightFactoryClass = factoryClass.getName();
282282
return this;
283283
}
284284

@@ -297,24 +297,24 @@ public EntitySelectorConfig inherit(EntitySelectorConfig inheritedConfig) {
297297
mimicSelectorRef = ConfigUtils.inheritOverwritableProperty(mimicSelectorRef,
298298
inheritedConfig.getMimicSelectorRef());
299299
entityClass = ConfigUtils.inheritOverwritableProperty(entityClass,
300-
inheritedConfig.getEntityClass());
300+
inheritedConfig.entityClass);
301301
nearbySelectionConfig = ConfigUtils.inheritConfig(nearbySelectionConfig, inheritedConfig.getNearbySelectionConfig());
302302
cacheType = ConfigUtils.inheritOverwritableProperty(cacheType, inheritedConfig.getCacheType());
303303
selectionOrder = ConfigUtils.inheritOverwritableProperty(selectionOrder, inheritedConfig.getSelectionOrder());
304304
filterClass = ConfigUtils.inheritOverwritableProperty(
305-
filterClass, inheritedConfig.getFilterClass());
305+
filterClass, inheritedConfig.filterClass);
306306
sorterManner = ConfigUtils.inheritOverwritableProperty(
307307
sorterManner, inheritedConfig.getSorterManner());
308308
comparatorClass = ConfigUtils.inheritOverwritableProperty(
309-
comparatorClass, inheritedConfig.getComparatorClass());
309+
comparatorClass, inheritedConfig.comparatorClass);
310310
comparatorFactoryClass = ConfigUtils.inheritOverwritableProperty(
311-
comparatorFactoryClass, inheritedConfig.getComparatorFactoryClass());
311+
comparatorFactoryClass, inheritedConfig.comparatorFactoryClass);
312312
sorterOrder = ConfigUtils.inheritOverwritableProperty(
313313
sorterOrder, inheritedConfig.getSorterOrder());
314314
sorterClass = ConfigUtils.inheritOverwritableProperty(
315-
sorterClass, inheritedConfig.getSorterClass());
315+
sorterClass, inheritedConfig.sorterClass);
316316
probabilityWeightFactoryClass = ConfigUtils.inheritOverwritableProperty(
317-
probabilityWeightFactoryClass, inheritedConfig.getProbabilityWeightFactoryClass());
317+
probabilityWeightFactoryClass, inheritedConfig.probabilityWeightFactoryClass);
318318
selectedCountLimit = ConfigUtils.inheritOverwritableProperty(
319319
selectedCountLimit, inheritedConfig.getSelectedCountLimit());
320320
return this;
@@ -327,15 +327,15 @@ public EntitySelectorConfig copyConfig() {
327327

328328
@Override
329329
public void visitReferencedClasses(Consumer<Class<?>> classVisitor) {
330-
classVisitor.accept(entityClass);
330+
classVisitor.accept(getEntityClass());
331331
if (nearbySelectionConfig != null) {
332332
nearbySelectionConfig.visitReferencedClasses(classVisitor);
333333
}
334-
classVisitor.accept(filterClass);
335-
classVisitor.accept(comparatorClass);
336-
classVisitor.accept(comparatorFactoryClass);
337-
classVisitor.accept(sorterClass);
338-
classVisitor.accept(probabilityWeightFactoryClass);
334+
classVisitor.accept(getFilterClass());
335+
classVisitor.accept(getComparatorClass());
336+
classVisitor.accept(getComparatorFactoryClass());
337+
classVisitor.accept(getSorterClass());
338+
classVisitor.accept(getProbabilityWeightFactoryClass());
339339
}
340340

341341
@Override

0 commit comments

Comments
 (0)