This is an automated email from the ASF dual-hosted git repository.
andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git
The following commit(s) were added to refs/heads/main by this push:
new ce31633f23 GH-3036: Use Titanium RdfQuadConsumer API
ce31633f23 is described below
commit ce31633f23c506acc5d258a1a5c973e7d520a752
Author: Andy Seaborne <[email protected]>
AuthorDate: Mon Mar 10 14:20:20 2025 +0000
GH-3036: Use Titanium RdfQuadConsumer API
---
.../org/apache/jena/riot/lang/LangJSONLD11.java | 68 +++++++++++++++++++++-
.../org/apache/jena/riot/system/JenaTitanium.java | 29 +++++++--
.../org/apache/jena/system/TestJenaTitanium.java | 9 ++-
3 files changed, 94 insertions(+), 12 deletions(-)
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/LangJSONLD11.java
b/jena-arq/src/main/java/org/apache/jena/riot/lang/LangJSONLD11.java
index 0ea7c70fd4..912e5f1e51 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/LangJSONLD11.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/LangJSONLD11.java
@@ -30,6 +30,8 @@ import com.apicatalog.jsonld.document.Document;
import com.apicatalog.jsonld.document.JsonDocument;
import com.apicatalog.jsonld.lang.Keywords;
import com.apicatalog.rdf.RdfDataset;
+import com.apicatalog.rdf.api.RdfConsumerException;
+import com.apicatalog.rdf.api.RdfQuadConsumer;
import jakarta.json.JsonObject;
import jakarta.json.JsonString;
@@ -38,14 +40,18 @@ import jakarta.json.JsonValue;
import jakarta.json.stream.JsonLocation;
import org.apache.jena.atlas.logging.Log;
import org.apache.jena.atlas.web.ContentType;
+import org.apache.jena.datatypes.RDFDatatype;
+import org.apache.jena.datatypes.TypeMapper;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.Triple;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.ReaderRIOT;
import org.apache.jena.riot.RiotException;
import org.apache.jena.riot.system.ErrorHandler;
-import org.apache.jena.riot.system.JenaTitanium;
import org.apache.jena.riot.system.ParserProfile;
import org.apache.jena.riot.system.StreamRDF;
import org.apache.jena.sparql.SystemARQ;
+import org.apache.jena.sparql.core.Quad;
import org.apache.jena.sparql.util.Context;
import org.apache.jena.sparql.util.Symbol;
@@ -113,7 +119,12 @@ public class LangJSONLD11 implements ReaderRIOT {
JsonLdOptions opts = getJsonLdOptions(baseURI, context);
RdfDataset dataset =
JsonLd.toRdf(document).options(opts).base(baseURI).get();
extractPrefixes(document, output::prefix);
- JenaTitanium.convert(dataset, profile, output);
+
+ RdfQuadConsumer consumer = new JsonLDToStreamRDF(output, profile);
+ JsonLd.toRdf(document).options(opts).provide(consumer);
+
+ // Titanium 1.5.0 and earlier.
+ // JenaTitanium.convert(dataset, profile, output);
}
/**
@@ -201,4 +212,57 @@ public class LangJSONLD11 implements ReaderRIOT {
JsonLdOptions opts = jenaContext.get(JSONLD_OPTIONS);
return (opts != null) ? opts : new JsonLdOptions();
}
+
+ static class JsonLDToStreamRDF implements RdfQuadConsumer {
+ private static long line = -1L;
+ private static long col = -1L;
+
+ private final StreamRDF output;
+ private final ParserProfile profile;
+
+ JsonLDToStreamRDF(StreamRDF output, ParserProfile profile) {
+ this.output = output;
+ this.profile = profile;
+ }
+
+ @Override
+ public RdfQuadConsumer quad(String subject, String predicate, String
object,
+ String datatype, String language, String
direction,
+ String graph) throws RdfConsumerException {
+ Node g = (graph == null) ? null : convertToNode(graph);
+ Node s = convertToNode(subject);
+ Node p = convertToNode(predicate);
+ Node o;
+
+ if ( RdfQuadConsumer.isLiteral(datatype, language, direction) )
+ o = convertToLiteral(object, datatype, language, direction);
+ else
+ o = convertToNode(object);
+
+ if ( g == null )
+ output.triple(Triple.create(s, p, o));
+ else
+ output.quad(Quad.create(g, s, p, o));
+ return this;
+ }
+ private Node convertToNode(String str) {
+ if ( RdfQuadConsumer.isBlank(str) ) {
+ str = str.substring(2); // Remove "_:"
+ Node bn = profile.getFactorRDF().createBlankNode(str);
+ return bn;
+ }
+ str = profile.resolveIRI(str, line, col);
+ Node iri = profile.createURI(str, line, col);
+ return iri;
+ }
+
+ private Node convertToLiteral(String lexical, String datatypeURI,
String language, String direction) {
+ if ( RdfQuadConsumer.isLangString(datatypeURI, language,
direction) )
+ return profile.createLangLiteral(lexical, language, line, col);
+// if ( RdfQuadConsumer.isDirLangString(datatype, language,
direction) )
+// return factory.createDirLangLiteral(str, language,
direction);
+ RDFDatatype dType =
TypeMapper.getInstance().getSafeTypeByName(datatypeURI) ;
+ return profile.createTypedLiteral(lexical, dType, line, col);
+ }
+ }
}
diff --git
a/jena-arq/src/main/java/org/apache/jena/riot/system/JenaTitanium.java
b/jena-arq/src/main/java/org/apache/jena/riot/system/JenaTitanium.java
index dce6574248..7c9f4cf95d 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/JenaTitanium.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/JenaTitanium.java
@@ -41,7 +41,9 @@ public class JenaTitanium {
public JenaTitaniumException(String msg) { super(msg); }
}
- /** Translate a Jena {@link DatasetGraph} to a Titanium JSON-LD dataset */
+ /**
+ * Translate a Jena {@link DatasetGraph} to a Titanium JSON-LD dataset
+ */
public static RdfDataset convert(DatasetGraph dataset) {
RdfProvider provider = RdfProvider.provider();
RdfDataset rdfDataset = provider.createDataset();
@@ -64,7 +66,11 @@ public class JenaTitanium {
return rdfDataset;
}
- /** Translate a Titanium JSON-LD dataset to a {@link DatasetGraph} */
+ /**
+ * Translate a Titanium JSON-LD dataset to a {@link DatasetGraph}
+ * @deprecated No longer used by the LangJSONLD_11
+ */
+ @Deprecated(forRemoval = true)
public static DatasetGraph convert(RdfDataset dataset, ParserProfile
parserProfile) {
DatasetGraph dsg = DatasetGraphFactory.createTxnMem();
StreamRDF dest = StreamRDFLib.dataset(dsg);
@@ -72,14 +78,27 @@ public class JenaTitanium {
return dsg;
}
- /** Translate a Titanium JSON-LD dataset to a {@link StreamRDF} */
+ /**
+ * Translate a Titanium JSON-LD dataset to a {@link DatasetGraph}
+ */
+ public static DatasetGraph convert(RdfDataset dataset) {
+ DatasetGraph dsg = DatasetGraphFactory.createTxnMem();
+ StreamRDF dest = StreamRDFLib.dataset(dsg);
+ convert(dataset, dest);
+ return dsg;
+ }
+
+ /**
+ * Translate a Titanium JSON-LD dataset to a {@link StreamRDF}
+ */
public static void convert(RdfDataset dataset, StreamRDF output) {
convert(dataset, RiotLib.dftProfile(), output);
}
- /** Translate a Titanium JSON-LD dataset to a {@link StreamRDF} */
+ /**
+ * Translate a Titanium JSON-LD dataset to a {@link StreamRDF}.
+ */
public static void convert(RdfDataset dataset, ParserProfile
parserProfile, StreamRDF output) {
- RdfProvider provider = RdfProvider.provider();
for ( RdfNQuad rdfQuad : dataset.toList() ) {
Optional<RdfResource> gn = rdfQuad.getGraphName();
RdfResource subj = rdfQuad.getSubject();
diff --git
a/jena-arq/src/test/java/org/apache/jena/system/TestJenaTitanium.java
b/jena-arq/src/test/java/org/apache/jena/system/TestJenaTitanium.java
index 19de9c176d..08c12f470e 100644
--- a/jena-arq/src/test/java/org/apache/jena/system/TestJenaTitanium.java
+++ b/jena-arq/src/test/java/org/apache/jena/system/TestJenaTitanium.java
@@ -29,13 +29,11 @@ import java.io.StringWriter;
import com.apicatalog.rdf.RdfDataset;
import com.apicatalog.rdf.io.RdfWriter;
import com.apicatalog.rdf.io.error.RdfWriterException;
-import com.apicatalog.rdf.io.nquad.NQuadsWriter;
import org.apache.jena.atlas.lib.StrUtils;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.riot.RDFParser;
import org.apache.jena.riot.system.JenaTitanium;
-import org.apache.jena.riot.system.RiotLib;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.DatasetGraphFactory;
import org.apache.jena.sparql.core.Quad;
@@ -98,7 +96,8 @@ public class TestJenaTitanium {
// Check the RdfDataset
try ( StringWriter writer = new StringWriter() ) {
- RdfWriter w = new NQuadsWriter(writer);
+ @SuppressWarnings("deprecation")
+ RdfWriter w = new com.apicatalog.rdf.io.nquad.NQuadsWriter(writer);
w.write(rdfDataset);
String s = writer.toString();
assertTrue(s.contains("_:b0"));
@@ -106,7 +105,7 @@ public class TestJenaTitanium {
assertTrue(s.contains("@en"));
}
- DatasetGraph dsg2 = JenaTitanium.convert(rdfDataset,
RiotLib.dftProfile());
+ DatasetGraph dsg2 = JenaTitanium.convert(rdfDataset);
assertTrue(IsoMatcher.isomorphic(dsg1, dsg2));
}
@@ -127,7 +126,7 @@ public class TestJenaTitanium {
RdfDataset rdfDataset = JenaTitanium.convert(dsg1);
// Try converting it back – it should not output any nulls.
- DatasetGraph dsg2 = JenaTitanium.convert(rdfDataset,
RiotLib.dftProfile());
+ DatasetGraph dsg2 = JenaTitanium.convert(rdfDataset);
dsg2.find().forEachRemaining(q->{
assertNotNull(q.getGraph());
assertTrue(q.isDefaultGraph());