package com.ctp.cdi.query.meta.unit;
import java.util.List;
public final class DescriptorHierarchyBuilder {
private final List<EntityDescriptor> entities;
private final List<MappedSuperclassDescriptor> superClasses;
private DescriptorHierarchyBuilder(List<EntityDescriptor> entities,
List<MappedSuperclassDescriptor> superClasses) {
this.entities = entities;
this.superClasses = superClasses;
}
public static DescriptorHierarchyBuilder newInstance(List<EntityDescriptor> entities,
List<MappedSuperclassDescriptor> superClasses) {
return new DescriptorHierarchyBuilder(entities, superClasses);
}
public void buildHierarchy() {
for (EntityDescriptor descriptor : entities) {
buildHierarchy(descriptor);
}
}
private void buildHierarchy(PersistentClassDescriptor descriptor) {
Class<?> superClass = descriptor.getEntityClass().getSuperclass();
while (superClass != null) {
PersistentClassDescriptor superDescriptor = findPersistentClassDescriptor(superClass);
if (superDescriptor != null) {
if (descriptor.getParent() == null) {
buildHierarchy(superDescriptor);
}
descriptor.setParent(superDescriptor);
return;
}
superClass = superClass.getSuperclass();
}
}
private PersistentClassDescriptor findPersistentClassDescriptor(Class<?> superClass) {
for (MappedSuperclassDescriptor descriptor : superClasses) {
if (descriptor.getEntityClass().equals(superClass)){
return descriptor;
}
}
for (EntityDescriptor descriptor : entities) {
if (descriptor.getEntityClass().equals(superClass)){
return descriptor;
}
}
return null;
}
}