package module.mission.presentationTier.provider; import java.lang.reflect.Modifier; import java.util.Collection; import java.util.Set; import java.util.TreeSet; import module.mission.domain.MissionProcess; import module.mission.domain.activity.ItemActivityInformation; import pt.ist.fenixWebFramework.renderers.DataProvider; import pt.ist.fenixWebFramework.renderers.components.converters.Converter; import pt.ist.fenixframework.FenixFramework; import pt.ist.fenixframework.dml.DomainClass; import pt.ist.fenixframework.dml.DomainModel; public class RelativeMissionItemTypeProvider implements DataProvider { @Override public Converter getConverter() { return null; } @Override public Object provide(final Object source, final Object currentValue) { final ItemActivityInformation itemActivityInformation = (ItemActivityInformation) source; final MissionProcess missionProcess = itemActivityInformation.getProcess(); final Class topLevelMissionItemType = itemActivityInformation.getTopLevelMissionItemType(); return getMissionItemTypes(topLevelMissionItemType); } public Collection<Class> getMissionItemTypes(final Class topLevelMissionItemType) { final Set<Class> missionItemTypes = new TreeSet<Class>(TopLevelMissionItemTypeProvider.CLASS_COMPARATOR_BY_NAME); if (topLevelMissionItemType != null) { final DomainModel domainModel = FenixFramework.getDomainModel(); for (final DomainClass domainClass : domainModel.getDomainClasses()) { if (isMissionItemSubclass(topLevelMissionItemType, domainClass)) { try { final Class clazz = Class.forName(domainClass.getFullName()); if (!Modifier.isAbstract(clazz.getModifiers())) { missionItemTypes.add(clazz); } } catch (final ClassNotFoundException e) { throw new Error(e); } } } } return missionItemTypes; } private boolean isMissionItemSubclass(final Class topLevelMissionItemType, final DomainClass domainClass) { return domainClass != null && (domainClass.getFullName().equals(topLevelMissionItemType.getName()) || isMissionItemSubclass( topLevelMissionItemType, (DomainClass) domainClass.getSuperclass())); } }