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());

Reply via email to