/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.stanbol.entityhub.model.clerezza; import java.util.Iterator; import org.apache.clerezza.commons.rdf.ImmutableGraph; import org.apache.clerezza.commons.rdf.Literal; import org.apache.clerezza.commons.rdf.Graph; import org.apache.clerezza.commons.rdf.Graph; import org.apache.clerezza.commons.rdf.IRI; import org.apache.clerezza.commons.rdf.impl.utils.simple.SimpleGraph; import org.apache.stanbol.commons.indexedgraph.IndexedGraph; import org.apache.stanbol.entityhub.servicesapi.model.Representation; import org.apache.stanbol.entityhub.servicesapi.model.ValueFactory; /** * Factory for creating instances of the RDF implementation of the Entityhub model * based on Clerezza. * TODO: Check if it makes sense to add a instance cache for {@link RdfReference} * instances. * @author Rupert Westenthaler * */ public final class RdfValueFactory implements ValueFactory { private static RdfValueFactory instance; /** * TODO:Currently implements the singleton pattern. This might change in the * future if ValueFactoy becomes an own OSGI Service * @return */ public static RdfValueFactory getInstance() { if(instance == null){ instance = new RdfValueFactory(); } return instance; } /** * If not <code>null</code> all {@link RdfRepresentation} created by this * instance will use this graph. */ private Graph graph; private RdfValueFactory(){ this(null); } /** * This allows to create an instance that uses the same graph for all * created {@link Representation}s. This allows to automatically add all * data added to {@link Representation} created by this Factory to this * graph. * @param graph */ public RdfValueFactory(Graph graph){ super(); this.graph = graph; } @Override public RdfReference createReference(Object value) { if (value == null) { throw new IllegalArgumentException("The parsed value MUST NOT be NULL"); } else if (value instanceof IRI) { return new RdfReference((IRI) value); } else { return new RdfReference(value.toString()); } } @Override public RdfText createText(Object value) { if (value == null) { throw new IllegalArgumentException("The parsed value MUST NOT be NULL"); } else if (value instanceof Literal) { return new RdfText((Literal) value); } else { return createText(value.toString(), null); } } @Override public RdfText createText(String text, String language) { return new RdfText(text, language); } @Override public RdfRepresentation createRepresentation(String id) { if (id == null){ throw new IllegalArgumentException("The parsed id MUST NOT be NULL!"); } else if(id.isEmpty()){ throw new IllegalArgumentException("The parsed id MUST NOT be empty!"); } else { return createRdfRepresentation(new IRI(id), graph == null ? new IndexedGraph() : graph); } } /** * {@link RdfRepresentation} specific create Method based on an existing * RDF ImmutableGraph. * * @param node The node of the node used for the representation. If this * node is not part of the parsed graph, the resulting representation * will be empty * @param graph the graph. * @return The representation based on the state of the parsed graph */ public RdfRepresentation createRdfRepresentation(IRI node, Graph graph) { if (node == null) { throw new IllegalArgumentException("The parsed id MUST NOT be NULL!"); } if(graph == null){ throw new IllegalArgumentException("The parsed graph MUST NOT be NULL!"); } return new RdfRepresentation(node, graph); } /** * Extracts the ImmutableGraph for {@link RdfRepresentation} or creates a {@link ImmutableGraph} * for all other implementations of {@link Representation}. * * @param representation the representation * @return the read only RDF ImmutableGraph. */ public RdfRepresentation toRdfRepresentation(Representation representation) { if (representation instanceof RdfRepresentation) { return (RdfRepresentation) representation; } else { //create the Clerezza Represenation RdfRepresentation clerezzaRep = createRepresentation(representation.getId()); //Copy all values field by field for (Iterator<String> fields = representation.getFieldNames(); fields.hasNext();) { String field = fields.next(); for (Iterator<Object> fieldValues = representation.get(field); fieldValues.hasNext();) { clerezzaRep.add(field, fieldValues.next()); } } return clerezzaRep; } } }