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
