You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by rv...@apache.org on 2014/03/18 13:49:47 UTC
svn commit: r1578850 - in /jena/trunk/jena-arq/src:
main/java/com/hp/hpl/jena/sparql/resultset/JSONInput.java
test/java/com/hp/hpl/jena/sparql/resultset/TestResultSetFormat2.java
Author: rvesse
Date: Tue Mar 18 12:49:46 2014
New Revision: 1578850
URL: http://svn.apache.org/r1578850
Log:
Further improve how keys are validated in SPARQL JSON results (JENA-655)
Modified:
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/JSONInput.java
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/resultset/TestResultSetFormat2.java
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/JSONInput.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/JSONInput.java?rev=1578850&r1=1578849&r2=1578850&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/JSONInput.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/JSONInput.java Tue Mar 18 12:49:46 2014
@@ -126,7 +126,7 @@ public class JSONInput extends SPARQLRes
if ( obj.hasKey(kBoolean) )
{
- checkContains(obj, true, kHead, kBoolean) ;
+ checkContains(obj, true, true, kHead, kBoolean) ;
booleanResult = obj.get(kBoolean).getAsBoolean().value() ;
rows = null ;
return ;
@@ -134,10 +134,7 @@ public class JSONInput extends SPARQLRes
rows = new ArrayList<Binding>(1000) ;
- checkContains(obj, true, kHead, kResults) ;
-
- if ( ! obj.hasKey(kHead) ) throw new ResultSetException("No 'head' for results") ;
- if ( ! obj.hasKey(kResults) ) throw new ResultSetException("No 'results' for results") ;
+ checkContains(obj, true, true, kHead, kResults) ;
// process head
if ( ! obj.get(kHead).isObject() )
@@ -221,14 +218,14 @@ public class JSONInput extends SPARQLRes
LabelToNode labelMap = SyntaxLabels.createLabelToNode() ;
private Node parseOneTerm(JsonObject term)
{
- checkContains(term, false, kType, kValue, kXmlLang, kDatatype) ;
+ checkContains(term, false, false, kType, kValue, kXmlLang, kDatatype) ;
String type = stringOrNull(term, kType) ;
String v = stringOrNull(term, kValue) ;
if ( kUri.equals(type) )
{
- checkContains(term, false, kType, kValue) ;
+ checkContains(term, false, true, kType, kValue) ;
String uri = v ;
Node n = NodeFactory.createURI(v) ;
return n ;
@@ -260,14 +257,19 @@ public class JSONInput extends SPARQLRes
}
- private static void checkContains(JsonObject term, boolean allowUndefinedKeys, String...keys)
+ private static void checkContains(JsonObject term, boolean allowUndefinedKeys, boolean requireAllExpectedKeys, String...keys)
{
- List<String> x = Arrays.asList(keys) ;
+ List<String> expectedKeys = Arrays.asList(keys) ;
+ Set<String> declared = new HashSet<String>();
for ( String k : term.keys() )
{
- if ( !x.contains(k) && !allowUndefinedKeys )
- throw new ResultSetException("Expected only object keys "+Arrays.asList(keys)+" but encountered '"+k+"'") ;
+ if ( !expectedKeys.contains(k) && !allowUndefinedKeys )
+ throw new ResultSetException("Expected only object keys "+Arrays.asList(keys)+" but encountered '"+k+"'") ;
+ if (expectedKeys.contains(k))
+ declared.add(k);
}
+
+ if (requireAllExpectedKeys && declared.size() < expectedKeys.size()) throw new ResultSetException("One or more of the required keys " + expectedKeys + " was not found");
}
}
Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/resultset/TestResultSetFormat2.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/resultset/TestResultSetFormat2.java?rev=1578850&r1=1578849&r2=1578850&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/resultset/TestResultSetFormat2.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/resultset/TestResultSetFormat2.java Tue Mar 18 12:49:46 2014
@@ -315,6 +315,41 @@ public class TestResultSetFormat2 {
//@formatter:on
parseJSON(input);
}
+
+ @Test(expected = ResultSetException.class)
+ public void resultset_json_02() {
+ //@formatter:off
+ String input = StrUtils.strjoinNL("{\"head\":{\"vars\":[\"s\"]},",
+ " \"results\": {",
+ " \"bindings\":[",
+ " {\"s\":{\"type\":\"uri\"}}",
+ " ]",
+ " },",
+ " \"warnings\": [\"parser warning: Variable o was bound but is unused in the query on line 1\",",
+ " \"parser warning: Variable p was bound but is unused in the query on line 1\"]",
+ " })",
+ " }");
+ //@formatter:on
+
+ // No value for URI is illegal
+ parseJSON(input);
+ }
+
+ @Test(expected = ResultSetException.class)
+ public void resultset_json_03() {
+ String input = "{\"head\":{\"vars\":[\"s\"]}}";
+
+ // Missing results is illegal
+ parseJSON(input);
+ }
+
+ @Test(expected = ResultSetException.class)
+ public void resultset_json_04() {
+ String input = "{\"results\":{}}";
+
+ // Missing head is illegal
+ parseJSON(input);
+ }
private void parseTSV(String x) {
byte[] b = StrUtils.asUTF8bytes(x);