Author: awiner
Date: Thu Jun  4 21:47:09 2009
New Revision: 781858

URL: http://svn.apache.org/viewvc?rev=781858&view=rev
Log:
SHINDIG-1079: os:DataRequest not working in "text/os-data" script blocks
- Switch PipelinedData from using Attribute.getLocalName() to 
Attribute.getNodeName() (equivalent for unnamespaced attributes, as we have 
here), to work around a NekoHTML bug
- Refactor PipelineDataGadgetRewriter to make it easier to test the fix

Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriter.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriterTest.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriter.java?rev=781858&r1=781857&r2=781858&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriter.java
 Thu Jun  4 21:47:09 2009
@@ -62,28 +62,7 @@
     }
     
     Document doc = content.getDocument();
-    NodeIterator nodeIterator = ((DocumentTraversal) doc)
-        .createNodeIterator(doc, NodeFilter.SHOW_ELEMENT,
-            new NodeFilter() {
-              public short acceptNode(Node n) {
-                if ("script".equalsIgnoreCase(n.getNodeName()) &&
-                    "text/os-data".equals(((Element) n).getAttribute("type"))) 
{
-                  return NodeFilter.FILTER_ACCEPT;
-                }
-                return NodeFilter.FILTER_REJECT;
-              }
-            }, false);
-    
-    Map<PipelinedData, Node> pipelineNodes = Maps.newHashMap();
-    for (Node n = nodeIterator.nextNode(); n != null ; n = 
nodeIterator.nextNode()) {
-      try {
-        PipelinedData pipelineData = new PipelinedData((Element) n, 
gadget.getSpec().getUrl());
-        pipelineNodes.put(pipelineData, n);
-      } catch (SpecParserException e) {
-        // Leave the element to the client
-        logger.log(Level.INFO, "Failed to parse preload in " + 
gadget.getSpec().getUrl(), e);
-      }
-    }
+    Map<PipelinedData, Node> pipelineNodes = parsePipelinedData(gadget, doc);
     
     if (pipelineNodes.isEmpty()) {
       return;
@@ -131,10 +110,38 @@
       gadget.removeFeature("opensocial-data");
     }
   }
+
+  /**
+   * Parses pipelined data out of a Document.
+   */
+  Map<PipelinedData, Node> parsePipelinedData(Gadget gadget, Document doc) {
+    NodeIterator nodeIterator = ((DocumentTraversal) doc)
+        .createNodeIterator(doc, NodeFilter.SHOW_ELEMENT,
+            new NodeFilter() {
+              public short acceptNode(Node n) {
+                if ("script".equalsIgnoreCase(n.getNodeName()) &&
+                    "text/os-data".equals(((Element) n).getAttribute("type"))) 
{
+                  return NodeFilter.FILTER_ACCEPT;
+                }
+                return NodeFilter.FILTER_REJECT;
+              }
+            }, false);
+    
+    Map<PipelinedData, Node> pipelineNodes = Maps.newHashMap();
+    for (Node n = nodeIterator.nextNode(); n != null ; n = 
nodeIterator.nextNode()) {
+      try {
+        PipelinedData pipelineData = new PipelinedData((Element) n, 
gadget.getSpec().getUrl());
+        pipelineNodes.put(pipelineData, n);
+      } catch (SpecParserException e) {
+        // Leave the element to the client
+        logger.log(Level.INFO, "Failed to parse preload in " + 
gadget.getSpec().getUrl(), e);
+      }
+    }
+    return pipelineNodes;
+  }
   
   static class PipelineState {
     public Node node;
-    public PipelinedData.Batch batch;
-    
+    public PipelinedData.Batch batch; 
   }
 }

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=781858&r1=781857&r2=781858&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
 Thu Jun  4 21:47:09 2009
@@ -362,7 +362,9 @@
         continue;
       }
 
-      String name = attrNode.getLocalName();
+      // Use getNodeName() instead of getLocalName().  NekoHTML has an 
incorrect
+      // implementation of node name that returns null.
+      String name = attrNode.getNodeName();
       // Skip the built-in names
       if ("method".equals(name) || "key".equals(name)) {
         continue;

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=781858&r1=781857&r2=781858&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
 Thu Jun  4 21:47:09 2009
@@ -27,8 +27,10 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import org.apache.shindig.common.JsonAssert;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.expressions.Expressions;
+import org.apache.shindig.expressions.RootELResolver;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.parse.ParseModule;
@@ -52,6 +54,7 @@
 import org.junit.Test;
 
 import java.util.Collection;
+import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 
@@ -223,6 +226,27 @@
     control.verify();
   }
 
+  @Test
+  /** Test that os:DataRequest is parsed correctly */
+  public void parseOfDataRequest() throws Exception {
+    final String contentWithDataRequest =
+      "<script xmlns:os=\"http://ns.opensocial.org/2008/markup\"; 
type=\"text/os-data\">"
+        + "  <os:DataRequest key=\"me\" method=\"people.get\" 
userId=\"canonical\"/>"
+        + "</script>";
+
+    setupGadget(getGadgetXml(contentWithDataRequest));
+    Map<PipelinedData, ? extends Object> pipelines =
+        rewriter.parsePipelinedData(gadget, content.getDocument());
+    assertEquals(1, pipelines.size());
+    PipelinedData pipeline = pipelines.keySet().iterator().next();
+    PipelinedData.Batch batch = pipeline.getBatch(new Expressions(), new 
RootELResolver());
+    Map<String, Object> preloads = batch.getSocialPreloads();
+    
+    JsonAssert.assertObjectEquals(
+        "{me: {params: {userId: 'canonical'}, method: 'people.get', id: 
'me'}}",
+        preloads);
+  }
+
   /** Create a mock Callable for a single preload task */
   private Callable<PreloadedData> createPreloadTask(final String key, String 
jsonResult)
       throws JSONException {


Reply via email to