You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2022/08/15 09:52:02 UTC

[jena] branch main updated: JENA-2345: Better report message for DatatypeConstraint

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 d74b7b1464 JENA-2345: Better report message for DatatypeConstraint
     new 36de811f7b Merge pull request #1479 from afs/jena2345-sh-datatype
d74b7b1464 is described below

commit d74b7b1464075d9a095e7b136fbec86829e03e62
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Sun Aug 14 11:46:11 2022 +0100

    JENA-2345: Better report message for DatatypeConstraint
---
 .../engine/constraint/DatatypeConstraint.java      | 22 ++++++++++++++++------
 .../main/java/org/apache/jena/shacl/lib/ShLib.java |  7 +++++++
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DatatypeConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DatatypeConstraint.java
index 3f0be7f9e4..ecd364e703 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DatatypeConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DatatypeConstraint.java
@@ -83,15 +83,25 @@ public class DatatypeConstraint extends ConstraintTerm {
         }
         if ( ! n.isLiteral() )
             return new ReportItem(toString()+" : Not a literal", n);
-        String dtStr = vCxt.getShapesGraph().getPrefixMapping().qnameFor(dtURI);
+        try {
+            String dtStrExpected = formatDatatype(vCxt, rdfDatatype);
+            String dtStrActual = formatDatatype(vCxt, n.getLiteralDatatype());
+            String errMsg = String.format("%s: Expected %s : Actual %s : Node %s", toString(), dtStrExpected, dtStrActual, displayStr(n));
+            return new ReportItem(errMsg, n);
+        } catch (RuntimeException ex) {
+            String errMsg = toString() + "Got node: "+ n;
+            return new ReportItem(errMsg, n);
 
-        if ( dtStr == null ) {
-            Node dt = NodeFactory.createURI(n.getLiteralDatatypeURI());
-            dtStr = ShLib.displayStr(dt);
         }
+    }
 
-        String errMsg = toString()+" : Got datatype "+dtStr+" : Node "+displayStr(n);
-        return new ReportItem(errMsg, n);
+    private static String formatDatatype(ValidationContext vCxt, RDFDatatype dt) {
+        // Format including the data prefixes.
+        String dtStr = vCxt.getShapesGraph().getPrefixMapping().qnameFor(dt.getURI());
+        if ( dtStr == null )
+            // No prefix in the data.
+            dtStr = ShLib.displayStr(dt);
+        return dtStr;
     }
 
     @Override
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/lib/ShLib.java b/jena-shacl/src/main/java/org/apache/jena/shacl/lib/ShLib.java
index b4e2226275..127d711a3d 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/lib/ShLib.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/lib/ShLib.java
@@ -25,8 +25,10 @@ import java.util.*;
 import org.apache.jena.atlas.io.IndentedLineBuffer;
 import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.atlas.lib.StrUtils;
+import org.apache.jena.datatypes.RDFDatatype;
 import org.apache.jena.graph.Graph;
 import org.apache.jena.graph.Node;
+import org.apache.jena.graph.NodeFactory;
 import org.apache.jena.query.*;
 import org.apache.jena.rdf.model.RDFNode;
 import org.apache.jena.rdf.model.Resource;
@@ -202,6 +204,11 @@ public class ShLib {
         return displayStr(n, nodeFmtAbbrev);
     }
 
+    public static String displayStr(RDFDatatype dt) {
+        Node n = NodeFactory.createURI(dt.getURI());
+        return displayStr(n, nodeFmtAbbrev);
+    }
+
     public static String displayStr(Node n, NodeFormatter nodeFmt) {
         IndentedLineBuffer sw = new IndentedLineBuffer() ;
         nodeFmt.format(sw, n);