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 2018/08/05 15:33:26 UTC

[01/19] jena git commit: ARQ:Query:ParameterizedSparqlString - Subclass ValueReplacement and methods added to allow substitution of varNames with collections of RDFNodes. This is used in SPARQL queries to provide inline data with the VALUES keyword. - Te

Repository: jena
Updated Branches:
  refs/heads/master 720a198d4 -> 43feda68f


ARQ:Query:ParameterizedSparqlString
- Subclass ValueReplacement and methods added to allow substitution of varNames with collections of RDFNodes. This is used in SPARQL queries to provide inline data with the VALUES keyword.
- Tests included for use cases.

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

Branch: refs/heads/master
Commit: 27695b93b7454b3948cc623cff788a18942a66e2
Parents: 6e85e6c
Author: Greg Albiston <gr...@hotmail.com>
Authored: Fri Jul 27 15:05:52 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Fri Jul 27 15:05:52 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 245 +++++++++++++++++++
 .../query/TestParameterizedSparqlString.java    | 134 ++++++++++
 2 files changed, 379 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/27695b93/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index 0e3e150..fb92909 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -20,7 +20,9 @@ package org.apache.jena.query;
 
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -141,6 +143,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
     private Map<String, Node> params = new HashMap<>();
     private Map<Integer, Node> positionalParams = new HashMap<>();
     private PrefixMapping prefixes;
+    private Map<String, ValueReplacement> valuesReplacements = new HashMap<>();
 
     /**
      * Creates a new parameterized string
@@ -1328,6 +1331,9 @@ public class ParameterizedSparqlString implements PrefixMapping {
             command = p.matcher(command).replaceAll(Matcher.quoteReplacement(this.stringForNode(n, context)) + "$2");
         }
 
+        // Inject Values Parameters
+        command = applyValues(command);
+        
         // Then inject Positional Parameters
         // To do this we need to find the ? we will replace
         p = Pattern.compile("(\\?)[\\s;,.]");
@@ -1734,4 +1740,243 @@ public class ParameterizedSparqlString implements PrefixMapping {
         }
 
     }
+    
+    /**
+     * Assign a varName with a multiple items and whether to include
+     * parenthesis.
+     *
+     * @param varName
+     * @param items
+     * @param isParenthesisNeeded
+     */
+    public void setValues(String varName, Collection<? extends RDFNode> items, boolean isParenthesisNeeded) {
+        this.valuesReplacements.put(varName, new ValueReplacement(varName, items, isParenthesisNeeded));
+    }
+
+    /**
+     * Assign a varName with a multiple items.<br>
+     * Can be used to assign multiple values to a single variable or single
+     * value to multiple variables (if using a List) in the SPARQL query.<br>
+     * See setGroupedValues to assign multiple values to multiple variables.
+     *
+     * @param varName
+     * @param items
+     */
+    public void setValues(String varName, Collection<? extends RDFNode> items) {
+        setValues(varName, items, false);
+    }
+
+    /**
+     * Assign a varName with a single item and whether to include parenthesis.
+     *
+     * @param varName
+     * @param item
+     * @param isParenthesisNeeded
+     */
+    public void setValues(String varName, RDFNode item, boolean isParenthesisNeeded) {
+        setValues(varName, Arrays.asList(item), isParenthesisNeeded);
+    }
+
+    /**
+     * Assign a varName with a single item.
+     *
+     * @param varName
+     * @param item
+     */
+    public void setValues(String varName, RDFNode item) {
+        setValues(varName, Arrays.asList(item), false);
+    }
+
+    /**
+     * Sets a map of varNames and their items.
+     *
+     * @param valuesItems
+     */
+    public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems) {
+        for (String varName : valuesItems.keySet()) {
+            Collection<? extends RDFNode> items = valuesItems.get(varName);
+            setValues(varName, items);
+        }
+    }
+
+    /**
+     * All varNames in the map will use the same approach to parenthesis.
+     *
+     * @param valuesItems
+     * @param isParenthesisNeeded
+     */
+    public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems, Boolean isParenthesisNeeded) {
+        for (String varName : valuesItems.keySet()) {
+            Collection<? extends RDFNode> items = valuesItems.get(varName);
+            setValues(varName, items, isParenthesisNeeded);
+        }
+    }
+
+    /**
+     * Combine a map of varNames and items with whether to include parenthesis.
+     * Missing varNames in the parenthesis map will default to false.
+     *
+     * @param valuesItems
+     * @param valuesParenthesis
+     */
+    public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems, Map<String, Boolean> valuesParenthesis) {
+
+        for (String varName : valuesItems.keySet()) {
+            Collection<? extends RDFNode> items = valuesItems.get(varName);
+            Boolean isParenthesisNeeded;
+            if (valuesParenthesis.containsKey(varName)) {
+                isParenthesisNeeded = valuesParenthesis.get(varName);
+            } else {
+                isParenthesisNeeded = false;
+            }
+
+            setValues(varName, items, isParenthesisNeeded);
+        }
+    }
+
+    /**
+     * Allocate multiple lists of variables to a single varName.<br>
+     * Using "vars" with list(list(prop_A, obj_A), list(prop_B, obj_B)) on query
+     * "VALUES (?p ?o) {?vars}" would produce "VALUES (?p ?o) {(prop_A obj_A)
+     * (prop_B obj_B)}".
+     *
+     * @param varName
+     * @param items
+     */
+    public void setGroupedValues(String varName, Collection<List<? extends RDFNode>> items) {
+        this.valuesReplacements.put(varName, new ValueReplacement(varName, items));
+    }
+
+    private String applyValues(String command) {
+
+        for (ValueReplacement valueReplacement : valuesReplacements.values()) {
+            command = valueReplacement.apply(command);
+        }
+        return command;
+    }
+
+    /**
+     * Performs replacement of VALUES in query string.
+     *
+     */
+    private class ValueReplacement {
+
+        private final String varName;
+        private final Collection<? extends RDFNode> items;
+        private final Collection<List<? extends RDFNode>> groupedItems;
+        private final Boolean isParenthesisNeeded;
+        private final Boolean isGrouped;
+
+        public ValueReplacement(String varName, Collection<? extends RDFNode> items, Boolean isParenthesisNeeded) {
+            this.varName = varName;
+            this.items = items;
+            this.groupedItems = new ArrayList<>();
+            this.isParenthesisNeeded = isParenthesisNeeded;
+            this.isGrouped = false;
+        }
+
+        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> groupedItems) {
+            this.varName = varName;
+            this.items = new ArrayList<>();
+            this.groupedItems = groupedItems;
+            this.isParenthesisNeeded = true;
+            this.isGrouped = true;
+        }
+
+        public String apply(String command) {
+
+            if (items.isEmpty() && groupedItems.isEmpty()) {
+                return command;
+            }
+
+            String target = createTarget(varName);
+
+            StringBuilder replacement;
+
+            if (isGrouped) {
+                replacement = groupedApply();
+            } else {
+                replacement = ungroupedApply();
+            }
+
+            return command.replace(target, replacement);
+        }
+
+        private StringBuilder groupedApply() {
+            StringBuilder replacement = new StringBuilder("");
+
+            for (List<? extends RDFNode> group : groupedItems) {
+                replacement.append("(");
+
+                for (RDFNode item : group) {
+                    String insert = createInsert(item);
+                    replacement.append(insert);
+                    replacement.append(" ");
+                }
+
+                replacement.deleteCharAt(replacement.length() - 1);
+                replacement.append(") ");
+            }
+
+            replacement.deleteCharAt(replacement.length() - 1);
+            return replacement;
+        }
+
+        private StringBuilder ungroupedApply() {
+            StringBuilder replacement = new StringBuilder("");
+
+            for (RDFNode item : items) {
+                if (isParenthesisNeeded) {
+                    replacement.append("(");
+                }
+                String insert = createInsert(item);
+                replacement.append(insert);
+                if (isParenthesisNeeded) {
+                    replacement.append(")");
+                }
+                replacement.append(" ");
+            }
+
+            replacement.deleteCharAt(replacement.length() - 1);
+
+            return replacement;
+        }
+
+        /**
+         * Tidy up varName if doesn't start with a ? or $.
+         *
+         * @param varName
+         * @return
+         */
+        private String createTarget(String varName) {
+            String target;
+
+            if (varName.startsWith("?") || varName.startsWith("$")) {
+                target = varName;
+            } else {
+                target = "?" + varName;
+            }
+            return target;
+        }
+
+        /**
+         * Insert the SPARQL representation of the RDF node.
+         *
+         * @param item
+         * @return
+         */
+        private String createInsert(RDFNode item) {
+            String insert;
+            if (item.isLiteral()) {
+                Literal lit = item.asLiteral();
+                insert = "\"" + lit.getLexicalForm() + "\"^^" + lit.getDatatypeURI();
+            } else if (item.isResource()) {
+                insert = "<" + item.asResource().getURI() + ">";
+            } else {
+                insert = item.asResource().getId().getLabelString();
+            }
+            return insert;
+        }
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/27695b93/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index e3d2026..8d75942 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -18,9 +18,11 @@
 
 package org.apache.jena.query;
 
+import java.util.ArrayList;
 import java.util.Calendar ;
 import java.util.HashMap;
 import java.util.Iterator ;
+import java.util.List;
 import java.util.TimeZone ;
 
 import org.apache.jena.datatypes.TypeMapper ;
@@ -1925,4 +1927,136 @@ public class TestParameterizedSparqlString {
 
         pss.toString();
     }
+    
+    @Test
+    public void test_set_values_item() {
+        // Tests a single value being added.
+        String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        pss.setValues("objs", ResourceFactory.createPlainLiteral("test"));
+
+        String exp = "SELECT * WHERE { VALUES ?o {\"test\"^^http://www.w3.org/2001/XMLSchema#string} ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
+    public void test_set_values_item_parenthesis() {
+        // Tests a single value with parenthesis.
+        String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        pss.setValues("objs", ResourceFactory.createPlainLiteral("test"), true);
+
+        String exp = "SELECT * WHERE { VALUES ?o {(\"test\"^^http://www.w3.org/2001/XMLSchema#string)} ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
+    public void test_set_values_items() {
+        // Tests two values for same variable.
+        String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        List<RDFNode> objs = new ArrayList<>();
+        objs.add(ResourceFactory.createPlainLiteral("obj_A"));
+        objs.add(ResourceFactory.createPlainLiteral("obj_B"));
+        pss.setValues("objs", objs);
+
+        String exp = "SELECT * WHERE { VALUES ?o {\"obj_A\"^^http://www.w3.org/2001/XMLSchema#string \"obj_B\"^^http://www.w3.org/2001/XMLSchema#string} ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
+    public void test_set_values_items_parenthesis() {
+        // Tests two values for same variable.
+        String str = "SELECT * WHERE { VALUES (?o) {?objs} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        List<RDFNode> objs = new ArrayList<>();
+        objs.add(ResourceFactory.createPlainLiteral("obj_A"));
+        objs.add(ResourceFactory.createPlainLiteral("obj_B"));
+        pss.setValues("objs", objs, true);
+
+        String exp = "SELECT * WHERE { VALUES (?o) {(\"obj_A\"^^http://www.w3.org/2001/XMLSchema#string) (\"obj_B\"^^http://www.w3.org/2001/XMLSchema#string)} ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
+    public void test_set_values_multi_var() {
+        // Tests two variables.
+        String str = "SELECT * WHERE { VALUES ?p {?props} VALUES ?o {?objs} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        List<RDFNode> objs = new ArrayList<>();
+        objs.add(ResourceFactory.createPlainLiteral("obj_A"));
+        objs.add(ResourceFactory.createPlainLiteral("obj_B"));
+        pss.setValues("objs", objs);
+
+        List<RDFNode> props = new ArrayList<>();
+        props.add(ResourceFactory.createProperty("http://example.org/prop_A"));
+        props.add(ResourceFactory.createProperty("http://example.org/prop_B"));
+        pss.setValues("props", props);
+
+        String exp = "SELECT * WHERE { VALUES ?p {<http://example.org/prop_A> <http://example.org/prop_B>} VALUES ?o {\"obj_A\"^^http://www.w3.org/2001/XMLSchema#string \"obj_B\"^^http://www.w3.org/2001/XMLSchema#string} ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
+    public void test_set_values_multi_var_parenthesis() {
+        // Tests two variables with parenthesis for one.
+        String str = "SELECT * WHERE { VALUES (?p) {?props} VALUES ?o {?objs} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        List<RDFNode> objs = new ArrayList<>();
+        objs.add(ResourceFactory.createPlainLiteral("obj_A"));
+        objs.add(ResourceFactory.createPlainLiteral("obj_B"));
+        pss.setValues("objs", objs);
+
+        List<RDFNode> props = new ArrayList<>();
+        props.add(ResourceFactory.createProperty("http://example.org/prop_A"));
+        props.add(ResourceFactory.createProperty("http://example.org/prop_B"));
+        pss.setValues("props", props, true);
+
+        String exp = "SELECT * WHERE { VALUES (?p) {(<http://example.org/prop_A>) (<http://example.org/prop_B>)} VALUES ?o {\"obj_A\"^^http://www.w3.org/2001/XMLSchema#string \"obj_B\"^^http://www.w3.org/2001/XMLSchema#string} ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
+    public void test_set_values_grouped_var() {
+        // Tests two variables with parenthesis for one.
+        String str = "SELECT * WHERE { VALUES (?p ?o) {?vars} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+
+        List<List<? extends RDFNode>> vars = new ArrayList<>();
+        List<RDFNode> objsA = new ArrayList<>();
+        objsA.add(ResourceFactory.createProperty("http://example.org/prop_A"));
+        objsA.add(ResourceFactory.createPlainLiteral("obj_A"));
+        vars.add(objsA);
+
+        List<RDFNode> objsB = new ArrayList<>();
+        objsB.add(ResourceFactory.createProperty("http://example.org/prop_B"));
+        objsB.add(ResourceFactory.createPlainLiteral("obj_B"));
+        vars.add(objsB);
+
+        pss.setGroupedValues("vars", vars);
+
+        String exp = "SELECT * WHERE { VALUES (?p ?o) {(<http://example.org/prop_A> \"obj_A\"^^http://www.w3.org/2001/XMLSchema#string) (<http://example.org/prop_B> \"obj_B\"^^http://www.w3.org/2001/XMLSchema#string)} ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
 }


[08/19] jena git commit: ARQ:Query:ParameterizedSparqlString - simplified checking the need for parenthesis.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString - simplified checking the need for parenthesis.

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

Branch: refs/heads/master
Commit: 8b1548c4164048567940d488b146bcc8cd9a23cb
Parents: f367e23
Author: Greg Albiston <gr...@hotmail.com>
Authored: Mon Jul 30 16:26:15 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Mon Jul 30 16:26:15 2018 +0100

----------------------------------------------------------------------
 .../java/org/apache/jena/query/ParameterizedSparqlString.java   | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/8b1548c4/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index 669cc6c..9a3fae8 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1829,9 +1829,8 @@ public class ParameterizedSparqlString implements PrefixMapping {
         if (varIndex > -1) {
             String subCmd = command.substring(0, varIndex).toLowerCase(); //Truncate the command at the varName. Lowercase to search both types of values.
             int valuesIndex = subCmd.lastIndexOf(VALUES_KEYWORD);
-            int bracesIndex = subCmd.lastIndexOf("{");
-            String vars = command.substring(valuesIndex + VALUES_KEYWORD.length(), bracesIndex);
-            isNeeded = vars.contains("(");
+            int parenthesisIndex = subCmd.indexOf("(", valuesIndex + VALUES_KEYWORD.length());
+            isNeeded = parenthesisIndex > -1;
         } else {
             isNeeded = false;
         }


[16/19] jena git commit: ARQ:Query:ParameterizedSparqlString - replacement values now use the same mechanism to apply context prefixes as the remainder of class to provide consistency.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString 
- replacement values now use the same mechanism to apply context prefixes as the remainder of class to provide consistency.

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

Branch: refs/heads/master
Commit: d1ee09b4d4e844bcced79e9ef2ab04cd26018997
Parents: 9c72875
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 15:01:13 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 15:01:13 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 22 ++++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/d1ee09b4/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index 5305654..b8b8978 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1334,7 +1334,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
         }
 
         // Inject Values Parameters
-        command = applyValues(command);
+        command = applyValues(command, context);
         
         // Then inject Positional Parameters
         // To do this we need to find the ? we will replace
@@ -1807,10 +1807,10 @@ public class ParameterizedSparqlString implements PrefixMapping {
         this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems));
     }
 
-    private String applyValues(String command) {
+    private String applyValues(String command, SerializationContext context) {
 
         for (ValueReplacement valueReplacement : valuesReplacements.values()) {
-            command = valueReplacement.apply(command);
+            command = valueReplacement.apply(command, context);
         }
         return command;
     }
@@ -1848,7 +1848,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
             this.rowItems = rowItems;
         }
 
-        public String apply(String command) {
+        public String apply(String command, SerializationContext context) {
 
             if (rowItems.isEmpty()) {
                 return command;
@@ -1863,29 +1863,29 @@ public class ParameterizedSparqlString implements PrefixMapping {
             validateValuesSafeToInject(command, targetVars);
 
             String target = createTarget();
-            String replacement = buildReplacement(targetVars.length);
+            String replacement = buildReplacement(targetVars.length, context);
 
             return command.replaceAll(target, replacement);
         }
 
-        private String buildReplacement(int targetVarCount) {
+        private String buildReplacement(int targetVarCount, SerializationContext context) {
 
             StringBuilder replacement = new StringBuilder("");
 
             if (targetVarCount == 1) {
                 for (List<? extends RDFNode> row : rowItems) {
                     for (RDFNode item : row) {
-                    replacement.append("(");
-                    String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
-                    replacement.append(insert);
-                    replacement.append(") ");
+                        replacement.append("(");
+                        String insert = stringForNode(item.asNode(), context);
+                        replacement.append(insert);
+                        replacement.append(") ");
                     }
                 }
             } else {
                 for (List<? extends RDFNode> row : rowItems) {
                     replacement.append("(");
                     for (RDFNode item : row) {
-                        String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
+                        String insert = stringForNode(item.asNode(), context);
                         replacement.append(insert);
                         replacement.append(" ");
                     }


[15/19] jena git commit: ARQ:Query:ParameterizedSparqlString - valuesReplacement now cleared by "clearParam(String var)" and "clearParams" in line with the other stored parameters.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString 
- valuesReplacement now cleared by "clearParam(String var)" and "clearParams" in line with the other stored parameters.

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

Branch: refs/heads/master
Commit: 9c72875ef6e77367877b4c8b168e520de059c77b
Parents: 16fb7ce
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 14:54:05 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 14:54:05 2018 +0100

----------------------------------------------------------------------
 .../org/apache/jena/query/ParameterizedSparqlString.java     | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/9c72875e/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index b1b5446..5305654 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1159,14 +1159,15 @@ public class ParameterizedSparqlString implements PrefixMapping {
     }
 
     /**
-     * Clears the value for a variable parameter so the given variable will not
-     * have a value injected
+     * Clears the value for a variable or values parameter so the given variable
+     * will not     * have a value injected
      * 
      * @param var
      *            Variable
      */
     public void clearParam(String var) {
         this.params.remove(var);
+        this.valuesReplacements.remove(var);
     }
 
     /**
@@ -1180,10 +1181,11 @@ public class ParameterizedSparqlString implements PrefixMapping {
     }
 
     /**
-     * Clears all values for both variable and positional parameters
+     * Clears all values for variable, values and positional parameters
      */
     public void clearParams() {
         this.params.clear();
+        this.valuesReplacements.clear();
         this.positionalParams.clear();
     }
 


[10/19] jena git commit: ARQ:Query:ParameterizedSparqlString - Parenthesis always applied. Term "group" replaced with "row".

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString - Parenthesis always applied. Term "group" replaced with "row".

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

Branch: refs/heads/master
Commit: b708cff4b81878423e7cd9f99dcefd81c077a262
Parents: 9662ff6
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 13:16:06 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 13:16:06 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 76 +++++++-------------
 .../query/TestParameterizedSparqlString.java    | 57 +++------------
 2 files changed, 36 insertions(+), 97 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/b708cff4/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index 8ecc644..e45f3d6 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1744,7 +1744,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * Assign a VALUES varName with a multiple items.<br>
      * Can be used to assign multiple values to a single variable or single
      * value to multiple variables (if using a List) in the SPARQL query.<br>
-     * See setGroupedValues to assign multiple values to multiple variables.<br>
+     * See setRowValues to assign multiple values to multiple variables.<br>
      * Using "var" with list(prop_A, obj_A) on query "VALUES (?p ?o) {?var}"
      * would produce "VALUES (?p ?o) {(prop_A obj_A)}".
      *
@@ -1774,7 +1774,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * Sets a map of VALUES varNames and their items.<br>
      * Can be used to assign multiple values to a single variable or single
      * value to multiple variables (if using a List) in the SPARQL query.<br>
-     * See setGroupedValues to assign multiple values to multiple variables.
+     * See setRowValues to assign multiple values to multiple variables.
      *
      * @param itemsMap
      */
@@ -1789,11 +1789,11 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * (prop_B obj_B)}".
      *
      * @param varName
-     * @param groupedItems
+     * @param rowItems
      */
-    public void setGroupedValues(String varName, Collection<List<? extends RDFNode>> groupedItems) {
-        groupedItems.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
-        this.valuesReplacements.put(varName, new ValueReplacement(varName, groupedItems, true));
+    public void setRowValues(String varName, Collection<List<? extends RDFNode>> rowItems) {
+        rowItems.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
+        this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems, true));
     }
 
     private String applyValues(String command) {
@@ -1822,21 +1822,6 @@ public class ParameterizedSparqlString implements PrefixMapping {
         return targetVars;
     }
 
-    protected static boolean checkParenthesis(String command, String varName) {
-        boolean isNeeded;
-
-        int varIndex = command.indexOf(varName);
-        if (varIndex > -1) {
-            String subCmd = command.substring(0, varIndex).toLowerCase(); //Truncate the command at the varName. Lowercase to search both types of values.
-            int valuesIndex = subCmd.lastIndexOf(VALUES_KEYWORD);
-            int parenthesisIndex = subCmd.indexOf("(", valuesIndex + VALUES_KEYWORD.length());
-            isNeeded = parenthesisIndex > -1;
-        } else {
-            isNeeded = false;
-        }
-        return isNeeded;
-    }
-
     /**
      * Performs replacement of VALUES in query string.
      *
@@ -1845,26 +1830,26 @@ public class ParameterizedSparqlString implements PrefixMapping {
 
         private final String varName;
         private final Collection<? extends RDFNode> items;
-        private final Collection<List<? extends RDFNode>> groupedItems;
-        private final Boolean isGrouped;
+        private final Collection<List<? extends RDFNode>> rowItems;
+        private final Boolean isRows;
 
         public ValueReplacement(String varName, Collection<? extends RDFNode> items) {
             this.varName = varName;
             this.items = items;
-            this.groupedItems = new ArrayList<>();
-            this.isGrouped = false;
+            this.rowItems = new ArrayList<>();
+            this.isRows = false;
         }
 
-        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> groupedItems, Boolean isGrouped) {
+        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> rowItems, Boolean isRows) {
             this.varName = varName;
             this.items = new ArrayList<>();
-            this.groupedItems = groupedItems;
-            this.isGrouped = isGrouped;
+            this.rowItems = rowItems;
+            this.isRows = isRows;
         }
 
         public String apply(String command) {
 
-            if (items.isEmpty() && groupedItems.isEmpty()) {
+            if (items.isEmpty() && rowItems.isEmpty()) {
                 return command;
             }
 
@@ -1874,23 +1859,22 @@ public class ParameterizedSparqlString implements PrefixMapping {
             String target = createTarget();
 
             StringBuilder replacement;
-            if (isGrouped) {
-                replacement = groupedApply();
+            if (isRows) {
+                replacement = rowsApply();
             } else {
-
-                replacement = ungroupedApply(command, targetVars.length);
+                replacement = singleApply(targetVars.length);
             }
 
             return command.replace(target, replacement);
         }
 
-        private StringBuilder groupedApply() {
+        private StringBuilder rowsApply() {
             StringBuilder replacement = new StringBuilder("");
 
-            for (List<? extends RDFNode> group : groupedItems) {
+            for (List<? extends RDFNode> row : rowItems) {
                 replacement.append("(");
 
-                for (RDFNode item : group) {
+                for (RDFNode item : row) {
                     String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
                     replacement.append(insert);
                     replacement.append(" ");
@@ -1904,22 +1888,16 @@ public class ParameterizedSparqlString implements PrefixMapping {
             return replacement;
         }
 
-        private StringBuilder ungroupedApply(String command, int targetVarCount) {
+        private StringBuilder singleApply(int targetVarCount) {
 
             StringBuilder replacement = new StringBuilder("");
 
             if (targetVarCount == 1) {
-                boolean isParenthesisNeeded = checkParenthesis(command, varName);
                 for (RDFNode item : items) {
-                    if (isParenthesisNeeded) {
-                        replacement.append("(");
-                    }
+                    replacement.append("(");
                     String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
                     replacement.append(insert);
-                    if (isParenthesisNeeded) {
-                        replacement.append(")");
-                    }
-                    replacement.append(" ");
+                    replacement.append(") ");
                 }
                 replacement.deleteCharAt(replacement.length() - 1);
             } else {
@@ -1957,10 +1935,10 @@ public class ParameterizedSparqlString implements PrefixMapping {
 
             for (int i = 0; i < targetVars.length; i++) {
                 String targetVar = targetVars[i];
-                if (isGrouped) {
-                    //Iterate through each group according to the position of var and item.
-                    for (List<? extends RDFNode> group : groupedItems) {
-                        RDFNode item = group.get(i);
+                if (isRows) {
+                    //Iterate through each row according to the position of var and item.
+                    for (List<? extends RDFNode> row : rowItems) {
+                        RDFNode item = row.get(i);
                         validateSafeToInject(command, targetVar, item.asNode());
                     }
                 } else {

http://git-wip-us.apache.org/repos/asf/jena/blob/b708cff4/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index 1dc14ee..1cf3312 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -1929,29 +1929,12 @@ public class TestParameterizedSparqlString {
     
     @Test
     public void test_set_values_item() {
-        // Tests a single value being added.
+        // Tests a single value being added - always adding parenthesis.
         String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
         ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
         pss.setValues("objs", ResourceFactory.createPlainLiteral("test"));
 
-        String exp = "SELECT * WHERE { VALUES ?o {\"test\"} ?s ?p ?o }";
-        String res = pss.toString();
-        //System.out.println("Exp: " + exp);
-        //System.out.println("Res: " + res);
-        Assert.assertEquals(exp, res);
-    }
-
-    @Test
-    public void test_set_values_items() {
-        // Tests two values for same variable.
-        String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
-        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
-        List<RDFNode> objs = new ArrayList<>();
-        objs.add(ResourceFactory.createPlainLiteral("obj_A"));
-        objs.add(ResourceFactory.createPlainLiteral("obj_B"));
-        pss.setValues("objs", objs);
-
-        String exp = "SELECT * WHERE { VALUES ?o {\"obj_A\" \"obj_B\"} ?s ?p ?o }";
+        String exp = "SELECT * WHERE { VALUES ?o {(\"test\")} ?s ?p ?o }";
         String res = pss.toString();
         //System.out.println("Exp: " + exp);
         //System.out.println("Res: " + res);
@@ -1987,37 +1970,15 @@ public class TestParameterizedSparqlString {
 
         String exp = "SELECT * WHERE { VALUES (?p ?o) {(<http://example.org/prop_A> \"obj_A\")} ?s ?p ?o }";
         String res = pss.toString();
-        System.out.println("Exp: " + exp);
-        System.out.println("Res: " + res);
-        Assert.assertEquals(exp, res);
-    }
-
-    @Test
-    public void test_set_values_multi_var() {
-        // Tests two variables.
-        String str = "SELECT * WHERE { VALUES ?p {?props} VALUES ?o {?objs} ?s ?p ?o }";
-        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
-        List<RDFNode> objs = new ArrayList<>();
-        objs.add(ResourceFactory.createPlainLiteral("obj_A"));
-        objs.add(ResourceFactory.createPlainLiteral("obj_B"));
-        pss.setValues("objs", objs);
-
-        List<RDFNode> props = new ArrayList<>();
-        props.add(ResourceFactory.createProperty("http://example.org/prop_A"));
-        props.add(ResourceFactory.createProperty("http://example.org/prop_B"));
-        pss.setValues("props", props);
-
-        String exp = "SELECT * WHERE { VALUES ?p {<http://example.org/prop_A> <http://example.org/prop_B>} VALUES ?o {\"obj_A\" \"obj_B\"} ?s ?p ?o }";
-        String res = pss.toString();
         //System.out.println("Exp: " + exp);
         //System.out.println("Res: " + res);
         Assert.assertEquals(exp, res);
     }
 
     @Test
-    public void test_set_values_multi_var_parenthesis() {
-        // Tests two variables with parenthesis for one.
-        String str = "SELECT * WHERE { VALUES (?p) {?props} VALUES ?o {?objs} ?s ?p ?o }";
+    public void test_set_values_multi_var() {
+        // Tests two variables - always adding parenthesis.
+        String str = "SELECT * WHERE { VALUES ?p {?props} VALUES ?o {?objs} ?s ?p ?o }";
         ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
         List<RDFNode> objs = new ArrayList<>();
         objs.add(ResourceFactory.createPlainLiteral("obj_A"));
@@ -2029,10 +1990,10 @@ public class TestParameterizedSparqlString {
         props.add(ResourceFactory.createProperty("http://example.org/prop_B"));
         pss.setValues("props", props);
 
-        String exp = "SELECT * WHERE { VALUES (?p) {(<http://example.org/prop_A>) (<http://example.org/prop_B>)} VALUES ?o {\"obj_A\" \"obj_B\"} ?s ?p ?o }";
+        String exp = "SELECT * WHERE { VALUES ?p {(<http://example.org/prop_A>) (<http://example.org/prop_B>)} VALUES ?o {(\"obj_A\") (\"obj_B\")} ?s ?p ?o }";
         String res = pss.toString();
-        //System.out.println("Exp: " + exp);
-        //System.out.println("Res: " + res);
+        System.out.println("Exp: " + exp);
+        System.out.println("Res: " + res);
         Assert.assertEquals(exp, res);
     }
 
@@ -2053,7 +2014,7 @@ public class TestParameterizedSparqlString {
         objsB.add(ResourceFactory.createPlainLiteral("obj_B"));
         vars.add(objsB);
 
-        pss.setGroupedValues("vars", vars);
+        pss.setRowValues("vars", vars);
 
         String exp = "SELECT * WHERE { VALUES (?p ?o) {(<http://example.org/prop_A> \"obj_A\") (<http://example.org/prop_B> \"obj_B\")} ?s ?p ?o }";
         String res = pss.toString();


[13/19] jena git commit: ARQ:Query:ParameterizedSparqlString - targetting varNames now takes into account "$" variable syntax.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString 
- targetting varNames now takes into account "$" variable syntax.

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

Branch: refs/heads/master
Commit: 5eb24eb0675e5cc5dd7c6d92cca7f3eeb6b76dba
Parents: ec242ef
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 14:42:07 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 14:42:07 2018 +0100

----------------------------------------------------------------------
 .../apache/jena/query/ParameterizedSparqlString.java   | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/5eb24eb0/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index b65106e..b1b5446 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1826,7 +1826,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
             int closeBracesIndex = subCmd.lastIndexOf("}");
             if (valuesIndex > -1 && valuesIndex < openBracesIndex && closeBracesIndex < valuesIndex) { //Ensure that VALUES keyword is found, open braces index is located after the VALUES and any close braces is located before the VALUES.
                 String vars = command.substring(valuesIndex + VALUES_KEYWORD.length(), openBracesIndex);
-                targetVars = vars.replaceAll("[(?)]", "").trim().split(" ");
+                targetVars = vars.replaceAll("[(?$)]", "").trim().split(" ");
             }
         }
         return targetVars;
@@ -1861,13 +1861,12 @@ public class ParameterizedSparqlString implements PrefixMapping {
             validateValuesSafeToInject(command, targetVars);
 
             String target = createTarget();
-            StringBuilder replacement = buildReplacement(targetVars.length);
+            String replacement = buildReplacement(targetVars.length);
 
-            return command.replace(target, replacement);
+            return command.replaceAll(target, replacement);
         }
 
-
-        private StringBuilder buildReplacement(int targetVarCount) {
+        private String buildReplacement(int targetVarCount) {
 
             StringBuilder replacement = new StringBuilder("");
 
@@ -1894,7 +1893,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
             }
             replacement.deleteCharAt(replacement.length() - 1);
 
-            return replacement;
+            return replacement.toString();
         }
 
         /**
@@ -1909,7 +1908,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
             if (varName.startsWith("?") || varName.startsWith("$")) {
                 target = varName;
             } else {
-                target = "?" + varName;
+                target = "[?$]" + varName;
             }
             return target;
         }


[02/19] jena git commit: ARQ:Query:ParameterizedSparqlString - applied Collection.forEach functional operators following style feedback.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString - applied Collection.forEach functional operators following style feedback.

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

Branch: refs/heads/master
Commit: edbd0a2989df3efc1e622c2242bfcf86c7655ee8
Parents: 27695b9
Author: Greg Albiston <gr...@hotmail.com>
Authored: Fri Jul 27 17:27:43 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Fri Jul 27 17:27:43 2018 +0100

----------------------------------------------------------------------
 .../org/apache/jena/query/ParameterizedSparqlString.java | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/edbd0a29/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index fb92909..03960e0 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -32,7 +32,6 @@ import java.util.Map.Entry;
 import java.util.regex.MatchResult;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-
 import org.apache.jena.atlas.lib.Pair;
 import org.apache.jena.datatypes.RDFDatatype ;
 import org.apache.jena.graph.Node ;
@@ -1793,10 +1792,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * @param valuesItems
      */
     public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems) {
-        for (String varName : valuesItems.keySet()) {
-            Collection<? extends RDFNode> items = valuesItems.get(varName);
-            setValues(varName, items);
-        }
+        valuesItems.forEach(this::setValues);
     }
 
     /**
@@ -1806,10 +1802,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * @param isParenthesisNeeded
      */
     public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems, Boolean isParenthesisNeeded) {
-        for (String varName : valuesItems.keySet()) {
-            Collection<? extends RDFNode> items = valuesItems.get(varName);
-            setValues(varName, items, isParenthesisNeeded);
-        }
+        valuesItems.forEach((varName, items) -> setValues(varName, items, isParenthesisNeeded));
     }
 
     /**


[03/19] jena git commit: ARQ:Query:ParameterizedSparqlString - replaced "createInsert" method with "FmtUtils.stringForNode" to convert RDFNodes to string representation.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString - replaced "createInsert" method with "FmtUtils.stringForNode" to convert RDFNodes to string representation.

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

Branch: refs/heads/master
Commit: b06b67bd2ba5e9afd6f254998b8143e42a69ffc6
Parents: edbd0a2
Author: Greg Albiston <gr...@hotmail.com>
Authored: Mon Jul 30 14:00:03 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Mon Jul 30 14:00:03 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 22 ++------------------
 .../query/TestParameterizedSparqlString.java    | 17 +++++++--------
 2 files changed, 10 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/b06b67bd/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index 03960e0..2a71ea9 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1902,7 +1902,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
                 replacement.append("(");
 
                 for (RDFNode item : group) {
-                    String insert = createInsert(item);
+                    String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
                     replacement.append(insert);
                     replacement.append(" ");
                 }
@@ -1922,7 +1922,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
                 if (isParenthesisNeeded) {
                     replacement.append("(");
                 }
-                String insert = createInsert(item);
+                String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
                 replacement.append(insert);
                 if (isParenthesisNeeded) {
                     replacement.append(")");
@@ -1952,24 +1952,6 @@ public class ParameterizedSparqlString implements PrefixMapping {
             return target;
         }
 
-        /**
-         * Insert the SPARQL representation of the RDF node.
-         *
-         * @param item
-         * @return
-         */
-        private String createInsert(RDFNode item) {
-            String insert;
-            if (item.isLiteral()) {
-                Literal lit = item.asLiteral();
-                insert = "\"" + lit.getLexicalForm() + "\"^^" + lit.getDatatypeURI();
-            } else if (item.isResource()) {
-                insert = "<" + item.asResource().getURI() + ">";
-            } else {
-                insert = item.asResource().getId().getLabelString();
-            }
-            return insert;
-        }
     }
     
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/b06b67bd/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index 8d75942..fd9b79d 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -24,8 +24,7 @@ import java.util.HashMap;
 import java.util.Iterator ;
 import java.util.List;
 import java.util.TimeZone ;
-
-import org.apache.jena.datatypes.TypeMapper ;
+import org.apache.jena.datatypes.TypeMapper;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.NodeFactory ;
 import org.apache.jena.rdf.model.* ;
@@ -1935,7 +1934,7 @@ public class TestParameterizedSparqlString {
         ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
         pss.setValues("objs", ResourceFactory.createPlainLiteral("test"));
 
-        String exp = "SELECT * WHERE { VALUES ?o {\"test\"^^http://www.w3.org/2001/XMLSchema#string} ?s ?p ?o }";
+        String exp = "SELECT * WHERE { VALUES ?o {\"test\"} ?s ?p ?o }";
         String res = pss.toString();
         //System.out.println("Exp: " + exp);
         //System.out.println("Res: " + res);
@@ -1949,7 +1948,7 @@ public class TestParameterizedSparqlString {
         ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
         pss.setValues("objs", ResourceFactory.createPlainLiteral("test"), true);
 
-        String exp = "SELECT * WHERE { VALUES ?o {(\"test\"^^http://www.w3.org/2001/XMLSchema#string)} ?s ?p ?o }";
+        String exp = "SELECT * WHERE { VALUES ?o {(\"test\")} ?s ?p ?o }";
         String res = pss.toString();
         //System.out.println("Exp: " + exp);
         //System.out.println("Res: " + res);
@@ -1966,7 +1965,7 @@ public class TestParameterizedSparqlString {
         objs.add(ResourceFactory.createPlainLiteral("obj_B"));
         pss.setValues("objs", objs);
 
-        String exp = "SELECT * WHERE { VALUES ?o {\"obj_A\"^^http://www.w3.org/2001/XMLSchema#string \"obj_B\"^^http://www.w3.org/2001/XMLSchema#string} ?s ?p ?o }";
+        String exp = "SELECT * WHERE { VALUES ?o {\"obj_A\" \"obj_B\"} ?s ?p ?o }";
         String res = pss.toString();
         //System.out.println("Exp: " + exp);
         //System.out.println("Res: " + res);
@@ -1983,7 +1982,7 @@ public class TestParameterizedSparqlString {
         objs.add(ResourceFactory.createPlainLiteral("obj_B"));
         pss.setValues("objs", objs, true);
 
-        String exp = "SELECT * WHERE { VALUES (?o) {(\"obj_A\"^^http://www.w3.org/2001/XMLSchema#string) (\"obj_B\"^^http://www.w3.org/2001/XMLSchema#string)} ?s ?p ?o }";
+        String exp = "SELECT * WHERE { VALUES (?o) {(\"obj_A\") (\"obj_B\")} ?s ?p ?o }";
         String res = pss.toString();
         //System.out.println("Exp: " + exp);
         //System.out.println("Res: " + res);
@@ -2005,7 +2004,7 @@ public class TestParameterizedSparqlString {
         props.add(ResourceFactory.createProperty("http://example.org/prop_B"));
         pss.setValues("props", props);
 
-        String exp = "SELECT * WHERE { VALUES ?p {<http://example.org/prop_A> <http://example.org/prop_B>} VALUES ?o {\"obj_A\"^^http://www.w3.org/2001/XMLSchema#string \"obj_B\"^^http://www.w3.org/2001/XMLSchema#string} ?s ?p ?o }";
+        String exp = "SELECT * WHERE { VALUES ?p {<http://example.org/prop_A> <http://example.org/prop_B>} VALUES ?o {\"obj_A\" \"obj_B\"} ?s ?p ?o }";
         String res = pss.toString();
         //System.out.println("Exp: " + exp);
         //System.out.println("Res: " + res);
@@ -2027,7 +2026,7 @@ public class TestParameterizedSparqlString {
         props.add(ResourceFactory.createProperty("http://example.org/prop_B"));
         pss.setValues("props", props, true);
 
-        String exp = "SELECT * WHERE { VALUES (?p) {(<http://example.org/prop_A>) (<http://example.org/prop_B>)} VALUES ?o {\"obj_A\"^^http://www.w3.org/2001/XMLSchema#string \"obj_B\"^^http://www.w3.org/2001/XMLSchema#string} ?s ?p ?o }";
+        String exp = "SELECT * WHERE { VALUES (?p) {(<http://example.org/prop_A>) (<http://example.org/prop_B>)} VALUES ?o {\"obj_A\" \"obj_B\"} ?s ?p ?o }";
         String res = pss.toString();
         //System.out.println("Exp: " + exp);
         //System.out.println("Res: " + res);
@@ -2053,7 +2052,7 @@ public class TestParameterizedSparqlString {
 
         pss.setGroupedValues("vars", vars);
 
-        String exp = "SELECT * WHERE { VALUES (?p ?o) {(<http://example.org/prop_A> \"obj_A\"^^http://www.w3.org/2001/XMLSchema#string) (<http://example.org/prop_B> \"obj_B\"^^http://www.w3.org/2001/XMLSchema#string)} ?s ?p ?o }";
+        String exp = "SELECT * WHERE { VALUES (?p ?o) {(<http://example.org/prop_A> \"obj_A\") (<http://example.org/prop_B> \"obj_B\")} ?s ?p ?o }";
         String res = pss.toString();
         //System.out.println("Exp: " + exp);
         //System.out.println("Res: " + res);


[05/19] jena git commit: ARQ:Query:ParameterizedSparqlString - "validateValuesSafeToInject" method now performed when applying the values. The variables which will be used in the substitution are identified then each variable is checked against the relev

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString - "validateValuesSafeToInject" method now performed when applying the values. The variables which will be used in the substitution are identified then each variable is checked against the relevant item.

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

Branch: refs/heads/master
Commit: a5f18c3d468a703954de464887b699e4ca95822a
Parents: 93c6780
Author: Greg Albiston <gr...@hotmail.com>
Authored: Mon Jul 30 15:48:42 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Mon Jul 30 15:48:42 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 57 ++++++++++++++++++--
 .../query/TestParameterizedSparqlString.java    | 39 ++++++++++++++
 2 files changed, 93 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/a5f18c3d/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index ab3bfcc..cba1e6d 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1850,6 +1850,24 @@ public class ParameterizedSparqlString implements PrefixMapping {
         return command;
     }
 
+    private static final String VALUES_KEYWORD = "values";
+
+    protected static String[] extractTargetVars(String command, String varName) {
+        String[] targetVars;
+
+        int varIndex = command.indexOf(varName);
+        if (varIndex > -1) {
+            String subCmd = command.substring(0, varIndex).toLowerCase(); //Truncate the command at the varName. Lowercase to search both types of values.
+            int valuesIndex = subCmd.lastIndexOf(VALUES_KEYWORD);
+            int bracesIndex = subCmd.lastIndexOf("{");
+            String vars = command.substring(valuesIndex + VALUES_KEYWORD.length(), bracesIndex);
+            targetVars = vars.replaceAll("[(?)]", "").trim().split(" ");
+        } else {
+            targetVars = new String[]{};
+        }
+        return targetVars;
+    }
+
     /**
      * Performs replacement of VALUES in query string.
      *
@@ -1884,10 +1902,11 @@ public class ParameterizedSparqlString implements PrefixMapping {
                 return command;
             }
 
-            String target = createTarget(varName);
+            validateValuesSafeToInject(command);
 
-            StringBuilder replacement;
+            String target = createTarget();
 
+            StringBuilder replacement;
             if (isGrouped) {
                 replacement = groupedApply();
             } else {
@@ -1943,7 +1962,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
          * @param varName
          * @return
          */
-        private String createTarget(String varName) {
+        private String createTarget() {
             String target;
 
             if (varName.startsWith("?") || varName.startsWith("$")) {
@@ -1954,6 +1973,38 @@ public class ParameterizedSparqlString implements PrefixMapping {
             return target;
         }
 
+        protected void validateValuesSafeToInject(String command) {
+
+            String[] targetVars = extractTargetVars(command, varName);
+
+            for (int i = 0; i < targetVars.length; i++) {
+                String targetVar = targetVars[i];
+                if (isGrouped) {
+                    //Iterate through each group according to the position of var and item.
+                    for (List<? extends RDFNode> group : groupedItems) {
+                        RDFNode item = group.get(i);
+                        validateSafeToInject(command, targetVar, item.asNode());
+                    }
+                } else {
+                    if (targetVars.length > 1) {
+                        if (items instanceof List) {
+                            //Multiple vars with items in an ordered list. Each var is checked against the item.
+                            List<? extends RDFNode> listItems = (List<? extends RDFNode>) items;
+                            RDFNode item = listItems.get(i);
+                            validateSafeToInject(command, targetVar, item.asNode());
+                        } else {
+                            //Multiple vars with items not in an ordered list. This is parsing error.
+                            throw new ARQException("Multiple VALUES variables (" + String.join(", ", targetVars) + ") being used without an ordered list of items: " + items.toString());
+                        }
+                    } else {
+                        //Single var with one or more items so all are checked.
+                        for (RDFNode item : items) {
+                            validateSafeToInject(command, targetVar, item.asNode());
+                        }
+                    }
+                }
+            }
+        }
     }
     
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/a5f18c3d/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index 69c50bf..90e5385 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -2070,4 +2070,43 @@ public class TestParameterizedSparqlString {
         Assert.fail("Attempt to do SPARQL injection should result in an exception");
     }
 
+    @Test
+    public void test_extract_target_vars() {
+        // Identifies the vars in the VALUES clause according to the substituting varName.
+        String cmd = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
+        String varName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String[] exp = new String[]{"o"};
+
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertArrayEquals(exp, res);
+    }
+
+    @Test
+    public void test_extract_two_target_vars() {
+        // Identifies the vars in the VALUES clause according to the substituting varName.
+        String cmd = "SELECT * WHERE { VALUES(?p ?o){?vars} ?s ?p ?o }";
+        String varName = "vars";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String[] exp = new String[]{"p", "o"};
+
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertArrayEquals(exp, res);
+    }
+
+    @Test
+    public void test_extract_multiple_target_vars() {
+        // Identifies the vars in the VALUES clause according to the substituting varName.
+        String cmd = "SELECT * WHERE { VALUES ?p {?props} VALUES ?o {?objs} ?s ?p ?o }";
+        String varName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String[] exp = new String[]{"o"};
+
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertArrayEquals(exp, res);
+    }
+
 }


[14/19] jena git commit: ARQ:Query:ParameterizedSparqlString - Tests for malformed queries which leave the query unchanged. Following current class design where syntax correctness is checked and reported by Query or UpdateRequest.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString 
- Tests for malformed queries which leave the query unchanged. Following current class design where syntax correctness is checked and reported by Query or UpdateRequest.

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

Branch: refs/heads/master
Commit: 16fb7ce9a3a08abb53aa791b938166e9f612ab0c
Parents: 5eb24eb
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 14:48:35 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 14:48:35 2018 +0100

----------------------------------------------------------------------
 .../query/TestParameterizedSparqlString.java    | 56 ++++++++++++++++++++
 1 file changed, 56 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/16fb7ce9/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index 6f174fb..4a050c6 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -1942,6 +1942,62 @@ public class TestParameterizedSparqlString {
     }
 
     @Test
+    public void test_set_values_item2() {
+        // Tests a single value being added using '$' variable syntax - always adding parenthesis.
+        String str = "SELECT * WHERE { VALUES $o {$objs} $s $p $o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        pss.setValues("objs", ResourceFactory.createPlainLiteral("test"));
+
+        String exp = "SELECT * WHERE { VALUES $o {(\"test\")} $s $p $o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
+    public void test_set_values_item_missing_values() {
+        // VALUES keyword missing so query is unchanged.
+        String str = "SELECT * WHERE { ?o {?objs} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        pss.setValues("objs", ResourceFactory.createPlainLiteral("test"));
+
+        String exp = "SELECT * WHERE { ?o {?objs} ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
+    public void test_set_values_item_missing_braces() {
+        // Braces missing so query is unchanged.
+        String str = "SELECT * WHERE { VALUES ?o ?objs ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        pss.setValues("objs", ResourceFactory.createPlainLiteral("test"));
+
+        String exp = "SELECT * WHERE { VALUES ?o ?objs ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
+    public void test_set_values_item_missing_varName() {
+        // varName missing ('props' instead of 'objs') so query is unchanged.
+        String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        pss.setValues("props", ResourceFactory.createPlainLiteral("test"));
+
+        String exp = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
+        String res = pss.toString();
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
     public void test_set_values_items_parenthesis() {
         // Tests two values for same variable.
         String str = "SELECT * WHERE { VALUES (?o) {?objs} ?s ?p ?o }";


[06/19] jena git commit: ARQ:Query:ParameterizedSparqlString - need for parenthesis in ungrouped values now determined based on the query rather than as a parameter.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString - need for parenthesis in ungrouped values now determined based on the query rather than as a parameter.

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

Branch: refs/heads/master
Commit: ecaf8d8bf08be57146c4f52b03117f4dd39f45a2
Parents: a5f18c3
Author: Greg Albiston <gr...@hotmail.com>
Authored: Mon Jul 30 16:13:12 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Mon Jul 30 16:13:12 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 114 +++++++------------
 .../query/TestParameterizedSparqlString.java    |  18 +--
 2 files changed, 41 insertions(+), 91 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/ecaf8d8b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index cba1e6d..3acac63 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1741,19 +1741,6 @@ public class ParameterizedSparqlString implements PrefixMapping {
     }
     
     /**
-     * Assign a varName with a multiple items and whether to include
-     * parenthesis.
-     *
-     * @param varName
-     * @param items
-     * @param isParenthesisNeeded
-     */
-    public void setValues(String varName, Collection<? extends RDFNode> items, boolean isParenthesisNeeded) {
-        items.forEach(item -> validateParameterValue(item.asNode()));
-        this.valuesReplacements.put(varName, new ValueReplacement(varName, items, isParenthesisNeeded));
-    }
-
-    /**
      * Assign a varName with a multiple items.<br>
      * Can be used to assign multiple values to a single variable or single
      * value to multiple variables (if using a List) in the SPARQL query.<br>
@@ -1763,69 +1750,31 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * @param items
      */
     public void setValues(String varName, Collection<? extends RDFNode> items) {
-        setValues(varName, items, false);
-    }
-
-    /**
-     * Assign a varName with a single item and whether to include parenthesis.
-     *
-     * @param varName
-     * @param item
-     * @param isParenthesisNeeded
-     */
-    public void setValues(String varName, RDFNode item, boolean isParenthesisNeeded) {
-        setValues(varName, Arrays.asList(item), isParenthesisNeeded);
+        items.forEach(item -> validateParameterValue(item.asNode()));
+        this.valuesReplacements.put(varName, new ValueReplacement(varName, items));
     }
 
     /**
-     * Assign a varName with a single item.
+     * Assign a varName with a single item.<br>
      *
      * @param varName
      * @param item
      */
     public void setValues(String varName, RDFNode item) {
-        setValues(varName, Arrays.asList(item), false);
-    }
-
-    /**
-     * Sets a map of varNames and their items.
-     *
-     * @param valuesItems
-     */
-    public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems) {
-        valuesItems.forEach(this::setValues);
+        setValues(varName, Arrays.asList(item));
     }
 
     /**
-     * All varNames in the map will use the same approach to parenthesis.
-     *
-     * @param valuesItems
-     * @param isParenthesisNeeded
-     */
-    public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems, Boolean isParenthesisNeeded) {
-        valuesItems.forEach((varName, items) -> setValues(varName, items, isParenthesisNeeded));
-    }
-
-    /**
-     * Combine a map of varNames and items with whether to include parenthesis.
-     * Missing varNames in the parenthesis map will default to false.
+     * **
+     * Sets a map of varNames and their items.<br>
+     * Can be used to assign multiple values to a single variable or single
+     * value to multiple variables (if using a List) in the SPARQL query.<br>
+     * See setGroupedValues to assign multiple values to multiple variables.
      *
-     * @param valuesItems
-     * @param valuesParenthesis
+     * @param itemsMap
      */
-    public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems, Map<String, Boolean> valuesParenthesis) {
-
-        for (String varName : valuesItems.keySet()) {
-            Collection<? extends RDFNode> items = valuesItems.get(varName);
-            Boolean isParenthesisNeeded;
-            if (valuesParenthesis.containsKey(varName)) {
-                isParenthesisNeeded = valuesParenthesis.get(varName);
-            } else {
-                isParenthesisNeeded = false;
-            }
-
-            setValues(varName, items, isParenthesisNeeded);
-        }
+    public void setValues(Map<String, Collection<? extends RDFNode>> itemsMap) {
+        itemsMap.forEach(this::setValues);
     }
 
     /**
@@ -1835,11 +1784,11 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * (prop_B obj_B)}".
      *
      * @param varName
-     * @param items
+     * @param groupedItems
      */
-    public void setGroupedValues(String varName, Collection<List<? extends RDFNode>> items) {
-        items.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
-        this.valuesReplacements.put(varName, new ValueReplacement(varName, items));
+    public void setGroupedValues(String varName, Collection<List<? extends RDFNode>> groupedItems) {
+        groupedItems.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
+        this.valuesReplacements.put(varName, new ValueReplacement(varName, groupedItems, true));
     }
 
     private String applyValues(String command) {
@@ -1868,6 +1817,22 @@ public class ParameterizedSparqlString implements PrefixMapping {
         return targetVars;
     }
 
+    protected static boolean checkParenthesis(String command, String varName) {
+        boolean isNeeded;
+
+        int varIndex = command.indexOf(varName);
+        if (varIndex > -1) {
+            String subCmd = command.substring(0, varIndex).toLowerCase(); //Truncate the command at the varName. Lowercase to search both types of values.
+            int valuesIndex = subCmd.lastIndexOf(VALUES_KEYWORD);
+            int bracesIndex = subCmd.lastIndexOf("{");
+            String vars = command.substring(valuesIndex + VALUES_KEYWORD.length(), bracesIndex);
+            isNeeded = vars.contains("(");
+        } else {
+            isNeeded = false;
+        }
+        return isNeeded;
+    }
+
     /**
      * Performs replacement of VALUES in query string.
      *
@@ -1877,23 +1842,20 @@ public class ParameterizedSparqlString implements PrefixMapping {
         private final String varName;
         private final Collection<? extends RDFNode> items;
         private final Collection<List<? extends RDFNode>> groupedItems;
-        private final Boolean isParenthesisNeeded;
         private final Boolean isGrouped;
 
-        public ValueReplacement(String varName, Collection<? extends RDFNode> items, Boolean isParenthesisNeeded) {
+        public ValueReplacement(String varName, Collection<? extends RDFNode> items) {
             this.varName = varName;
             this.items = items;
             this.groupedItems = new ArrayList<>();
-            this.isParenthesisNeeded = isParenthesisNeeded;
             this.isGrouped = false;
         }
 
-        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> groupedItems) {
+        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> groupedItems, Boolean isGrouped) {
             this.varName = varName;
             this.items = new ArrayList<>();
             this.groupedItems = groupedItems;
-            this.isParenthesisNeeded = true;
-            this.isGrouped = true;
+            this.isGrouped = isGrouped;
         }
 
         public String apply(String command) {
@@ -1910,7 +1872,8 @@ public class ParameterizedSparqlString implements PrefixMapping {
             if (isGrouped) {
                 replacement = groupedApply();
             } else {
-                replacement = ungroupedApply();
+
+                replacement = ungroupedApply(command);
             }
 
             return command.replace(target, replacement);
@@ -1936,7 +1899,8 @@ public class ParameterizedSparqlString implements PrefixMapping {
             return replacement;
         }
 
-        private StringBuilder ungroupedApply() {
+        private StringBuilder ungroupedApply(String command) {
+            boolean isParenthesisNeeded = checkParenthesis(command, varName);
             StringBuilder replacement = new StringBuilder("");
 
             for (RDFNode item : items) {

http://git-wip-us.apache.org/repos/asf/jena/blob/ecaf8d8b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index 90e5385..adf1108 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -1942,20 +1942,6 @@ public class TestParameterizedSparqlString {
     }
 
     @Test
-    public void test_set_values_item_parenthesis() {
-        // Tests a single value with parenthesis.
-        String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
-        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
-        pss.setValues("objs", ResourceFactory.createPlainLiteral("test"), true);
-
-        String exp = "SELECT * WHERE { VALUES ?o {(\"test\")} ?s ?p ?o }";
-        String res = pss.toString();
-        //System.out.println("Exp: " + exp);
-        //System.out.println("Res: " + res);
-        Assert.assertEquals(exp, res);
-    }
-
-    @Test
     public void test_set_values_items() {
         // Tests two values for same variable.
         String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
@@ -1980,7 +1966,7 @@ public class TestParameterizedSparqlString {
         List<RDFNode> objs = new ArrayList<>();
         objs.add(ResourceFactory.createPlainLiteral("obj_A"));
         objs.add(ResourceFactory.createPlainLiteral("obj_B"));
-        pss.setValues("objs", objs, true);
+        pss.setValues("objs", objs);
 
         String exp = "SELECT * WHERE { VALUES (?o) {(\"obj_A\") (\"obj_B\")} ?s ?p ?o }";
         String res = pss.toString();
@@ -2024,7 +2010,7 @@ public class TestParameterizedSparqlString {
         List<RDFNode> props = new ArrayList<>();
         props.add(ResourceFactory.createProperty("http://example.org/prop_A"));
         props.add(ResourceFactory.createProperty("http://example.org/prop_B"));
-        pss.setValues("props", props, true);
+        pss.setValues("props", props);
 
         String exp = "SELECT * WHERE { VALUES (?p) {(<http://example.org/prop_A>) (<http://example.org/prop_B>)} VALUES ?o {\"obj_A\" \"obj_B\"} ?s ?p ?o }";
         String res = pss.toString();


[12/19] jena git commit: ARQ:Query:ParameterizedSparqlString - "extractTargetVars" method now checks for missing VALUES keyword and braces. Additional test cases added.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString 
- "extractTargetVars" method now checks for missing VALUES keyword and braces. Additional test cases added.

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

Branch: refs/heads/master
Commit: ec242ef1ffc5cf081f5e8652dd72c4b8002f7b32
Parents: 856e06c
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 14:24:00 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 14:24:00 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 18 ++--
 .../query/TestParameterizedSparqlString.java    | 94 ++++++++++++++++++--
 2 files changed, 98 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/ec242ef1/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index c3b3857..b65106e 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1816,17 +1816,18 @@ public class ParameterizedSparqlString implements PrefixMapping {
     private static final String VALUES_KEYWORD = "values";
 
     protected static String[] extractTargetVars(String command, String varName) {
-        String[] targetVars;
+        String[] targetVars = new String[]{};
 
         int varIndex = command.indexOf(varName);
         if (varIndex > -1) {
             String subCmd = command.substring(0, varIndex).toLowerCase(); //Truncate the command at the varName. Lowercase to search both types of values.
             int valuesIndex = subCmd.lastIndexOf(VALUES_KEYWORD);
-            int bracesIndex = subCmd.lastIndexOf("{");
-            String vars = command.substring(valuesIndex + VALUES_KEYWORD.length(), bracesIndex);
-            targetVars = vars.replaceAll("[(?)]", "").trim().split(" ");
-        } else {
-            targetVars = new String[]{};
+            int openBracesIndex = subCmd.lastIndexOf("{");
+            int closeBracesIndex = subCmd.lastIndexOf("}");
+            if (valuesIndex > -1 && valuesIndex < openBracesIndex && closeBracesIndex < valuesIndex) { //Ensure that VALUES keyword is found, open braces index is located after the VALUES and any close braces is located before the VALUES.
+                String vars = command.substring(valuesIndex + VALUES_KEYWORD.length(), openBracesIndex);
+                targetVars = vars.replaceAll("[(?)]", "").trim().split(" ");
+            }
         }
         return targetVars;
     }
@@ -1852,6 +1853,11 @@ public class ParameterizedSparqlString implements PrefixMapping {
             }
 
             String[] targetVars = extractTargetVars(command, varName);
+            if (targetVars.length == 0) {
+                //VALUES keyword has not been found or there is another issue so do not modify the command.
+                return command;
+            }
+
             validateValuesSafeToInject(command, targetVars);
 
             String target = createTarget();

http://git-wip-us.apache.org/repos/asf/jena/blob/ec242ef1/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index 1cf3312..6f174fb 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -1992,8 +1992,8 @@ public class TestParameterizedSparqlString {
 
         String exp = "SELECT * WHERE { VALUES ?p {(<http://example.org/prop_A>) (<http://example.org/prop_B>)} VALUES ?o {(\"obj_A\") (\"obj_B\")} ?s ?p ?o }";
         String res = pss.toString();
-        System.out.println("Exp: " + exp);
-        System.out.println("Res: " + res);
+        //System.out.println("Exp: " + exp);
+        //System.out.println("Res: " + res);
         Assert.assertEquals(exp, res);
     }
 
@@ -2042,8 +2042,8 @@ public class TestParameterizedSparqlString {
         String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
         String[] exp = new String[]{"o"};
 
-        //System.out.println("Exp: " + exp);
-        //System.out.println("Res: " + res);
+        //System.out.println("Exp: " + String.join(",", exp));
+        //System.out.println("Res: " + String.join(",", res));
         Assert.assertArrayEquals(exp, res);
     }
 
@@ -2055,8 +2055,8 @@ public class TestParameterizedSparqlString {
         String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
         String[] exp = new String[]{"p", "o"};
 
-        //System.out.println("Exp: " + exp);
-        //System.out.println("Res: " + res);
+        ///System.out.println("Exp: " + String.join(",", exp));
+        //System.out.println("Res: " + String.join(",", res));
         Assert.assertArrayEquals(exp, res);
     }
 
@@ -2068,8 +2068,86 @@ public class TestParameterizedSparqlString {
         String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
         String[] exp = new String[]{"o"};
 
-        //System.out.println("Exp: " + exp);
-        //System.out.println("Res: " + res);
+        //System.out.println("Exp: " + String.join(",", exp));
+        //System.out.println("Res: " + String.join(",", res));
+        Assert.assertArrayEquals(exp, res);
+    }
+
+    @Test
+    public void test_extract_target_vars_missing_target() {
+        // Missing target variable name so should return empty array.
+        String cmd = "SELECT * WHERE { VALUES ?o {} ?s ?p ?o }";
+        String varName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String[] exp = new String[]{};
+
+        //System.out.println("Exp: " + String.join(",", exp));
+        //System.out.println("Res: " + String.join(",", res));
+        Assert.assertArrayEquals(exp, res);
+    }
+
+    @Test
+    public void test_extract_target_vars_missing_brace() {
+        // Missing brace so should return empty array.
+        String cmd = "SELECT * WHERE { VALUES ?o ?objs} ?s ?p ?o }";
+        String varName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String[] exp = new String[]{};
+
+        //System.out.println("Exp: " + String.join(",", exp));
+        //System.out.println("Res: " + String.join(",", res));
+        Assert.assertArrayEquals(exp, res);
+    }
+
+    @Test
+    public void test_extract_multiple_target_vars_missing_brace() {
+        // Missing brace so should return empty array.
+        String cmd = "SELECT * WHERE { VALUES ?p {?props} VALUES ?o ?objs} ?s ?p ?o }";
+        String varName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String[] exp = new String[]{};
+
+        //System.out.println("Exp: " + String.join(",", exp));
+        //System.out.println("Res: " + String.join(",", res));
+        Assert.assertArrayEquals(exp, res);
+    }
+
+    @Test
+    public void test_extract_target_vars_missing_values() {
+        // Missing VALUES keyword so should return empty array.
+        String cmd = "SELECT * WHERE { ?o {?objs} ?s ?p ?o }";
+        String varName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String[] exp = new String[]{};
+
+        //System.out.println("Exp: " + String.join(",", exp));
+        //System.out.println("Res: " + String.join(",", res));
+        Assert.assertArrayEquals(exp, res);
+    }
+
+    @Test
+    public void test_extract_multiple_target_vars_missing_values() {
+        // Missing VALUES keyword so should return empty array.
+        String cmd = "SELECT * WHERE { VALUES ?p {?props} ?o {?objs} ?s ?p ?o }";
+        String varName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String[] exp = new String[]{};
+
+        //System.out.println("Exp: " + String.join(",", exp));
+        //System.out.println("Res: " + String.join(",", res));
+        Assert.assertArrayEquals(exp, res);
+    }
+
+    @Test
+    public void test_extract_multiple_target_vars_no_braces() {
+        // Missing braces and VALUES keyword so should return empty array.
+        String cmd = "SELECT * WHERE { VALUES ?p ?props ?o ?objs ?s ?p ?o }";
+        String varName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String[] exp = new String[]{};
+
+        //System.out.println("Exp: " + String.join(",", exp));
+        //System.out.println("Res: " + String.join(",", res));
         Assert.assertArrayEquals(exp, res);
     }
 


[19/19] jena git commit: JENA-1578: Merge commit 'refs/pull/449/head' of https://github.com/apache/jena

Posted by an...@apache.org.
JENA-1578: Merge commit 'refs/pull/449/head' of https://github.com/apache/jena

This closes #449.


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

Branch: refs/heads/master
Commit: 43feda68f0b781cacb7a85333e07c5c3c3c22f68
Parents: 720a198 b405304
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Aug 5 16:30:02 2018 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Aug 5 16:30:02 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 217 ++++++++++++-
 .../query/TestParameterizedSparqlString.java    | 314 ++++++++++++++++++-
 2 files changed, 525 insertions(+), 6 deletions(-)
----------------------------------------------------------------------



[09/19] jena git commit: ARQ:Query:ParameterizedSparqlString - parenthesis now always applied when there is more than one target variables. Only check the query for parenthesis in the single target variable case.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString - parenthesis now always applied when there is more than one target variables. Only check the query for parenthesis in the single target variable case.

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

Branch: refs/heads/master
Commit: 9662ff6e7dc57633cfbc78632a596f56f2db3268
Parents: 8b1548c
Author: Greg Albiston <gr...@hotmail.com>
Authored: Mon Jul 30 16:49:37 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Mon Jul 30 16:49:37 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 48 ++++++++++++--------
 .../query/TestParameterizedSparqlString.java    | 17 +++++++
 2 files changed, 46 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/9662ff6e/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index 9a3fae8..8ecc644 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1745,8 +1745,8 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * Can be used to assign multiple values to a single variable or single
      * value to multiple variables (if using a List) in the SPARQL query.<br>
      * See setGroupedValues to assign multiple values to multiple variables.<br>
-     * Using "var" with list(prop_A, obj_A) on query "VALUES ?p ?o {?var}" would
-     * produce "VALUES ?p ?o {prop_A obj_A}".
+     * Using "var" with list(prop_A, obj_A) on query "VALUES (?p ?o) {?var}"
+     * would produce "VALUES (?p ?o) {(prop_A obj_A)}".
      *
      *
      * @param varName
@@ -1868,7 +1868,8 @@ public class ParameterizedSparqlString implements PrefixMapping {
                 return command;
             }
 
-            validateValuesSafeToInject(command);
+            String[] targetVars = extractTargetVars(command, varName);
+            validateValuesSafeToInject(command, targetVars);
 
             String target = createTarget();
 
@@ -1877,7 +1878,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
                 replacement = groupedApply();
             } else {
 
-                replacement = ungroupedApply(command);
+                replacement = ungroupedApply(command, targetVars.length);
             }
 
             return command.replace(target, replacement);
@@ -1903,24 +1904,35 @@ public class ParameterizedSparqlString implements PrefixMapping {
             return replacement;
         }
 
-        private StringBuilder ungroupedApply(String command) {
-            boolean isParenthesisNeeded = checkParenthesis(command, varName);
+        private StringBuilder ungroupedApply(String command, int targetVarCount) {
+
             StringBuilder replacement = new StringBuilder("");
 
-            for (RDFNode item : items) {
-                if (isParenthesisNeeded) {
-                    replacement.append("(");
+            if (targetVarCount == 1) {
+                boolean isParenthesisNeeded = checkParenthesis(command, varName);
+                for (RDFNode item : items) {
+                    if (isParenthesisNeeded) {
+                        replacement.append("(");
+                    }
+                    String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
+                    replacement.append(insert);
+                    if (isParenthesisNeeded) {
+                        replacement.append(")");
+                    }
+                    replacement.append(" ");
                 }
-                String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
-                replacement.append(insert);
-                if (isParenthesisNeeded) {
-                    replacement.append(")");
+                replacement.deleteCharAt(replacement.length() - 1);
+            } else {
+                replacement.append("(");
+                for (RDFNode item : items) {
+                    String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
+                    replacement.append(insert);
+                    replacement.append(" ");
                 }
-                replacement.append(" ");
+                replacement.deleteCharAt(replacement.length() - 1);
+                replacement.append(")");
             }
 
-            replacement.deleteCharAt(replacement.length() - 1);
-
             return replacement;
         }
 
@@ -1941,9 +1953,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
             return target;
         }
 
-        protected void validateValuesSafeToInject(String command) {
-
-            String[] targetVars = extractTargetVars(command, varName);
+        protected void validateValuesSafeToInject(String command, String[] targetVars) {
 
             for (int i = 0; i < targetVars.length; i++) {
                 String targetVar = targetVars[i];

http://git-wip-us.apache.org/repos/asf/jena/blob/9662ff6e/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index adf1108..1dc14ee 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -1976,6 +1976,23 @@ public class TestParameterizedSparqlString {
     }
 
     @Test
+    public void test_set_values_multiple_variables_parenthesis() {
+        // Tests two values for same variable.
+        String str = "SELECT * WHERE { VALUES (?p ?o) {?vars} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        List<RDFNode> vars = new ArrayList<>();
+        vars.add(ResourceFactory.createProperty("http://example.org/prop_A"));
+        vars.add(ResourceFactory.createPlainLiteral("obj_A"));
+        pss.setValues("vars", vars);
+
+        String exp = "SELECT * WHERE { VALUES (?p ?o) {(<http://example.org/prop_A> \"obj_A\")} ?s ?p ?o }";
+        String res = pss.toString();
+        System.out.println("Exp: " + exp);
+        System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
     public void test_set_values_multi_var() {
         // Tests two variables.
         String str = "SELECT * WHERE { VALUES ?p {?props} VALUES ?o {?objs} ?s ?p ?o }";


[18/19] jena git commit: ARQ:Query:TestParameterizedSparqlString - tests for incorrect number of values for variables.

Posted by an...@apache.org.
ARQ:Query:TestParameterizedSparqlString 
- tests for incorrect number of values for variables.

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

Branch: refs/heads/master
Commit: b405304988fad9f872cb99fcc7fbd4e7ae259e41
Parents: c865069
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 15:39:43 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 15:39:43 2018 +0100

----------------------------------------------------------------------
 .../query/TestParameterizedSparqlString.java    | 32 ++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/b4053049/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index 589a005..7a32ded 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -2015,7 +2015,7 @@ public class TestParameterizedSparqlString {
     }
 
     @Test
-    public void test_set_values_multiple_variables_parenthesis() {
+    public void test_set_values_multiple_variables() {
         // Tests two values for same variable.
         String str = "SELECT * WHERE { VALUES (?p ?o) {?vars} ?s ?p ?o }";
         ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
@@ -2031,6 +2031,34 @@ public class TestParameterizedSparqlString {
         Assert.assertEquals(exp, res);
     }
 
+    @Test(expected = ARQException.class)
+    public void test_set_values_multiple_variables_too_few() {
+        // Test of one value for two variables.
+        String str = "SELECT * WHERE { VALUES (?p ?o) {?vars} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        List<RDFNode> vars = new ArrayList<>();
+        vars.add(ResourceFactory.createProperty("http://example.org/prop_A"));
+        pss.setValues("vars", vars);
+
+        pss.toString();
+        Assert.fail("Attempt to insert incorrect number of values.");
+    }
+
+    @Test(expected = ARQException.class)
+    public void test_set_values_multiple_variables_too_many() {
+        // Test of three values for two variables.
+        String str = "SELECT * WHERE { VALUES (?p ?o) {?vars} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        List<RDFNode> vars = new ArrayList<>();
+        vars.add(ResourceFactory.createProperty("http://example.org/prop_A"));
+        vars.add(ResourceFactory.createPlainLiteral("obj_A"));
+        vars.add(ResourceFactory.createPlainLiteral("obj_A"));
+        pss.setValues("vars", vars);
+
+        pss.toString();
+        Assert.fail("Attempt to insert incorrect number of values.");
+    }
+
     @Test
     public void test_set_values_multi_var() {
         // Tests two variables - always adding parenthesis.
@@ -2086,7 +2114,7 @@ public class TestParameterizedSparqlString {
         ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
         pss.setValues(str, ResourceFactory.createResource("<http://example.org/obj_A>"));
 
-        pss.asQuery();
+        pss.toString();
         Assert.fail("Attempt to do SPARQL injection should result in an exception");
     }
 


[07/19] jena git commit: ARQ:Query:ParameterizedSparqlString - more examples provided in JavaDocs.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString - more examples provided in JavaDocs.

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

Branch: refs/heads/master
Commit: f367e23c3413ef4a10df4b775f07d3139a900bc1
Parents: ecaf8d8
Author: Greg Albiston <gr...@hotmail.com>
Authored: Mon Jul 30 16:17:49 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Mon Jul 30 16:17:49 2018 +0100

----------------------------------------------------------------------
 .../apache/jena/query/ParameterizedSparqlString.java | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/f367e23c/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index 3acac63..669cc6c 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1741,10 +1741,13 @@ public class ParameterizedSparqlString implements PrefixMapping {
     }
     
     /**
-     * Assign a varName with a multiple items.<br>
+     * Assign a VALUES varName with a multiple items.<br>
      * Can be used to assign multiple values to a single variable or single
      * value to multiple variables (if using a List) in the SPARQL query.<br>
-     * See setGroupedValues to assign multiple values to multiple variables.
+     * See setGroupedValues to assign multiple values to multiple variables.<br>
+     * Using "var" with list(prop_A, obj_A) on query "VALUES ?p ?o {?var}" would
+     * produce "VALUES ?p ?o {prop_A obj_A}".
+     *
      *
      * @param varName
      * @param items
@@ -1755,7 +1758,9 @@ public class ParameterizedSparqlString implements PrefixMapping {
     }
 
     /**
-     * Assign a varName with a single item.<br>
+     * Assign a VALUES varName with a single item.<br>
+     * Using "var" with Literal obj_A on query "VALUES ?o {?var}" would produce
+     * "VALUES ?o {obj_A}".
      *
      * @param varName
      * @param item
@@ -1766,7 +1771,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
 
     /**
      * **
-     * Sets a map of varNames and their items.<br>
+     * Sets a map of VALUES varNames and their items.<br>
      * Can be used to assign multiple values to a single variable or single
      * value to multiple variables (if using a List) in the SPARQL query.<br>
      * See setGroupedValues to assign multiple values to multiple variables.
@@ -1778,7 +1783,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
     }
 
     /**
-     * Allocate multiple lists of variables to a single varName.<br>
+     * Allocate multiple lists of variables to a single VALUES varName.<br>
      * Using "vars" with list(list(prop_A, obj_A), list(prop_B, obj_B)) on query
      * "VALUES (?p ?o) {?vars}" would produce "VALUES (?p ?o) {(prop_A obj_A)
      * (prop_B obj_B)}".


[17/19] jena git commit: ARQ:Query:ParameterizedSparqlString - replaced "varName" with "valueName" to distinguish from the "vars" that will be substituted when query is executed.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString 
- replaced "varName" with "valueName" to distinguish from the "vars" that will be substituted when query is executed.

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

Branch: refs/heads/master
Commit: c865069a56f595df50f665c8155c67a600e4c91d
Parents: d1ee09b
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 15:09:09 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 15:09:09 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 66 ++++++++++----------
 .../query/TestParameterizedSparqlString.java    | 48 +++++++-------
 2 files changed, 57 insertions(+), 57 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/c865069a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index b8b8978..acf50e8 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1744,18 +1744,18 @@ public class ParameterizedSparqlString implements PrefixMapping {
     }
     
     /**
-     * Assign a VALUES varName with a multiple items.<br>
+     * Assign a VALUES valueName with a multiple items.<br>
      * Can be used to assign multiple values to a single variable or single
      * value to multiple variables (if using a List) in the SPARQL query.<br>
      * See setRowValues to assign multiple values to multiple variables.<br>
-     * Using "var" with list(prop_A, obj_A) on query "VALUES (?p ?o) {?var}"
-     * would produce "VALUES (?p ?o) {(prop_A obj_A)}".
+     * Using "valueName" with list(prop_A, obj_A) on query "VALUES (?p ?o)
+     * {?valueName}"     * would produce "VALUES (?p ?o) {(prop_A obj_A)}".
      *
      *
-     * @param varName
+     * @param valueName
      * @param items
      */
-    public void setValues(String varName, Collection<? extends RDFNode> items) {
+    public void setValues(String valueName, Collection<? extends RDFNode> items) {
         items.forEach(item -> validateParameterValue(item.asNode()));
 
         //Ensure that a list is used for the items.
@@ -1765,24 +1765,24 @@ public class ParameterizedSparqlString implements PrefixMapping {
         } else {
             rowItems.add(new ArrayList<>(items));
         }
-        this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems));
+        this.valuesReplacements.put(valueName, new ValueReplacement(valueName, rowItems));
     }
 
     /**
-     * Assign a VALUES varName with a single item.<br>
-     * Using "var" with Literal obj_A on query "VALUES ?o {?var}" would produce
-     * "VALUES ?o {obj_A}".
+     * Assign a VALUES valueName with a single item.<br>
+     * Using "valueName" with Literal obj_A on query "VALUES ?o {?valueName}"
+     * would produce     * "VALUES ?o {obj_A}".
      *
-     * @param varName
+     * @param valueName
      * @param item
      */
-    public void setValues(String varName, RDFNode item) {
-        setValues(varName, Arrays.asList(item));
+    public void setValues(String valueName, RDFNode item) {
+        setValues(valueName, Arrays.asList(item));
     }
 
     /**
      * **
-     * Sets a map of VALUES varNames and their items.<br>
+     * Sets a map of VALUES valueNames and their items.<br>
      * Can be used to assign multiple values to a single variable or single
      * value to multiple variables (if using a List) in the SPARQL query.<br>
      * See setRowValues to assign multiple values to multiple variables.
@@ -1794,17 +1794,17 @@ public class ParameterizedSparqlString implements PrefixMapping {
     }
 
     /**
-     * Allocate multiple lists of variables to a single VALUES varName.<br>
-     * Using "vars" with list(list(prop_A, obj_A), list(prop_B, obj_B)) on query
-     * "VALUES (?p ?o) {?vars}" would produce "VALUES (?p ?o) {(prop_A obj_A)
-     * (prop_B obj_B)}".
+     * Allocate multiple lists of variables to a single VALUES valueName.<br>
+     * Using "valuesName" with list(list(prop_A, obj_A), list(prop_B, obj_B)) on
+     * query "VALUES (?p ?o) {?valuesName}" would produce "VALUES (?p ?o)
+     * {(prop_A obj_A)     * (prop_B obj_B)}".
      *
-     * @param varName
+     * @param valueName
      * @param rowItems
      */
-    public void setRowValues(String varName, Collection<List<? extends RDFNode>> rowItems) {
+    public void setRowValues(String valueName, Collection<List<? extends RDFNode>> rowItems) {
         rowItems.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
-        this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems));
+        this.valuesReplacements.put(valueName, new ValueReplacement(valueName, rowItems));
     }
 
     private String applyValues(String command, SerializationContext context) {
@@ -1817,12 +1817,12 @@ public class ParameterizedSparqlString implements PrefixMapping {
 
     private static final String VALUES_KEYWORD = "values";
 
-    protected static String[] extractTargetVars(String command, String varName) {
+    protected static String[] extractTargetVars(String command, String valueName) {
         String[] targetVars = new String[]{};
 
-        int varIndex = command.indexOf(varName);
-        if (varIndex > -1) {
-            String subCmd = command.substring(0, varIndex).toLowerCase(); //Truncate the command at the varName. Lowercase to search both types of values.
+        int valueIndex = command.indexOf(valueName);
+        if (valueIndex > -1) {
+            String subCmd = command.substring(0, valueIndex).toLowerCase(); //Truncate the command at the valueName. Lowercase to search both cases of VALUES keyword.
             int valuesIndex = subCmd.lastIndexOf(VALUES_KEYWORD);
             int openBracesIndex = subCmd.lastIndexOf("{");
             int closeBracesIndex = subCmd.lastIndexOf("}");
@@ -1840,11 +1840,11 @@ public class ParameterizedSparqlString implements PrefixMapping {
      */
     private class ValueReplacement {
 
-        private final String varName;
+        private final String valueName;
         private final Collection<List<? extends RDFNode>> rowItems;
 
-        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> rowItems) {
-            this.varName = varName;
+        public ValueReplacement(String valueName, Collection<List<? extends RDFNode>> rowItems) {
+            this.valueName = valueName;
             this.rowItems = rowItems;
         }
 
@@ -1854,7 +1854,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
                 return command;
             }
 
-            String[] targetVars = extractTargetVars(command, varName);
+            String[] targetVars = extractTargetVars(command, valueName);
             if (targetVars.length == 0) {
                 //VALUES keyword has not been found or there is another issue so do not modify the command.
                 return command;
@@ -1899,18 +1899,18 @@ public class ParameterizedSparqlString implements PrefixMapping {
         }
 
         /**
-         * Tidy up varName if doesn't start with a ? or $.
+         * Tidy up valueName if doesn't start with a ? or $.
          *
-         * @param varName
+         * @param valueName
          * @return
          */
         private String createTarget() {
             String target;
 
-            if (varName.startsWith("?") || varName.startsWith("$")) {
-                target = varName;
+            if (valueName.startsWith("?") || valueName.startsWith("$")) {
+                target = valueName;
             } else {
-                target = "[?$]" + varName;
+                target = "[?$]" + valueName;
             }
             return target;
         }

http://git-wip-us.apache.org/repos/asf/jena/blob/c865069a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index 4a050c6..589a005 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -1984,8 +1984,8 @@ public class TestParameterizedSparqlString {
     }
 
     @Test
-    public void test_set_values_item_missing_varName() {
-        // varName missing ('props' instead of 'objs') so query is unchanged.
+    public void test_set_values_item_missing_valueName() {
+        // valueName missing ('props' instead of 'objs') so query is unchanged.
         String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
         ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
         pss.setValues("props", ResourceFactory.createPlainLiteral("test"));
@@ -2092,10 +2092,10 @@ public class TestParameterizedSparqlString {
 
     @Test
     public void test_extract_target_vars() {
-        // Identifies the vars in the VALUES clause according to the substituting varName.
+        // Identifies the vars in the VALUES clause according to the substituting valueName.
         String cmd = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
-        String varName = "objs";
-        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String valueName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, valueName);
         String[] exp = new String[]{"o"};
 
         //System.out.println("Exp: " + String.join(",", exp));
@@ -2105,10 +2105,10 @@ public class TestParameterizedSparqlString {
 
     @Test
     public void test_extract_two_target_vars() {
-        // Identifies the vars in the VALUES clause according to the substituting varName.
-        String cmd = "SELECT * WHERE { VALUES(?p ?o){?vars} ?s ?p ?o }";
-        String varName = "vars";
-        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        // Identifies the vars in the VALUES clause according to the substituting valueName.
+        String cmd = "SELECT * WHERE { VALUES(?p ?o){?valuesName} ?s ?p ?o }";
+        String valueName = "valuesName";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, valueName);
         String[] exp = new String[]{"p", "o"};
 
         ///System.out.println("Exp: " + String.join(",", exp));
@@ -2118,10 +2118,10 @@ public class TestParameterizedSparqlString {
 
     @Test
     public void test_extract_multiple_target_vars() {
-        // Identifies the vars in the VALUES clause according to the substituting varName.
+        // Identifies the vars in the VALUES clause according to the substituting valueName.
         String cmd = "SELECT * WHERE { VALUES ?p {?props} VALUES ?o {?objs} ?s ?p ?o }";
-        String varName = "objs";
-        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String valueName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, valueName);
         String[] exp = new String[]{"o"};
 
         //System.out.println("Exp: " + String.join(",", exp));
@@ -2133,8 +2133,8 @@ public class TestParameterizedSparqlString {
     public void test_extract_target_vars_missing_target() {
         // Missing target variable name so should return empty array.
         String cmd = "SELECT * WHERE { VALUES ?o {} ?s ?p ?o }";
-        String varName = "objs";
-        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String valueName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, valueName);
         String[] exp = new String[]{};
 
         //System.out.println("Exp: " + String.join(",", exp));
@@ -2146,8 +2146,8 @@ public class TestParameterizedSparqlString {
     public void test_extract_target_vars_missing_brace() {
         // Missing brace so should return empty array.
         String cmd = "SELECT * WHERE { VALUES ?o ?objs} ?s ?p ?o }";
-        String varName = "objs";
-        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String valueName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, valueName);
         String[] exp = new String[]{};
 
         //System.out.println("Exp: " + String.join(",", exp));
@@ -2159,8 +2159,8 @@ public class TestParameterizedSparqlString {
     public void test_extract_multiple_target_vars_missing_brace() {
         // Missing brace so should return empty array.
         String cmd = "SELECT * WHERE { VALUES ?p {?props} VALUES ?o ?objs} ?s ?p ?o }";
-        String varName = "objs";
-        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String valueName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, valueName);
         String[] exp = new String[]{};
 
         //System.out.println("Exp: " + String.join(",", exp));
@@ -2172,8 +2172,8 @@ public class TestParameterizedSparqlString {
     public void test_extract_target_vars_missing_values() {
         // Missing VALUES keyword so should return empty array.
         String cmd = "SELECT * WHERE { ?o {?objs} ?s ?p ?o }";
-        String varName = "objs";
-        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String valueName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, valueName);
         String[] exp = new String[]{};
 
         //System.out.println("Exp: " + String.join(",", exp));
@@ -2185,8 +2185,8 @@ public class TestParameterizedSparqlString {
     public void test_extract_multiple_target_vars_missing_values() {
         // Missing VALUES keyword so should return empty array.
         String cmd = "SELECT * WHERE { VALUES ?p {?props} ?o {?objs} ?s ?p ?o }";
-        String varName = "objs";
-        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String valueName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, valueName);
         String[] exp = new String[]{};
 
         //System.out.println("Exp: " + String.join(",", exp));
@@ -2198,8 +2198,8 @@ public class TestParameterizedSparqlString {
     public void test_extract_multiple_target_vars_no_braces() {
         // Missing braces and VALUES keyword so should return empty array.
         String cmd = "SELECT * WHERE { VALUES ?p ?props ?o ?objs ?s ?p ?o }";
-        String varName = "objs";
-        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, varName);
+        String valueName = "objs";
+        String[] res = ParameterizedSparqlString.extractTargetVars(cmd, valueName);
         String[] exp = new String[]{};
 
         //System.out.println("Exp: " + String.join(",", exp));


[04/19] jena git commit: ARQ:Query:ParameterizedSparqlString - "validateParameterValue" now performed on all values' items to ensure no injection through ">" in URI. Test added based on existing tests.

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString - "validateParameterValue" now performed on all values' items to ensure no injection through ">" in URI. Test added based on existing tests.

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

Branch: refs/heads/master
Commit: 93c678001479d059989fcc66dbf55125c8f19c6c
Parents: b06b67b
Author: Greg Albiston <gr...@hotmail.com>
Authored: Mon Jul 30 14:45:20 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Mon Jul 30 14:45:20 2018 +0100

----------------------------------------------------------------------
 .../apache/jena/query/ParameterizedSparqlString.java    |  2 ++
 .../jena/query/TestParameterizedSparqlString.java       | 12 ++++++++++++
 2 files changed, 14 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/93c67800/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index 2a71ea9..ab3bfcc 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1749,6 +1749,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * @param isParenthesisNeeded
      */
     public void setValues(String varName, Collection<? extends RDFNode> items, boolean isParenthesisNeeded) {
+        items.forEach(item -> validateParameterValue(item.asNode()));
         this.valuesReplacements.put(varName, new ValueReplacement(varName, items, isParenthesisNeeded));
     }
 
@@ -1837,6 +1838,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * @param items
      */
     public void setGroupedValues(String varName, Collection<List<? extends RDFNode>> items) {
+        items.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
         this.valuesReplacements.put(varName, new ValueReplacement(varName, items));
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/93c67800/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index fd9b79d..69c50bf 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -2058,4 +2058,16 @@ public class TestParameterizedSparqlString {
         //System.out.println("Res: " + res);
         Assert.assertEquals(exp, res);
     }
+
+    @Test(expected = ARQException.class)
+    public void test_set_values_uri_injection() {
+        // This injection is prevented by forbidding the > character in URIs
+        String str = "PREFIX : <http://example/>\nSELECT * WHERE { VALUES ?obj {?objVar} <s> <p> ?obj . }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        pss.setValues(str, ResourceFactory.createResource("<http://example.org/obj_A>"));
+
+        pss.asQuery();
+        Assert.fail("Attempt to do SPARQL injection should result in an exception");
+    }
+
 }


[11/19] jena git commit: ARQ:Query:ParameterizedSparqlString - Distinction removed between "items" and "rowItems". Alternative checks (replacing values and validating injection) are made when only a single variable found. Otherwise treat multiple variabl

Posted by an...@apache.org.
ARQ:Query:ParameterizedSparqlString 
- Distinction removed between "items" and "rowItems". Alternative checks (replacing values and validating injection) are made when only a single variable found. Otherwise treat multiple variables with single row or many rows the same.
- Now ensure all "row" Collections are Lists when values are being set for later handling.

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

Branch: refs/heads/master
Commit: 856e06c2d12cdf194db4661d9e91bddb7c522e49
Parents: b708cff
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 13:49:21 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 13:49:21 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 113 +++++++------------
 1 file changed, 43 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/856e06c2/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index e45f3d6..c3b3857 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -32,6 +32,7 @@ import java.util.Map.Entry;
 import java.util.regex.MatchResult;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 import org.apache.jena.atlas.lib.Pair;
 import org.apache.jena.datatypes.RDFDatatype ;
 import org.apache.jena.graph.Node ;
@@ -1754,7 +1755,15 @@ public class ParameterizedSparqlString implements PrefixMapping {
      */
     public void setValues(String varName, Collection<? extends RDFNode> items) {
         items.forEach(item -> validateParameterValue(item.asNode()));
-        this.valuesReplacements.put(varName, new ValueReplacement(varName, items));
+
+        //Ensure that a list is used for the items.
+        Collection<List<? extends RDFNode>> rowItems = new ArrayList<>();
+        if (items instanceof List) {
+            rowItems.add((List) items);
+        } else {
+            rowItems.add(new ArrayList<>(items));
+        }
+        this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems));
     }
 
     /**
@@ -1793,7 +1802,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
      */
     public void setRowValues(String varName, Collection<List<? extends RDFNode>> rowItems) {
         rowItems.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
-        this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems, true));
+        this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems));
     }
 
     private String applyValues(String command) {
@@ -1829,27 +1838,16 @@ public class ParameterizedSparqlString implements PrefixMapping {
     private class ValueReplacement {
 
         private final String varName;
-        private final Collection<? extends RDFNode> items;
         private final Collection<List<? extends RDFNode>> rowItems;
-        private final Boolean isRows;
 
-        public ValueReplacement(String varName, Collection<? extends RDFNode> items) {
+        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> rowItems) {
             this.varName = varName;
-            this.items = items;
-            this.rowItems = new ArrayList<>();
-            this.isRows = false;
-        }
-
-        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> rowItems, Boolean isRows) {
-            this.varName = varName;
-            this.items = new ArrayList<>();
             this.rowItems = rowItems;
-            this.isRows = isRows;
         }
 
         public String apply(String command) {
 
-            if (items.isEmpty() && rowItems.isEmpty()) {
+            if (rowItems.isEmpty()) {
                 return command;
             }
 
@@ -1857,59 +1855,38 @@ public class ParameterizedSparqlString implements PrefixMapping {
             validateValuesSafeToInject(command, targetVars);
 
             String target = createTarget();
-
-            StringBuilder replacement;
-            if (isRows) {
-                replacement = rowsApply();
-            } else {
-                replacement = singleApply(targetVars.length);
-            }
+            StringBuilder replacement = buildReplacement(targetVars.length);
 
             return command.replace(target, replacement);
         }
 
-        private StringBuilder rowsApply() {
-            StringBuilder replacement = new StringBuilder("");
-
-            for (List<? extends RDFNode> row : rowItems) {
-                replacement.append("(");
 
-                for (RDFNode item : row) {
-                    String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
-                    replacement.append(insert);
-                    replacement.append(" ");
-                }
-
-                replacement.deleteCharAt(replacement.length() - 1);
-                replacement.append(") ");
-            }
-
-            replacement.deleteCharAt(replacement.length() - 1);
-            return replacement;
-        }
-
-        private StringBuilder singleApply(int targetVarCount) {
+        private StringBuilder buildReplacement(int targetVarCount) {
 
             StringBuilder replacement = new StringBuilder("");
 
             if (targetVarCount == 1) {
-                for (RDFNode item : items) {
+                for (List<? extends RDFNode> row : rowItems) {
+                    for (RDFNode item : row) {
                     replacement.append("(");
                     String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
                     replacement.append(insert);
                     replacement.append(") ");
+                    }
                 }
-                replacement.deleteCharAt(replacement.length() - 1);
             } else {
-                replacement.append("(");
-                for (RDFNode item : items) {
-                    String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
-                    replacement.append(insert);
-                    replacement.append(" ");
+                for (List<? extends RDFNode> row : rowItems) {
+                    replacement.append("(");
+                    for (RDFNode item : row) {
+                        String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
+                        replacement.append(insert);
+                        replacement.append(" ");
+                    }
+                    replacement.deleteCharAt(replacement.length() - 1);
+                    replacement.append(") ");
                 }
-                replacement.deleteCharAt(replacement.length() - 1);
-                replacement.append(")");
             }
+            replacement.deleteCharAt(replacement.length() - 1);
 
             return replacement;
         }
@@ -1933,29 +1910,25 @@ public class ParameterizedSparqlString implements PrefixMapping {
 
         protected void validateValuesSafeToInject(String command, String[] targetVars) {
 
-            for (int i = 0; i < targetVars.length; i++) {
-                String targetVar = targetVars[i];
-                if (isRows) {
-                    //Iterate through each row according to the position of var and item.
-                    for (List<? extends RDFNode> row : rowItems) {
-                        RDFNode item = row.get(i);
+            if (targetVars.length == 1) {
+                //Single var with one or more items so all checked against the same var.
+                String targetVar = targetVars[0];
+                for (List<? extends RDFNode> row : rowItems) {
+                    for (RDFNode item : row) {
                         validateSafeToInject(command, targetVar, item.asNode());
                     }
-                } else {
-                    if (targetVars.length > 1) {
-                        if (items instanceof List) {
-                            //Multiple vars with items in an ordered list. Each var is checked against the item.
-                            List<? extends RDFNode> listItems = (List<? extends RDFNode>) items;
-                            RDFNode item = listItems.get(i);
+                }
+            } else {
+                //Multiple var with one or more rows.
+                for (int i = 0; i < targetVars.length; i++) {
+                    String targetVar = targetVars[i];
+                    for (List<? extends RDFNode> row : rowItems) {
+                        if (targetVars.length == row.size()) {
+                            RDFNode item = row.get(i);
                             validateSafeToInject(command, targetVar, item.asNode());
                         } else {
-                            //Multiple vars with items not in an ordered list. This is parsing error.
-                            throw new ARQException("Multiple VALUES variables (" + String.join(", ", targetVars) + ") being used without an ordered list of items: " + items.toString());
-                        }
-                    } else {
-                        //Single var with one or more items so all are checked.
-                        for (RDFNode item : items) {
-                            validateSafeToInject(command, targetVar, item.asNode());
+                            String rowString = row.stream().map(RDFNode::toString).collect(Collectors.joining(","));
+                            throw new ARQException("Number of VALUES variables (" + String.join(", ", targetVars) + ") does not equal replacement row (" + rowString + ").");
                         }
                     }
                 }