From cd6be3b405a50003276dfe5c5af1d524023d3aaa Mon Sep 17 00:00:00 2001
From: "U-SWNA\\dbaldwin100" <dbaldwin100@SE-DBALDWIN-DT1.swna.wdpr.disney.com>
Date: Thu, 21 Jul 2011 13:02:33 -0700
Subject: [PATCH] Merge

---
 .../java/com/jayway/jsonpath/JsonPath.java    |  7 +--
 .../jayway/jsonpath/filter/FilterOutput.java  | 57 ++++++++-----------
 .../jsonpath/filter/JsonPathFilterBase.java   |  6 +-
 .../jsonpath/filter/JsonPathFilterChain.java  | 10 ++--
 .../jsonpath/filter/ListIndexFilter.java      | 34 +++++++----
 .../com/jayway/jsonpath/JsonPathTest.java     | 48 ++++++++++------
 6 files changed, 87 insertions(+), 75 deletions(-)

diff --git a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java
index 1dbbd8d9..8dff12ee 100644
--- a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java
+++ b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java
@@ -11,6 +11,7 @@ import com.jayway.jsonpath.json.JsonParser;
 
 
 import java.io.IOException;
+import java.util.List;
 import java.util.logging.Logger;
 
 import net.minidev.json.parser.ParseException;
@@ -132,12 +133,8 @@ public class JsonPath {
      */
     public JsonElement read(JsonElement json) throws JsonException {
         FilterOutput filterOutput = filters.filter(json);
-        
-        if (filterOutput == null || filterOutput.getResult() == null) {
-            return null;
-        }
 
-        return filterOutput.getResult();
+        return filterOutput.getResultAsJson();
         
     }
 
diff --git a/json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java b/json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java
index fb8e71fa..14ef9ca0 100644
--- a/json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java
+++ b/json-path/src/main/java/com/jayway/jsonpath/filter/FilterOutput.java
@@ -7,6 +7,7 @@ import com.jayway.jsonpath.json.JsonArray;
 import com.jayway.jsonpath.json.JsonElement;
 import com.jayway.jsonpath.json.JsonException;
 import com.jayway.jsonpath.json.JsonFactory;
+import com.jayway.jsonpath.json.JsonPathResultList;
 
 import static java.lang.String.format;
 
@@ -15,51 +16,39 @@ import static java.lang.String.format;
  * Date: 2/9/11
  * Time: 12:28 PM
  */
-public class FilterOutput {
+public class FilterOutput extends ArrayList<JsonElement> {
 
-    private final List<JsonElement> result;
     
     public FilterOutput(JsonElement root) {
-    	this.result = new ArrayList<JsonElement>();
-        result.add(root);
+    	super();
+    	this.add(root);
+    }
+    public FilterOutput(){
+    	super();
     }
 
-
-    public FilterOutput(List<JsonElement> result) {
-    	this.result = result;
-	}
-
-
-	public FilterOutput() {
-		this.result = new ArrayList<JsonElement>();
+	
+	public JsonArray getResultAsJsonArray() throws JsonException {
+		return this.get(0).toJsonArray();
 	}
-
-
-	public JsonElement getResult() throws JsonException {
-		if(result.size()==0){
-			return null;
+	
+	public JsonElement getResultAsJson() throws JsonException {
+		if(this.size()>1){
+			JsonArray ja = JsonFactory.getInstance().createJsonArray();
+			for(JsonElement je:this){
+				ja.add(je);
+			}
+			return ja;
+		}
+		else if(this.size()==1){
+			return this.get(0);
 		}
-		else if(result.size()==1){
-			return result.get(0);
-    	}
 		else{
-    		JsonFactory fact = JsonFactory.getInstance();
-    		JsonArray ja = fact.createJsonArray();
-    		for(JsonElement ele:result)
-    			ja.add(ele);
-    		return ja;
+			return JsonFactory.getInstance().createJsonNull(null, null);
 		}
-    }
-	
-	public JsonArray getResultAsList() throws JsonException {
-		return getResult().toJsonArray();
 	}
+		
 	
-   
-
-    public List<JsonElement> getList() throws JsonException {
-    	return result;
-    }
 
 
 
diff --git a/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java b/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java
index 6bd2a0cf..2e29b9a9 100644
--- a/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java
+++ b/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterBase.java
@@ -14,13 +14,13 @@ import com.jayway.jsonpath.json.JsonException;
  */
 public abstract class JsonPathFilterBase {
 	public FilterOutput apply(FilterOutput element) throws JsonException{
-		List<JsonElement> result = new ArrayList<JsonElement>();
-		for(JsonElement el : element.getList()){
+		FilterOutput result = new FilterOutput();
+		for(JsonElement el : element){
     		List<JsonElement> out = apply(el);
     		if(out != null)
     			result.addAll(out);
     	}
-		return new FilterOutput(result);
+		return result;
     }
 	public abstract List<JsonElement> apply(JsonElement element) throws JsonException;
     public abstract String getPathSegment() throws JsonException;;
diff --git a/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java b/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java
index 875e3122..34803733 100644
--- a/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java
+++ b/json-path/src/main/java/com/jayway/jsonpath/filter/JsonPathFilterChain.java
@@ -43,17 +43,17 @@ public class JsonPathFilterChain {
 
     public FilterOutput filter(JsonElement root) throws JsonException {
     	FilterOutput out = new FilterOutput(root);
-    	log.info(out.getResult().toString());
+    	log.info(out.getResultAsJson().toString());
         for (JsonPathFilterBase filter : filters) {
             if (filter == null) {
                 throw new InvalidPathException();
             }
-            if(out.getList() == null){
-                return null;
+            if(out.getResultAsJson().isJsonNull()){
+                break;
             }
             out = filter.apply(out);
-            if(out.getResult()!=null)
-            	log.info(out.getResult().toString());
+
+            log.info(out.getResultAsJson().toString());
         }
         
         
diff --git a/json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java b/json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java
index b7e46c69..69d276c1 100644
--- a/json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java
+++ b/json-path/src/main/java/com/jayway/jsonpath/filter/ListIndexFilter.java
@@ -3,10 +3,12 @@ package com.jayway.jsonpath.filter;
 
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.regex.Pattern;
 
+import com.google.gson.JsonNull;
 import com.jayway.jsonpath.json.JsonArray;
 import com.jayway.jsonpath.json.JsonElement;
 import com.jayway.jsonpath.json.JsonException;
@@ -35,19 +37,31 @@ public class ListIndexFilter extends JsonPathFilterBase {
 
     @Override
     public List<JsonElement> apply(JsonElement element) throws JsonException {
-    	List<JsonElement> result = new ArrayList<JsonElement>();
-        
+    	
         Integer[] index = getArrayIndex();
-        if(element.isJsonArray()){
-            for (int i : index) {
-                if (indexIsInRange(element.toJsonArray(), i)) {
-                    result.add(element.toJsonArray().get(i));
-                }
-            }
-        }
-        
         
+
+        ArrayList<JsonElement> result = new ArrayList<JsonElement>();
+        filterRange(result,element,index);
         return result;
+        
+        
+ 
+    }
+    
+    private <T extends Collection> void filterRange(T result,JsonElement element,Integer[] index) throws JsonException{
+    	  if(element.isJsonArray()){
+              for (int i : index) {
+                  if (indexIsInRange(element.toJsonArray(), i)) {
+                      result.add(element.toJsonArray().get(i));
+                  }
+                  else{
+                      com.jayway.jsonpath.json.JsonNull jn = factory.createJsonNull(i,element);
+                	  result.add(jn);
+                  }
+                  
+              }
+          }
     }
 
     private boolean indexIsInRange(List list, int index) {
diff --git a/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java b/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java
index c45963cd..1dba0ebb 100644
--- a/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java
+++ b/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java
@@ -4,6 +4,7 @@ import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 
+import com.google.gson.JsonNull;
 import com.jayway.jsonpath.json.JsonArray;
 import com.jayway.jsonpath.json.JsonElement;
 import com.jayway.jsonpath.json.JsonException;
@@ -65,17 +66,19 @@ public abstract class JsonPathTest {
                     "  }\n" +
                     "}";
 
+    protected  JsonFactory factory = null;
     @Before
     public void init_factory(){
     	
+    }
     @Test
     public void bracket_notation_can_be_used_in_path() throws Exception {
-    }
     
-        assertEquals("new", JsonPath.read(DOCUMENT, "$.['store'].bicycle.['dot.notation']"));
-        assertEquals("new", JsonPath.read(DOCUMENT, "$['store']['bicycle']['dot.notation']"));
-        assertEquals("new", JsonPath.read(DOCUMENT, "$.['store']['bicycle']['dot.notation']"));
-        assertEquals("new", JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['dot.notation']"));
+    
+        assertEquals(w("new"), JsonPath.read(DOCUMENT, "$.['store'].bicycle.['dot.notation']"));
+        assertEquals(w("new"), JsonPath.read(DOCUMENT, "$['store']['bicycle']['dot.notation']"));
+        assertEquals(w("new"), JsonPath.read(DOCUMENT, "$.['store']['bicycle']['dot.notation']"));
+        assertEquals(w("new"), JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['dot.notation']"));
     }
 
     @Test
@@ -89,17 +92,25 @@ public abstract class JsonPathTest {
     @Test
     public void read_path_with_colon() throws Exception {
 
-        assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar"), "fooBar");
-        assertEquals(JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['foo:bar']"), "fooBar");
-        assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar").toObject(), "fooBar");
-        assertEquals(JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['foo:bar']").toObject(), "fooBar");
-        assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar"), "fooBar");
-        assertEquals(JsonPath.read(DOCUMENT, "$['store']['bicycle']['foo:bar']"), "fooBar");
+        assertEquals(JsonPath.read(DOCUMENT, "$.store.bicycle.foo:bar"), w("fooBar"));
+        assertEquals(JsonPath.read(DOCUMENT, "$.['store'].['bicycle'].['foo:bar']"), w("fooBar"));
     }
 
     
     
-    
+    private JsonElement w(Object obj) throws JsonException {
+    	return factory.createJsonPrimitive(obj);
+    	
+	}
+    private JsonElement[] w(Object ... objs) throws JsonException {
+    	JsonElement je[]= new JsonElement[objs.length]; 
+    	for(int i=0;i<objs.length;i++){
+    		je[i] = w(objs[i]);
+    	}
+    	return je;
+	}
+
+
     @Test
     public void parent_ref() throws Exception {
 
@@ -138,7 +149,7 @@ public abstract class JsonPathTest {
     	String doc = "{foo:{biz:{id:1}}}";
     	
     	assertEquals(JsonPath.read(doc, "$.foo.biz.(object)").toString(), "{\"id\":1}");
-    	assertEquals(JsonPath.read(doc, "$.foo.biz.(collection)"), null);
+    	assertTrue(JsonPath.read(doc, "$.foo.biz.(collection)").isJsonNull());
         
         
         doc = "{foo:{biz:[{Id:1},{Id:2},{Id:4,foo:1234}]}}";    	
@@ -277,16 +288,17 @@ public abstract class JsonPathTest {
     @Test
     public void access_index_out_of_bounds_does_not_throw_exception() throws Exception {
 
-        Object res = JsonPath.read(DOCUMENT, "$.store.book[100].author");
+        JsonElement res = JsonPath.read(DOCUMENT, "$.store.book[100].author");
 
-        assertNull(res);
+        assertTrue(res.isJsonNull());
 
         JsonElement res2 = JsonPath.read(DOCUMENT, "$.store.book[1, 200].author");
+        JsonElement res3 = JsonPath.read(DOCUMENT, "$.store.book[1, 200]");
+        assertEquals(res2.toObject(), "Evelyn Waugh");
+        System.out.println(res3.toJsonArray().get(1));
+
 
 
-        assertThat((List<String>)res, hasItems("Evelyn Waugh"));
-        assertEquals(res2.toObject(), "Evelyn Waugh");
-        assertThat((List<String>) res, hasItems("Evelyn Waugh"));
         //assertNull(();
     }