/* The contents of this file are subject to the license and copyright terms * detailed in the license directory at the root of the source tree (also * available online at http://fedora-commons.org/license/). */ package fedora.server.resourceIndex; import static fedora.common.Models.CONTENT_MODEL_3_0; import static fedora.common.Models.FEDORA_OBJECT_3_0; import static fedora.common.Models.SERVICE_DEFINITION_3_0; import static fedora.common.Models.SERVICE_DEPLOYMENT_3_0; import fedora.server.errors.ResourceIndexException; import fedora.server.errors.ServerException; import fedora.server.storage.DOReader; import org.jrdf.graph.Triple; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * Generates an object's triples based upon its declared content models. * <p> * For each content model in the object, will see if there is a * {@link TripleGenerator} for that model. Returns the union of all triples * created by these generators. * </p> * * @author Aaron Birkland */ public class ModelBasedTripleGenerator implements TripleGenerator { /** * Map of model-specific triple generators. Right now, this is entirely * static. Change that if the need arises... */ private static final Map<String, Class<? extends TripleGenerator>> m_generatorClasses = new HashMap<String, Class<? extends TripleGenerator>>(); /* hard coded for now... */ static { m_generatorClasses.put(FEDORA_OBJECT_3_0.uri, FedoraObjectTripleGenerator_3_0.class); m_generatorClasses.put(SERVICE_DEFINITION_3_0.uri, ServiceDefinitionTripleGenerator_3_0.class); m_generatorClasses.put(SERVICE_DEPLOYMENT_3_0.uri, ServiceDeploymentTripleGenerator.class); m_generatorClasses.put(CONTENT_MODEL_3_0.uri, ContentModelTripleGenerator_3_0.class); } /** Contains the initialized triple generators for each model */ private Map<String, TripleGenerator> m_generators = new HashMap<String, TripleGenerator>(); /** * Create a ModelBasedTripleGenerator. */ public ModelBasedTripleGenerator() { for (String modelID : m_generatorClasses.keySet()) { Class<? extends TripleGenerator> genClass = m_generatorClasses.get(modelID); try { TripleGenerator generator = genClass.newInstance(); m_generators.put(modelID, generator); } catch (Exception e) { throw new RuntimeException("Could not instantiate triple generator " + genClass.getName() + " for model " + modelID, e); } } } /** * Gets all triples implied by the object's models. * * @param reader * Reads the current object * @return Set of all triples implied by the object's models. */ public Set<Triple> getTriplesForObject(DOReader reader) throws ResourceIndexException { Set<Triple> objectTriples = new HashSet<Triple>(); try { for (String modelRelobject:reader.getContentModels()){ /* for (RelationshipTuple modelRel : reader .getRelationships(MODEL.HAS_MODEL, null)) { */ if (m_generators.containsKey(modelRelobject)) { objectTriples.addAll(m_generators.get(modelRelobject) .getTriplesForObject(reader)); } } } catch (ServerException e) { throw new ResourceIndexException("Could not read object's content model", e); } return objectTriples; } }