/* * Copyright (c) 2010 Mysema Ltd. * All rights reserved. * */ package com.mysema.rdfbean.ontology; import java.util.Collection; import java.util.Collections; import java.util.Set; import java.util.Stack; import com.google.common.collect.Multimap; import com.mysema.rdfbean.model.UID; import com.mysema.util.MultimapFactory; /** * AbstractOntology provides a generic implementation of the Ontology interface * * @author tiwe * @version $Id$ */ public abstract class AbstractOntology implements Ontology { private final Multimap<UID, UID> subtypes = MultimapFactory.<UID, UID> createWithSet(); private final Multimap<UID, UID> supertypes = MultimapFactory.<UID, UID> createWithSet(); private final Multimap<UID, UID> subproperties = MultimapFactory.<UID, UID> createWithSet(); private final Multimap<UID, UID> superproperties = MultimapFactory.<UID, UID> createWithSet(); protected void initializeTypeHierarchy(Set<UID> types, Multimap<UID, UID> directSubtypes, Multimap<UID, UID> directSupertypes) { for (UID type : types) { subtypes.put(type, type); if (directSubtypes.containsKey(type)) { flatten(type, directSubtypes, subtypes); } if (directSupertypes.containsKey(type)) { flatten(type, directSupertypes, supertypes); } } } protected void initializePropertyHierarchy(Set<UID> properties, Multimap<UID, UID> directSubproperties, Multimap<UID, UID> directSuperproperties) { for (UID property : properties) { subproperties.put(property, property); if (directSubproperties.containsKey(property)) { flatten(property, directSubproperties, subproperties); } if (directSuperproperties.containsKey(property)) { flatten(property, directSuperproperties, superproperties); } } } private void flatten(UID id, Multimap<UID, UID> direct, Multimap<UID, UID> expanded) { Stack<UID> t = new Stack<UID>(); t.addAll(direct.get(id)); while (!t.isEmpty()) { UID supertype = t.pop(); expanded.put(id, supertype); if (direct.containsKey(supertype)) { t.addAll(direct.get(supertype)); } } } public Collection<UID> getSubtypes(UID uid) { Collection<UID> rv = subtypes.get(uid); return rv != null ? rv : Collections.singleton(uid); } public Collection<UID> getSupertypes(UID uid) { Collection<UID> rv = supertypes.get(uid); return rv != null ? rv : Collections.<UID> emptySet(); } public Collection<UID> getSubproperties(UID uid) { Collection<UID> rv = subproperties.get(uid); return rv != null ? rv : Collections.singleton(uid); } public Collection<UID> getSuperproperties(UID uid) { Collection<UID> rv = superproperties.get(uid); return rv != null ? rv : Collections.<UID> emptySet(); } }