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/04/24 08:52:22 UTC

[jena] branch main updated: JENA-2324: Property params in SHACLC

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 5a9f520334 JENA-2324: Property params in SHACLC
     new cd03b4739e Merge pull request #1265 from afs/jena2324_shaclc
5a9f520334 is described below

commit 5a9f520334f72891a5d363f20591826bed5a75a9
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Thu Apr 21 17:47:18 2022 +0100

    JENA-2324: Property params in SHACLC
---
 .../src/main/java/org/apache/jena/atlas/io/IO.java |  4 +-
 jena-cmds/src/main/java/shacl/shacl_parse.java     | 24 +++++++---
 jena-shacl/shaclc/shaclc.jj                        |  2 +-
 .../reader/parser/ShaclCompactParserJJ.java        | 56 +++++++++++++++-------
 .../engine/constraint/DisjointConstraint.java      |  4 +-
 .../org/apache/jena/shacl/parser/Constraints.java  | 16 +++++--
 .../files/local/shaclc-syntax/propertyParams.shc   |  6 +++
 7 files changed, 79 insertions(+), 33 deletions(-)

diff --git a/jena-base/src/main/java/org/apache/jena/atlas/io/IO.java b/jena-base/src/main/java/org/apache/jena/atlas/io/IO.java
index d810bd1aa4..031ab4793e 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/io/IO.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/io/IO.java
@@ -272,8 +272,8 @@ public class IO
         catch (IOException ex) { IO.exception(ex); return false; }
     }
 
-    public static boolean exists(String directory) {
-        Path path = Path.of(directory);
+    public static boolean exists(String fsname) {
+        Path path = Path.of(fsname);
         return Files.exists(path);
     }
 
diff --git a/jena-cmds/src/main/java/shacl/shacl_parse.java b/jena-cmds/src/main/java/shacl/shacl_parse.java
index f282701227..7e3e49a612 100644
--- a/jena-cmds/src/main/java/shacl/shacl_parse.java
+++ b/jena-cmds/src/main/java/shacl/shacl_parse.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
+import org.apache.jena.atlas.io.IO;
 import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.atlas.lib.StreamOps;
 import org.apache.jena.atlas.logging.LogCtl;
@@ -73,7 +74,7 @@ public class shacl_parse extends CmdGeneral {
 
     public shacl_parse(String[] argv) {
         super(argv) ;
-        super.add(argOutput,  "--output=",      "Output formats: RDF, compact, text (default, terse)");
+        super.add(argOutput,  "--output=",      "Output formats: RDF, compact, text (default, text)");
         super.add(argSyntax,  "--syntax=NAME",  "Set syntax (otherwise syntax guessed from file extension)");
         super.add(argBase,    "--base=URI",     "Set the base URI (does not apply to N-triples and N-Quads)");
     }
@@ -103,14 +104,14 @@ public class shacl_parse extends CmdGeneral {
                      );
              printText = values.remove("text") || values.remove("t");
              printCompact = values.remove("compact") || values.remove("c");
-             printRDF = values.remove("rdf") || values.remove("r");
+             printRDF = values.remove("rdf") || values.remove("r") || values.remove("ttl");
              if ( values.remove("all") || values.remove("a") ) {
                  printCompact = true;
                  printRDF = true;
                  printText = true;
              }
              if ( ! values.isEmpty() )
-                 throw new CmdException("Formats not recognized: "+values+" : Formats are 'text', 'compact', 'rdf' and 'all'");
+                 throw new CmdException("Formats not recognized: "+values+" : Formats are 'text', 'compact', 'rdf','ttl' and 'all'");
 
          } else {
              printCompact = false;
@@ -149,6 +150,17 @@ public class shacl_parse extends CmdGeneral {
 
     @Override
     protected void exec() {
+        boolean filesOK = true;
+        for ( String fn : positionals ) {
+            if ( ! "-".equals(fn) ) {
+                if ( ! IO.exists(fn) ) {
+                    System.err.println("File not found: "+fn);
+                    filesOK = false;
+                }
+            }
+        }
+        if ( ! filesOK )
+            throw new CmdException("File(s) not found");
         boolean multipleFiles = (positionals.size() > 1) ;
         positionals.forEach(fn->{
             exec(fn, multipleFiles);
@@ -163,16 +175,14 @@ public class shacl_parse extends CmdGeneral {
         try {
             Graph g = parseFile(fn);
             shapes = Shapes.parse(g);
-        }
-        catch ( RiotException ex ) { /*ErrorHandler logged this */ return; }
-        catch (ShaclParseException | ShaclcParseException /*| RiotException*/ ex) {
+        } catch (ShaclParseException | ShaclcParseException | RiotNotFoundException ex) {
             // Errors parsing the RDF.
             // Errors parsing SHACL Compact Syntax.
             if ( multipleFiles )
                 err.println(fn+" : ");
             err.println(ex.getMessage());
             return;
-        }
+        } catch ( RiotException ex ) { /*ErrorHandler logged this */ return; }
 
         boolean outputByPrev = false;
 
diff --git a/jena-shacl/shaclc/shaclc.jj b/jena-shacl/shaclc/shaclc.jj
index d3ab2ed144..6d76506ac7 100644
--- a/jena-shacl/shaclc/shaclc.jj
+++ b/jena-shacl/shaclc/shaclc.jj
@@ -267,7 +267,7 @@ void shapeRef(boolean inPropertyShape) : { Token t; String iriStr; }
 
 void propertyValue() : { String s; Node n; List<Node> x; }
 {
-  s = nodeParam()
+  s = propertyParam()
   <EQUALS>
   //value = iriOrLiteralOrArray()
   (
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJ.java b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJ.java
index e54f4bf599..0217b252fb 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJ.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/compact/reader/parser/ShaclCompactParserJJ.java
@@ -415,10 +415,6 @@ rPropertyShape(p);
       case 6:
       case 7:
       case 8:
-      case 9:
-      case 10:
-      case 11:
-      case 12:
       case 13:
       case 14:
       case 15:
@@ -440,6 +436,18 @@ rPropertyShape(p);
       case 31:
       case 32:
       case 33:
+      case 34:
+      case 35:
+      case 36:
+      case 37:
+      case 38:
+      case 39:
+      case 40:
+      case 41:
+      case 42:
+      case 43:
+      case 44:
+      case 45:
       case AT:
       case BANG:
       case LBRACE:
@@ -467,10 +475,6 @@ rPropertyShape(p);
       case 6:
       case 7:
       case 8:
-      case 9:
-      case 10:
-      case 11:
-      case 12:
       case 13:
       case 14:
       case 15:
@@ -492,6 +496,18 @@ rPropertyShape(p);
       case 31:
       case 32:
       case 33:
+      case 34:
+      case 35:
+      case 36:
+      case 37:
+      case 38:
+      case 39:
+      case 40:
+      case 41:
+      case 42:
+      case 43:
+      case 44:
+      case 45:
       case AT:
       case BANG:
       case LBRACE:
@@ -576,10 +592,6 @@ finishPropertyNot(b);
       shapeRef(true);
       break;
       }
-    case 9:
-    case 10:
-    case 11:
-    case 12:
     case 13:
     case 14:
     case 15:
@@ -600,7 +612,19 @@ finishPropertyNot(b);
     case 30:
     case 31:
     case 32:
-    case 33:{
+    case 33:
+    case 34:
+    case 35:
+    case 36:
+    case 37:
+    case 38:
+    case 39:
+    case 40:
+    case 41:
+    case 42:
+    case 43:
+    case 44:
+    case 45:{
       propertyValue();
       break;
       }
@@ -716,7 +740,7 @@ rShapeRef(inPropertyShape, iriStr);
   }
 
   final public void propertyValue() throws ParseException {String s; Node n; List<Node> x;
-    s = nodeParam();
+    s = propertyParam();
     jj_consume_token(EQUALS);
     switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     case TRUE:
@@ -1449,10 +1473,10 @@ lex = unescapeStr(lex,  t.beginLine, t.beginColumn) ;
       jj_la1_init_3();
    }
    private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] {0x0,0x0,0x0,0x0,0x0,0x2,0x0,0xfffffe00,0xfffffe00,0xfffffe00,0x0,0x0,0x0,0xfffffff8,0xfffffff8,0x0,0x0,0xfffffff8,0x0,0x1f8,0x0,0x0,0xfffffe00,0xffffe000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+      jj_la1_0 = new int[] {0x0,0x0,0x0,0x0,0x0,0x2,0x0,0xfffffe00,0xfffffe00,0xfffffe00,0x0,0x0,0x0,0xffffe1f8,0xffffe1f8,0x0,0x0,0xffffe1f8,0x0,0x1f8,0x0,0x0,0xfffffe00,0xffffe000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
    }
    private static void jj_la1_init_1() {
-      jj_la1_1 = new int[] {0x200000,0x1c00000,0x6000000,0x6000000,0x1c00000,0x0,0x0,0x3,0x3,0x3,0x0,0x0,0x18000000,0x3,0x3,0x0,0x0,0x3,0x0,0x0,0x0,0x18000000,0x3,0x3fff,0x0,0x0,0x40000000,0x0,0x40000000,0x0,0x18000000,0x18000000,0x18000000,0x18000000,0x0,0x4000,0x4000,0x0,0x0,0x0,};
+      jj_la1_1 = new int[] {0x200000,0x1c00000,0x6000000,0x6000000,0x1c00000,0x0,0x0,0x3,0x3,0x3,0x0,0x0,0x18000000,0x3fff,0x3fff,0x0,0x0,0x3fff,0x0,0x0,0x0,0x18000000,0x3,0x3fff,0x0,0x0,0x40000000,0x0,0x40000000,0x0,0x18000000,0x18000000,0x18000000,0x18000000,0x0,0x4000,0x4000,0x0,0x0,0x0,};
    }
    private static void jj_la1_init_2() {
       jj_la1_2 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x38000,0xf8216,0x10,0xf8216,0x1,0x10,0xbc03a000,0xfa812,0xfa812,0x1,0x10,0xf8802,0x80000080,0x0,0xc0002,0xbc03a000,0x0,0x0,0x1,0x40,0xa0,0x38204,0xa0,0x38200,0xbc038000,0xbc038000,0xbc000000,0x0,0x80000000,0x0,0x0,0x3c000000,0x38000,0x30000,};
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DisjointConstraint.java b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DisjointConstraint.java
index 80fce1098b..121f65152b 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DisjointConstraint.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/engine/constraint/DisjointConstraint.java
@@ -18,7 +18,7 @@
 
 package org.apache.jena.shacl.engine.constraint;
 
-import static org.apache.jena.shacl.compact.writer.CompactOut.compactArrayNodes;
+import static org.apache.jena.shacl.compact.writer.CompactOut.compact;
 import static org.apache.jena.shacl.lib.ShLib.displayStr;
 
 import java.util.Objects;
@@ -58,7 +58,7 @@ public class DisjointConstraint extends ConstraintPairwise {
 
     @Override
     public void printCompact(IndentedWriter out, NodeFormatter nodeFmt) {
-        compactArrayNodes(out, nodeFmt, null, null);
+        compact(out, nodeFmt, "disjoint", value);
     }
 
     @Override
diff --git a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Constraints.java b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Constraints.java
index 44a058ed82..ed78d53258 100644
--- a/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Constraints.java
+++ b/jena-shacl/src/main/java/org/apache/jena/shacl/parser/Constraints.java
@@ -92,7 +92,7 @@ public class Constraints {
 
         dispatch.put( SHACL.minLength,         (g, s, p, o) -> new StrMinLengthConstraint(intValue(o)) );
         dispatch.put( SHACL.maxLength,         (g, s, p, o) -> new StrMaxLengthConstraint(intValue(o)) );
-        // in parseConstraint
+        // Below
         //dispatch.put( SHACL.pattern,           (g, p, o) -> notImplemented(p) );
         dispatch.put( SHACL.languageIn,        (g, s, p, o) -> new StrLanguageIn(listString(g, o)) );
         dispatch.put( SHACL.uniqueLang,        (g, s, p, o) -> new UniqueLangConstraint(booleanValueStrict(o)) );
@@ -101,10 +101,10 @@ public class Constraints {
         dispatch.put( SHACL.in,                (g, s, p, o) -> new InConstraint(list(g,o)) );
         dispatch.put( SHACL.closed,            (g, s, p, o) -> new ClosedConstraint(g,s,booleanValue(o)) );
 
-        dispatch.put( SHACL.equals,            (g, s, p, o) -> new EqualsConstraint(o) );
-        dispatch.put( SHACL.disjoint,          (g, s, p, o) -> new DisjointConstraint(o) );
-        dispatch.put( SHACL.lessThan,          (g, s, p, o) -> new LessThanConstraint(o) );
-        dispatch.put( SHACL.lessThanOrEquals,  (g, s, p, o) -> new LessThanOrEqualsConstraint(o) );
+        dispatch.put( SHACL.equals,            (g, s, p, o) -> new EqualsConstraint( checkObjectIRI(g, s, p, o)) );
+        dispatch.put( SHACL.disjoint,          (g, s, p, o) -> new DisjointConstraint( checkObjectIRI(g, s, p, o)) );
+        dispatch.put( SHACL.lessThan,          (g, s, p, o) -> new LessThanConstraint( checkObjectIRI(g, s, p, o)) );
+        dispatch.put( SHACL.lessThanOrEquals,  (g, s, p, o) -> new LessThanOrEqualsConstraint( checkObjectIRI(g, s, p, o)) );
 
         // Below
         //dispatch.put( SHACL.not,                (g, s, p, o) -> notImplemented(p) );
@@ -265,6 +265,12 @@ public class Constraints {
         throw new NotImplemented(ShLib.displayStr(p));
     }
 
+    static Node checkObjectIRI(Graph g, Node shape, Node p, Node o) {
+        if ( ! o.isURI() )
+            throw new ShaclParseException("IRI required: "+displayStr(o) + " at "+shape+" "+displayStr(p));
+        return o;
+    }
+
     static int intValue(Node n) {
         return ((Integer)(n.getLiteralValue())).intValue();
     }
diff --git a/jena-shacl/src/test/files/local/shaclc-syntax/propertyParams.shc b/jena-shacl/src/test/files/local/shaclc-syntax/propertyParams.shc
index 614d690505..8150f947bd 100644
--- a/jena-shacl/src/test/files/local/shaclc-syntax/propertyParams.shc
+++ b/jena-shacl/src/test/files/local/shaclc-syntax/propertyParams.shc
@@ -3,6 +3,7 @@ PREFIX ex:      <http://example.org/test#>
 PREFIX sh:      <http://www.w3.org/ns/shacl#>
 
 shapeClass ex:TestPropertyParams {
+   # Overlap with node params.
    :prop1  nodeKind=sh:IRI .
    :prop2  datatype=xsd:double .
    :prop3  pattern="^.*$" .
@@ -14,4 +15,9 @@ shapeClass ex:TestPropertyParams {
    ## Short forms
    :propA  BlankNode .
    :propB  xsd:integer .
+   # Unique to property params.
+   :q1 equals=:q99 .
+   :q2 lessThanOrEquals=:q99 .
+   :q3 ! lessThan=:q98 .
+   :q4 disjoint=:q97 .
 }