in optaplanner-quarkus-integration/optaplanner-quarkus/deployment/src/main/java/org/optaplanner/quarkus/deployment/GizmoMemberAccessorEntityEnhancer.java [226:312]
public String generateSolutionCloner(SolutionDescriptor solutionDescriptor, ClassOutput classOutput,
IndexView indexView, BuildProducer<BytecodeTransformerBuildItem> transformers) {
String generatedClassName = GizmoSolutionClonerFactory.getGeneratedClassName(solutionDescriptor);
try (ClassCreator classCreator = ClassCreator
.builder()
.className(generatedClassName)
.interfaces(SolutionCloner.class)
.classOutput(classOutput)
.setFinal(true)
.build()) {
Set<Class<?>> solutionSubclassSet =
indexView.getAllKnownSubclasses(DotName.createSimple(solutionDescriptor.getSolutionClass().getName()))
.stream()
.map(classInfo -> {
try {
return Class.forName(classInfo.name().toString(), false,
Thread.currentThread().getContextClassLoader());
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Unable to find class (" + classInfo.name() +
"), which is a known subclass of the solution class (" +
solutionDescriptor.getSolutionClass() + ").", e);
}
}).collect(Collectors.toCollection(LinkedHashSet::new));
solutionSubclassSet.add(solutionDescriptor.getSolutionClass());
Map<Class<?>, GizmoSolutionOrEntityDescriptor> memoizedGizmoSolutionOrEntityDescriptorForClassMap =
new HashMap<>();
for (Class<?> solutionSubclass : solutionSubclassSet) {
getGizmoSolutionOrEntityDescriptorForEntity(solutionDescriptor,
solutionSubclass,
memoizedGizmoSolutionOrEntityDescriptorForClassMap,
transformers);
}
// IDEA gave error on entityClass being a Class...
for (Object entityClass : solutionDescriptor.getEntityClassSet()) {
getGizmoSolutionOrEntityDescriptorForEntity(solutionDescriptor,
(Class<?>) entityClass,
memoizedGizmoSolutionOrEntityDescriptorForClassMap,
transformers);
}
Set<Class<?>> solutionAndEntitySubclassSet = new HashSet<>(solutionSubclassSet);
for (Object entityClassObject : solutionDescriptor.getEntityClassSet()) {
Class<?> entityClass = (Class<?>) entityClassObject;
Collection<ClassInfo> classInfoCollection;
// getAllKnownSubclasses returns an empty collection for interfaces (silent failure); thus:
// for interfaces, we use getAllKnownImplementors; otherwise we use getAllKnownSubclasses
if (entityClass.isInterface()) {
classInfoCollection = indexView.getAllKnownImplementors(DotName.createSimple(entityClass.getName()));
} else {
classInfoCollection = indexView.getAllKnownSubclasses(DotName.createSimple(entityClass.getName()));
}
classInfoCollection.stream().map(classInfo -> {
try {
return Class.forName(classInfo.name().toString(), false,
Thread.currentThread().getContextClassLoader());
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Unable to find class (" + classInfo.name() +
"), which is a known subclass of the entity class (" +
entityClass + ").", e);
}
}).forEach(solutionAndEntitySubclassSet::add);
}
Set<Class<?>> deepClonedClassSet =
GizmoCloningUtils.getDeepClonedClasses(solutionDescriptor, solutionAndEntitySubclassSet);
for (Class<?> deepCloningClass : deepClonedClassSet) {
makeConstructorAccessible(deepCloningClass, transformers);
if (!memoizedGizmoSolutionOrEntityDescriptorForClassMap.containsKey(deepCloningClass)) {
getGizmoSolutionOrEntityDescriptorForEntity(solutionDescriptor,
deepCloningClass,
memoizedGizmoSolutionOrEntityDescriptorForClassMap,
transformers);
}
}
GizmoSolutionClonerImplementor.defineClonerFor(classCreator, solutionDescriptor, solutionSubclassSet,
memoizedGizmoSolutionOrEntityDescriptorForClassMap, deepClonedClassSet);
}
return generatedClassName;
}