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 1f02c0dd20 GH-3806: Allow URIs as values of ja:cxtName.
1f02c0dd20 is described below

commit 1f02c0dd203866e2ccd9dc6dd1f5459f91c366d3
Author: Claus Stadler <[email protected]>
AuthorDate: Thu Mar 19 11:55:21 2026 +0100

    GH-3806: Allow URIs as values of ja:cxtName.
---
 .../jena/sparql/core/assembler/AssemblerUtils.java | 13 +++-
 .../org/apache/jena/sparql/core/TestContext.java   | 72 ++++++++++++++++++++++
 2 files changed, 83 insertions(+), 2 deletions(-)

diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
index 83a0c7b53e..4d99ba1c65 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
@@ -36,6 +36,7 @@ import org.apache.jena.query.QuerySolutionMap;
 import org.apache.jena.query.ResultSet;
 import org.apache.jena.rdf.model.Model;
 import org.apache.jena.rdf.model.ModelFactory;
+import org.apache.jena.rdf.model.RDFNode;
 import org.apache.jena.rdf.model.Resource;
 import org.apache.jena.rdf.model.ResourceFactory;
 import org.apache.jena.riot.RDFDataMgr;
@@ -232,9 +233,17 @@ public class AssemblerUtils
         while ( rs.hasNext() )
         {
             QuerySolution soln = rs.next();
-            String name = soln.getLiteral("name").getLexicalForm();
+            RDFNode key = soln.get("name");
+            String name;
+            if (key.isLiteral()) {
+                String rawName = key.asLiteral().getLexicalForm();
+                name = MappingRegistry.mapPrefixName(rawName);
+            } else if (key.isURIResource()) {
+                name = key.asResource().getURI();
+            } else {
+                throw new ARQException("Value of ja:cxtName must be a literal 
or URI.");
+            }
             String value = soln.getLiteral("value").getLexicalForm();  // 
Works for numbers as well!
-            name = MappingRegistry.mapPrefixName(name);
             Symbol symbol = Symbol.create(name);
             if ( "undef".equalsIgnoreCase(value) )
                 context.remove(symbol);
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/core/TestContext.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/core/TestContext.java
index afd6de3441..6b31e4702b 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/core/TestContext.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/TestContext.java
@@ -28,7 +28,15 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.junit.jupiter.api.Test;
 
+import org.apache.jena.assembler.JA;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.rdf.model.Model;
+import org.apache.jena.rdf.model.ModelFactory;
+import org.apache.jena.rdf.model.RDFNode;
+import org.apache.jena.rdf.model.Resource;
 import org.apache.jena.sparql.ARQException;
+import org.apache.jena.sparql.core.assembler.AssemblerUtils;
 import org.apache.jena.sparql.util.Context;
 import org.apache.jena.sparql.util.Symbol;
 
@@ -114,4 +122,68 @@ public class TestContext {
         // Bad. Long for Integer.
         assertThrows(ARQException.class, ()->cxt.getInt(p1, -2));
     }
+
+    /**
+     * Test context parsing where the key is a literal.
+     *
+     * <pre>{@code
+     * PREFIX ja: <http://jena.hpl.hp.com/2005/11/Assembler#>
+     * PREFIX eg: <http://www.example.org/>
+     *
+     * [] ja:context [ ja:cxtName "key" ; ja:cxtValue true ] .
+     * }</pre>
+     */
+    @Test
+    public void testCxtAssemblerLiteral() {
+        Node keyNode = 
NodeFactory.createLiteralString("http://www.example.org/key";);
+        Symbol keySym = Symbol.create(keyNode.getLiteralLexicalForm());
+        Context cxt = parseTestContext(keyNode);
+        assertTrue(cxt.isTrue(keySym));
+    }
+
+    /**
+     * Test context parsing where the key is a URI.
+     *
+     * <pre>{@code
+     * PREFIX ja: <http://jena.hpl.hp.com/2005/11/Assembler#>
+     * PREFIX eg: <http://www.example.org/>
+     *
+     * [] ja:context [ ja:cxtName eg:key ; ja:cxtValue true ] .
+     * }</pre>
+     */
+    @Test
+    public void testCxtAssemblerURI() {
+        Node keyNode = NodeFactory.createURI("http://www.example.org/key";);
+        Symbol keySym = Symbol.create(keyNode.getURI());
+        Context cxt = parseTestContext(keyNode);
+        assertTrue(cxt.isTrue(keySym));
+    }
+
+    @Test
+    public void testCxtAssemblerInvalid() {
+        assertThrows(ARQException.class, () -> {
+            Node keyNode = NodeFactory.createBlankNode();
+            parseTestContext(keyNode);
+        });
+    }
+    /**
+     * Create a test context from the following RDF model.
+     *
+     * <pre>{@code
+     * PREFIX ja: <http://jena.hpl.hp.com/2005/11/Assembler#>
+     * PREFIX eg: <http://www.example.org/>
+     *
+     * [] ja:context [ ja:cxtName ${KEY_NODE} ; ja:cxtValue true ] .
+     * }</pre>
+     */
+    private static Context parseTestContext(Node key) {
+        Model model = ModelFactory.createDefaultModel();
+        RDFNode k = model.asRDFNode(key);
+        Resource cxtRes = model.createResource()
+            .addProperty(JA.cxtName, k)
+            .addLiteral(JA.cxtValue, true);
+        Resource r = model.createResource().addProperty(JA.context, cxtRes);
+        Context cxt = AssemblerUtils.parseContext(r);
+        return cxt;
+    }
 }

Reply via email to