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 5ee25dcc05f86ab1a0bd77f6caf014ae8f3eba85
Author: Andy Seaborne <[email protected]>
AuthorDate: Mon Mar 16 21:56:42 2026 +0000

    GH-3790: RDF 1.2 features are errors in ARP
---
 .../apache/jena/rdfxml/arp1/ARPErrorNumbers.java   |  6 +++
 .../apache/jena/rdfxml/arp1/impl/ElementLexer.java |  1 -
 .../org/apache/jena/rdfxml/arp1/impl/Names.java    | 15 ++++--
 .../apache/jena/rdfxml/arp1/impl/QNameLexer.java   | 53 +++++++++++++++-------
 .../jena/rdfxml/arp1/impl/XMLBaselessContext.java  |  4 +-
 .../rdfxml/arp1/states/WantPropertyElement.java    |  7 +++
 .../apache/jena/graph/test/AbstractTestGraph.java  |  1 -
 7 files changed, 63 insertions(+), 24 deletions(-)

diff --git 
a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/ARPErrorNumbers.java 
b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/ARPErrorNumbers.java
index ec444cf6e0..a7f4b8f563 100644
--- a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/ARPErrorNumbers.java
+++ b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/ARPErrorNumbers.java
@@ -522,6 +522,12 @@ For input involving no errors, ARP creates triples in 
accordance with the RDF/XM
      */
     public int ERR_RESOLVING_AGAINST_RELATIVE_BASE = 215;
 
+    /**
+     * RDF 1.2 feature -- ParserType="Triple", rdf:version
+     * Not supported by ARP.
+     */
+    public int ERR_RDF12 = 216;
+
       /**   No longer used. (E300)
        * @deprecated Not used.
     **/
diff --git 
a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/ElementLexer.java 
b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/ElementLexer.java
index e667bcb69e..67e9bf84b8 100644
--- a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/ElementLexer.java
+++ b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/ElementLexer.java
@@ -67,7 +67,6 @@ public class ElementLexer extends QNameLexer  {
                 r==E_LI?ERR_LI_AS_TYPE:
                 ERR_BAD_RDF_ELEMENT,
                 getQName() + " is not allowed as an element tag here.");
-
     }
     @Override
     void deprecatedAttribute(Taint me,int r) throws SAXParseException {
diff --git 
a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/Names.java 
b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/Names.java
index ced8527180..80fce906a5 100644
--- a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/Names.java
+++ b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/Names.java
@@ -28,13 +28,13 @@ public interface Names {
 
     String xmlns = "http://www.w3.org/XML/1998/namespace".intern();
     String xmlnsns = "http://www.w3.org/2000/xmlns/";;
-    
+
     int A_XMLBASE = 1;
 
     int A_XMLLANG = 2;
 
     int A_XML_OTHER = 4;
-    
+
     int A_XMLNS = 32768;
 
     int A_ID = 8;
@@ -52,9 +52,16 @@ public interface Names {
     int A_TYPE = 512;
 
     int A_DEPRECATED = 1024;
-    
+
     int A_BAGID = 16384;
 
+    // RDF 1.2 rdf:version. Not supported by ARP
+    int A_VERSION = 64*1024;
+
+    // XML International Tag Set ("its:") - not supported by ARP
+    int A_ITS_VERSION = 128*1024;
+    int A_ITS_DIR = 256*1024;
+
     int E_LI = 2048;
 
     int E_RDF = 4096;
@@ -78,7 +85,7 @@ public interface Names {
     ANode RDF_OBJECT = URIReference.createNoChecks((rdfns + "object"));
 
     ANode RDF_NIL        = URIReference.createNoChecks(rdfns+"nil");
-    
+
     ANode RDF_FIRST = URIReference.createNoChecks(rdfns+"first");
     ANode RDF_REST       = URIReference.createNoChecks(rdfns+"rest");
 }
diff --git 
a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/QNameLexer.java 
b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/QNameLexer.java
index 2b4134259d..a9ab6957a6 100644
--- a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/QNameLexer.java
+++ b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/QNameLexer.java
@@ -25,22 +25,24 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.jena.rdfxml.arp1.ARPErrorNumbers;
+import org.apache.jena.rdfxml.arp1.ParseException;
 import org.apache.jena.rdfxml.arp1.states.Frame;
+import org.apache.jena.vocabulary.ITS;
 import org.xml.sax.SAXParseException;
 
 abstract public class QNameLexer implements Names, ARPErrorNumbers {
     final int bad;
     final int select;
     final Frame frame;
-    
-    
+
+
     public QNameLexer(Frame f, int good, int bad) {
         bad &= ~good;
         this.bad = bad;
         this.select = good|bad;
         this.frame = f;
     }
-    
+
     private int xml(String wanted, int fl) {
         return
              (fl &select)== fl
@@ -51,12 +53,12 @@ abstract public class QNameLexer implements Names, 
ARPErrorNumbers {
     abstract boolean isInRdfns(Taint taintMe) throws SAXParseException;
     abstract void error(Taint taintMe,int rslt) throws SAXParseException;
     abstract void deprecatedAttribute(Taint me,int rslt) throws 
SAXParseException;
-    
+
 
     abstract String getLocalName();
     abstract String getUri();
     abstract String getQName();
-    
+
     private int rdf(Taint taintMe,String wanted, int fl) throws 
SAXParseException {
         if ((fl &select)== fl
           && wanted.equals(getLocalName())) {
@@ -96,7 +98,7 @@ abstract public class QNameLexer implements Names, 
ARPErrorNumbers {
             // How disgusting.
             // When xmlns="eg:a"
             // xmlns is the prefix ...
-            if (this.getUri().equals(xmlnsns)) 
+            if (this.getUri().equals(xmlnsns))
                 return A_XMLNS;
             throw e;
         }
@@ -125,33 +127,50 @@ abstract public class QNameLexer implements Names, 
ARPErrorNumbers {
             return rdf(taintMe,"ID",A_ID);
         case 'n': /* nodeID */
             return rdf(taintMe,"nodeID",A_NODEID);
-        case 'a': /* about aboutEach aboutEachPrefix */
-            switch (getLocalName().length()) {
-            case 5:
-                return rdf(taintMe,"about",A_ABOUT);
-            case 9:
-                return rdf(taintMe,"aboutEach",A_DEPRECATED);
-            case 15:
-                return rdf(taintMe,"aboutEachPrefix",A_DEPRECATED);
+        case 'a': {
+            switch (getLocalName()) {
+                case "about":
+                    return rdf(taintMe,"about",A_ABOUT);
+                case "aboutEach":
+                    return rdf(taintMe,"aboutEach",A_DEPRECATED);
+                case "aboutEachPrefix":
+                    return rdf(taintMe,"aboutEachPrefix",A_DEPRECATED);
+                case "annotationId", "annotation": {
+                    throw new ParseException(ARPErrorNumbers.ERR_RDF12, 
location(), "RDF 1.2 not supported by ARP: rdf:"+getLocalName());
+                }
             }
             break;
+        }
         case 'r': /* resource */
             return rdf(taintMe,"resource",A_RESOURCE);
         case 'R': /* resource */
             return rdf(taintMe,"RDF",E_RDF);
-        case 'd': /* datatype */
+        case 'd': { /* datatype */
+            if ( ITS.uri.equals(getUri()) && "dir".equals(getLocalName()) )
+                throw new ParseException(ARPErrorNumbers.ERR_RDF12, 
location(), "RDF 1.2 not supported by ARP: its:"+getLocalName());
             return rdf(taintMe,"datatype",A_DATATYPE);
+        }
         case 't': /* type */
             return rdf(taintMe,"type",A_TYPE);
         case 'p': /* parseType */
             return rdf(taintMe,"parseType",A_PARSETYPE);
         case 'D': /* Description */
             return rdf(taintMe,"Description",E_DESCRIPTION);
+        case 'v':
+            if ( "version".equals(getLocalName()) ) {
+                if ( rdfns.equals(getUri()) )
+                    throw new ParseException(ARPErrorNumbers.ERR_RDF12, 
location(), "RDF 1.2 not supported by ARP: rdf:"+getLocalName());
+                if ( ITS.uri.equals(getUri()) ) {}
+                throw new ParseException(ARPErrorNumbers.ERR_RDF12, 
location(), "RDF 1.2 not supported by ARP: rdf:"+getLocalName());
+            }
         }
         return 0;
     }
 
-    
+    private ARPLocation location() {
+        return new ARPLocation(frame.arp.getLocator());
+    }
+
 //    static final Set rdfnames = new HashSet();
 //    static {
 //        rdfnames.add("Description");
@@ -227,6 +246,6 @@ abstract public class QNameLexer implements Names, 
ARPErrorNumbers {
         return knownRDFProperties.contains(name);
     }
 
-    
+
 
 }
diff --git 
a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/XMLBaselessContext.java
 
b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/XMLBaselessContext.java
index dfe3c89c5a..a995c806d3 100644
--- 
a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/XMLBaselessContext.java
+++ 
b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/impl/XMLBaselessContext.java
@@ -53,7 +53,9 @@ public class XMLBaselessContext extends AbsXMLContext 
implements ARPErrorNumbers
         case ERR_RESOLVING_AGAINST_RELATIVE_BASE:
             errmsg = "Resolving against relative URI <"+baseURI+">";
             break;
-            default:
+        case ERR_RDF12:
+            errmsg = "RDF 1.2 not supported by ARP";
+        default:
                 throw new IllegalArgumentException("Unknown error code: "+eno);
         }
     }
diff --git 
a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/states/WantPropertyElement.java
 
b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/states/WantPropertyElement.java
index db7919c43c..501511066e 100644
--- 
a/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/states/WantPropertyElement.java
+++ 
b/jena-core/src/main/java/org/apache/jena/rdfxml/arp1/states/WantPropertyElement.java
@@ -23,6 +23,8 @@ package org.apache.jena.rdfxml.arp1.states;
 
 import java.util.ArrayList;
 
+import org.apache.jena.rdfxml.arp1.ARPErrorNumbers;
+import org.apache.jena.rdfxml.arp1.ParseException;
 import org.apache.jena.rdfxml.arp1.impl.*;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXParseException;
@@ -174,10 +176,15 @@ public class WantPropertyElement extends Frame implements 
WantsObjectFrameI,
             }
             return new WantPropertyElement(this, x);
         }
+        if (pt.equals("Triple")) {
+            ARPLocation aLoc = new ARPLocation(arp.getLocator());
+            throw new ParseException(ARPErrorNumbers.ERR_RDF12, aLoc, "RDF 1.2 
not supported by ARP: rdf:parseType=\"Triple\"");
+        }
         if (!pt.equals("Literal")) {
             warning(WARN_UNKNOWN_PARSETYPE, "Unknown rdf:parseType: '" + pt
                     + "' (treated as 'Literal')");
         }
+
         return new OuterXMLLiteral(this, x, pt);
     }
 
diff --git 
a/jena-core/src/test/java/org/apache/jena/graph/test/AbstractTestGraph.java 
b/jena-core/src/test/java/org/apache/jena/graph/test/AbstractTestGraph.java
index ec62e37aa7..6285854891 100644
--- a/jena-core/src/test/java/org/apache/jena/graph/test/AbstractTestGraph.java
+++ b/jena-core/src/test/java/org/apache/jena/graph/test/AbstractTestGraph.java
@@ -826,7 +826,6 @@ public abstract class AbstractTestGraph extends 
GraphTestBase {
     }
 
     private void testIsomorphismFile(int n, String lang, String suffix, 
boolean result) {
-
         Graph g1 = getNewGraph();
         Graph g2 = getNewGraph();
         Model m1 = ModelFactory.createModelForGraph(g1);

Reply via email to