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);