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/07/17 20:52:57 UTC

svn commit: r795193 [1/2] - in /incubator/shindig/trunk/java: gadgets/src/main/java/org/apache/shindig/gadgets/preload/ gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ gadgets/src/main/java/org/apache/shindig/gadgets/spec/ gadgets/src/main/ja...

Author: awiner
Date: Fri Jul 17 18:52:55 2009
New Revision: 795193

URL: http://svn.apache.org/viewvc?rev=795193&view=rev
Log:
Add new Variable tag to pipelining and (server-side) templates, as an osx: extension
Refactor pipeline code a bit now that we have a third type of task (social, http, and variable)
Move tags down into a tags subpackage of templates
Repackage tags into

Added:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandler.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagRegistry.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagRegistry.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/CompositeTagRegistry.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/CompositeTagRegistry.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/DefaultTagRegistry.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTagRegistry.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/FlashTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/HtmlTagHandler.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/HtmlTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/IfTagHandler.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/IfTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RenderTagHandler.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RenderTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RepeatTagHandler.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RepeatTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TagHandler.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java   (contents, props changed)
      - copied, changed from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/VariableTagHandler.java   (with props)
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandlerTest.java   (contents, props changed)
      - copied, changed from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/AbstractTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/CompositeTagRegistryTest.java   (contents, props changed)
      - copied, changed from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/CompositeTagRegistryTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/DefaultTagRegistryTest.java   (contents, props changed)
      - copied, changed from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/DefaultTagRegistryTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandlerTest.java   (contents, props changed)
      - copied, changed from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/FlashTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/HtmlTagHandlerTest.java   (contents, props changed)
      - copied, changed from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/HtmlTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/IfTagHandlerTest.java   (contents, props changed)
      - copied, changed from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/IfTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/RenderTagHandlerTest.java   (contents, props changed)
      - copied, changed from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/RenderTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/RepeatTagHandlerTest.java   (contents, props changed)
      - copied, changed from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/RepeatTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandlerTest.java   (contents, props changed)
      - copied, changed from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandlerTest.java
Removed:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagRegistry.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/CompositeTagRegistry.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTagRegistry.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/FlashTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/HtmlTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/IfTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RenderTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RepeatTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/AbstractTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/CompositeTagRegistryTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/DefaultTagRegistryTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/FlashTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/HtmlTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/IfTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/RenderTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/RepeatTagHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandlerTest.java
Modified:
    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/rewrite/TemplateRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ElementELResolver.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/NullTemplateLibrary.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagRegistry.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.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/rewrite/PipelineDataGadgetRewriterTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/PipelinedDataTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessorTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/XmlTemplateLibraryTest.java
    incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java
    incubator/shindig/trunk/java/server/src/test/resources/endtoend/pipeliningTest.xml
    incubator/shindig/trunk/java/server/src/test/resources/endtoend/templateRewriter.xml

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=795193&r1=795192&r2=795193&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 Fri Jul 17 18:52:55 2009
@@ -48,6 +48,7 @@
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
@@ -72,22 +73,32 @@
   public Collection<Callable<PreloadedData>> createPreloadTasks(GadgetContext context,
       PipelinedData.Batch batch) {
     List<Callable<PreloadedData>> preloadList = Lists.newArrayList();
-
-    // Load any social preloads into a JSONArray for delivery to
-    // JsonRpcServlet
-    if (!batch.getSocialPreloads().isEmpty()) {
-      Callable<PreloadedData> preloader = new SocialPreloadTask(context,
-          batch.getSocialPreloads().values());
-      preloadList.add(preloader);
-    }
-
-    if (!batch.getHttpPreloads().isEmpty()) {
-      for (Map.Entry<String, RequestAuthenticationInfo> httpPreloadEntry
-          : batch.getHttpPreloads().entrySet()) {
-        preloadList.add(new HttpPreloadTask(context,  httpPreloadEntry.getValue(),
-            httpPreloadEntry.getKey()));
-      }
-
+    
+    Collection<Object> socialRequest = Lists.newArrayList();
+    // Gather all the preload entries;  all social requests in one batch, each HTTP
+    // in its own
+    for (Map.Entry<String, PipelinedData.BatchItem> preloadEntry : batch.getPreloads().entrySet()) {
+      PipelinedData.BatchItem preloadItem = preloadEntry.getValue();
+      switch (preloadItem.getType()) {
+        case HTTP:
+          preloadList.add(new HttpPreloadTask(context, (RequestAuthenticationInfo) preloadItem.getData(),
+              preloadEntry.getKey()));
+          break;
+        case SOCIAL:
+          socialRequest.add(preloadItem.getData());
+          break;
+        case VARIABLE:
+          // TODO: this is rather crazy: these tasks don't need to execute on
+          // another thread.
+          preloadList.add(new VariableTask(preloadEntry.getKey(), preloadItem.getData()));
+          break;
+        default:
+          throw new IllegalArgumentException("Unknown pipeline type");
+      }
+    }
+    
+    if (!socialRequest.isEmpty()) {
+      preloadList.add(new SocialPreloadTask(context, socialRequest));
     }
 
     return preloadList;
@@ -105,6 +116,23 @@
     return response;
   }
 
+  private static class VariableTask implements Callable<PreloadedData> {
+    private ImmutableMap<String, Object> result;
+
+    public VariableTask(String key, Object data) {
+      this.result = (data == null) ? ImmutableMap.of("id", (Object) key)
+          : ImmutableMap.of("id", key, "data", data); 
+    }
+
+    public PreloadedData call() throws Exception {
+      return new PreloadedData() {
+        public Collection<Object> toJson() throws PreloadException {
+          return ImmutableList.<Object>of(result);
+        }
+      };
+    }
+  }
+  
   /**
    * Callable for issuing HttpRequests to JsonRpcServlet.
    */

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=795193&r1=795192&r2=795193&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 Fri Jul 17 18:52:55 2009
@@ -29,19 +29,19 @@
 import org.apache.shindig.gadgets.render.SanitizingGadgetRewriter;
 import org.apache.shindig.gadgets.spec.Feature;
 import org.apache.shindig.gadgets.spec.MessageBundle;
-import org.apache.shindig.gadgets.templates.CompositeTagRegistry;
 import org.apache.shindig.gadgets.templates.ContainerTagLibraryFactory;
-import org.apache.shindig.gadgets.templates.DefaultTagRegistry;
 import org.apache.shindig.gadgets.templates.MessageELResolver;
-import org.apache.shindig.gadgets.templates.TagHandler;
 import org.apache.shindig.gadgets.templates.TagRegistry;
-import org.apache.shindig.gadgets.templates.TemplateBasedTagHandler;
 import org.apache.shindig.gadgets.templates.TemplateContext;
 import org.apache.shindig.gadgets.templates.TemplateLibrary;
 import org.apache.shindig.gadgets.templates.TemplateLibraryFactory;
 import org.apache.shindig.gadgets.templates.TemplateParserException;
 import org.apache.shindig.gadgets.templates.TemplateProcessor;
 import org.apache.shindig.gadgets.templates.TemplateResource;
+import org.apache.shindig.gadgets.templates.tags.CompositeTagRegistry;
+import org.apache.shindig.gadgets.templates.tags.DefaultTagRegistry;
+import org.apache.shindig.gadgets.templates.tags.TagHandler;
+import org.apache.shindig.gadgets.templates.tags.TemplateBasedTagHandler;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java Fri Jul 17 18:52:55 2009
@@ -52,17 +52,15 @@
  * Parsing code for &lt;os:*&gt; elements.
  */
 public class PipelinedData {
-  private final Map<String, SocialData> socialPreloads;
-  private final Map<String, HttpData> httpPreloads;
-
   private boolean needsViewer;
   private boolean needsOwner;
+  private Map<String, BatchItemData> allPreloads;
 
   public static final String OPENSOCIAL_NAMESPACE = "http://ns.opensocial.org/2008/markup";
+  public static final String EXTENSION_NAMESPACE = "http://ns.opensocial.org/2009/extensions";
 
   public PipelinedData(Element element, Uri base) throws SpecParserException {
-    Map<String, SocialData> socialPreloads = Maps.newHashMap();
-    Map<String, HttpData> httpPreloads = Maps.newHashMap();
+    Map<String, BatchItemData> allPreloads = Maps.newHashMap();
 
     // TODO: extract this loop into XmlUtils.getChildrenWithNamespace
     for (Node node = element.getFirstChild(); node != null; node = node.getNextSibling()) {
@@ -71,62 +69,61 @@
       }
 
       Element child = (Element) node;
-      // Ignore elements not in the namespace
-      if (!OPENSOCIAL_NAMESPACE.equals(child.getNamespaceURI())) {
-        continue;
-      }
-
-      String elementName = child.getLocalName();
-
-      String key = child.getAttribute("key");
-      if (key == null) {
-        throw new SpecParserException("Missing key attribute on os:" + elementName);
-      }
-
-      try {
-        if ("PeopleRequest".equals(elementName)) {
-          socialPreloads.put(key, createPeopleRequest(child));
-        } else if ("ViewerRequest".equals(elementName)) {
-          socialPreloads.put(key, createViewerRequest(child));
-        } else if ("OwnerRequest".equals(elementName)) {
-          socialPreloads.put(key, createOwnerRequest(child));
-        } else if ("PersonAppDataRequest".equals(elementName)) {
-          // TODO: delete when 0.9 app data retrieval is supported
-          socialPreloads.put(key, createPersonAppDataRequest(child));
-        } else if ("ActivitiesRequest".equals(elementName)) {
-          socialPreloads.put(key, createActivityRequest(child));
-        } else if ("DataRequest".equals(elementName)) {
-          socialPreloads.put(key, createDataRequest(child));
-        } else if ("HttpRequest".equals(elementName)) {
-          httpPreloads.put(key, createHttpRequest(child, base));
-        } else {
-          // TODO: This is wrong - the spec should parse, but should preload
-          // notImplemented
-          throw new SpecParserException("Unknown element <os:" + elementName + '>');
+      
+      if (EXTENSION_NAMESPACE.equals(child.getNamespaceURI())) {
+        if ("Variable".equals(child.getLocalName())) {
+          allPreloads.put(child.getAttribute("key"), createVariableRequest(child));
+        }
+        
+      } else if (OPENSOCIAL_NAMESPACE.equals(child.getNamespaceURI())) {
+        String elementName = child.getLocalName();
+  
+        String key = child.getAttribute("key");
+        if (key == null) {
+          throw new SpecParserException("Missing key attribute on os:" + elementName);
+        }
+  
+        try {
+          if ("PeopleRequest".equals(elementName)) {
+            allPreloads.put(key, createPeopleRequest(child));
+          } else if ("ViewerRequest".equals(elementName)) {
+            allPreloads.put(key, createViewerRequest(child));
+          } else if ("OwnerRequest".equals(elementName)) {
+            allPreloads.put(key, createOwnerRequest(child));
+          } else if ("PersonAppDataRequest".equals(elementName)) {
+            // TODO: delete when 0.9 app data retrieval is supported
+            allPreloads.put(key, createPersonAppDataRequest(child));
+          } else if ("ActivitiesRequest".equals(elementName)) {
+            allPreloads.put(key, createActivityRequest(child));
+          } else if ("DataRequest".equals(elementName)) {
+            allPreloads.put(key, createDataRequest(child));
+          } else if ("HttpRequest".equals(elementName)) {
+            allPreloads.put(key, createHttpRequest(child, base));
+          } else {
+            // TODO: This is wrong - the spec should parse, but should preload
+            // notImplemented
+            throw new SpecParserException("Unknown element <os:" + elementName + '>');
+          }
+        } catch (ELException ele) {
+          throw new SpecParserException(new XmlException(ele));
         }
-      } catch (ELException ele) {
-        throw new SpecParserException(new XmlException(ele));
       }
     }
 
-    this.socialPreloads = Collections.unmodifiableMap(socialPreloads);
-    this.httpPreloads = Collections.unmodifiableMap(httpPreloads);
+    this.allPreloads = Collections.unmodifiableMap(allPreloads);
   }
 
-  private PipelinedData(PipelinedData socialData, Substitutions substituter) {
-    Map<String, SocialData> socialPreloads = Maps.newHashMap();
-    Map<String, HttpData> httpPreloads = Maps.newHashMap();
-
-    // TODO: support hangman substitutions for social preloads?
-    socialPreloads.putAll(socialData.socialPreloads);
+  private BatchItemData createVariableRequest(Element child) {
+    return new VariableData(child.getAttribute("value"));
+  }
 
-    for (Map.Entry<String, HttpData> httpPreload : socialData.httpPreloads.entrySet()) {
-      httpPreloads.put(httpPreload.getKey(), httpPreload.getValue().substitute(substituter));
+  private PipelinedData(PipelinedData socialData, Substitutions substituter) {
+    Map<String, BatchItemData> allPreloads = Maps.newHashMap();
+    for (Map.Entry<String, BatchItemData> preload : socialData.allPreloads.entrySet()) {
+      allPreloads.put(preload.getKey(), preload.getValue().substitute(substituter));
     }
-
-    this.socialPreloads = Collections.unmodifiableMap(socialPreloads);
-    this.httpPreloads = Collections.unmodifiableMap(httpPreloads);
-
+    
+    this.allPreloads = Collections.unmodifiableMap(allPreloads);
   }
 
   /**
@@ -138,11 +135,29 @@
   }
 
   public interface Batch {
-    Map<String, Object> getSocialPreloads();
-    Map<String, RequestAuthenticationInfo> getHttpPreloads();
+    Map<String, BatchItem> getPreloads();
     Batch getNextBatch(ELResolver rootObjects);
   }
-
+  
+  /** Temporary type until BatchItem is made fully polymorphic */
+  public enum BatchType {
+    SOCIAL,
+    HTTP,
+    VARIABLE
+  }
+  
+  /** Item within a batch */
+  public interface BatchItem {
+    BatchType getType();
+    Object getData();
+  }
+  
+  /** Shared data used to generate BatchItems */
+  interface BatchItemData {
+    BatchItem evaluate(Expressions expressions, ELContext elContext);
+    BatchItemData substitute(Substitutions substituter);
+  }
+  
   /**
    * Gets the first batch of preload requests.  Preloads that require root
    * objects not yet available will not be executed in this batch, but may
@@ -154,7 +169,7 @@
    * @return a batch, or null if no batch could be created
    */
   public Batch getBatch(Expressions expressions, ELResolver rootObjects) {
-    return getBatch(expressions, rootObjects, socialPreloads, httpPreloads);
+    return getBatch(expressions, rootObjects, allPreloads);
   }
 
   /**
@@ -166,95 +181,64 @@
    * @param currentHttpPreloads the remaining http preloads
    */
   private Batch getBatch(Expressions expressions, ELResolver rootObjects,
-      Map<String, SocialData> currentSocialPreloads,
-      Map<String, HttpData> currentHttpPreloads) {
+      Map<String, BatchItemData> currentPreloads) {
     ELContext elContext = expressions.newELContext(rootObjects);
 
-    // Evaluate all existing social preloads
-    Map<String, Object> evaluatedSocialPreloads = Maps.newHashMap();
-    Map<String, SocialData> pendingSocialPreloads = null;
-
-    if (currentSocialPreloads != null) {
-      for (Map.Entry<String, SocialData> preload : currentSocialPreloads.entrySet()) {
+    Map<String, BatchItem> evaluatedPreloads = Maps.newHashMap();
+    Map<String, BatchItemData> pendingPreloads = null;
+    
+    if (currentPreloads != null) {
+      for (Map.Entry<String, BatchItemData> preload : currentPreloads.entrySet()) {
         try {
-          Object value = preload.getValue().toJson(expressions, elContext);
-          evaluatedSocialPreloads.put(preload.getKey(), value);
-        } catch (PropertyNotFoundException pnfe) {
-          // Missing top-level property: put it in the pending set
-          if (pendingSocialPreloads == null) {
-            pendingSocialPreloads = Maps.newHashMap();
+          BatchItem value = preload.getValue().evaluate(expressions, elContext);
+          evaluatedPreloads.put(preload.getKey(), value);
+        } catch (PropertyNotFoundException pe) {
+          // Property-not-found: presume that this is because a top-level
+          // variable isn't available yet, which means that this needs to be
+          // postponed to the next batch.
+          if (pendingPreloads == null) {
+            pendingPreloads = Maps.newHashMap();
           }
-          pendingSocialPreloads.put(preload.getKey(), preload.getValue());
+          
+          pendingPreloads.put(preload.getKey(), preload.getValue());
         } catch (ELException e) {
           // TODO: Handle!?!
           throw new RuntimeException(e);
         }
       }
     }
-    // And evaluate all existing HTTP preloads
-    Map<String, RequestAuthenticationInfo> evaluatedHttpPreloads = Maps.newHashMap();
-    Map<String, HttpData> pendingHttpPreloads = null;
-
-    if (currentHttpPreloads != null) {
-      for (Map.Entry<String, HttpData> preload : currentHttpPreloads.entrySet()) {
-        try {
-          RequestAuthenticationInfo value = preload.getValue().evaluate(expressions, elContext);
-          evaluatedHttpPreloads.put(preload.getKey(), value);
-        } catch (PropertyNotFoundException pnfe) {
-          if (pendingHttpPreloads == null) {
-            pendingHttpPreloads = Maps.newHashMap();
-          }
-          pendingHttpPreloads.put(preload.getKey(), preload.getValue());
-        } catch (ELException e) {
-          // TODO: Handle!?!
-          throw new RuntimeException(e);
-        }
-      }
-    }
-
+    
     // Nothing evaluated or pending;  return null for the batch.  Note that
     // there may be multiple PipelinedData objects (e.g., from multiple
     // <script type="text/os-data"> elements), so even if all evaluations
     // fail here, evaluations might succeed elsewhere and free up pending preloads
-    if (evaluatedSocialPreloads.isEmpty() && evaluatedHttpPreloads.isEmpty() &&
-        pendingHttpPreloads == null && pendingSocialPreloads == null) {
+    if (evaluatedPreloads.isEmpty() && pendingPreloads == null) {
       return null;
     }
 
-    return new BatchImpl(expressions, evaluatedSocialPreloads, evaluatedHttpPreloads,
-        pendingSocialPreloads, pendingHttpPreloads);
+    return new BatchImpl(expressions, evaluatedPreloads, pendingPreloads);
   }
 
   /** Batch implementation */
   class BatchImpl implements Batch {
 
     private final Expressions expressions;
-    private final Map<String, Object> evaluatedSocialPreloads;
-    private final Map<String, RequestAuthenticationInfo> evaluatedHttpPreloads;
-    private final Map<String, SocialData> pendingSocialPreloads;
-    private final Map<String, HttpData> pendingHttpPreloads;
-
-    public BatchImpl(Expressions expressions,
-        Map<String, Object> evaluatedSocialPreloads,
-        Map<String, RequestAuthenticationInfo> evaluatedHttpPreloads,
-        Map<String, SocialData> pendingSocialPreloads, Map<String, HttpData> pendingHttpPreloads) {
-      this.expressions = expressions;
-      this.evaluatedSocialPreloads = evaluatedSocialPreloads;
-      this.evaluatedHttpPreloads = evaluatedHttpPreloads;
-      this.pendingSocialPreloads = pendingSocialPreloads;
-      this.pendingHttpPreloads = pendingHttpPreloads;
-    }
+    private final Map<String, BatchItem> evaluatedPreloads;
+    private final Map<String, BatchItemData> pendingPreloads;
 
-    public Map<String, Object> getSocialPreloads() {
-      return evaluatedSocialPreloads;
+    public BatchImpl(Expressions expressions, Map<String, BatchItem> evaluatedPreloads,
+        Map<String, BatchItemData> pendingPreloads) {
+          this.expressions = expressions;
+          this.evaluatedPreloads = evaluatedPreloads;
+          this.pendingPreloads = pendingPreloads;
     }
 
-    public Map<String, RequestAuthenticationInfo> getHttpPreloads() {
-      return evaluatedHttpPreloads;
+    public Batch getNextBatch(ELResolver rootObjects) {
+      return getBatch(expressions, rootObjects, pendingPreloads);
     }
 
-    public Batch getNextBatch(ELResolver rootObjects) {
-      return getBatch(expressions, rootObjects, pendingSocialPreloads, pendingHttpPreloads);
+    public Map<String, BatchItem> getPreloads() {
+      return evaluatedPreloads;
     }
   }
 
@@ -424,7 +408,7 @@
   /**
    * A single pipelined HTTP makerequest.
    */
-  private static class HttpData {
+  private static class HttpData implements BatchItemData {
     private final AuthType authz;
     private final Uri base;
     private final String href;
@@ -481,7 +465,7 @@
      * Evaluate expressions and return a RequestAuthenticationInfo.
      * @throws ELException if expression evaluation fails.
      */
-    public RequestAuthenticationInfo evaluate(Expressions expressions, ELContext context)
+    public BatchItem evaluate(Expressions expressions, ELContext context)
         throws ELException {
       String hrefString = String.valueOf(expressions.parse(href, String.class)
           .getValue(context));
@@ -494,7 +478,7 @@
             String.valueOf(expression.getValue(context)));
       }
 
-      return new RequestAuthenticationInfo() {
+      final RequestAuthenticationInfo info = new RequestAuthenticationInfo() {
         public Map<String, String> getAttributes() {
           return evaluatedAttributes;
         }
@@ -515,6 +499,16 @@
           return signViewer;
         }
       };
+      
+      return new BatchItem() {
+        public Object getData() {
+          return info;
+        }
+
+        public BatchType getType() {
+          return BatchType.HTTP;
+        }        
+      };
     }
 
     /** Parse a boolean expression off an XML attribute. */
@@ -531,7 +525,7 @@
   /**
    * A single social data request.
    */
-  private static class SocialData {
+  private static class SocialData implements BatchItemData {
     private final List<Property> properties = Lists.newArrayList();
     private final String id;
     private final String method;
@@ -546,7 +540,7 @@
     }
 
     /** Create the JSON request form for the social data */
-    public JSONObject toJson(Expressions expressions, ELContext elContext) throws ELException {
+    private JSONObject toJson(Expressions expressions, ELContext elContext) throws ELException {
       JSONObject object = new JSONObject();
       try {
         object.put("method", method);
@@ -589,5 +583,50 @@
         }
       }
     }
+
+    public BatchItem evaluate(Expressions expressions, ELContext elContext) throws ELException {
+      final JSONObject jsonResult = toJson(expressions, elContext);
+      return new BatchItem() {
+        public Object getData() {
+          return jsonResult;
+        }
+
+        public BatchType getType() {
+          return BatchType.SOCIAL;
+        }
+      };
+    }
+
+    public BatchItemData substitute(Substitutions substituter) {
+      // TODO: support hangman substution on social data?
+      return this;
+    }
+  }
+
+  private static class VariableData implements BatchItemData {
+    private final String value;
+
+    public VariableData(String value) {
+      this.value = value;
+    }
+    
+    public BatchItem evaluate(Expressions expressions, ELContext elContext) throws ELException {
+      ValueExpression expression = expressions.parse(value, Object.class);
+      final Object result = expression.getValue(elContext);
+      return new BatchItem() {
+        public Object getData() {
+          return result;
+        }
+
+        public BatchType getType() {
+          return BatchType.VARIABLE;
+        }
+        
+      };
+    }
+
+    public BatchItemData substitute(Substitutions substituter) {
+      return this;
+    }
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java Fri Jul 17 18:52:55 2009
@@ -21,6 +21,8 @@
 import org.apache.shindig.expressions.Expressions;
 import org.apache.shindig.gadgets.GadgetELResolver;
 import org.apache.shindig.gadgets.parse.HtmlSerialization;
+import org.apache.shindig.gadgets.templates.tags.RepeatTagHandler;
+import org.apache.shindig.gadgets.templates.tags.TagHandler;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentFragment;

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ElementELResolver.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ElementELResolver.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ElementELResolver.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ElementELResolver.java Fri Jul 17 18:52:55 2009
@@ -34,7 +34,7 @@
 /**
  * ELResolver that processes DOM elements.
  */
-class ElementELResolver extends ELResolver {
+public class ElementELResolver extends ELResolver {
   /**
    * A wrapper for a DOM Element that overrides toString().
    * TODO: remove with JUEL 2.1.1.

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/NullTemplateLibrary.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/NullTemplateLibrary.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/NullTemplateLibrary.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/NullTemplateLibrary.java Fri Jul 17 18:52:55 2009
@@ -19,6 +19,8 @@
 package org.apache.shindig.gadgets.templates;
 
 import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.templates.tags.DefaultTagRegistry;
+import org.apache.shindig.gadgets.templates.tags.TagHandler;
 
 import com.google.common.collect.ImmutableSet;
 

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagRegistry.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagRegistry.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagRegistry.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagRegistry.java Fri Jul 17 18:52:55 2009
@@ -18,6 +18,8 @@
  */
 package org.apache.shindig.gadgets.templates;
 
+import org.apache.shindig.gadgets.templates.tags.DefaultTagRegistry;
+import org.apache.shindig.gadgets.templates.tags.TagHandler;
 import org.w3c.dom.Element;
 
 import com.google.inject.ImplementedBy;

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java Fri Jul 17 18:52:55 2009
@@ -18,6 +18,14 @@
  */
 package org.apache.shindig.gadgets.templates;
 
+import org.apache.shindig.gadgets.templates.tags.FlashTagHandler;
+import org.apache.shindig.gadgets.templates.tags.HtmlTagHandler;
+import org.apache.shindig.gadgets.templates.tags.IfTagHandler;
+import org.apache.shindig.gadgets.templates.tags.RenderTagHandler;
+import org.apache.shindig.gadgets.templates.tags.RepeatTagHandler;
+import org.apache.shindig.gadgets.templates.tags.TagHandler;
+import org.apache.shindig.gadgets.templates.tags.VariableTagHandler;
+
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
@@ -34,6 +42,8 @@
   @Override
   protected void configure() {
     bind(TemplateProcessor.class).to(DefaultTemplateProcessor.class);
+    // TODO: switch to Guice multibindings when that JAR becomes available
+    // in a Maven repository
     bind(new TypeLiteral<Set<TagHandler>>(){}).toProvider(TagHandlersProvider.class); 
   }
    
@@ -44,9 +54,11 @@
     @Inject
     public TagHandlersProvider(HtmlTagHandler htmlHandler, 
         IfTagHandler ifHandler, RepeatTagHandler repeatHandler, 
-        RenderTagHandler renderHandler, FlashTagHandler flashHandler) {
+        RenderTagHandler renderHandler, FlashTagHandler flashHandler,
+        VariableTagHandler variableHandler) {
       handlers = ImmutableSet.of((TagHandler) htmlHandler, ifHandler,
-          repeatHandler, renderHandler, flashHandler);
+          repeatHandler, renderHandler, flashHandler,
+          variableHandler);
     }
     
     public Set<TagHandler> get() {

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java Fri Jul 17 18:52:55 2009
@@ -22,6 +22,9 @@
 import org.apache.shindig.common.xml.DomUtil;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.render.SanitizingGadgetRewriter;
+import org.apache.shindig.gadgets.templates.tags.DefaultTagRegistry;
+import org.apache.shindig.gadgets.templates.tags.TagHandler;
+import org.apache.shindig.gadgets.templates.tags.TemplateBasedTagHandler;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandler.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagHandler.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandler.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandler.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagHandler.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandler.java Fri Jul 17 18:52:55 2009
@@ -16,9 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
 import org.apache.shindig.gadgets.parse.HtmlSerialization;
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandler.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagRegistry.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagRegistry.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagRegistry.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagRegistry.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagRegistry.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/AbstractTagRegistry.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagRegistry.java Fri Jul 17 18:52:55 2009
@@ -16,8 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
+import org.apache.shindig.gadgets.templates.TagRegistry;
 import org.w3c.dom.Element;
 
 public abstract class AbstractTagRegistry implements TagRegistry {

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagRegistry.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/CompositeTagRegistry.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/CompositeTagRegistry.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/CompositeTagRegistry.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/CompositeTagRegistry.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/CompositeTagRegistry.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/CompositeTagRegistry.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/CompositeTagRegistry.java Fri Jul 17 18:52:55 2009
@@ -16,7 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
+
+import org.apache.shindig.gadgets.templates.TagRegistry;
 
 import java.util.Collection;
 

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/CompositeTagRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/CompositeTagRegistry.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/DefaultTagRegistry.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTagRegistry.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/DefaultTagRegistry.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/DefaultTagRegistry.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTagRegistry.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTagRegistry.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/DefaultTagRegistry.java Fri Jul 17 18:52:55 2009
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
 import java.util.Map;
 import java.util.Set;

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/DefaultTagRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/DefaultTagRegistry.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/FlashTagHandler.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/FlashTagHandler.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/FlashTagHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java Fri Jul 17 18:52:55 2009
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.ImmutableSet;
@@ -30,6 +30,7 @@
 import org.apache.shindig.common.util.Utf8UrlCoder;
 import org.apache.shindig.common.JsonSerializer;
 import org.apache.shindig.gadgets.render.SanitizingGadgetRewriter;
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
 import org.apache.shindig.gadgets.GadgetFeatureRegistry;
 import org.apache.shindig.gadgets.RenderingContext;
 import org.apache.shindig.gadgets.GadgetFeature;

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/HtmlTagHandler.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/HtmlTagHandler.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/HtmlTagHandler.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/HtmlTagHandler.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/HtmlTagHandler.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/HtmlTagHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/HtmlTagHandler.java Fri Jul 17 18:52:55 2009
@@ -16,11 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
 import org.apache.shindig.gadgets.parse.HtmlSerialization;
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/HtmlTagHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/HtmlTagHandler.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/IfTagHandler.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/IfTagHandler.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/IfTagHandler.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/IfTagHandler.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/IfTagHandler.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/IfTagHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/IfTagHandler.java Fri Jul 17 18:52:55 2009
@@ -16,8 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/IfTagHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/IfTagHandler.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RenderTagHandler.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RenderTagHandler.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RenderTagHandler.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RenderTagHandler.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RenderTagHandler.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RenderTagHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RenderTagHandler.java Fri Jul 17 18:52:55 2009
@@ -16,8 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
+import org.apache.shindig.gadgets.templates.ElementELResolver.ElementWrapper;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
@@ -25,7 +27,6 @@
 import java.util.Map;
 
 import com.google.inject.Inject;
-import org.apache.shindig.gadgets.templates.ElementELResolver.ElementWrapper;
 
 /**
  * Tag Handler for <os:Render/> tag.

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RenderTagHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RenderTagHandler.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RepeatTagHandler.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RepeatTagHandler.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RepeatTagHandler.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RepeatTagHandler.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RepeatTagHandler.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/RepeatTagHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RepeatTagHandler.java Fri Jul 17 18:52:55 2009
@@ -16,8 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RepeatTagHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RepeatTagHandler.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TagHandler.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagHandler.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TagHandler.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TagHandler.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagHandler.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TagHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TagHandler.java Fri Jul 17 18:52:55 2009
@@ -16,8 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TagHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TagHandler.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java (from r794096, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandler.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandler.java&r1=794096&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java Fri Jul 17 18:52:55 2009
@@ -16,8 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
+import org.apache.shindig.gadgets.templates.ElementELResolver.ElementWrapper;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
@@ -29,7 +31,6 @@
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import org.apache.shindig.gadgets.templates.ElementELResolver.ElementWrapper;
 
 /**
  * TagHandler implemented by an declarative XML definition.

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/VariableTagHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/VariableTagHandler.java?rev=795193&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/VariableTagHandler.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/VariableTagHandler.java Fri Jul 17 18:52:55 2009
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.shindig.gadgets.templates.tags;
+
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+/**
+ * Implement the osx:Variable tag
+ */
+public class VariableTagHandler extends AbstractTagHandler {
+
+  static final String TAG_NAME = "Variable";
+
+  @Inject
+  public VariableTagHandler(@Named("shindig.template-rewrite.extension-tag-namespace") String namespace) {
+    super(namespace, TAG_NAME);
+  }
+
+  public void process(Node result, Element tag, TemplateProcessor processor) {
+    // Get the key.  Don't support EL (to match pipelining)
+    String key = tag.getAttribute("key");
+    if ("".equals(key)) {
+      return;
+    }
+    
+    // Get the value (with EL)
+    Object value = getValueFromTag(tag, "value", processor, Object.class);
+    
+    if (processor.getTemplateContext().getMy() == null) {
+      processor.getTemplateContext().setMy(Maps.<String, Object> newHashMap());
+    }
+    processor.getTemplateContext().getMy().put(key, value);
+  }
+}

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/VariableTagHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=795193&r1=795192&r2=795193&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 Fri Jul 17 18:52:55 2009
@@ -121,8 +121,8 @@
         ImmutableList.of(pipeline));
     
     // Verify the data set is injected, and the os-data was deleted
-    assertTrue(batchCapture.getValue().getSocialPreloads().containsKey("me"));
-    assertTrue(batchCapture.getValue().getHttpPreloads().containsKey("json"));
+    assertTrue(batchCapture.getValue().getPreloads().containsKey("me"));
+    assertTrue(batchCapture.getValue().getPreloads().containsKey("json"));
     
     JsonAssert.assertJsonEquals("[{id: 'key', data: {foo: 'bar'}}]",
         JsonSerializer.serialize(results.results));
@@ -187,11 +187,12 @@
     // Verify the data set is injected, and the os-data was deleted
 
     // Check the evaluated HTTP request
-    RequestAuthenticationInfo request = firstBatch.getValue().getHttpPreloads().get("json");
+    RequestAuthenticationInfo request = (RequestAuthenticationInfo)
+        firstBatch.getValue().getPreloads().get("json").getData();
     assertEquals("http://example.org/test.json", request.getHref().toString());
     
     // Check the evaluated person request
-    JSONObject personRequest = (JSONObject) secondBatch.getValue().getSocialPreloads().get("me");
+    JSONObject personRequest = (JSONObject) secondBatch.getValue().getPreloads().get("me").getData();
     assertEquals("canonical", personRequest.getJSONObject("params").getJSONArray("userId").get(0));
   }
 
@@ -239,8 +240,8 @@
         ImmutableList.of(pipeline));
     
     // Verify the data set is injected, and the os-data was deleted
-    assertTrue(batchCapture.getValue().getSocialPreloads().containsKey("me"));
-    assertTrue(batchCapture.getValue().getHttpPreloads().containsKey("json"));
+    assertTrue(batchCapture.getValue().getPreloads().containsKey("me"));
+    assertTrue(batchCapture.getValue().getPreloads().containsKey("json"));
     
     JsonAssert.assertJsonEquals("[{id: 'key', error: {message: 'NO!', code: 500}}]",
         JsonSerializer.serialize(results.results));
@@ -307,8 +308,17 @@
       }
       
       PipelinedData.Batch batch = (PipelinedData.Batch) obj;
-      return (socialCount == batch.getSocialPreloads().size() 
-          && httpCount == batch.getHttpPreloads().size());
+      int actualSocialCount = 0;
+      int actualHttpCount = 0;
+      for (PipelinedData.BatchItem item : batch.getPreloads().values()) {
+        if (item.getType() == PipelinedData.BatchType.HTTP) {
+          actualHttpCount++;
+        } else if (item.getType() == PipelinedData.BatchType.SOCIAL) {
+          actualSocialCount++;
+        }
+      }
+      
+      return socialCount == actualSocialCount && httpCount == actualHttpCount;
     }
     
   }

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=795193&r1=795192&r2=795193&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 Fri Jul 17 18:52:55 2009
@@ -74,6 +74,13 @@
       + "  <os:HttpRequest key=\"p\" href=\"" + HTTP_REQUEST_URL + "\" "
       + "refreshInterval=\"60\" method=\"POST\"/>" + "</Content></Module>";
 
+  private static final String XML_WITH_VARIABLE = "<Module " +
+  		"xmlns:os=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " +
+        "xmlns:osx=\"" + PipelinedData.EXTENSION_NAMESPACE + "\">"
+    + "<ModulePrefs title=\"Title\"/>"
+    + "<Content href=\"http://example.org/proxied.php\" view=\"profile\">"
+    + "  <osx:Variable key=\"p\" value=\"${1+1}\"/>" + "</Content></Module>";
+
   private static final String XML_WITH_HTTP_REQUEST_FOR_TEXT = "<Module xmlns:os=\""
     + PipelinedData.OPENSOCIAL_NAMESPACE + "\">"
     + "<ModulePrefs title=\"Title\"/>"
@@ -457,6 +464,34 @@
     assertEquals(1, tasks.size());
   }
 
+  @Test
+  public void testVariablePreload() throws Exception {
+    GadgetSpec spec = new GadgetSpec(GADGET_URL, XML_WITH_VARIABLE);
+
+    RecordingRequestPipeline pipeline = new RecordingRequestPipeline("");
+    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(1, result.size());
+
+    JsonAssert.assertObjectEquals("{id: 'p', data: 2}", result.iterator().next());
+  }
+
   private static class RecordingRequestPipeline implements RequestPipeline {
     public final List<HttpRequest> requests = Lists.newArrayList();
     private final HttpResponse response;

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriterTest.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriterTest.java Fri Jul 17 18:52:55 2009
@@ -138,8 +138,8 @@
     assertFalse("os-data wasn't deleted",
         content.getContent().contains("type=\"text/os-data\""));
 
-    assertTrue(batchCapture.getValue().getSocialPreloads().containsKey("me"));
-    assertTrue(batchCapture.getValue().getHttpPreloads().containsKey("json"));
+    assertTrue(batchCapture.getValue().getPreloads().containsKey("me"));
+    assertTrue(batchCapture.getValue().getPreloads().containsKey("json"));
     
     assertEquals(ImmutableSet.of("opensocial-data"), gadget.getRemovedFeatures());
     assertEquals(ImmutableSet.of("opensocial-data-context"), gadget.getAddedFeatures());
@@ -197,8 +197,17 @@
       }
       
       PipelinedData.Batch batch = (PipelinedData.Batch) obj;
-      return (socialCount == batch.getSocialPreloads().size() 
-          && httpCount == batch.getHttpPreloads().size());
+      int actualSocialCount = 0;
+      int actualHttpCount = 0;
+      for (PipelinedData.BatchItem item : batch.getPreloads().values()) {
+        if (item.getType() == PipelinedData.BatchType.HTTP) {
+          actualHttpCount++;
+        } else if (item.getType() == PipelinedData.BatchType.SOCIAL) {
+          actualSocialCount++;
+        }
+      }
+      
+      return socialCount == actualSocialCount && httpCount == actualHttpCount;
     }
     
   }
@@ -240,11 +249,13 @@
     assertEquals(1, pipelines.size());
     PipelinedData pipeline = pipelines.keySet().iterator().next();
     PipelinedData.Batch batch = pipeline.getBatch(Expressions.forTesting(), new RootELResolver());
-    Map<String, Object> preloads = batch.getSocialPreloads();
-    
+    Map<String, PipelinedData.BatchItem> preloads = batch.getPreloads();
+    assertTrue(preloads.containsKey("me"));
+    assertEquals(PipelinedData.BatchType.SOCIAL, preloads.get("me").getType());
+        
     JsonAssert.assertObjectEquals(
-        "{me: {params: {userId: 'canonical'}, method: 'people.get', id: 'me'}}",
-        preloads);
+        "{params: {userId: 'canonical'}, method: 'people.get', id: 'me'}",
+        preloads.get("me").getData());
   }
 
   /** Create a mock Callable for a single preload task */

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java Fri Jul 17 18:52:55 2009
@@ -34,15 +34,15 @@
 import org.apache.shindig.gadgets.render.FakeMessageBundleFactory;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.SpecParserException;
-import org.apache.shindig.gadgets.templates.AbstractTagHandler;
 import org.apache.shindig.gadgets.templates.ContainerTagLibraryFactory;
-import org.apache.shindig.gadgets.templates.DefaultTagRegistry;
 import org.apache.shindig.gadgets.templates.DefaultTemplateProcessor;
-import org.apache.shindig.gadgets.templates.TagHandler;
 import org.apache.shindig.gadgets.templates.TemplateLibrary;
 import org.apache.shindig.gadgets.templates.TemplateLibraryFactory;
 import org.apache.shindig.gadgets.templates.TemplateProcessor;
 import org.apache.shindig.gadgets.templates.XmlTemplateLibrary;
+import org.apache.shindig.gadgets.templates.tags.AbstractTagHandler;
+import org.apache.shindig.gadgets.templates.tags.DefaultTagRegistry;
+import org.apache.shindig.gadgets.templates.tags.TagHandler;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.junit.Before;

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/PipelinedDataTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/PipelinedDataTest.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/PipelinedDataTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/PipelinedDataTest.java Fri Jul 17 18:52:55 2009
@@ -24,11 +24,14 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import org.apache.shindig.common.JsonAssert;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.xml.XmlUtil;
 import org.apache.shindig.expressions.Expressions;
 import org.apache.shindig.expressions.RootELResolver;
 import org.apache.shindig.gadgets.AuthType;
+import org.apache.shindig.gadgets.spec.PipelinedData.BatchItem;
+import org.apache.shindig.gadgets.spec.PipelinedData.BatchType;
 
 import java.util.Map;
 
@@ -84,9 +87,10 @@
         + "}}");
 
     PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
-    assertTrue(batch.getHttpPreloads().isEmpty());
-    assertEquals(1, batch.getSocialPreloads().size());
-    assertEquals(expected.toString(), batch.getSocialPreloads().get("key").toString());
+    assertEquals(1, batch.getPreloads().size());
+    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
+    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
+    JsonAssert.assertObjectEquals(expected, batchItem.getData());
   }
 
   @Test
@@ -113,9 +117,10 @@
         + "}}");
 
     PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
-    assertTrue(batch.getHttpPreloads().isEmpty());
-    assertEquals(1, batch.getSocialPreloads().size());
-    assertEquals(expected.toString(), batch.getSocialPreloads().get("key").toString());
+    assertEquals(1, batch.getPreloads().size());
+    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
+    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
+    JsonAssert.assertObjectEquals(expected, batchItem.getData());
     assertNull(batch.getNextBatch(elResolver));
   }
   
@@ -146,9 +151,10 @@
         + "}}");
 
     PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
-    assertTrue(batch.getHttpPreloads().isEmpty());
-    assertEquals(1, batch.getSocialPreloads().size());
-    assertEquals(expected.toString(), batch.getSocialPreloads().get("key").toString());
+    assertEquals(1, batch.getPreloads().size());
+    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
+    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
+    JsonAssert.assertObjectEquals(expected, batchItem.getData());
   }
 
   @Test
@@ -168,9 +174,10 @@
         + "}}");
 
     PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
-    assertTrue(batch.getHttpPreloads().isEmpty());
-    assertEquals(1, batch.getSocialPreloads().size());
-    assertEquals(expected.toString(), batch.getSocialPreloads().get("key").toString());
+    assertEquals(1, batch.getPreloads().size());
+    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
+    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
+    JsonAssert.assertObjectEquals(expected, batchItem.getData());
   }
 
   @Test
@@ -190,9 +197,10 @@
         + "}}");
 
     PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
-    assertTrue(batch.getHttpPreloads().isEmpty());
-    assertEquals(1, batch.getSocialPreloads().size());
-    assertEquals(expected.toString(), batch.getSocialPreloads().get("key").toString());
+    assertEquals(1, batch.getPreloads().size());
+    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
+    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
+    JsonAssert.assertObjectEquals(expected, batchItem.getData());
   }
 
   @Test
@@ -213,9 +221,10 @@
         + "}}");
 
     PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
-    assertTrue(batch.getHttpPreloads().isEmpty());
-    assertEquals(1, batch.getSocialPreloads().size());
-    assertEquals(expected.toString(), batch.getSocialPreloads().get("key").toString());
+    assertEquals(1, batch.getPreloads().size());
+    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
+    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
+    JsonAssert.assertObjectEquals(expected, batchItem.getData());
   }
 
   @Test
@@ -236,9 +245,10 @@
         + "}}");
 
     PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
-    assertTrue(batch.getHttpPreloads().isEmpty());
-    assertEquals(1, batch.getSocialPreloads().size());
-    assertEquals(expected.toString(), batch.getSocialPreloads().get("key").toString());
+    assertEquals(1, batch.getPreloads().size());
+    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
+    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
+    JsonAssert.assertObjectEquals(expected, batchItem.getData());
   }
 
   @Test
@@ -274,22 +284,43 @@
     PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), GADGET_URI);
     
     PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
-    assertTrue(batch.getSocialPreloads().isEmpty());
-    assertTrue(batch.getHttpPreloads().isEmpty());
+
+    assertTrue(batch.getPreloads().isEmpty());
 
     // Now have "userId", the next batch should resolve the people request
     elValues.put("userId", "foo");
     batch = batch.getNextBatch(elResolver);
-    assertEquals(1, batch.getSocialPreloads().size());
-    assertTrue(batch.getHttpPreloads().isEmpty());
+    assertEquals(1, batch.getPreloads().size());
+    assertTrue(batch.getPreloads().containsKey("key"));
 
+    // Now, add "key", the next batch should resolve the HTTP request
     elValues.put("key", "somedata");
     batch = batch.getNextBatch(elResolver);
-    assertTrue(batch.getSocialPreloads().isEmpty());
-    assertEquals(1, batch.getHttpPreloads().size());
+    assertEquals(1, batch.getPreloads().size());
+    assertTrue(batch.getPreloads().containsKey("key2"));
+    
+    // And the final batch should be empty
     assertNull(batch.getNextBatch(elResolver));
   }
 
+  @Test
+  public void testVariable() throws Exception {
+    String xml = "<Content xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\">"
+            + "<osx:Variable xmlns:osx=\"" + PipelinedData.EXTENSION_NAMESPACE + "\" "
+            +       "key=\"key\" value=\"${1+1}\"/>"
+        + "</Content>";
+
+    PipelinedData pipelinedData = new PipelinedData(XmlUtil.parse(xml), GADGET_URI);
+    
+    PipelinedData.Batch batch = pipelinedData.getBatch(expressions, elResolver);
+    assertFalse(pipelinedData.needsViewer());
+    assertFalse(pipelinedData.needsOwner());
+    
+    assertEquals(1, batch.getPreloads().size());
+    BatchItem output = batch.getPreloads().get("key");
+    assertEquals(BatchType.VARIABLE, output.getType());
+    assertEquals(2L, output.getData());
+  }
 
  @Test
   public void httpRequestDefaults() throws Exception {
@@ -303,11 +334,12 @@
     assertFalse(pipelinedData.needsViewer());
     assertFalse(pipelinedData.needsOwner());
     
-    assertEquals(1, batch.getHttpPreloads().size());
-    RequestAuthenticationInfo preload = batch.getHttpPreloads().get("key");
+    assertEquals(1, batch.getPreloads().size());
+    BatchItem output = batch.getPreloads().get("key");
+    assertEquals(BatchType.HTTP, output.getType());
+    RequestAuthenticationInfo preload = (RequestAuthenticationInfo) output.getData();
     assertEquals(AuthType.NONE, preload.getAuthType());
     assertEquals(Uri.parse("http://example.org/example.html"), preload.getHref());    
-    assertTrue(batch.getSocialPreloads().isEmpty());
   }
 
   @Test
@@ -324,11 +356,12 @@
     assertTrue(pipelinedData.needsViewer());
     assertFalse(pipelinedData.needsOwner());
     
-    assertEquals(1, batch.getHttpPreloads().size());
-    RequestAuthenticationInfo preload = batch.getHttpPreloads().get("key");
+    assertEquals(1, batch.getPreloads().size());
+    BatchItem output = batch.getPreloads().get("key");
+    assertEquals(BatchType.HTTP, output.getType());
+    RequestAuthenticationInfo preload = (RequestAuthenticationInfo) output.getData();
     assertEquals(AuthType.SIGNED, preload.getAuthType());
     assertTrue(preload.isSignViewer());
     assertFalse(preload.isSignOwner());
-    assertTrue(batch.getSocialPreloads().isEmpty());
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java Fri Jul 17 18:52:55 2009
@@ -226,8 +226,8 @@
     PipelinedData.Batch batch = view.getPipelinedData().getBatch(
         Expressions.forTesting(), new RootELResolver());
     
-    assertEquals(1, batch.getSocialPreloads().size());
-    assertTrue(batch.getSocialPreloads().containsKey("key"));
+    assertEquals(1, batch.getPreloads().size());
+    assertTrue(batch.getPreloads().containsKey("key"));
   }
 
   @Test(expected = SpecParserException.class)

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessorTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessorTest.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessorTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessorTest.java Fri Jul 17 18:52:55 2009
@@ -31,6 +31,9 @@
 import org.apache.shindig.gadgets.parse.ParseModule;
 import org.apache.shindig.gadgets.parse.nekohtml.SocialMarkupHtmlParser;
 import org.apache.shindig.gadgets.render.SanitizingGadgetRewriter;
+import org.apache.shindig.gadgets.templates.tags.AbstractTagHandler;
+import org.apache.shindig.gadgets.templates.tags.DefaultTagRegistry;
+import org.apache.shindig.gadgets.templates.tags.TagHandler;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.junit.Before;

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/XmlTemplateLibraryTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/XmlTemplateLibraryTest.java?rev=795193&r1=795192&r2=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/XmlTemplateLibraryTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/XmlTemplateLibraryTest.java Fri Jul 17 18:52:55 2009
@@ -25,6 +25,7 @@
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.xml.XmlUtil;
 import org.apache.shindig.expressions.Expressions;
+import org.apache.shindig.gadgets.templates.tags.TagHandler;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.w3c.dom.Element;

Copied: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandlerTest.java (from r793628, incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/AbstractTagHandlerTest.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandlerTest.java?p2=incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandlerTest.java&p1=incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/AbstractTagHandlerTest.java&r1=793628&r2=795193&rev=795193&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/AbstractTagHandlerTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandlerTest.java Fri Jul 17 18:52:55 2009
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.shindig.gadgets.templates;
+package org.apache.shindig.gadgets.templates.tags;
 
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.eq;
@@ -28,6 +28,8 @@
 import static org.junit.Assert.assertNull;
 
 import org.apache.shindig.gadgets.parse.ParseModule;
+import org.apache.shindig.gadgets.templates.TemplateProcessor;
+import org.apache.shindig.gadgets.templates.tags.AbstractTagHandler;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.DOMImplementation;