in core/optaplanner-core-impl/src/main/java/org/optaplanner/core/impl/domain/entity/descriptor/EntityDescriptor.java [264:332]
private void registerVariableAccessor(Class<? extends Annotation> variableAnnotationClass,
MemberAccessor memberAccessor) {
String memberName = memberAccessor.getName();
if (declaredGenuineVariableDescriptorMap.containsKey(memberName)
|| declaredShadowVariableDescriptorMap.containsKey(memberName)) {
VariableDescriptor<Solution_> duplicate = declaredGenuineVariableDescriptorMap.get(memberName);
if (duplicate == null) {
duplicate = declaredShadowVariableDescriptorMap.get(memberName);
}
throw new IllegalStateException("The entityClass (" + entityClass
+ ") has a @" + variableAnnotationClass.getSimpleName()
+ " annotated member (" + memberAccessor
+ ") that is duplicated by another member for variableDescriptor (" + duplicate + ").\n"
+ "Maybe the annotation is defined on both the field and its getter.");
}
if (variableAnnotationClass.equals(PlanningVariable.class)) {
GenuineVariableDescriptor<Solution_> variableDescriptor = new BasicVariableDescriptor<>(
this, memberAccessor);
declaredGenuineVariableDescriptorMap.put(memberName, variableDescriptor);
} else if (variableAnnotationClass.equals(PlanningListVariable.class)) {
if (List.class.isAssignableFrom(memberAccessor.getType())) {
GenuineVariableDescriptor<Solution_> variableDescriptor = new ListVariableDescriptor<>(
this, memberAccessor);
declaredGenuineVariableDescriptorMap.put(memberName, variableDescriptor);
} else {
throw new IllegalStateException("The entityClass (" + entityClass
+ ") has a @" + PlanningListVariable.class.getSimpleName()
+ " annotated member (" + memberAccessor
+ ") that has an unsupported type (" + memberAccessor.getType() + ").\n"
+ "Maybe use " + List.class.getCanonicalName() + ".");
}
} else if (variableAnnotationClass.equals(InverseRelationShadowVariable.class)) {
ShadowVariableDescriptor<Solution_> variableDescriptor = new InverseRelationShadowVariableDescriptor<>(
this, memberAccessor);
declaredShadowVariableDescriptorMap.put(memberName, variableDescriptor);
} else if (variableAnnotationClass.equals(AnchorShadowVariable.class)) {
ShadowVariableDescriptor<Solution_> variableDescriptor = new AnchorShadowVariableDescriptor<>(
this, memberAccessor);
declaredShadowVariableDescriptorMap.put(memberName, variableDescriptor);
} else if (variableAnnotationClass.equals(IndexShadowVariable.class)) {
ShadowVariableDescriptor<Solution_> variableDescriptor = new IndexShadowVariableDescriptor<>(
this, memberAccessor);
declaredShadowVariableDescriptorMap.put(memberName, variableDescriptor);
} else if (variableAnnotationClass.equals(PreviousElementShadowVariable.class)) {
PreviousElementShadowVariableDescriptor<Solution_> variableDescriptor =
new PreviousElementShadowVariableDescriptor<>(this, memberAccessor);
declaredShadowVariableDescriptorMap.put(memberName, variableDescriptor);
} else if (variableAnnotationClass.equals(NextElementShadowVariable.class)) {
NextElementShadowVariableDescriptor<Solution_> variableDescriptor =
new NextElementShadowVariableDescriptor<>(this, memberAccessor);
declaredShadowVariableDescriptorMap.put(memberName, variableDescriptor);
} else if (variableAnnotationClass.equals(ShadowVariable.class)
|| variableAnnotationClass.equals(ShadowVariable.List.class)) {
ShadowVariableDescriptor<Solution_> variableDescriptor = new CustomShadowVariableDescriptor<>(
this, memberAccessor);
declaredShadowVariableDescriptorMap.put(memberName, variableDescriptor);
} else if (variableAnnotationClass.equals(PiggybackShadowVariable.class)) {
ShadowVariableDescriptor<Solution_> variableDescriptor = new PiggybackShadowVariableDescriptor<>(
this, memberAccessor);
declaredShadowVariableDescriptorMap.put(memberName, variableDescriptor);
} else if (variableAnnotationClass.equals(CustomShadowVariable.class)) {
ShadowVariableDescriptor<Solution_> variableDescriptor = new LegacyCustomShadowVariableDescriptor<>(
this, memberAccessor);
declaredShadowVariableDescriptorMap.put(memberName, variableDescriptor);
} else {
throw new IllegalStateException("The variableAnnotationClass ("
+ variableAnnotationClass + ") is not implemented.");
}
}