Author: johnh
Date: Wed Sep 24 16:11:31 2008
New Revision: 698770

URL: http://svn.apache.org/viewvc?rev=698770&view=rev
Log:
Support for rendering gadgets by directly-provided spec XML.

* The code supports both POST and GET.
* This functionality is enabled by BasicGadgetSpecFactory.
* The returned GadgetSpec object is provided with URI http://localhost/raw.xml, 
which prevents it from being rendered on the same locked-domain as any gadget 
that's not hosted remotely (ie only conflicts with localhost/raw.xml).

The rendering flow still emits an error if a (dummy/ignored) url= param isn't 
provided, but that's easy to work around.


Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/BasicGadgetSpecFactoryTest.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java?rev=698770&r1=698769&r2=698770&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java
 Wed Sep 24 16:11:31 2008
@@ -32,6 +32,7 @@
 import com.google.inject.name.Named;
 
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
@@ -43,6 +44,9 @@
  */
 @Singleton
 public class BasicGadgetSpecFactory implements GadgetSpecFactory {
+  public static final String RAW_GADGETSPEC_XML_PARAM_NAME = "rawxml";
+  public static final URI RAW_GADGET_URI = getRawGadgetUri();
+  
   static final Logger logger = 
Logger.getLogger(BasicGadgetSpecFactory.class.getName());
 
   private final HttpFetcher fetcher;
@@ -50,6 +54,13 @@
   private final TtlCache<URI, GadgetSpec> ttlCache;
 
   public GadgetSpec getGadgetSpec(GadgetContext context) throws 
GadgetException {
+    String rawxml = context.getParameter(RAW_GADGETSPEC_XML_PARAM_NAME);
+    if (rawxml != null) {
+      // Set URI to a fixed, safe value (localhost), preventing a gadget 
rendered
+      // via raw XML (eg. via POST) to be rendered on a locked domain of any 
other
+      // gadget whose spec is hosted non-locally.
+      return new GadgetSpec(RAW_GADGET_URI, rawxml);
+    }
     return getGadgetSpec(context.getUrl(), context.getIgnoreCache());
   }
   
@@ -130,6 +141,15 @@
     
     return spec;
   }
+  
+  private static URI getRawGadgetUri() {
+    try {
+      return new URI("http", "localhost", "/raw.xml", null);
+    } catch (URISyntaxException e) {
+      // Never happens
+    }
+    return null;
+  }
 
   @Inject
   public BasicGadgetSpecFactory(HttpFetcher fetcher,

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java?rev=698770&r1=698769&r2=698770&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java
 Wed Sep 24 16:11:31 2008
@@ -52,4 +52,10 @@
     }
     renderProvider.get().process(req, resp);
   }
+  
+  @Override
+  protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
+      throws IOException {
+    renderProvider.get().process(req, resp);
+  }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/BasicGadgetSpecFactoryTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/BasicGadgetSpecFactoryTest.java?rev=698770&r1=698769&r2=698770&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/BasicGadgetSpecFactoryTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/BasicGadgetSpecFactoryTest.java
 Wed Sep 24 16:11:31 2008
@@ -46,6 +46,7 @@
   private final static String LOCAL_CONTENT = "Hello, local content!";
   private final static String ALT_LOCAL_CONTENT = "Hello, local content!";
   private final static String REMOTE_CONTENT = "Hello, remote content!";
+  private final static String RAWXML_CONTENT = "Hello, rawxml content!";
   private final static String LOCAL_SPEC_XML
   = "<Module>" +
   "  <ModulePrefs title='GadgetSpecFactoryTest'/>" +
@@ -61,6 +62,11 @@
   "  <ModulePrefs title='GadgetSpecFactoryTest'/>" +
   "  <Content type='html' href='" + REMOTE_URL + "'/>" +
   "</Module>";
+  private final static String RAWXML_SPEC_XML
+  = "<Module>" +
+  "  <ModulePrefs title='GadgetSpecFactoryTest'/>" +
+  "  <Content type='html'>" + RAWXML_CONTENT + "</Content>" +
+  "</Module>";
   private final static String URL_SPEC_XML
   = "<Module>" +
   "  <ModulePrefs title='GadgetSpecFactoryTest'/>" +
@@ -77,6 +83,27 @@
       return SPEC_URL.toJavaUri();
     }
   };
+  
+  private final static GadgetContext RAWXML_GADGET_CONTEXT = new 
GadgetContext() {
+    @Override
+    public boolean getIgnoreCache() {
+      // This should be ignored by calling code.
+      return false;
+    }
+    
+    @Override
+    public URI getUrl() {
+      return SPEC_URL.toJavaUri();
+    }
+    
+    @Override
+    public String getParameter(String param) {
+      if (param.equals(BasicGadgetSpecFactory.RAW_GADGETSPEC_XML_PARAM_NAME)) {
+        return RAWXML_SPEC_XML;
+      }
+      return null;
+    }
+  };
   private final static ExecutorService FAKE_EXECUTOR = new 
TestExecutorService();
 
   private final HttpFetcher fetcher = 
EasyMock.createNiceMock(HttpFetcher.class);
@@ -109,6 +136,21 @@
 
     assertEquals(LOCAL_CONTENT, 
spec.getView(GadgetSpec.DEFAULT_VIEW).getContent());
   }
+  
+  @Test
+  public void specFetchedFromParam() throws Exception {
+    // Set up request as if it's a regular spec request, and ensure that
+    // the return value comes from rawxml, not the fetcher.
+    HttpRequest request = new HttpRequest(SPEC_URL).setIgnoreCache(false);
+    HttpResponse response = new HttpResponse(LOCAL_SPEC_XML);
+    expect(fetcher.fetch(request)).andReturn(response);
+    replay(fetcher);
+    
+    GadgetSpec spec = specFactory.getGadgetSpec(RAWXML_GADGET_CONTEXT);
+    
+    assertEquals(RAWXML_CONTENT, 
spec.getView(GadgetSpec.DEFAULT_VIEW).getContent());
+    assertEquals(BasicGadgetSpecFactory.RAW_GADGET_URI, spec.getUrl());
+  }
 
   @Test
   public void staleSpecIsRefetched() throws Exception {


Reply via email to