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

commit e5a71d6956d5b40a3fee44cd52c154aeae000029
Author: Andy Seaborne <[email protected]>
AuthorDate: Fri Aug 9 19:27:30 2024 +0100

    RRX: Check for bad use of rdf:resource
---
 .../riot/lang/rdfxml/rrx/ParserRDFXML_SAX.java     |  7 ++++-
 .../rdfxml/rrx_stax_ev/ParserRDFXML_StAX_EV.java   |  5 ++++
 .../rdfxml/rrx_stax_sr/ParserRDFXML_StAX_SR.java   |  6 +++++
 .../jena/riot/lang/rdfxml/rrx/RunTestRDFXML.java   |  4 ++-
 .../apache/jena/riot/lang/rdfxml/rrx/TestRRX.java  | 31 +++++++++++++---------
 .../testing/RIOT/rrx-files/file-external-base.rdf  |  3 +++
 jena-arq/testing/RIOT/rrx-files/file-no-base.rdf   |  3 +++
 .../rrx-files/{warn01.rdf => parseType-warn.rdf}   |  0
 .../testing/RIOT/rrx-files/rdf-resource-node.rdf   | 14 ++++++++++
 9 files changed, 59 insertions(+), 14 deletions(-)

diff --git 
a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx/ParserRDFXML_SAX.java
 
b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx/ParserRDFXML_SAX.java
index e34ccc4329..c52d843727 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx/ParserRDFXML_SAX.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx/ParserRDFXML_SAX.java
@@ -665,7 +665,12 @@ class ParserRDFXML_SAX
      * ++ nodeElementURIs anyURI - ( coreSyntaxTerms | rdf:li | oldTerms ) */
 
     private void startNodeElement(String namespaceURI, String localName, 
String qName, Attributes attributes, Position position) {
-        // Top level object - maybe inside rdf:RDF
+        // Subject - maybe inside rdf:RDF
+
+        String rdfResourceStr = attributes.getValue(rdfNS, rdfResource);
+        if ( rdfResourceStr != null )
+            throw RDFXMLparseError("rdf:resource not allowed as attribute 
here: "+qName, position);
+
         Node thisSubject = attributesToSubjectNode(attributes, position);
         startNodeElementWithSubject(thisSubject, namespaceURI, localName, 
qName, attributes, position);
     }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_ev/ParserRDFXML_StAX_EV.java
 
b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_ev/ParserRDFXML_StAX_EV.java
index d64a501028..7ee9b26a88 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_ev/ParserRDFXML_StAX_EV.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_ev/ParserRDFXML_StAX_EV.java
@@ -419,6 +419,11 @@ class ParserRDFXML_StAX_EV {
         if ( ! allowedNodeElementURIs(startElt.getName()) )
             throw RDFXMLparseError("Not allowed as a node element tag: 
'"+str(startElt.getName())+"'", startElt);
 
+        // rdf:resource not allowed on a node element
+        Attribute attrRdfResource= startElt.getAttributeByName(rdfResource);
+        if ( attrRdfResource != null )
+            throw RDFXMLparseError("rdf:resource not allowed as attribute 
here: "+str(startElt.getName()), startElt);
+
         incIndent();
         boolean hasFrame = startElement(startElt);
         if ( subject == null )
diff --git 
a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_sr/ParserRDFXML_StAX_SR.java
 
b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_sr/ParserRDFXML_StAX_SR.java
index 65bc006b25..6c9487fc3c 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_sr/ParserRDFXML_StAX_SR.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_sr/ParserRDFXML_StAX_SR.java
@@ -399,6 +399,12 @@ class ParserRDFXML_StAX_SR {
         if ( ! allowedNodeElementURIs(qName) )
             throw RDFXMLparseError("Not allowed as a node element tag: 
'"+str(qName)+"'");
 
+
+        // rdf:resource not allowed on a node element
+        String rdfResourceStr = attribute(rdfResource);
+        if ( rdfResourceStr != null )
+            throw RDFXMLparseError("rdf:resource not allowed as attribute 
here: "+str(qName));
+
         incIndent();
         boolean hasFrame = startElement();
         if ( subject == null )
diff --git 
a/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/RunTestRDFXML.java
 
b/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/RunTestRDFXML.java
index da6648a05b..f9133a433e 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/RunTestRDFXML.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/RunTestRDFXML.java
@@ -95,7 +95,9 @@ public class RunTestRDFXML {
 
         // For a better order ...
         List<String> testfiles = List.of(
-                 "xml.rdf", "xml10.rdf", "xml11.rdf",
+                 "xml.rdf",
+                 "xml10.rdf",
+                 "xml11.rdf",
 
                  "basic01.rdf",
                  "basic02.rdf",
diff --git 
a/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/TestRRX.java 
b/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/TestRRX.java
index 8c16eec860..e88689c058 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/TestRRX.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/TestRRX.java
@@ -98,7 +98,19 @@ public class TestRRX {
         // Now valid. parseType="literal" -> parseType="Literal"
         // because ARP behaved that way.
         // Warning issued.
-        warningTest("warn01.rdf", 1);
+        warningTest("parseType-warn.rdf", 1);
+    }
+
+    // misc
+    @Test public void no_base_not_requiredBase01() {
+        // Call with no base; no base needed.
+        noBase("file-no-base.rdf");
+    }
+
+    @Test(expected=RiotException.class)
+    public void noBase_but_needed() {
+        // Call with no base; a base is needed => exception.
+        noBase("file-external-base.rdf");
     }
 
     // CIM
@@ -110,18 +122,11 @@ public class TestRRX {
         warningTest("cim_statements01.rdf", 2);
     }
 
-    // misc
-    @Test public void noBase01() {
-        // Call with no base; no base needed.
-        noBase("file-no-base.rdf");
-    }
-
-    @Test(expected=RiotException.class)
-    public void noBase02() {
-        // Call with no base; a base is needed => exception.
-        noBase("file-external-base.rdf");
+    @Test public void rdfResourceBad() {
+        errorTest("rdf-resource-node.rdf");
     }
 
+    /** Parse with no base set by the parser */
     private void noBase(String filename) {
         ReaderRIOTFactory factory = RDFParserRegistry.getFactory(lang);
         String fn = DIR+filename;
@@ -131,7 +136,7 @@ public class TestRRX {
         Graph graph = GraphFactory.createDefaultGraph();
         StreamRDF dest = StreamRDFLib.graph(graph);
         try ( InputStream in = IO.openFile(fn) ) {
-            reader.read(in, null, WebContent.ctRDFXML, dest, 
RIOT.getContext().copy());
+            reader.read(in, null/* No base*/, WebContent.ctRDFXML, dest, 
RIOT.getContext().copy());
         } catch (IOException ex) {
             throw IOX.exception(ex);
         }
@@ -151,6 +156,8 @@ public class TestRRX {
         RunTestRDFXML.runTestCompareARP(fn, factory, label, fn);
     }
 
+    // Run test, expecting an error.
+    // This is checked by error handler.
     private void errorTest(String filename) {
         errorTest(filename, true);
     }
diff --git a/jena-arq/testing/RIOT/rrx-files/file-external-base.rdf 
b/jena-arq/testing/RIOT/rrx-files/file-external-base.rdf
index 40509769ef..e13b8cbd50 100644
--- a/jena-arq/testing/RIOT/rrx-files/file-external-base.rdf
+++ b/jena-arq/testing/RIOT/rrx-files/file-external-base.rdf
@@ -1,3 +1,6 @@
+<?xml version='1.0'?>
+<!-- Licensed under the terms of https://www.apache.org/licenses/LICENSE-2.0 
-->
+
 <rdf:RDF
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
     xmlns="http://local/"; 
diff --git a/jena-arq/testing/RIOT/rrx-files/file-no-base.rdf 
b/jena-arq/testing/RIOT/rrx-files/file-no-base.rdf
index b49b5a3fd0..789ef6dbfb 100644
--- a/jena-arq/testing/RIOT/rrx-files/file-no-base.rdf
+++ b/jena-arq/testing/RIOT/rrx-files/file-no-base.rdf
@@ -1,3 +1,6 @@
+<?xml version='1.0'?>
+<!-- Licensed under the terms of https://www.apache.org/licenses/LICENSE-2.0 
-->
+
 <rdf:RDF
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
     xmlns="http://local/"; 
diff --git a/jena-arq/testing/RIOT/rrx-files/warn01.rdf 
b/jena-arq/testing/RIOT/rrx-files/parseType-warn.rdf
similarity index 100%
rename from jena-arq/testing/RIOT/rrx-files/warn01.rdf
rename to jena-arq/testing/RIOT/rrx-files/parseType-warn.rdf
diff --git a/jena-arq/testing/RIOT/rrx-files/rdf-resource-node.rdf 
b/jena-arq/testing/RIOT/rrx-files/rdf-resource-node.rdf
new file mode 100644
index 0000000000..ee3bbab131
--- /dev/null
+++ b/jena-arq/testing/RIOT/rrx-files/rdf-resource-node.rdf
@@ -0,0 +1,14 @@
+<?xml version='1.0'?>
+<!-- Licensed under the terms of https://www.apache.org/licenses/LICENSE-2.0 
-->
+
+<!-- Out of place rdf:resource -->
+<rdf:RDF
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+    xmlns="http://local/"; 
+    xmlns:ex="http://example/"; >
+
+  <!-- rdf:resource on rdf:Description -->
+  <rdf:Description rdf:about="http://example/s"; 
rdf:resource="http://example/foo";>
+    <ex:property>text</ex:property>
+  </rdf:Description>
+</rdf:RDF>
\ No newline at end of file

Reply via email to