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 {