package pt.ist.fenixframework;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import dml.DomainClass;
import dml.DomainModel;
public class DomainModelUtil {
public static List<Class<? extends DomainObject>> getDomainClassHierarchy(final Class superClass,
boolean shouldContainSuperClass, boolean shouldContainAbstractClass) {
final DomainModel domainModel = FenixFramework.getDomainModel();
List<Class<? extends DomainObject>> classNames = new ArrayList<Class<? extends DomainObject>>();
for (DomainClass domainClass : domainModel.getDomainClasses()) {
if (isClassInstance(domainClass, superClass, shouldContainSuperClass)) {
try {
final Class<? extends DomainObject> clazz = (Class<? extends DomainObject>) Class.forName(domainClass
.getFullName());
if (shouldContainAbstractClass || !Modifier.isAbstract(clazz.getModifiers())) {
classNames.add(clazz);
}
} catch (ClassNotFoundException e) {
// ignore error
e.printStackTrace();
}
}
}
return classNames;
}
public static DomainClass getDomainClassFor(final Class<? extends DomainObject> className) {
final DomainModel domainModel = FenixFramework.getDomainModel();
for (DomainClass domainClass : domainModel.getDomainClasses()) {
if (domainClass.getFullName().equals(className.getName())) {
return domainClass;
}
}
return null;
}
public static List<Class<? extends DomainObject>> getDomainClassHierarchy(final Class superClass,
boolean shouldContainSuperClass) {
return getDomainClassHierarchy(superClass, shouldContainSuperClass, true);
}
private static boolean isClass(final DomainClass domainClass, final Class superClass) {
return domainClass != null && domainClass.getFullName().equals(superClass.getName());
}
private static boolean isClassInstance(final DomainClass domainClass, final Class superClass, boolean shouldContainSuperClass) {
if (domainClass == null) {
return false;
}
if (isClass(domainClass, superClass)) {
return shouldContainSuperClass;
}
final DomainClass superclass = (DomainClass) domainClass.getSuperclass();
return isClass(superclass, superClass) || isClassInstance(superclass, superClass, shouldContainSuperClass);
}
}