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 .
}