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 {
