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;
+ }
}