blob: e2f012c8ec61dbb257c330b145ecd00655d52149 [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.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Set;
/**
* W3C RDF 1.1 serialization syntax.
* <p>
* This defines the W3C standardized RDF 1.1 syntaxes like {@link #TURTLE} and
* {@link #JSONLD}. Note the existence of other RDF syntaxes that are not
* included here, e.g. <a href="http://www.w3.org/TeamSubmission/n3/">N3</a> and
* <a href="https://en.wikipedia.org/wiki/TriX_%28syntax%29">TriX</a>.
* <p>
* This class is package-protected, its static constants are exposed through
* {@link RDFSyntax}.
*
* @see RDFSyntax#w3cSyntaxes()
* @see <a href="https://www.w3.org/TR/rdf11-primer/#section-graph-syntax">RDF
* 1.1 Primer</a>
* @see org.apache.commons.rdf.experimental.RDFParser
*/
class W3CRDFSyntax implements RDFSyntax {
/**
* IRI representing a <a href="https://www.w3.org/ns/formats/">W3C RDF
* format</a>.
*/
private final static class FormatIRI implements IRI {
private static final String BASE = "http://www.w3.org/ns/formats/";
private final String format;
private FormatIRI(final String format) {
this.format = format;
}
@Override
public String getIRIString() {
return BASE + format;
}
@Override
public String ntriplesString() {
return "<" + getIRIString() + ">";
}
@Override
public String toString() {
return ntriplesString();
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null || !(obj instanceof IRI)) {
return false;
}
final IRI other = (IRI) obj;
return getIRIString().equals(other.getIRIString());
}
@Override
public int hashCode() {
return getIRIString().hashCode();
}
}
static final RDFSyntax JSONLD, TURTLE, NQUADS, NTRIPLES, RDFA, RDFXML, TRIG;
static final Set<RDFSyntax> syntaxes;
static {
// Initialize within static block to avoid inserting nulls
JSONLD = new W3CRDFSyntax("JSON-LD", "JSON-LD 1.0", "application/ld+json", ".jsonld", true);
TURTLE = new W3CRDFSyntax("Turtle", "RDF 1.1 Turtle", "text/turtle", ".ttl", false);
NQUADS = new W3CRDFSyntax("N-Quads", "RDF 1.1 N-Quads", "application/n-quads", ".nq", true);
NTRIPLES = new W3CRDFSyntax("N-Triples", "RDF 1.1 N-Triples", "application/n-triples", ".nt", false);
RDFXML = new W3CRDFSyntax("RDF_XML", "RDF 1.1 XML Syntax", "application/rdf+xml", ".rdf", false);
TRIG = new W3CRDFSyntax("TriG", "RDF 1.1 TriG", "application/trig", ".trig", true);
RDFA = new W3CRDFSyntax("RDFa", "HTML+RDFa 1.1", "text/html", ".html", false) {
private final Set<String> types = Collections.unmodifiableSet(new LinkedHashSet<>(
Arrays.asList("text/html", "application/xhtml+xml")));
private final Set<String> extensions = Collections.unmodifiableSet(new LinkedHashSet<>(
Arrays.asList(".html", ".xhtml")));
@Override
public Set<String> mediaTypes() {
return types;
}
@Override
public Set<String> fileExtensions() {
return extensions;
}
};
syntaxes = Collections.unmodifiableSet(new LinkedHashSet<>(
Arrays.asList(JSONLD, NQUADS, NTRIPLES, RDFA, RDFXML, TRIG, TURTLE)));
}
private final String title;
private final String mediaType;
private final String fileExtension;
private final boolean supportsDataset;
private final String name;
private final IRI iri;
private W3CRDFSyntax(final String name, final String title, final String mediaType, final String fileExtension, final boolean supportsDataset) {
this.name = name;
this.title = title;
this.mediaType = mediaType.toLowerCase(Locale.ROOT);
this.fileExtension = fileExtension.toLowerCase(Locale.ROOT);
this.supportsDataset = supportsDataset;
this.iri = new FormatIRI(name);
}
/**
* {@inheritDoc}
* <p>
* {@link W3CRDFSyntax} always defines media type in lower case, so
* {@link String#toLowerCase(Locale)} need not be called.
*
*/
@Override
public String mediaType() {
return mediaType;
}
/**
* {@inheritDoc}
* <p>
* {@link W3CRDFSyntax} always defines file extensions in lower case, so
* {@link String#toLowerCase(Locale)} need not be called.
*
*/
@Override
public String fileExtension() {
return fileExtension;
}
@Override
public boolean supportsDataset() {
return supportsDataset;
}
@Override
public String title() {
return title;
}
@Override
public String name() {
return name;
}
@Override
public IRI iri() {
return iri;
}
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof RDFSyntax)) {
return false;
}
final RDFSyntax other = (RDFSyntax) obj;
return mediaType.equals(other.mediaType().toLowerCase(Locale.ROOT));
}
@Override
public int hashCode() {
return mediaType.hashCode();
}
@Override
public String toString() {
return title;
}
}