blob: a089fac4cfba412ec845eebb7492a9a4d8d8d5c9 [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.any23.writer;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Optional;
import org.eclipse.rdf4j.model.BNode;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Literal;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.Value;
/**
* Implementation of <i>JSON</i> {@link TripleWriter}.
*
* @author Michele Mostarda (mostarda@fbk.eu)
*
* @deprecated since 2.3. Use {@link JSONLDWriter} instead.
*/
@Deprecated
public class JSONWriter extends TripleWriterHandler implements FormatWriter {
private JsonGenerator ps;
private boolean documentStarted = false;
public JSONWriter(OutputStream os) {
if (os == null) {
throw new NullPointerException("Output stream cannot be null.");
}
JsonFactory factory = new JsonFactory();
try {
this.ps = factory.createGenerator(os).disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET)
.enable(JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM).setPrettyPrinter(new DefaultPrettyPrinter());
} catch (IOException ex) {
}
}
private void start(boolean throwIfStarted) throws TripleHandlerException {
if (documentStarted) {
if (throwIfStarted) {
throw new IllegalStateException("Document already started.");
}
return;
}
documentStarted = true;
try {
ps.writeStartObject();
ps.writeFieldName("quads");
ps.writeStartArray();
} catch (IOException ex) {
throw new TripleHandlerException("IO Error while starting document.", ex);
}
}
@Override
public void startDocument(IRI documentIRI) throws TripleHandlerException {
start(true);
}
@Override
public void writeTriple(Resource s, IRI p, Value o, Resource g) throws TripleHandlerException {
start(false);
try {
ps.writeStartArray();
if (s instanceof IRI) {
printExplicitIRI(s.stringValue());
} else {
printBNode(s.stringValue());
}
printIRI(p.stringValue());
if (o instanceof IRI) {
printExplicitIRI(o.stringValue());
} else if (o instanceof BNode) {
printBNode(o.stringValue());
} else {
printLiteral((Literal) o);
}
printIRI(g == null ? null : g.stringValue());
ps.writeEndArray();
} catch (IOException ex) {
throw new TripleHandlerException("IO Error while writing triple", ex);
}
}
@Override
public void writeNamespace(String prefix, String uri) throws TripleHandlerException {
// Empty.
}
@Override
public void endDocument(IRI documentIRI) throws TripleHandlerException {
validateDocumentStarted();
}
@Override
public void close() throws TripleHandlerException {
start(false);
try {
ps.writeEndArray();
ps.writeEndObject();
ps.close();
} catch (IOException ex) {
throw new TripleHandlerException("IO Error while closing document.", ex);
} finally {
ps = null;
}
}
private void validateDocumentStarted() {
if (!documentStarted) {
throw new IllegalStateException("Document didn't start.");
}
}
private void printIRI(String uri) throws IOException {
printValue(uri);
}
private void printExplicitIRI(String uri) throws IOException {
printValue("uri", uri);
}
private void printBNode(String bnode) throws IOException {
printValue("bnode", bnode);
}
private void printLiteral(Literal literal) throws IOException {
ps.writeStartObject();
ps.writeStringField("type", "literal");
ps.writeStringField("value", literal.stringValue());
final Optional<String> language = literal.getLanguage();
ps.writeStringField("lang", language.isPresent() ? literal.getLanguage().get() : null);
final IRI datatype = literal.getDatatype();
ps.writeStringField("datatype", datatype != null ? datatype.stringValue() : null);
ps.writeEndObject();
}
private void printValue(String type, String value) throws IOException {
ps.writeStartObject();
ps.writeStringField("type", type);
ps.writeStringField("value", value);
ps.writeEndObject();
}
private void printValue(String value) throws IOException {
ps.writeString(value);
}
@Override
public boolean isAnnotated() {
return false; // TODO: add annotation support.
}
@Override
public void setAnnotated(boolean f) {
// Empty.
}
}