blob: b34ebebf36d5fb97ee4b1d81ae1edf277e742021 [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.extractor.rdf;
import java.util.Map.Entry;
import java.util.UUID;
import org.apache.any23.extractor.ExtractionResult;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.ValueFactory;
import com.github.jsonldjava.core.JsonLdConsts;
import com.github.jsonldjava.core.JsonLdTripleCallback;
import com.github.jsonldjava.core.RDFDataset;
/**
* @author Hans Brende (hansbrende@apache.org)
*/
class JSONLDJavaSink implements JsonLdTripleCallback {
private static final String BNODE_PREFIX = JsonLdConsts.BLANK_NODE_PREFIX;
private final ExtractionResult handler;
private final ValueFactory valueFactory;
private final String bNodeUniquifier;
JSONLDJavaSink(ExtractionResult handler, ValueFactory valueFactory) {
this.handler = handler;
this.valueFactory = valueFactory;
this.bNodeUniquifier = "n" + UUID.randomUUID().toString().replace("-", "") + "x";
}
private Resource createResource(RDFDataset.Node resource) {
String value = resource == null ? null : resource.getValue();
if (value != null && value.startsWith(BNODE_PREFIX)) {
String bNodeId = value.substring(BNODE_PREFIX.length());
if (bNodeId.length() < 32) { // not globally unique; will collide with other blank node ids
if (bNodeId.isEmpty()) {
bNodeId = Integer.toHexString(System.identityHashCode(resource));
}
bNodeId = bNodeUniquifier + bNodeId;
}
return valueFactory.createBNode(bNodeId);
}
return valueFactory.createIRI(value);
}
private void writeQuad(RDFDataset.Node sNode, RDFDataset.Node pNode, Value o, String graphName) {
if (graphName != null && graphName.startsWith(BNODE_PREFIX)) {
// TODO support blank node graph names in Any23
return;
}
Resource s = createResource(sNode);
IRI p = valueFactory.createIRI(pNode == null ? null : pNode.getValue());
if (s == null || p == null || o == null) {
return;
}
if (graphName == null || graphName.isEmpty() || JsonLdConsts.DEFAULT.equalsIgnoreCase(graphName)) {
handler.writeTriple(s, p, o);
} else {
handler.writeTriple(s, p, o, valueFactory.createIRI(graphName));
}
}
@Override
public Object call(final RDFDataset dataset) {
for (Entry<String, String> nextNamespace : dataset.getNamespaces().entrySet()) {
handler.writeNamespace(nextNamespace.getKey(), nextNamespace.getValue());
}
for (String graphName : dataset.keySet()) {
for (RDFDataset.Quad quad : dataset.getQuads(graphName)) {
RDFDataset.Node s = quad.getSubject();
RDFDataset.Node p = quad.getPredicate();
RDFDataset.Node o = quad.getObject();
if (o == null || !o.isLiteral()) {
writeQuad(s, p, createResource(o), graphName);
} else {
String lang = o.getLanguage();
String datatype = o.getDatatype();
String literal = o.getValue();
if (lang != null && !lang.isEmpty()
&& (datatype == null || datatype.indexOf(':') < 0
|| JsonLdConsts.RDF_LANGSTRING.equalsIgnoreCase(datatype)
|| JsonLdConsts.XSD_STRING.equalsIgnoreCase(datatype))) {
writeQuad(s, p, valueFactory.createLiteral(literal, lang), graphName);
} else if (datatype != null && !datatype.isEmpty()) {
writeQuad(s, p, valueFactory.createLiteral(literal, valueFactory.createIRI(datatype)),
graphName);
} else {
writeQuad(s, p, valueFactory.createLiteral(literal), graphName);
}
}
}
}
return null;
}
}