You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by aw...@apache.org on 2009/04/07 19:47:58 UTC

svn commit: r762869 - in /incubator/shindig/trunk/java: common/src/main/java/org/apache/shindig/common/ common/src/test/java/org/apache/shindig/common/ gadgets/src/main/java/org/apache/shindig/gadgets/preload/ gadgets/src/main/java/org/apache/shindig/g...

Author: awiner
Date: Tue Apr  7 17:47:57 2009
New Revision: 762869

URL: http://svn.apache.org/viewvc?rev=762869&view=rev
Log:
Simplify preloader code:
- Removed support for using a List<Preloader>.  Preloader is now @ImplementedBy HttpPreloader.
  (An early rev made PipleinedDataPreloader no longer a Preloader)
- Removed concept of a Preloader "phase"
- Changed pipeline code to use List and Object instead of JSONArray and JSONObject
- Properly implement error handling (both HTTP and batch error) for social preloads
- Use JsonSerializer instead of toString() for post body of HttpRequest for social preloads

Modified:
    incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java
    incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/JsonSerializerTest.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelineExecutor.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloadModule.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/Preloader.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloaderService.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateContext.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelineExecutorTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java

Modified: incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java (original)
+++ incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/JsonSerializer.java Tue Apr  7 17:47:57 2009
@@ -20,6 +20,7 @@
 
 import org.apache.shindig.common.util.DateUtil;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.MapMaker;
 import com.google.common.collect.Maps;
@@ -162,7 +163,7 @@
                value.getClass().isEnum()) {
       // String-like Primitives
       appendString(buf, value.toString());
-    } else if(value instanceof Date) {
+    } else if (value instanceof Date) {
       appendString(buf, DateUtil.formatIso8601Date((Date)value));
     } else if (value instanceof JSONObject) {
       appendJsonObject(buf, (JSONObject) value);
@@ -429,6 +430,41 @@
     buf.append('"');
   }
 
+  /**
+   * Gets a property of an Object.  Will return a property value if
+   * serializing the value would produce a JSON object containing that 
+   * property, otherwise returns null.
+   */
+  public static Object getProperty(Object value, String propertyName) {
+    Preconditions.checkNotNull(value);
+    Preconditions.checkNotNull(propertyName);
+
+    if (value instanceof JSONObject) {
+      return ((JSONObject) value).opt(propertyName);
+    } else if (value instanceof Map) {
+      return ((Map<?, ?>) value).get(propertyName);
+    } else {
+      // Try getter conversion
+      Method method = getGetters(value).get(propertyName);
+      if (method != null) {
+        try {
+          return method.invoke(value);
+        } catch (IllegalArgumentException e) {
+          // Shouldn't be possible.
+          throw new RuntimeException(e);
+        } catch (IllegalAccessException e) {
+          // Bad class.
+          throw new RuntimeException(e);
+        } catch (InvocationTargetException e) {
+          // Bad class.
+          throw new RuntimeException(e);
+        }
+      }
+    }
+    
+    return null;
+  }
+  
   private static Map<String, Method> getGetters(Object pojo) {
     Class<?> clazz = pojo.getClass();
 

Modified: incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/JsonSerializerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/JsonSerializerTest.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/JsonSerializerTest.java (original)
+++ incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/JsonSerializerTest.java Tue Apr  7 17:47:57 2009
@@ -20,6 +20,7 @@
 
 import static org.apache.shindig.common.JsonAssert.assertJsonEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
@@ -188,6 +189,31 @@
     assertEquals("Hello<world>foo < bar", obj.get("foo"));
   }
 
+  @Test
+  public void getPropertyOfJsonObject() throws Exception {
+    JSONObject json = new JSONObject("{a: 1, b: '2'}");
+    assertEquals(1, JsonSerializer.getProperty(json, "a"));
+    assertEquals("2", JsonSerializer.getProperty(json, "b"));
+    assertNull(JsonSerializer.getProperty(json, "c"));
+  }
+  
+  @Test
+  public void getPropertyOfMap() throws Exception {
+    Map<String, Object> map = ImmutableMap.of("a", (Object) 1, "b", "2");
+        assertEquals(1, JsonSerializer.getProperty(map, "a"));
+    assertEquals("2", JsonSerializer.getProperty(map, "b"));
+    assertNull(JsonSerializer.getProperty(map, "c"));
+  }
+
+  @Test
+  public void getPropertyOfPojo() throws Exception {
+    JsonPojo pojo = new JsonPojo();
+    assertEquals("string-value", JsonSerializer.getProperty(pojo, "string"));
+    assertEquals(100, JsonSerializer.getProperty(pojo, "integer"));
+    assertEquals(3, JsonSerializer.getProperty(pojo, "simple!"));
+    assertNull(JsonSerializer.getProperty(pojo, "not"));
+  }
+
   private static String avg(long start, long end, long runs) {
     double delta = end - start;
     return String.format("%f5", delta / runs);

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java Tue Apr  7 17:47:57 2009
@@ -20,13 +20,10 @@
 import org.apache.shindig.gadgets.Gadget;
 
 import java.util.Collection;
-import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.FutureTask;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
 /**
@@ -38,25 +35,17 @@
  */
 public class ConcurrentPreloaderService implements PreloaderService {
   private final ExecutorService executor;
-  private final List<? extends Preloader> preloaders;
+  private Preloader preloader;
 
   @Inject
-  public ConcurrentPreloaderService(ExecutorService executor, List<Preloader> preloaders) {
+  public ConcurrentPreloaderService(ExecutorService executor, Preloader preloader) {
     this.executor = executor;
-    this.preloaders = preloaders;
+    this.preloader = preloader;
   }
 
-  public Collection<PreloadedData> preload(Gadget gadget, PreloadPhase phase) {
-    if (preloaders.isEmpty()) {
-      return ImmutableList.of();
-    }
-
-    List<Callable<PreloadedData>> tasks = Lists.newArrayList();
-    for (Preloader preloader : preloaders) {
-      Collection<Callable<PreloadedData>> taskCollection =
-          preloader.createPreloadTasks(gadget, phase);
-      tasks.addAll(taskCollection);
-    }
+  public Collection<PreloadedData> preload(Gadget gadget) {
+    Collection<Callable<PreloadedData>> tasks =
+        preloader.createPreloadTasks(gadget);
 
     return preload(tasks);
   }
@@ -68,8 +57,6 @@
       processed -= 1;
       if (processed == 0) {
         // The last preload fires in the current thread.
-        // TODO: for the HTML_RENDER phase, if there's also a proxied fetch, this
-        // is counter-productive
         FutureTask<PreloadedData> futureTask = new FutureTask<PreloadedData>(task);
         futureTask.run();
         preloads.add(futureTask);

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/HttpPreloader.java Tue Apr  7 17:47:57 2009
@@ -54,18 +54,15 @@
     this.requestPipeline = requestPipeline;
   }
 
-  public Collection<Callable<PreloadedData>> createPreloadTasks(Gadget gadget,
-      PreloaderService.PreloadPhase phase) {
+  public Collection<Callable<PreloadedData>> createPreloadTasks(Gadget gadget) {
     List<Callable<PreloadedData>> preloads = Lists.newArrayList();
 
     GadgetContext context = gadget.getContext();
 
-    if (phase == PreloaderService.PreloadPhase.HTML_RENDER) {
-      for (Preload preload : gadget.getSpec().getModulePrefs().getPreloads()) {
-        Set<String> preloadViews = preload.getViews();
-        if (preloadViews.isEmpty() || preloadViews.contains(context.getView())) {
-          preloads.add(new PreloadTask(context, preload, preload.getHref().toString()));
-        }
+    for (Preload preload : gadget.getSpec().getModulePrefs().getPreloads()) {
+      Set<String> preloadViews = preload.getViews();
+      if (preloadViews.isEmpty() || preloadViews.contains(context.getView())) {
+        preloads.add(new PreloadTask(context, preload, preload.getHref().toString()));
       }
     }
 

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelineExecutor.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelineExecutor.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelineExecutor.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelineExecutor.java Tue Apr  7 17:47:57 2009
@@ -18,15 +18,13 @@
  */
 package org.apache.shindig.gadgets.preload;
 
+import org.apache.shindig.common.JsonSerializer;
 import org.apache.shindig.expressions.Expressions;
 import org.apache.shindig.expressions.RootELResolver;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetELResolver;
 import org.apache.shindig.gadgets.spec.PipelinedData;
 import org.apache.shindig.gadgets.spec.PipelinedData.Batch;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
 
 import java.util.Collection;
 import java.util.List;
@@ -75,16 +73,16 @@
     /**
      * Results in the form of a full JSON-RPC batch response.
      */
-    public final JSONArray results;
+    public final Collection<? extends Object> results;
     
     /**
-     * Results in the form of a Map from id to JSONObject.
+     * Results in the form of a Map from id to a JSON-serializable object.
      */
-    public final Map<String, JSONObject> keyedResults;
+    public final Map<String, ? extends Object> keyedResults;
     
     public Results(Collection<PipelinedData> remainingPipelines,
-        JSONArray results,
-        Map<String, JSONObject> keyedResults) {
+        Collection<? extends Object> results,
+        Map<String, ? extends Object> keyedResults) {
       this.remainingPipelines = remainingPipelines;
       this.results = results;
       this.keyedResults = keyedResults;
@@ -98,8 +96,8 @@
    * @return results from the pipeline, or null if there are no results
    */
   public Results execute(GadgetContext context, Collection<PipelinedData> pipelines) {
-    JSONArray results = new JSONArray();
-    Map<String, JSONObject> elResults = Maps.newHashMap();
+    List<Object> results = Lists.newArrayList();
+    Map<String, Object> elResults = Maps.newHashMap();
     CompositeELResolver rootObjects = new CompositeELResolver();
     rootObjects.add(new GadgetELResolver(context));
     rootObjects.add(new RootELResolver(elResults));
@@ -127,19 +125,23 @@
       for (PreloadedData preloaded : preloads) {
         try {
           for (Object entry : preloaded.toJson()) {
-            JSONObject obj = (JSONObject) entry;
-            results.put(obj);
-            if (obj.has("data")) {
-              elResults.put(obj.getString("id"), obj.getJSONObject("data"));
-            } else if (obj.has("error")) {
-              elResults.put(obj.getString("id"), obj.getJSONObject("error"));
+            results.add(entry);
+            
+            String id = (String) JsonSerializer.getProperty(entry, "id");
+
+            Object data = JsonSerializer.getProperty(entry, "data");
+            if (data != null) {
+              elResults.put(id, data);
+            } else {
+              Object error = JsonSerializer.getProperty(entry, "error");
+              if (error != null) {
+                elResults.put(id, error);
+              }
             }
           }
         } catch (PreloadException pe) {
           // This will be thrown in the event of some unexpected exception. We can move on.
           logger.log(Level.WARNING, "Unexpected error when preloading", pe);
-        } catch (JSONException je) {
-          throw new RuntimeException(je);
         }
       }
 

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloader.java Tue Apr  7 17:47:57 2009
@@ -18,6 +18,8 @@
  */
 package org.apache.shindig.gadgets.preload;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.shindig.common.JsonSerializer;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.uri.UriBuilder;
 import org.apache.shindig.config.ContainerConfig;
@@ -72,12 +74,8 @@
     // Load any social preloads into a JSONArray for delivery to
     // JsonRpcServlet
     if (!batch.getSocialPreloads().isEmpty()) {
-      JSONArray array = new JSONArray();
-      for (Object socialRequest : batch.getSocialPreloads().values()) {
-        array.put(socialRequest);
-      }
-
-      Callable<PreloadedData> preloader = new SocialPreloadTask(context, array);
+      Callable<PreloadedData> preloader = new SocialPreloadTask(context,
+          batch.getSocialPreloads().values());
       preloadList.add(preloader);
     }
 
@@ -111,21 +109,23 @@
   private class SocialPreloadTask implements Callable<PreloadedData> {
 
     private final GadgetContext context;
-    private final JSONArray array;
+    private final Collection<? extends Object> socialRequests;
 
-    public SocialPreloadTask(GadgetContext context, JSONArray array) {
+    public SocialPreloadTask(GadgetContext context, Collection<? extends Object> socialRequests) {
       this.context = context;
-      this.array = array;
+      this.socialRequests = socialRequests;
     }
 
     public PreloadedData call() throws Exception {
       Uri uri = getSocialUri(context);
+
+      String socialRequestsJson = JsonSerializer.serialize(socialRequests);
       HttpRequest request = new HttpRequest(uri)
           .setIgnoreCache(context.getIgnoreCache())
           .setSecurityToken(context.getToken())
           .setMethod("POST")
           .setAuthType(AuthType.NONE)
-          .setPostBody(UTF8.encode(array.toString()).array())
+          .setPostBody(UTF8.encode(socialRequestsJson).array())
           .addHeader("Content-Type", "application/json; charset=UTF-8")
           .setContainer(context.getContainer())
           .setGadget(context.getUrl());
@@ -133,14 +133,18 @@
       HttpResponse response = executeSocialRequest(request);
 
       // Unpack the response into a list of PreloadedData responses
-      final List<Object> data = Lists.newArrayList();
-      // TODO: if the entire request fails, the result is an object,
-      // not an array
-      JSONArray array = new JSONArray(response.getResponseAsString());
-      for (int i = 0; i < array.length(); i++) {
-        data.add(array.getJSONObject(i));
+      String responseText;
+      if (response.getHttpStatusCode() < 400) {
+        responseText = response.getResponseAsString();
+      } else {
+        // For error responses, unpack into the same error format used
+        // for os:HttpRequest
+        responseText = JsonSerializer.serialize(
+            createJsonError(response.getHttpStatusCode(), null, response));
       }
 
+      final List<Object> data = parseSocialResponse(socialRequests, responseText);
+
       return new PreloadedData() {
         public Collection<Object> toJson() {
           return data;
@@ -149,7 +153,36 @@
     }
   }
 
-  // A task for preloading os:MakeRequest
+  /**
+   * Parse the response from a social request into a list of response objects
+   */
+  static List<Object> parseSocialResponse(Collection<? extends Object> requests,
+      String response) throws JSONException {
+    // Unpack the response into a list of PreloadedData responses
+    final List<Object> data = Lists.newArrayList();
+    
+    if (response.startsWith("[")) {
+      // A non-error response is a JSON array
+      JSONArray array = new JSONArray(response);
+      for (int i = 0; i < array.length(); i++) {
+        data.add(array.get(i));
+      }
+    } else {
+      // But a global failure is a JSON object.  Per spec requirements, copy
+      // the overall error into per-id errors
+      JSONObject error = new JSONObject(response);
+      for (Object request : requests) {
+        JSONObject itemResponse = new JSONObject();
+        itemResponse.put("error", error);
+        itemResponse.put("id", JsonSerializer.getProperty(request, "id"));
+        data.add(itemResponse);
+      }
+    }
+    
+    return data;
+  }
+  
+  /** A task for loading os:HttpRequest */
   class HttpPreloadTask implements Callable<PreloadedData> {
     private final GadgetContext context;
     private final RequestAuthenticationInfo preload;
@@ -196,8 +229,7 @@
       return new Data(requestPipeline.execute(request));
     }
 
-    // TODO: is this format correct?
-    // TODO: change HttpPreloader to use this format?
+    // TODO: change HttpPreloader to use this format
     class Data implements PreloadedData {
       private final JSONObject data;
 
@@ -208,7 +240,7 @@
         try {
           wrapper.put("id", key);
           if (response.getHttpStatusCode() >= 400) {
-            wrapper.put("error", createJSONError(response.getHttpStatusCode(), null, response));
+            wrapper.put("error", createJsonError(response.getHttpStatusCode(), null, response));
           } else {
             // Create {data: {status: [CODE], content: {...}|[...]|"...", headers:{...}}}
             JSONObject data = new JSONObject();
@@ -219,7 +251,7 @@
             String responseText = response.getResponseAsString();
 
             // Add allowed headers
-            JSONObject headers = createJSONHeaders(response);
+            JSONObject headers = createJsonHeaders(response);
             if (headers != null) {
               data.put("headers", headers);
             }
@@ -235,7 +267,7 @@
               } catch (JSONException je) {
                 // JSON parse failed: create a 406 error, and remove the "data" section
                 wrapper.remove("data");
-                wrapper.put("error", createJSONError(
+                wrapper.put("error", createJsonError(
                     HttpResponse.SC_NOT_ACCEPTABLE, je.getMessage(), response));
               }
             } else {
@@ -255,7 +287,7 @@
     }
   }
 
-  private static JSONObject createJSONHeaders(HttpResponse response)
+  private static JSONObject createJsonHeaders(HttpResponse response)
       throws JSONException {
     JSONObject headers = null;
 
@@ -282,7 +314,7 @@
   /**
    * Create {error: { code: [CODE], data: {content: "....", headers: {...}}}}
    */
-  private static JSONObject createJSONError(int code, String message, HttpResponse response)
+  private static JSONObject createJsonError(int code, String message, HttpResponse response)
       throws JSONException {
     JSONObject error = new JSONObject();
     error.put("code", code);
@@ -291,15 +323,21 @@
     }
 
     JSONObject data = new JSONObject();
-    error.put("data", data);
-    data.put("content", response.getResponseAsString());
+    String responseText = response.getResponseAsString();
+    if (StringUtils.isNotEmpty(responseText)) {
+      data.put("content", responseText);
+    }
 
     // Add allowed headers
-    JSONObject headers = createJSONHeaders(response);
+    JSONObject headers = createJsonHeaders(response);
     if (headers != null) {
       data.put("headers", headers);
     }
 
+    if (data.length() > 0) {
+      error.put("data", data);
+    }
+    
     return error;
   }
 
@@ -309,7 +347,6 @@
 
     UriBuilder builder = UriBuilder.parse(
         jsonUri.replace("%host%", context.getHost()))
-        //TODO: bogus?  find correct way.
         .addQueryParameter("st", context.getParameter("st"));
     return builder.toUri();
   }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloadModule.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloadModule.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloadModule.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloadModule.java Tue Apr  7 17:47:57 2009
@@ -18,13 +18,7 @@
  */
 package org.apache.shindig.gadgets.preload;
 
-import java.util.List;
-
-import com.google.common.collect.ImmutableList;
 import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
 
 /**
  * Guice bindings for the render package.
@@ -32,19 +26,5 @@
 public class PreloadModule extends AbstractModule {
   @Override
   protected void configure() {
-    bind(new TypeLiteral<List<Preloader>>(){}).toProvider(PreloaderProvider.class);
-  }
-  
-  private static class PreloaderProvider implements Provider<List<Preloader>> {
-    private final List<Preloader> preloaders;
-
-    @Inject
-    public PreloaderProvider(HttpPreloader httpPreloader) {
-      preloaders = ImmutableList.of((Preloader) httpPreloader);
-    }
-
-    public List<Preloader> get() {
-      return preloaders;
-    }
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/Preloader.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/Preloader.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/Preloader.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/Preloader.java Tue Apr  7 17:47:57 2009
@@ -22,21 +22,19 @@
 import java.util.Collection;
 import java.util.concurrent.Callable;
 
+import com.google.inject.ImplementedBy;
+
 /**
  * Performs an individual preloading operation.
  */
+@ImplementedBy(HttpPreloader.class)
 public interface Preloader {
   /**
    * Create new preload tasks for the provided gadget.
-   * TODO: instead of requiring each Preloader to check the preload phase,
-   * register a different list of preloaders for each phase.  Guice
-   * MultimapBinder would come in handy here.
    *
    * @param gadget The gadget that the operations will be performed for.
-   * @param phase The preload phase being executed.
    * @return Preloading tasks that will be executed by
    *  {@link PreloaderService#}.
    */
-  Collection<Callable<PreloadedData>> createPreloadTasks(Gadget gadget,
-      PreloaderService.PreloadPhase phase);
+  Collection<Callable<PreloadedData>> createPreloadTasks(Gadget gadget);
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloaderService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloaderService.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloaderService.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PreloaderService.java Tue Apr  7 17:47:57 2009
@@ -31,27 +31,12 @@
 @ImplementedBy(ConcurrentPreloaderService.class)
 public interface PreloaderService {
   /**
-   * Phases for preloading.
-   */
-  public enum PreloadPhase {
-    /**
-     * Preloaded content that will be POSTed to a proxied render.
-     */
-    PROXY_FETCH,
-
-    /**
-     * Preloaded content that will be delivered to the final render
-     */
-    HTML_RENDER
-  }
-
-  /**
    * Begin all preload operations.
    *
    * @param gadget The gadget that the operations will be performed for.
    * @return The preloads for the gadget.
    */
-  Collection<PreloadedData> preload(Gadget gadget, PreloadPhase phase);
+  Collection<PreloadedData> preload(Gadget gadget);
 
   /**
    * Execute preloads with a specific set of preload tasks.

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java Tue Apr  7 17:47:57 2009
@@ -71,8 +71,7 @@
       View view = gadget.getCurrentView();
 
       // We always execute these preloads, they have nothing to do with the cache output.
-      Collection<PreloadedData> preloads = preloader.preload(gadget,
-          PreloaderService.PreloadPhase.HTML_RENDER);
+      Collection<PreloadedData> preloads = preloader.preload(gadget);
       gadget.setPreloads(preloads);
 
       String content;

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/ProxyRenderer.java Tue Apr  7 17:47:57 2009
@@ -127,7 +127,7 @@
       PipelineExecutor.Results results = 
         pipelineExecutor.execute(gadget.getContext(), ImmutableList.of(data));
     
-      if (results != null && results.results.length() != 0) {
+      if (results != null && !results.results.isEmpty()) {
         String postContent = JsonSerializer.serialize(results.results);
         // POST the preloaded content, with a method override of GET
         // to enable caching

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java Tue Apr  7 17:47:57 2009
@@ -17,18 +17,16 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import com.google.common.collect.Maps;
-
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
 import org.apache.shindig.gadgets.parse.HtmlSerializer;
-import org.json.JSONObject;
-
 import org.w3c.dom.Document;
 
 import java.util.Map;
 
+import com.google.common.collect.Maps;
+
 /**
  * Object that maintains a String representation of arbitrary contents
  * and a consistent view of those contents as an HTML parse tree.
@@ -38,7 +36,7 @@
   private HttpResponse contentSource;
   private Document document;
   private final GadgetHtmlParser contentParser;
-  private final Map<String, JSONObject> pipelinedData;
+  private final Map<String, Object> pipelinedData;
 
   private static final String MUTABLE_CONTENT_LISTENER = "MutableContentListener";
 
@@ -150,11 +148,11 @@
     return (document != null);
   }
   
-  public void addPipelinedData(String key, JSONObject value) {
+  public void addPipelinedData(String key, Object value) {
     pipelinedData.put(key, value);
   }
   
-  public Map<String, JSONObject> getPipelinedData() {
+  public Map<String, Object> getPipelinedData() {
     return pipelinedData;
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataContentRewriter.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataContentRewriter.java Tue Apr  7 17:47:57 2009
@@ -26,7 +26,6 @@
 import org.apache.shindig.gadgets.preload.PipelineExecutor;
 import org.apache.shindig.gadgets.spec.PipelinedData;
 import org.apache.shindig.gadgets.spec.SpecParserException;
-import org.json.JSONObject;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -115,7 +114,7 @@
       pipelineScript.setAttribute("type", "text/javascript");
   
       StringBuilder script = new StringBuilder();
-      for (Map.Entry<String, JSONObject> entry : results.keyedResults.entrySet()) {
+      for (Map.Entry<String, ? extends Object> entry : results.keyedResults.entrySet()) {
         String key = entry.getKey();
   
         // TODO: escape key

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java Tue Apr  7 17:47:57 2009
@@ -32,7 +32,6 @@
 import org.apache.shindig.gadgets.templates.TemplateBasedTagHandler;
 import org.apache.shindig.gadgets.templates.TemplateContext;
 import org.apache.shindig.gadgets.templates.TemplateProcessor;
-import org.json.JSONObject;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 
@@ -161,7 +160,7 @@
   
   private RewriterResults processInlineTemplates(Gadget gadget, MutableContent content,
       List<Element> allTemplates, TagRegistry registry) throws GadgetException {
-    Map<String, JSONObject> pipelinedData = content.getPipelinedData();
+    Map<String, Object> pipelinedData = content.getPipelinedData();
 
     // If true, client-side processing will be needed
     boolean needsFeature = false;

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateContext.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateContext.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateContext.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateContext.java Tue Apr  7 17:47:57 2009
@@ -18,10 +18,7 @@
  */
 package org.apache.shindig.gadgets.templates;
 
-import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.Gadget;
-
-import org.json.JSONObject;
 import org.w3c.dom.Node;
 
 import java.util.Map;
@@ -32,7 +29,7 @@
  * Context for processing a single template.
  */
 public class TemplateContext {
-  private final Map<String, JSONObject> top;
+  private final Map<String, ? extends Object> top;
   private final Gadget gadget;
 
   private Object cur = null;
@@ -41,7 +38,7 @@
   private Map<String, Object> myMap = null;
   private Node templateRoot;
   
-  public TemplateContext(Gadget gadget, Map<String, JSONObject> top) {
+  public TemplateContext(Gadget gadget, Map<String, ? extends Object> top) {
     this.gadget = gadget;
     this.top = top;
     this.cur = top;

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java Tue Apr  7 17:47:57 2009
@@ -26,7 +26,6 @@
 import org.apache.shindig.gadgets.Gadget;
 import org.junit.Test;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -50,7 +49,6 @@
       = ImmutableMap.of("foo", "bar", "baz", "blah");
 
   private final TestPreloader preloader = new TestPreloader();
-  private final TestPreloader preloader2 = new TestPreloader();
 
   @Test
   public void preloadSingleService() throws Exception {
@@ -58,10 +56,9 @@
         new DataPreload(PRELOAD_STRING_KEY, PRELOAD_STRING_VALUE)));
 
     PreloaderService service = new ConcurrentPreloaderService(new TestExecutorService(),
-        Arrays.<Preloader>asList(preloader));
+        preloader);
 
-    Collection<PreloadedData> preloads = service.preload(
-        null, PreloaderService.PreloadPhase.HTML_RENDER);
+    Collection<PreloadedData> preloads = service.preload((Gadget) null);
 
     Collection<Object> preloaded = getAll(preloads);
     assertEquals(ImmutableMap.of(PRELOAD_STRING_KEY, PRELOAD_STRING_VALUE),
@@ -86,14 +83,14 @@
     preloader.tasks.add(new TestPreloadCallable(
         new DataPreload(PRELOAD_NUMERIC_KEY, PRELOAD_NUMERIC_VALUE)));
 
-    preloader2.tasks.add(new TestPreloadCallable(
+    preloader.tasks.add(new TestPreloadCallable(
         new DataPreload(PRELOAD_MAP_KEY, PRELOAD_MAP_VALUE)));
 
     PreloaderService service = new ConcurrentPreloaderService(new TestExecutorService(),
-        Arrays.<Preloader>asList(preloader, preloader2));
+        preloader);
 
     Collection<PreloadedData> preloads =
-      service.preload(null, PreloaderService.PreloadPhase.HTML_RENDER);
+      service.preload((Gadget) null);
 
     Collection<Object> preloaded = getAll(preloads);
     assertEquals(ImmutableList.<Object>of(
@@ -116,9 +113,9 @@
     preloader.tasks.add(third);
 
     PreloaderService service = new ConcurrentPreloaderService(Executors.newFixedThreadPool(5),
-        Arrays.<Preloader>asList(preloader));
+        preloader);
 
-    service.preload(null, PreloaderService.PreloadPhase.HTML_RENDER);
+    service.preload((Gadget) null);
 
     TestPreloadCallable ranInSameThread = null;
     for (TestPreloadCallable preloadCallable: Lists.newArrayList(first, second, third)) {
@@ -141,9 +138,9 @@
     preloader.tasks.add(callable);
 
     PreloaderService service = new ConcurrentPreloaderService(Executors.newCachedThreadPool(),
-        Arrays.<Preloader>asList(preloader));
+        preloader);
 
-    service.preload(null, PreloaderService.PreloadPhase.HTML_RENDER);
+    service.preload((Gadget) null);
 
     assertSame("Single request not run in current thread",
         Thread.currentThread(), callable.executedThread);
@@ -156,8 +153,7 @@
     }
 
     public Collection<Callable<PreloadedData>> createPreloadTasks(
-        Gadget gadget, PreloaderService.PreloadPhase phase) {
-      assertEquals(PreloaderService.PreloadPhase.HTML_RENDER, phase);
+        Gadget gadget) {
       return tasks;
     }
   }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/HttpPreloaderTest.java Tue Apr  7 17:47:57 2009
@@ -98,7 +98,7 @@
         .setSpec(spec)
         .setCurrentView(spec.getView(GadgetSpec.DEFAULT_VIEW));
     Collection<Callable<PreloadedData>> preloaded =
-        preloader.createPreloadTasks(gadget, PreloaderService.PreloadPhase.HTML_RENDER);
+        preloader.createPreloadTasks(gadget);
 
     assertEquals(1, preloaded.size());
     PreloadedData data = preloaded.iterator().next().call();
@@ -121,7 +121,7 @@
         .setSpec(spec)
         .setCurrentView(spec.getView(GadgetSpec.DEFAULT_VIEW));
     Collection<Callable<PreloadedData>> preloaded =
-        preloader.createPreloadTasks(gadget, PreloaderService.PreloadPhase.HTML_RENDER);
+        preloader.createPreloadTasks(gadget);
 
     assertEquals(1, preloaded.size());
     PreloadedData data = preloaded.iterator().next().call();
@@ -148,7 +148,7 @@
         .setSpec(spec)
         .setCurrentView(spec.getView(GadgetSpec.DEFAULT_VIEW));
     Collection<Callable<PreloadedData>> preloaded = preloader.createPreloadTasks(
-        gadget, PreloaderService.PreloadPhase.HTML_RENDER);
+        gadget);
 
     assertEquals(1, preloaded.size());
     PreloadedData data = preloaded.iterator().next().call();
@@ -173,7 +173,7 @@
         .setSpec(spec)
         .setCurrentView(spec.getView(GadgetSpec.DEFAULT_VIEW));
     Collection<Callable<PreloadedData>> preloaded = preloader.createPreloadTasks(
-        gadget, PreloaderService.PreloadPhase.HTML_RENDER);
+        gadget);
 
     assertEquals(2, preloaded.size());
     List<Object> list = getAll(preloaded);
@@ -213,7 +213,7 @@
         .setSpec(spec)
         .setCurrentView(spec.getView(GadgetSpec.DEFAULT_VIEW));
     Collection<Callable<PreloadedData>> preloaded
-        = preloader.createPreloadTasks(gadget, PreloaderService.PreloadPhase.HTML_RENDER);
+        = preloader.createPreloadTasks(gadget);
 
     List<Object> list = getAll(preloaded);
     assertEquals(1, list.size());
@@ -221,25 +221,6 @@
     checkResults((JSONObject) list.get(0));
   }
 
-  @Test
-  public void proxiedPreloadIsEmpty() throws Exception {
-    String xml =
-        "<Module><ModulePrefs title=''>" +
-        " <Preload href='" + PRELOAD_HREF + "'/>" +
-        "</ModulePrefs><Content/></Module>";
-    GadgetSpec spec = new GadgetSpec(GADGET_URL, xml);
-    Preloader preloader = new HttpPreloader(requestPipeline);
-
-    Gadget gadget = new Gadget()
-        .setContext(context)
-        .setSpec(spec)
-        .setCurrentView(spec.getView(GadgetSpec.DEFAULT_VIEW));
-    Collection<Callable<PreloadedData>> preloaded =
-        preloader.createPreloadTasks(gadget, PreloaderService.PreloadPhase.PROXY_FETCH);
-
-    assertEquals(0, preloaded.size());
-  }
-
   private static class RecordingHttpFetcher implements HttpFetcher {
     protected final List<HttpRequest> requests = Lists.newArrayList();
 

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelineExecutorTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelineExecutorTest.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelineExecutorTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelineExecutorTest.java Tue Apr  7 17:47:57 2009
@@ -29,6 +29,7 @@
 import static org.junit.Assert.assertTrue;
 
 import org.apache.shindig.common.JsonAssert;
+import org.apache.shindig.common.JsonSerializer;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.xml.XmlUtil;
 import org.apache.shindig.expressions.Expressions;
@@ -40,7 +41,6 @@
 import org.easymock.IArgumentMatcher;
 import org.easymock.classextension.EasyMock;
 import org.easymock.classextension.IMocksControl;
-import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.junit.Before;
@@ -124,11 +124,10 @@
     assertTrue(batchCapture.getValue().getSocialPreloads().containsKey("me"));
     assertTrue(batchCapture.getValue().getHttpPreloads().containsKey("json"));
     
-    JSONArray expectedArray = new JSONArray(
-        "[{id: 'key', data: {foo: 'bar'}}]");
-    
-    JsonAssert.assertJsonArrayEquals(expectedArray, results.results);
-    JsonAssert.assertJsonObjectEquals(expectedData.getJSONObject("data"), results.keyedResults.get("key"));
+    JsonAssert.assertJsonEquals("[{id: 'key', data: {foo: 'bar'}}]",
+        JsonSerializer.serialize(results.results));
+    JsonAssert.assertJsonEquals("{foo: 'bar'}",
+        JsonSerializer.serialize(results.keyedResults.get("key")));
     assertTrue(results.remainingPipelines.isEmpty());
     
     control.verify();
@@ -177,10 +176,9 @@
     PipelineExecutor.Results results = executor.execute(context,
         ImmutableList.of(pipeline));
 
-    JSONArray expectedArray = new JSONArray(
-        "[{id: 'json', data: {user: 'canonical'}}," +
-         "{id: 'me', data: {id: 'canonical'}}]");
-    JsonAssert.assertJsonArrayEquals(expectedArray, results.results);
+    JsonAssert.assertJsonEquals("[{id: 'json', data: {user: 'canonical'}}," +
+        "{id: 'me', data: {id: 'canonical'}}]",
+        JsonSerializer.serialize(results.results));
     assertEquals(ImmutableSet.of("json", "me"), results.keyedResults.keySet());
     assertTrue(results.remainingPipelines.isEmpty());
     
@@ -210,7 +208,7 @@
 
     PipelineExecutor.Results results = executor.execute(context,
         ImmutableList.of(pipeline));
-    assertEquals(0, results.results.length());
+    assertEquals(0, results.results.size());
     assertTrue(results.keyedResults.isEmpty());
     assertEquals(1, results.remainingPipelines.size());
     assertSame(pipeline, results.remainingPipelines.iterator().next());
@@ -244,11 +242,10 @@
     assertTrue(batchCapture.getValue().getSocialPreloads().containsKey("me"));
     assertTrue(batchCapture.getValue().getHttpPreloads().containsKey("json"));
     
-    JSONArray expectedArray = new JSONArray(
-        "[{id: 'key', error: {message: 'NO!', code: 500}}]");
-    
-    JsonAssert.assertJsonArrayEquals(expectedArray, results.results);
-    JsonAssert.assertJsonObjectEquals(expectedData.getJSONObject("error"), results.keyedResults.get("key"));
+    JsonAssert.assertJsonEquals("[{id: 'key', error: {message: 'NO!', code: 500}}]",
+        JsonSerializer.serialize(results.results));
+    JsonAssert.assertJsonEquals("{message: 'NO!', code: 500}",
+        JsonSerializer.serialize(results.keyedResults.get("key")));
     assertTrue(results.remainingPipelines.isEmpty());
     
     control.verify();
@@ -278,7 +275,7 @@
         ImmutableList.of(pipeline));
 
     // The exception is fully handled, and leads to empty results
-    assertEquals(0, results.results.length());
+    assertEquals(0, results.results.size());
     assertTrue(results.keyedResults.isEmpty());
     assertTrue(results.remainingPipelines.isEmpty());
     

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PipelinedDataPreloaderTest.java Tue Apr  7 17:47:57 2009
@@ -150,6 +150,72 @@
     assertTrue(request.getContentType().startsWith("application/json"));
   }
 
+  @Test
+  public void testSocialPreloadWithBatchError() throws Exception {
+    GadgetSpec spec = new GadgetSpec(GADGET_URL, XML);
+
+    String socialResult = "{code: 401, message: 'unauthorized'}";
+    RecordingRequestPipeline pipeline = new RecordingRequestPipeline(socialResult);
+    PipelinedDataPreloader preloader = new PipelinedDataPreloader(pipeline, containerConfig);
+
+    view = "profile";
+    contextParams.put("st", "token");
+
+    Gadget gadget = new Gadget()
+        .setContext(context)
+        .setSpec(spec)
+        .setCurrentView(spec.getView("profile"));
+
+    PipelinedData.Batch batch = getBatch(gadget);
+    Collection<Callable<PreloadedData>> tasks = preloader.createPreloadTasks(
+        context, batch);
+    assertEquals(1, tasks.size());
+    // Nothing fetched yet
+    assertEquals(0, pipeline.requests.size());
+
+    Collection<Object> result = tasks.iterator().next().call().toJson();
+    assertEquals(2, result.size());
+
+    JSONObject resultWithKeyP = new JSONObject("{id: 'p', error: {code: 401, message: 'unauthorized'}}");
+    JSONObject resultWithKeyA = new JSONObject("{id: 'a', error: {code: 401, message: 'unauthorized'}}");
+    Iterator<Object> iter = result.iterator();
+    JsonAssert.assertJsonEquals(resultWithKeyA.toString(), iter.next().toString());
+    JsonAssert.assertJsonEquals(resultWithKeyP.toString(), iter.next().toString());
+  }
+
+  @Test
+  public void testSocialPreloadWithHttpError() throws Exception {
+    GadgetSpec spec = new GadgetSpec(GADGET_URL, XML);
+
+    HttpResponse httpError = new HttpResponseBuilder()
+        .setHttpStatusCode(HttpResponse.SC_INTERNAL_SERVER_ERROR)
+        .create();
+    RecordingRequestPipeline pipeline = new RecordingRequestPipeline(httpError);
+    PipelinedDataPreloader preloader = new PipelinedDataPreloader(pipeline, containerConfig);
+
+    view = "profile";
+    contextParams.put("st", "token");
+
+    Gadget gadget = new Gadget()
+        .setContext(context)
+        .setSpec(spec)
+        .setCurrentView(spec.getView("profile"));
+
+    PipelinedData.Batch batch = getBatch(gadget);
+    Collection<Callable<PreloadedData>> tasks = preloader.createPreloadTasks(
+        context, batch);
+
+    Collection<Object> result = tasks.iterator().next().call().toJson();
+    assertEquals(2, result.size());
+
+    JSONObject resultWithKeyP = new JSONObject("{id: 'p', error: {code: 500}}");
+    JSONObject resultWithKeyA = new JSONObject("{id: 'a', error: {code: 500}}");
+    Iterator<Object> iter = result.iterator();
+    JsonAssert.assertJsonEquals(resultWithKeyA.toString(), iter.next().toString());
+    JsonAssert.assertJsonEquals(resultWithKeyP.toString(), iter.next().toString());
+  }
+
+
   private Batch getBatch(Gadget gadget) {
     return gadget.getCurrentView().getPipelinedData().getBatch(expressions,
         new GadgetELResolver(gadget.getContext()));

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java Tue Apr  7 17:47:57 2009
@@ -128,7 +128,7 @@
     protected FakePreloaderService() {
     }
 
-    public Collection<PreloadedData> preload(Gadget gadget, PreloadPhase phase) {
+    public Collection<PreloadedData> preload(Gadget gadget) {
       wasPreloaded = true;
       return preloads;
     }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java?rev=762869&r1=762868&r2=762869&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/ProxyRendererTest.java Tue Apr  7 17:47:57 2009
@@ -24,6 +24,7 @@
 import org.apache.shindig.auth.AnonymousSecurityToken;
 import org.apache.shindig.auth.SecurityToken;
 import org.apache.shindig.common.JsonAssert;
+import org.apache.shindig.common.JsonSerializer;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.uri.UriBuilder;
 import org.apache.shindig.common.xml.XmlUtil;
@@ -38,14 +39,16 @@
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.PipelinedData;
 import org.apache.shindig.gadgets.spec.View;
-import org.json.JSONArray;
+import org.json.JSONObject;
 import org.junit.Test;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 
 /**
@@ -196,7 +199,8 @@
 
   @Test
   public void renderProxiedWithPreload() throws Exception {
-    JSONArray prefetchedJson = new JSONArray("[{id: 'foo', data: 'bar'}]");
+    List<JSONObject> prefetchedJson = ImmutableList.of(new JSONObject("{id: 'foo', data: 'bar'}"));
+    
     pipelineExecutor.results = new PipelineExecutor.Results(null, prefetchedJson, null);
 
     pipeline.plainResponses.put(EXPECTED_PROXIED_HTML_HREF, new HttpResponse(PROXIED_HTML_CONTENT));
@@ -209,8 +213,7 @@
     assertEquals("application/json;charset=utf-8", lastHttpRequest.getHeader("Content-Type"));
     String postBody = lastHttpRequest.getPostBodyAsString();
 
-    JSONArray actualJson = new JSONArray(postBody);
-    JsonAssert.assertJsonArrayEquals(prefetchedJson, actualJson);
+    JsonAssert.assertJsonEquals(JsonSerializer.serialize(prefetchedJson), postBody);
     assertTrue(pipelineExecutor.wasPreloaded);
   }