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 + ").");
}
}
}