org.openrdf.rio.trix.TriXWriter Maven / Gradle / Ivy
/*
* Licensed to Aduna under one or more contributor license agreements.
* See the NOTICE.txt file distributed with this work for additional
* information regarding copyright ownership.
*
* Aduna licenses this file to you under the terms of the Aduna BSD
* License (the "License"); you may not use this file except in compliance
* with the License. See the LICENSE.txt file distributed with this work
* for the full License.
*
* 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.openrdf.rio.trix;
import static org.openrdf.rio.trix.TriXConstants.BNODE_TAG;
import static org.openrdf.rio.trix.TriXConstants.CONTEXT_TAG;
import static org.openrdf.rio.trix.TriXConstants.DATATYPE_ATT;
import static org.openrdf.rio.trix.TriXConstants.LANGUAGE_ATT;
import static org.openrdf.rio.trix.TriXConstants.NAMESPACE;
import static org.openrdf.rio.trix.TriXConstants.PLAIN_LITERAL_TAG;
import static org.openrdf.rio.trix.TriXConstants.ROOT_TAG;
import static org.openrdf.rio.trix.TriXConstants.TRIPLE_TAG;
import static org.openrdf.rio.trix.TriXConstants.TYPED_LITERAL_TAG;
import static org.openrdf.rio.trix.TriXConstants.URI_TAG;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import info.aduna.xml.XMLWriter;
import org.openrdf.model.BNode;
import org.openrdf.model.Literal;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.model.util.Literals;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFHandlerException;
import org.openrdf.rio.RDFWriter;
import org.openrdf.rio.helpers.RDFWriterBase;
import org.openrdf.rio.helpers.XMLWriterSettings;
/**
* An implementation of the RDFWriter interface that writes RDF documents in TriX format.
*
* @author Arjohn Kampman
*/
public class TriXWriter extends RDFWriterBase implements RDFWriter {
/*-----------*
* Variables *
*-----------*/
private XMLWriter xmlWriter;
private boolean writingStarted;
private boolean inActiveContext;
private Resource currentContext;
/*--------------*
* Constructors *
*--------------*/
/**
* Creates a new TriXWriter that will write to the supplied OutputStream.
*
* @param out
* The OutputStream to write the RDF/XML document to.
*/
public TriXWriter(OutputStream out) {
this(new XMLWriter(out));
}
/**
* Creates a new TriXWriter that will write to the supplied Writer.
*
* @param writer
* The Writer to write the RDF/XML document to.
*/
public TriXWriter(Writer writer) {
this(new XMLWriter(writer));
}
protected TriXWriter(XMLWriter xmlWriter) {
this.xmlWriter = xmlWriter;
this.xmlWriter.setPrettyPrint(true);
writingStarted = false;
inActiveContext = false;
currentContext = null;
}
/*---------*
* Methods *
*---------*/
public RDFFormat getRDFFormat() {
return RDFFormat.TRIX;
}
public void startRDF()
throws RDFHandlerException
{
if (writingStarted) {
throw new RDFHandlerException("Document writing has already started");
}
try {
if (getWriterConfig().get(XMLWriterSettings.INCLUDE_XML_PI)) {
xmlWriter.startDocument();
}
xmlWriter.setAttribute("xmlns", NAMESPACE);
xmlWriter.startTag(ROOT_TAG);
}
catch (IOException e) {
throw new RDFHandlerException(e);
}
finally {
writingStarted = true;
}
}
public void endRDF()
throws RDFHandlerException
{
if (!writingStarted) {
throw new RDFHandlerException("Document writing has not yet started");
}
try {
if (inActiveContext) {
xmlWriter.endTag(CONTEXT_TAG);
inActiveContext = false;
currentContext = null;
}
xmlWriter.endTag(ROOT_TAG);
xmlWriter.endDocument();
}
catch (IOException e) {
throw new RDFHandlerException(e);
}
finally {
writingStarted = false;
}
}
public void handleNamespace(String prefix, String name) {
// ignore
}
public void handleStatement(Statement st)
throws RDFHandlerException
{
if (!writingStarted) {
throw new RDFHandlerException("Document writing has not yet been started");
}
try {
Resource context = st.getContext();
if (inActiveContext && !contextsEquals(context, currentContext)) {
// Close currently active context
xmlWriter.endTag(CONTEXT_TAG);
inActiveContext = false;
}
if (!inActiveContext) {
// Open new context
xmlWriter.startTag(CONTEXT_TAG);
if (context != null) {
writeValue(context);
}
currentContext = context;
inActiveContext = true;
}
xmlWriter.startTag(TRIPLE_TAG);
writeValue(st.getSubject());
writeValue(st.getPredicate());
writeValue(st.getObject());
xmlWriter.endTag(TRIPLE_TAG);
}
catch (IOException e) {
throw new RDFHandlerException(e);
}
}
public void handleComment(String comment)
throws RDFHandlerException
{
try {
xmlWriter.comment(comment);
}
catch (IOException e) {
throw new RDFHandlerException(e);
}
}
/**
* Writes out the XML-representation for the supplied value.
*/
private void writeValue(Value value)
throws IOException, RDFHandlerException
{
if (value instanceof URI) {
URI uri = (URI)value;
xmlWriter.textElement(URI_TAG, uri.toString());
}
else if (value instanceof BNode) {
BNode bNode = (BNode)value;
xmlWriter.textElement(BNODE_TAG, bNode.getID());
}
else if (value instanceof Literal) {
Literal literal = (Literal)value;
URI datatype = literal.getDatatype();
String language = literal.getLanguage();
if (Literals.isLanguageLiteral(literal)) {
xmlWriter.setAttribute(LANGUAGE_ATT, language);
xmlWriter.textElement(PLAIN_LITERAL_TAG, literal.getLabel());
}
else {
xmlWriter.setAttribute(DATATYPE_ATT, datatype.toString());
xmlWriter.textElement(TYPED_LITERAL_TAG, literal.getLabel());
}
}
else {
throw new RDFHandlerException("Unknown value type: " + value.getClass());
}
}
private static final boolean contextsEquals(Resource context1, Resource context2) {
if (context1 == null) {
return context2 == null;
}
else {
return context1.equals(context2);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy