package org.openflexo.foundation.ontology; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.logging.Logger; public class OntologyUtils { private static final Logger logger = Logger.getLogger(OntologyUtils.class.getPackage().getName()); public static <C extends OntologyClass> C getMostSpecializedClass(Collection<C> someClasses) { if (someClasses.size() == 0) { return null; } if (someClasses.size() == 1) { return someClasses.iterator().next(); } OntologyClass[] array = someClasses.toArray(new OntologyClass[someClasses.size()]); for (int i = 0; i < someClasses.size(); i++) { for (int j = i + 1; j < someClasses.size(); j++) { OntologyClass c1 = array[i]; OntologyClass c2 = array[j]; if (c1.isSuperClassOf(c2)) { someClasses.remove(c1); return getMostSpecializedClass(someClasses); } if (c2.isSuperClassOf(c1)) { someClasses.remove(c2); return getMostSpecializedClass(someClasses); } } } // No parent were found, take first item logger.warning("Undefined specializing criteria between " + someClasses); return someClasses.iterator().next(); } public static <C extends OntologyClass> OntologyClass getFirstCommonAncestor(C c1, C c2) { Set<C> commonAncestors = new HashSet<C>(); Set<C> ancestors1 = (Set<C>) c1.getAllSuperClasses(); ancestors1.add(c1); Set<C> ancestors2 = (Set<C>) c2.getAllSuperClasses(); ancestors2.add(c2); for (C cl1 : ancestors1) { for (C cl2 : ancestors2) { if (cl1.equalsToConcept(cl2)) { commonAncestors.add(cl1); } } } return getMostSpecializedClass(commonAncestors); } }