blob: 41a7b9479df2321cf583238fdfc3b0992b8152de [file] [log] [blame]
/**
* 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.commons.rdf.api;
import java.io.Serializable;
import java.util.Locale;
/**
* Factory for creating RDFTerm and Graph instances.
* <p>
* It is not specified how an implementation should provide a RDFTermFactory.
* <p>
* If an implementation does not support a particular method (e.g. it requires
* additional parameters or can't create graphs), then it MAY throw
* {@link UnsupportedOperationException}, as provided by the <code>default</code>
* implementations in this interface.
* <p>
* If a factory method does not allow or support a provided parameter, e.g.
* because an IRI is considered invalid, then it SHOULD throw
* {@link IllegalArgumentException}.
*
* @see RDFTerm
* @see Graph
*/
public interface RDFTermFactory {
/**
* Create a new blank node.
* <p>
* The returned blank node MUST NOT be equal to any existing
* {@link BlankNode} instances according to {@link BlankNode#equals(Object)}.
*
* @return A new, unique {@link BlankNode}
* @throws UnsupportedOperationException
* If the operation is not supported.
*/
default BlankNode createBlankNode() throws UnsupportedOperationException {
throw new UnsupportedOperationException(
"createBlankNode() not supported");
}
/**
* Create a blank node based on the given name.
* <p>
* All {@link BlankNode}s created with the given <code>name</code>
* <em>on a particular instance</em> of <code>RDFTermFactory</code> MUST be
* equivalent according to {@link BlankNode#equals(Object)},
* <p>
* The returned BlankNode MUST NOT be equal to <code>BlankNode</code>
* instances returned for any other <code>name</code> or those returned from
* {@link #createBlankNode()}.
* <p>
* The returned BlankNode SHOULD NOT be equivalent to any BlankNodes created
* on a <em>different</em> <code>RDFTermFactory</code> instance, e.g.
* different instances of <code>RDFTermFactory</code> should produce
* different blank nodes for the same <code>name</code> unless they
* purposely are intending to create equivalent {@link BlankNode}
* instances (e.g. a reinstated {@link Serializable} factory).
*
* @param name
* A non-empty, non-null, String that is unique to this blank
* node in the context of this {@link RDFTermFactory}.
* @return A BlankNode for the given name
* @throws UnsupportedOperationException
* If the operation is not supported.
*/
default BlankNode createBlankNode(String name)
throws UnsupportedOperationException {
throw new UnsupportedOperationException(
"createBlankNode(String) not supported");
}
/**
* Create a new graph.
*
* It is undefined if the graph will be persisted by any underlying storage
* mechanism.
*
* @return A new Graph
* @throws UnsupportedOperationException If the operation is not supported.
*/
default Graph createGraph() throws UnsupportedOperationException {
throw new UnsupportedOperationException("createGraph() not supported");
}
/**
* Create an IRI from a (possibly escaped) String.
*
* The provided iri string MUST be valid according to the <a
* href="http://www.w3.org/TR/rdf11-concepts/#dfn-iri">W3C RDF-1.1 IRI</a>
* definition.
*
* @param iri Internationalized Resource Identifier
* @return A new IRI
* @throws IllegalArgumentException If the provided string is not acceptable, e.g. does not
* conform to the RFC3987 syntax.
* @throws UnsupportedOperationException If the operation is not supported.
*/
default IRI createIRI(String iri) throws IllegalArgumentException,
UnsupportedOperationException {
throw new UnsupportedOperationException(
"createIRI(String) not supported");
}
/**
* Create a simple literal.
*
* The provided lexical form should not be escaped in any sense, e.g. should
* not include "quotes" unless those are part of the literal value.
*
* The returned Literal MUST have a {@link Literal#getLexicalForm()} that is
* equal to the provided lexical form, MUST NOT have a
* {@link Literal#getLanguageTag()} present, and SHOULD return a
* {@link Literal#getDatatype()} that is equal to the IRI
* <code>http://www.w3.org/2001/XMLSchema#string</code>.
*
* @param lexicalForm The literal value in plain text
* @return The created Literal
* @throws IllegalArgumentException If the provided lexicalForm is not acceptable, e.g. because
* it is too large for an underlying storage.
* @throws UnsupportedOperationException If the operation is not supported.
*/
default Literal createLiteral(String lexicalForm)
throws IllegalArgumentException, UnsupportedOperationException {
throw new UnsupportedOperationException(
"createLiteral(String) not supported");
}
/**
* Create a literal with the specified data type.
*
* The provided lexical form should not be escaped in any sense, e.g. should
* not include "quotes" unless those are part of the literal value.
*
* It is RECOMMENDED that the provided dataType is one of the <a
* href="http://www.w3.org/TR/rdf11-concepts/#xsd-datatypes">RDF-compatible
* XSD types</a>.
*
* The provided lexical form SHOULD be in the <a
* href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-space">lexical
* space</a> of the provided dataType.
*
* The returned Literal SHOULD have a {@link Literal#getLexicalForm()} that
* is equal to the provided lexicalForm, MUST NOT have a
* {@link Literal#getLanguageTag()} present, and MUST return a
* {@link Literal#getDatatype()} that is equivalent to the provided dataType
* IRI.
*
* @param lexicalForm The literal value
* @param dataType The data type IRI for the literal value, e.g.
* <code>http://www.w3.org/2001/XMLSchema#integer</code>
* @return The created Literal
* @throws IllegalArgumentException If any of the provided arguments are not acceptable, e.g.
* because the provided dataType is not permitted.
* @throws UnsupportedOperationException If the operation is not supported.
*/
default Literal createLiteral(String lexicalForm, IRI dataType)
throws IllegalArgumentException, UnsupportedOperationException {
throw new UnsupportedOperationException(
"createLiteral(String) not supported");
}
/**
* Create a language-tagged literal.
*
* The provided lexical form should not be escaped in any sense, e.g. should
* not include "quotes" unless those are part of the literal value.
*
* The provided language tag MUST be valid according to <a
* href="http://tools.ietf.org/html/bcp47">BCP47</a>, e.g. <code>en</code>.
*
* The provided language tag <a
* href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string"
* >MAY be converted to lower case</a>.
*
* The returned Literal SHOULD have a {@link Literal#getLexicalForm()} which
* is equal to the provided lexicalForm, MUST return a
* {@link Literal#getDatatype()} that is equal to the IRI
* <code>http://www.w3.org/1999/02/22-rdf-syntax-ns#langString</code>, and
* MUST have a {@link Literal#getLanguageTag()} present which SHOULD be
* equal to the provided language tag (compared as
* {@link String#toLowerCase(Locale)} using {@link Locale#ENGLISH}).
*
* @param lexicalForm The literal value
* @param languageTag The non-empty language tag as defined by <a
* href="http://tools.ietf.org/html/bcp47">BCP47</a>
* @return The created Literal
* @throws IllegalArgumentException If the provided values are not acceptable, e.g. because the
* languageTag was syntactically invalid.
* @throws UnsupportedOperationException If the operation is not supported.
*/
default Literal createLiteral(String lexicalForm, String languageTag)
throws IllegalArgumentException, UnsupportedOperationException {
throw new UnsupportedOperationException(
"createLiteral(String,String) not supported");
}
/**
* Create a triple.
*
* The returned Triple SHOULD have a {@link Triple#getSubject()} that is
* equal to the provided subject, a {@link Triple#getPredicate()} that is
* equal to the provided predicate, and a {@link Triple#getObject()} that is
* equal to the provided object.
*
* @param subject The IRI or BlankNode that is the subject of the triple
* @param predicate The IRI that is the predicate of the triple
* @param object The IRI, BlankNode or Literal that is the object of the triple
* @return The created Triple
* @throws IllegalArgumentException If any of the provided arguments are not acceptable, e.g.
* because a Literal has a lexicalForm that is too large for an
* underlying storage.
* @throws UnsupportedOperationException If the operation is not supported.
*/
default Triple createTriple(BlankNodeOrIRI subject, IRI predicate,
RDFTerm object) throws IllegalArgumentException,
UnsupportedOperationException {
throw new UnsupportedOperationException(
"createTriple(BlankNodeOrIRI,IRI,RDFTerm) not supported");
}
}