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 2016/07/13 13:16:11 UTC

[2/2] jena git commit: JENA-1203: Static checks of update requests ("verify")

JENA-1203: Static checks of update requests ("verify")


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/541807c1
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/541807c1
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/541807c1

Branch: refs/heads/master
Commit: 541807c19db920c8257109a0058c256e0892be39
Parents: bbf6029
Author: Andy Seaborne <an...@apache.org>
Authored: Wed Jul 13 10:48:07 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Wed Jul 13 14:15:24 2016 +0100

----------------------------------------------------------------------
 .../jena/sparql/lang/SPARQLParserBase.java      | 28 ++++++++-----
 .../apache/jena/sparql/lang/SyntaxVarScope.java | 14 ++++---
 .../modify/request/UpdateVisitorBase.java       | 43 ++++++++++++++++++++
 .../Syntax/Syntax-SPARQL-Update/manifest.ttl    | 35 ++++++++--------
 .../syntax-update-bad-13.ru                     |  7 ++++
 .../syntax-update-bad-14.ru                     |  1 +
 .../syntax-update-bad-15.ru                     |  1 +
 jena-arq/testing/ARQ/Syntax/syn-up.sh           |  2 +-
 jena-arq/testing/ARQ/Syntax/syn-update.sh       | 19 +++++++++
 9 files changed, 116 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/541807c1/jena-arq/src/main/java/org/apache/jena/sparql/lang/SPARQLParserBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SPARQLParserBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SPARQLParserBase.java
index efb8723..d3fcd7b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SPARQLParserBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SPARQLParserBase.java
@@ -18,12 +18,7 @@
 
 package org.apache.jena.sparql.lang;
 
-import java.util.ArrayDeque ;
-import java.util.ArrayList ;
-import java.util.Deque ;
-import java.util.HashSet ;
-import java.util.List ;
-import java.util.Set ;
+import java.util.* ;
 
 import org.apache.jena.graph.Node ;
 import org.apache.jena.query.Query ;
@@ -35,8 +30,7 @@ import org.apache.jena.sparql.engine.binding.Binding ;
 import org.apache.jena.sparql.engine.binding.BindingFactory ;
 import org.apache.jena.sparql.engine.binding.BindingMap ;
 import org.apache.jena.sparql.modify.UpdateSink ;
-import org.apache.jena.sparql.modify.request.QuadAcc ;
-import org.apache.jena.sparql.modify.request.QuadDataAccSink ;
+import org.apache.jena.sparql.modify.request.* ;
 import org.apache.jena.sparql.util.LabelToNodeMap ;
 import org.apache.jena.update.Update ;
 
@@ -70,7 +64,6 @@ public class SPARQLParserBase extends ParserBase
 //        this.query = new Query () ;
 //    }
 
-    // SPARQL Update (W3C RECommendation)
     private UpdateSink sink = null ;
 
     // Places to push settings across points where we reset.
@@ -188,13 +181,26 @@ public class SPARQLParserBase extends ParserBase
     
     protected void emitUpdate(Update update)
     {
+
         // The parser can send null if it already performed an INSERT_DATA or DELETE_DATA
-        if (null != update)
-        {
+        if (null != update) {
+            // Verify each operation
+            verifyUpdate(update) ;
             sink.send(update);
         }
     }
     
+    private static UpdateVisitor v = new UpdateVisitorBase() {
+        @Override
+        public void visit(UpdateModify mod) {
+            SyntaxVarScope.check(mod.getWherePattern()) ;
+        }
+    } ;
+    
+    private void verifyUpdate(Update update) {
+        update.visit(v); 
+    }
+
     protected QuadDataAccSink createInsertDataSink()
     {
         return sink.createInsertDataSink();

http://git-wip-us.apache.org/repos/asf/jena/blob/541807c1/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java
index bfd1cf3..5573efb 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java
@@ -59,22 +59,24 @@ public class SyntaxVarScope
         if ( query.getQueryPattern() == null )
             // DESCRIBE may not have a pattern
             return ;
-        
-        checkSubQuery(query.getQueryPattern()) ;
-        checkBind(query) ;
+        check(query.getQueryPattern()) ;
         // Check this level.
         checkQueryScope(query) ;
-    
         // Other checks.
         Collection<Var> vars = varsOfQuery(query) ;
         check(query, vars) ;
     }
 
+    public static void check(Element queryPattern) {
+        checkSubQuery(queryPattern) ;
+        checkBind(queryPattern);
+    }
+
     // Check BIND by accumulating variables and making sure BIND does not attempt to reuse one  
-    private static void checkBind(Query query)
+    private static void checkBind(Element queryPattern)
     {
         BindScopeChecker v = new BindScopeChecker() ;
-        ElementWalker.walk(query.getQueryPattern(), v) ;
+        ElementWalker.walk(queryPattern, v) ;
     }
     
     // Check subquery by finding subquries and recurisively checking.

http://git-wip-us.apache.org/repos/asf/jena/blob/541807c1/jena-arq/src/main/java/org/apache/jena/sparql/modify/request/UpdateVisitorBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/modify/request/UpdateVisitorBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/modify/request/UpdateVisitorBase.java
new file mode 100644
index 0000000..1bf47ad
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/modify/request/UpdateVisitorBase.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.modify.request;
+
+import org.apache.jena.atlas.lib.Sink ;
+import org.apache.jena.sparql.core.Quad ;
+
+public class UpdateVisitorBase implements UpdateVisitor 
+{
+    @Override public void visit(UpdateDrop update)        {}
+    @Override public void visit(UpdateClear update)       {}
+    
+    @Override public void visit(UpdateCreate update)      {}
+    @Override public void visit(UpdateLoad update)        {}
+    
+    @Override public void visit(UpdateAdd update)         {}
+    @Override public void visit(UpdateCopy update)        {}
+    @Override public void visit(UpdateMove update)        {}
+    
+    @Override public void visit(UpdateDataInsert update)  {}
+    @Override public void visit(UpdateDataDelete update)  {}
+    @Override public void visit(UpdateDeleteWhere update) {}
+    @Override public void visit(UpdateModify update)      {}
+    
+    @Override public Sink<Quad> createInsertDataSink()    { return null ; }
+    @Override public Sink<Quad> createDeleteDataSink()    { return null ; }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/541807c1/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/manifest.ttl
----------------------------------------------------------------------
diff --git a/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/manifest.ttl b/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/manifest.ttl
index b504d04..f518677 100644
--- a/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/manifest.ttl
+++ b/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/manifest.ttl
@@ -1,19 +1,4 @@
-#  Licensed to the Apache Software Foundation (ASF) under one or more
-#  contributor license agreements.  See the NOTICE file distributed with
-#  this work for additional information regarding copyright ownership.
-#  The ASF licenses this file to You under the Apache License, Version 2.0
-#  (the "License"); you may not use this file except in compliance with
-#  the License.  You may obtain a copy of the License at
-# 
-#       http://www.apache.org/licenses/LICENSE-2.0
-# 
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-@prefix :       <http://www.w3.org/2009/sparql/docs/tests/data-sparql11/syntax-update-1/manifest#> .
+@prefix :       <manifest#> .
 @prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
 @prefix rdfs:	<http://www.w3.org/2000/01/rdf-schema#> .
 @prefix mf:     <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
@@ -78,6 +63,9 @@
 :test_50
 :test_51
 :test_52
+:test_53
+:test_54
+:test_55
 ) .
 
 :test_1 rdf:type   mf:PositiveUpdateSyntaxTest11 ;
@@ -340,4 +328,19 @@
    mf:name    "syntax-update-bad-12.ru" ;
    mf:action  <syntax-update-bad-12.ru> ;.
 
+:test_53 rdf:type   mf:NegativeUpdateSyntaxTest11 ;
+   dawgt:approval dawgt:NotClassified ;
+   mf:name    "syntax-update-bad-13.ru" ;
+   mf:action  <syntax-update-bad-13.ru> ;.
+
+:test_54 rdf:type   mf:NegativeUpdateSyntaxTest11 ;
+   dawgt:approval dawgt:NotClassified ;
+   mf:name    "syntax-update-bad-14.ru" ;
+   mf:action  <syntax-update-bad-14.ru> ;.
+
+:test_55 rdf:type   mf:NegativeUpdateSyntaxTest11 ;
+   dawgt:approval dawgt:NotClassified ;
+   mf:name    "syntax-update-bad-15.ru" ;
+   mf:action  <syntax-update-bad-15.ru> ;.
+
 

http://git-wip-us.apache.org/repos/asf/jena/blob/541807c1/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-13.ru
----------------------------------------------------------------------
diff --git a/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-13.ru b/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-13.ru
new file mode 100644
index 0000000..548dd32
--- /dev/null
+++ b/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-13.ru
@@ -0,0 +1,7 @@
+DELETE { } 
+WHERE {  
+    {SELECT * #?sub ?obj
+    WHERE {
+        ?sub ?pred ?obj .
+    } GROUP BY ?sub }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/541807c1/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-14.ru
----------------------------------------------------------------------
diff --git a/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-14.ru b/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-14.ru
new file mode 100644
index 0000000..bc2b75d
--- /dev/null
+++ b/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-14.ru
@@ -0,0 +1 @@
+INSERT { } WHERE { BIND(1 AS ?X)  BIND(1 AS ?X) }

http://git-wip-us.apache.org/repos/asf/jena/blob/541807c1/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-15.ru
----------------------------------------------------------------------
diff --git a/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-15.ru b/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-15.ru
new file mode 100644
index 0000000..c132815
--- /dev/null
+++ b/jena-arq/testing/ARQ/Syntax/Syntax-SPARQL-Update/syntax-update-bad-15.ru
@@ -0,0 +1 @@
+INSERT { } WHERE { ?s ?p ?X BIND(1 AS ?X) }

http://git-wip-us.apache.org/repos/asf/jena/blob/541807c1/jena-arq/testing/ARQ/Syntax/syn-up.sh
----------------------------------------------------------------------
diff --git a/jena-arq/testing/ARQ/Syntax/syn-up.sh b/jena-arq/testing/ARQ/Syntax/syn-up.sh
index cc20139..2dc706d 100644
--- a/jena-arq/testing/ARQ/Syntax/syn-up.sh
+++ b/jena-arq/testing/ARQ/Syntax/syn-up.sh
@@ -13,5 +13,5 @@ source syn-func.sh
     cd Syntax-SPARQL-Update
     clean 
     source ../syn-update.sh 
-    createManifest "Syntax SPARQL Update"
+    createManifest "Syntax SPARQL Update" '<manifest#>'
 )

http://git-wip-us.apache.org/repos/asf/jena/blob/541807c1/jena-arq/testing/ARQ/Syntax/syn-update.sh
----------------------------------------------------------------------
diff --git a/jena-arq/testing/ARQ/Syntax/syn-update.sh b/jena-arq/testing/ARQ/Syntax/syn-update.sh
index 633e6ed..8f2cb8b 100644
--- a/jena-arq/testing/ARQ/Syntax/syn-update.sh
+++ b/jena-arq/testing/ARQ/Syntax/syn-update.sh
@@ -318,3 +318,22 @@ N=$((N+1)) ; testBad $SPARQL11U $(fname "syntax-update-bad-" $N) <<EOF
 # BNode in DELETE DATA
 DELETE DATA { _:a <p> <o> }
 EOF
+
+## Scope
+N=$((N+1)) ; testBad $SPARQL11U $(fname "syntax-update-bad-" $N) <<EOF
+DELETE { } 
+WHERE {  
+    {SELECT * #?sub ?obj
+    WHERE {
+        ?sub ?pred ?obj .
+    } GROUP BY ?sub }
+}
+EOF
+
+N=$((N+1)) ; testBad $SPARQL11U $(fname "syntax-update-bad-" $N) <<EOF
+INSERT { } WHERE { BIND(1 AS ?X)  BIND(1 AS ?X) }
+EOF
+
+N=$((N+1)) ; testBad $SPARQL11U $(fname "syntax-update-bad-" $N) <<EOF
+INSERT { } WHERE { ?s ?p ?X BIND(1 AS ?X) }
+EOF