/** * Copyright 2005-2014 Restlet * * The contents of this file are subject to the terms of one of the following * open source licenses: Apache 2.0 or or EPL 1.0 (the "Licenses"). You can * select the license that you prefer but you may not use this file except in * compliance with one of these Licenses. * * You can obtain a copy of the Apache 2.0 license at * http://www.opensource.org/licenses/apache-2.0 * * You can obtain a copy of the EPL 1.0 license at * http://www.opensource.org/licenses/eclipse-1.0 * * See the Licenses for the specific language governing permissions and * limitations under the Licenses. * * Alternatively, you can obtain a royalty free commercial license with less * limitations, transferable or non-transferable, directly at * http://restlet.com/products/restlet-framework * * Restlet is a registered trademark of Restlet S.A.S. */ package org.restlet.ext.rdf; import java.util.concurrent.CopyOnWriteArraySet; import org.restlet.data.MediaType; import org.restlet.data.Reference; import org.restlet.representation.Representation; /** * Graph composed of links. This also called a set of RDF statements or a RDF * model. * * @author Jerome Louvel */ public class Graph extends CopyOnWriteArraySet<Link> { /** The serialization unique identifier. */ private static final long serialVersionUID = 1L; /** The default link that is used to complete new links. */ private Link defaultLink; /** * Default constructor. */ public Graph() { this((Link) null); } /** * Constructor with a default link. * * @param defaultLink * The link to use when adding links with missing properties. */ public Graph(Link defaultLink) { this.defaultLink = defaultLink; } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceGraph * The source graph. * @param typeRef * The type reference. * @param targetLit * The target literal. * @return The created link. */ public Link add(Graph sourceGraph, Reference typeRef, Literal targetLit) { Link result = new Link(getSourceAsGraph(sourceGraph), getTypeRef(typeRef), getTargetAsLiteral(targetLit)); add(result); return result; } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceGraph * The source graph. * @param typeRef * The type reference. * @param targetRef * The target reference. * @return The created link. */ public Link add(Graph sourceGraph, Reference typeRef, Reference targetRef) { Link result = new Link(getSourceAsGraph(sourceGraph), getTypeRef(typeRef), getTargetAsReference(targetRef)); add(result); return result; } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetLit * The target literal. * @return The created link. */ public Link add(Reference sourceRef, Reference typeRef, Literal targetLit) { Link result = new Link(getSourceAsReference(sourceRef), getTypeRef(typeRef), getTargetAsLiteral(targetLit)); add(result); return result; } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetRef * The target resource reference. * @return The created link. */ public Link add(Reference sourceRef, Reference typeRef, Reference targetRef) { Link result = new Link(getSourceAsReference(sourceRef), getTypeRef(typeRef), getTargetAsReference(targetRef)); add(result); return result; } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetLit * The target literal. * @return The created link. */ public Link add(Reference sourceRef, String typeRef, Literal targetLit) { return add(sourceRef, new Reference(typeRef), targetLit); } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetRef * The target resource reference. * @return The created link. */ public Link add(Reference sourceRef, String typeRef, Reference targetRef) { return add(sourceRef, new Reference(typeRef), targetRef); } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetLit * The target literal. * @return The created link. */ public Link add(String sourceRef, Reference typeRef, Literal targetLit) { return add(new Reference(sourceRef), typeRef, targetLit); } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetRef * The target resource reference. * @return The created link. */ public Link add(String sourceRef, Reference typeRef, Reference targetRef) { return add(new Reference(sourceRef), typeRef, targetRef); } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetLit * The target literal. * @return The created link. */ public Link add(String sourceRef, String typeRef, Literal targetLit) { return add(new Reference(sourceRef), new Reference(typeRef), targetLit); } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetRef * The target resource reference. * @return The created link. */ public Link add(String sourceRef, String typeRef, Reference targetRef) { return add(new Reference(sourceRef), new Reference(typeRef), targetRef); } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceGraph * The source graph. * @param typeRef * The type reference. * @param targetLit * The target literal. * @return The created link. */ public Link addLiteral(Graph sourceGraph, String typeRef, String targetLit) { return add(sourceGraph, new Reference(typeRef), new Literal(targetLit)); } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetLit * The target literal. * @return The created link. */ public Link addLiteral(String sourceRef, String typeRef, String targetLit) { return add(new Reference(sourceRef), new Reference(typeRef), new Literal(targetLit)); } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceGraph * The source graph. * @param typeRef * The type reference. * @param targetRef * The target reference. * @return The created link. */ public Link addReference(Graph sourceGraph, String typeRef, String targetRef) { return add(sourceGraph, new Reference(typeRef), new Reference(targetRef)); } /** * Creates then adds a link. If one of the parameter is null, the value from * {@link #getDefaultLink()} is used instead if possible. * * @param sourceRef * The source resource reference. * @param typeRef * The type reference. * @param targetRef * The target resource reference. * @return The created link. */ public Link addReference(String sourceRef, String typeRef, String targetRef) { return add(new Reference(sourceRef), new Reference(typeRef), new Reference(targetRef)); } /** * Returns the default link that is used to complete new links. * * @return The default link that is used to complete new links. */ public Link getDefaultLink() { return defaultLink; } /** * Returns a representation in the RDF/n3 format. * * @return A representation in the RDF/n3 format. */ public Representation getRdfN3Representation() { return new RdfRepresentation(this, MediaType.TEXT_RDF_N3); } /** * Returns a representation in the RDF/N-Triples format. * * @return A representation in the RDF/N-Triples format. */ public Representation getRdfNTriplesRepresentation() { return new RdfRepresentation(this, MediaType.TEXT_PLAIN); } /** * Returns a representation in the RDF/Turtle format. * * @return A representation in the RDF/Turtle format. */ public Representation getRdfTurtleRepresentation() { return new RdfRepresentation(this, MediaType.TEXT_TURTLE); } /** * Returns a representation in the RDF/XML format. * * @return A representation in the RDF/XML format. */ public Representation getRdfXmlRepresentation() { return new RdfRepresentation(this, MediaType.TEXT_XML); } /** * Returns the source reference, either the one given in the sourceRef * parameter or if it is null, the source reference of the default link. * * @param sourceRef * The source reference to check. * @return The source reference. */ private Graph getSourceAsGraph(Graph sourceGraph) { Graph result = sourceGraph; if ((result == null) && (getDefaultLink() != null)) { result = getDefaultLink().getSourceAsGraph(); } return result; } /** * Returns the source reference, either the one given in the sourceRef * parameter or if it is null, the source reference of the default link. * * @param sourceRef * The source reference to check. * @return The source reference. */ private Reference getSourceAsReference(Reference sourceRef) { Reference result = sourceRef; if ((result == null) && (getDefaultLink() != null)) { result = getDefaultLink().getSourceAsReference(); } return result; } /** * Returns the target literal, either the one given in the targetLit * parameter or if it is null, the target literal of the default link. * * @param targetLit * The target literal to check. * @return The target literal. */ private Literal getTargetAsLiteral(Literal targetLit) { Literal result = targetLit; if ((result == null) && (getDefaultLink() != null)) { result = getDefaultLink().getTargetAsLiteral(); } return result; } /** * Returns the target reference, either the one given in the targetRef * parameter or if it is null, the target reference of the default link. * * @param targetRef * The target reference to check. * @return The target reference. */ private Reference getTargetAsReference(Reference targetRef) { Reference result = targetRef; if ((result == null) && (getDefaultLink() != null)) { result = getDefaultLink().getTargetAsReference(); } return result; } /** * Returns the type reference, either the one given in the typeRef parameter * or if it is null, the type reference of the default link. * * @param typeRef * The type reference to check. * @return The type reference. */ private Reference getTypeRef(Reference typeRef) { Reference result = typeRef; if ((result == null) && (getDefaultLink() != null)) { result = getDefaultLink().getTypeRef(); } return result; } /** * Sets the default link that is used to complete new links. * * @param defaultLink * The default link that is used to complete new links. */ public void setDefaultLink(Link defaultLink) { this.defaultLink = defaultLink; } }