Author: johnh
Date: Sun Jan 31 05:10:45 2010
New Revision: 904981

URL: http://svn.apache.org/viewvc?rev=904981&view=rev
Log:
Try #2, adding missing files this time around.

Take advantage of gadget rewritter and apply it on arbitrary html page.

This done using new servlet (gadgets/accel?url=...).
Which for now fage a gadget spec with content from the specified url.

This is just the first step in making this servlet usable.

Ziv Horesh provided the patch.


Added:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/GadgetRewritersProvider.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java
Modified:
    incubator/shindig/trunk/features/src/main/javascript/features/features.txt
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactory.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java
    incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml
    incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml
    
incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/JettyLauncher.java

Modified: 
incubator/shindig/trunk/features/src/main/javascript/features/features.txt
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/features.txt?rev=904981&r1=904980&r2=904981&view=diff
==============================================================================
--- incubator/shindig/trunk/features/src/main/javascript/features/features.txt 
(original)
+++ incubator/shindig/trunk/features/src/main/javascript/features/features.txt 
Sun Jan 31 05:10:45 2010
@@ -28,6 +28,7 @@
 features/core.json/feature.xml
 features/core.legacy/feature.xml
 features/core.log/feature.xml
+features/core.none/feature.xml
 features/core.prefs/feature.xml
 features/core.util/feature.xml
 features/core/feature.xml

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactory.java?rev=904981&r1=904980&r2=904981&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactory.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactory.java
 Sun Jan 31 05:10:45 2010
@@ -24,6 +24,7 @@
 import org.apache.shindig.common.xml.XmlException;
 import org.apache.shindig.common.xml.XmlUtil;
 import org.apache.shindig.gadgets.http.RequestPipeline;
+import org.apache.shindig.gadgets.servlet.HtmlAccelServlet;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.SpecParserException;
 
@@ -42,7 +43,7 @@
 public class DefaultGadgetSpecFactory extends AbstractSpecFactory<GadgetSpec>
     implements GadgetSpecFactory {
   public static final String CACHE_NAME = "gadgetSpecs";
-  static final String RAW_GADGETSPEC_XML_PARAM_NAME = "rawxml";
+  public static final String RAW_GADGETSPEC_XML_PARAM_NAME = "rawxml";
   static final Uri RAW_GADGET_URI = Uri.parse("http://localhost/raw.xml";);
 
   @Inject
@@ -63,8 +64,14 @@
       // 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.
-      try {
-        return new GadgetSpec(RAW_GADGET_URI, XmlUtil.parse(rawxml), rawxml);
+      try 
+      {
+        Uri uri = RAW_GADGET_URI;
+        // For accelerate page, pass in page url instead of fake one:
+        if (HtmlAccelServlet.isAccel(context)) {
+          uri = context.getUrl();
+        }
+        return new GadgetSpec(uri, XmlUtil.parse(rawxml), rawxml);
       } catch (XmlException e) {
         throw new SpecParserException(e);
       }

Added: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/GadgetRewritersProvider.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/GadgetRewritersProvider.java?rev=904981&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/GadgetRewritersProvider.java
 (added)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/GadgetRewritersProvider.java
 Sun Jan 31 05:10:45 2010
@@ -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.render;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
+import org.apache.shindig.gadgets.servlet.HtmlAccelServlet;
+
+import java.util.List;
+
+/**
+ * Class to provide list of rewriters according to gadget request.
+ * Provide different list of rewriters fro html accelerate request
+ *
+ */
+public class GadgetRewritersProvider {
+
+  private final List<GadgetRewriter> renderRewriters;
+  private final List<GadgetRewriter> accelRewriters;
+  
+  @Inject
+  public GadgetRewritersProvider(
+      @Named("shindig.rewriters.gadget") List<GadgetRewriter> renderRewriters,
+      @Named("shindig.rewriters.accelerate") List<GadgetRewriter> 
accelRewriters) {
+    this.renderRewriters = renderRewriters;
+    this.accelRewriters = accelRewriters;
+  }
+
+  public List<GadgetRewriter> getRewriters(GadgetContext context) {
+    if (HtmlAccelServlet.isAccel(context)) {
+      return accelRewriters;
+    }
+    return renderRewriters;
+  }
+  
+}

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java?rev=904981&r1=904980&r2=904981&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
 Sun Jan 31 05:10:45 2010
@@ -43,17 +43,17 @@
   public static final String PATH_PARAM = "path";
   private final PreloaderService preloader;
   private final ProxyRenderer proxyRenderer;
-  private final List<GadgetRewriter> gadgetRewriters;
+  private final GadgetRewritersProvider gadgetRewritersProvider;
   private final GadgetHtmlParser htmlParser;
 
   @Inject
   public HtmlRenderer(PreloaderService preloader,
                       ProxyRenderer proxyRenderer,
-                      List<GadgetRewriter> gadgetRewriters,
+                      GadgetRewritersProvider gadgetRewritersProvider,
                       GadgetHtmlParser htmlParser) {
     this.preloader = preloader;
     this.proxyRenderer = proxyRenderer;
-    this.gadgetRewriters = gadgetRewriters;
+    this.gadgetRewritersProvider = gadgetRewritersProvider;
     this.htmlParser = htmlParser;
   }
 
@@ -87,7 +87,8 @@
       }
 
       MutableContent mc = new MutableContent(htmlParser, content);
-      for (GadgetRewriter rewriter : gadgetRewriters) {
+      for (GadgetRewriter rewriter : 
+          gadgetRewritersProvider.getRewriters(gadget.getContext())) {
         rewriter.rewrite(gadget, mc);
       }
       

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java?rev=904981&r1=904980&r2=904981&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
 Sun Jan 31 05:10:45 2010
@@ -31,6 +31,7 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
 
 /**
  * Guice bindings for the rewrite package.
@@ -39,11 +40,16 @@
 
   @Override
   protected void configure() {
-    bind(new 
TypeLiteral<List<GadgetRewriter>>(){}).toProvider(GadgetRewritersProvider.class);
+    bind(new TypeLiteral<List<GadgetRewriter>>(){})
+        .annotatedWith(Names.named("shindig.rewriters.gadget"))
+        .toProvider(GadgetRewritersProvider.class);
+    bind(new TypeLiteral<List<GadgetRewriter>>(){})
+        .annotatedWith(Names.named("shindig.rewriters.accelerate"))
+        .toProvider(AccelRewritersProvider.class);
     bind(new 
TypeLiteral<List<RequestRewriter>>(){}).toProvider(RequestRewritersProvider.class);
   }
 
-  private static class GadgetRewritersProvider implements 
Provider<List<GadgetRewriter>> {
+  public static class GadgetRewritersProvider implements 
Provider<List<GadgetRewriter>> {
     private final List<GadgetRewriter> rewriters;
 
     @Inject
@@ -70,7 +76,24 @@
     }
   }
 
-  private static class RequestRewritersProvider implements 
Provider<List<RequestRewriter>> {
+  public static class AccelRewritersProvider implements 
Provider<List<GadgetRewriter>> {
+    private final List<GadgetRewriter> rewriters;
+
+    @Inject
+    public AccelRewritersProvider(
+        HTMLContentRewriter optimizingRewriter,
+        CajaContentRewriter cajaRewriter) {
+      rewriters = Lists.newArrayList();
+      rewriters.add(optimizingRewriter);
+      rewriters.add(cajaRewriter);
+    }
+
+    public List<GadgetRewriter> get() {
+      return rewriters;
+    }
+  }
+
+  public static class RequestRewritersProvider implements 
Provider<List<RequestRewriter>> {
     private final List<RequestRewriter> rewriters;
 
     @Inject

Added: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java?rev=904981&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java
 (added)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java
 Sun Jan 31 05:10:45 2010
@@ -0,0 +1,203 @@
+/*
+ * 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.servlet;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.shindig.gadgets.DefaultGadgetSpecFactory;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.GadgetException.Code;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.RequestPipeline;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Html pages acceleration servlet.
+ * It uses the rewriter pipeline to improve speed of loading html.
+ * Internally it create a fake gadget spec and uses the Gadget rendering 
servlet.
+ * Only html content is being rewritten, other content is passed as is.
+ * (It uses the rawxml tag to pass spec, so require DefaultGadgetSpecFactory)
+ */
+public class HtmlAccelServlet extends GadgetRenderingServlet {
+
+  public static final String URL_PARAM_NAME = "url";
+  /**
+   * Use ACCEL_GADGET parameter to check for AccelServlet during rendering.
+   */
+  public static final String ACCEL_GADGET_PARAM_NAME = "accelGadget";
+  /** 
+   * Use the next value with '==' operation when checking for ACCEL_GADGET,
+   * That will prevent spoofing it using url params.
+   */
+  public static final String ACCEL_GADGET_PARAM_VALUE = "true";
+  public static final String CONTENT_TYPE = "Content-Type";
+  public static final String HTML_CONTENT = "text/html";
+  public static final String CONTENT_ENCODING = "Content-Encoding";
+  public static final String CONTENT_LENGTH = "Content-Length";
+
+  /** Fake spec to wrap the html data */
+  private static final String FAKE_SPEC_TPL = 
+      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+      + "<Module>\n"
+      + "  <ModulePrefs title=\"Apache Shindig Accelerator\"\n"
+      + "               author=\"Apache Shindig\"\n"
+      + "               author_email=\"[email protected]\">\n"
+      + "    <Require feature=\"core.none\"/>\n"
+      + "    <Optional feature=\"content-rewrite\">\n"
+      + "      <Param name=\"include-urls\">.*</Param>\n"
+      + "    </Optional>\n"
+      + "  </ModulePrefs>\n"
+      + "  <Content type=\"html\">\n"
+      + "    <![CDATA[%s]]>\n" 
+      + "  </Content>\n"
+      + "</Module>\n";
+
+  private RequestPipeline requestPipeline;
+  private Map<String, String> addedServletParams = null;
+  
+  @Inject
+  public void setRequestPipeline(RequestPipeline pipeline) {
+    this.requestPipeline = pipeline;
+  }
+  
+  @Inject(optional = true)
+  public void setAddedServletParams(
+      @Named("shindig.accelerate.added-params") Map<String, String> params) {
+    this.addedServletParams = params;
+  }
+  
+  public static boolean isAccel(GadgetContext context) {
+    return context.getParameter(HtmlAccelServlet.ACCEL_GADGET_PARAM_NAME) ==
+      HtmlAccelServlet.ACCEL_GADGET_PARAM_VALUE;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+      throws IOException {
+
+    // Get data to accelerate:
+    HttpResponse data;
+    HttpGadgetContext context = new HttpGadgetContext(req);
+    try {
+      data = fetch(context);
+    } catch (GadgetException e) {
+      resp.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
+      return;
+    }
+    
+    // No such page:
+    if (data == null) {
+      resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Error fetching 
data");
+      return;
+    }
+    
+    // If not html, just return data
+    if (!isHtmlContent(data)) {
+      respondVerbatim(data, resp);
+      return;
+    }
+    
+    // For html, use the gadgetServlet for rewrite
+    String content = data.getResponseAsString();
+
+    // Create fake spec wrapper for the html:
+    // (Note that the content can be big so don't use the limited 
String.Format)
+    final String spec = createFakeSpec(content);
+    
+    // wrap the request with the added params
+    HttpServletRequestWrapper reqWrapper = new HttpServletRequestWrapper(req) {
+      @Override
+      public String getParameter(String name) {
+        // Mark this as an accelerate page spec
+        // (The code that check for that field have to use the defined 
constant,
+        //  hence the use of == )
+        if (name == ACCEL_GADGET_PARAM_NAME) {
+          return ACCEL_GADGET_PARAM_VALUE;
+        }
+        // Pass the spec using rawxml (require DefaultGadgetSpecFactory):
+        if (name == DefaultGadgetSpecFactory.RAW_GADGETSPEC_XML_PARAM_NAME) {
+          return spec;
+        }
+        // Allow overriding extra params (i.e. container)
+        if (addedServletParams != null && 
addedServletParams.containsKey(name)) {
+          return addedServletParams.get(name);
+        }
+        return super.getParameter(name);
+      }
+    };
+    
+    // Call the gadget renderer to rewrite content:
+    super.doGet(reqWrapper,resp);
+  }
+
+  @Override
+  protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws IOException {
+    doGet(req,resp);
+  }
+  
+  protected boolean isHtmlContent(HttpResponse data) {
+    return data.getHeader(CONTENT_TYPE) != null &&
+           data.getHeader(CONTENT_TYPE).contains(HTML_CONTENT);
+  }
+
+  private HttpResponse fetch(HttpGadgetContext context) throws GadgetException 
{
+
+    if (context.getUrl() == null) {
+      throw new GadgetException(Code.INVALID_PARAMETER, "Missing url 
paramater");
+    }
+
+    HttpRequest request = new HttpRequest(context.getUrl())
+        .setIgnoreCache(context.getIgnoreCache())
+        .setContainer(context.getContainer());
+
+    HttpResponse results = requestPipeline.execute(request);
+    return results;
+  }
+  
+  private void respondVerbatim(HttpResponse results, HttpServletResponse 
response) 
+      throws IOException {
+    
+    for (Map.Entry<String, String> entry : results.getHeaders().entries()) {
+      // Encoding such as gzip was already stripped from data
+      if (!CONTENT_ENCODING.equals(entry.getKey()) &&
+          !CONTENT_LENGTH.equals(entry.getKey())) {
+        response.setHeader(entry.getKey(), entry.getValue());
+      }
+    }
+    response.setStatus(results.getHttpStatusCode());
+    IOUtils.copy(results.getResponse(), response.getOutputStream());
+  }
+
+  private String createFakeSpec(String content) {
+    // need to rescape CDATA: ( each "]]>" and "<![CDATA[" should be 
"]]><![CDATA[")
+    // TODO: just xml escape this and remove the CDATA section
+    String data = content.replace("]]>", "<![CDATA[")
+      .replace("<![CDATA[", "]]><![CDATA[");
+    return String.format(FAKE_SPEC_TPL, data);   
+  }
+}

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java?rev=904981&r1=904980&r2=904981&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java
 Sun Jan 31 05:10:45 2010
@@ -32,6 +32,7 @@
 import org.apache.shindig.gadgets.preload.PreloaderService;
 import org.apache.shindig.gadgets.rewrite.CaptureRewriter;
 import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
+import org.apache.shindig.gadgets.servlet.HtmlAccelServlet;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.View;
 import org.junit.Before;
@@ -58,9 +59,20 @@
     }
   };
 
+  private static final GadgetContext ACCEL_CONTEXT = new GadgetContext() {
+    @Override
+    public String getParameter(String name) {
+      if (name == HtmlAccelServlet.ACCEL_GADGET_PARAM_NAME) {
+        return HtmlAccelServlet.ACCEL_GADGET_PARAM_VALUE;
+      }
+      return super.getParameter(name);
+    }
+  };
+
   private final FakePreloaderService preloaderService = new 
FakePreloaderService();
   private final FakeProxyRenderer proxyRenderer = new FakeProxyRenderer();
   private final CaptureRewriter captureRewriter = new CaptureRewriter();
+  private final CaptureRewriter accelRewriter = new CaptureRewriter();
   private HtmlRenderer renderer;
 
   private Gadget makeGadget(String content) throws GadgetException {
@@ -84,7 +96,9 @@
   @Before
   public void setUp() throws Exception {
     renderer = new HtmlRenderer(preloaderService, proxyRenderer,
-        ImmutableList.of((GadgetRewriter) captureRewriter), null);
+        new GadgetRewritersProvider(ImmutableList.of((GadgetRewriter) 
captureRewriter),
+            ImmutableList.of((GadgetRewriter) accelRewriter)),
+        null);
     
   }
   
@@ -112,6 +126,13 @@
     assertTrue("Rewriting not performed.", captureRewriter.viewWasRewritten());
   }
 
+  @Test
+  public void doAccelRewriting() throws Exception {
+    renderer.render(makeGadget(BASIC_HTML_CONTENT).setContext(ACCEL_CONTEXT));
+    assertTrue("Rewriting should not be not performed.", 
!captureRewriter.viewWasRewritten());
+    assertTrue("Rewriting not performed.", accelRewriter.viewWasRewritten());
+  }
+
   private static class FakeProxyRenderer extends ProxyRenderer {
     public FakeProxyRenderer() {
       super(null, null, null);
@@ -140,4 +161,5 @@
       return preloads;
     }
   }
+  
 }

Added: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java?rev=904981&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java
 (added)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/HtmlAccelServletTest.java
 Sun Jan 31 05:10:45 2010
@@ -0,0 +1,177 @@
+/*
+ * 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.servlet;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+
+import com.google.caja.util.Maps;
+
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.UrlGenerator;
+import org.apache.shindig.gadgets.UrlValidationStatus;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
+import org.apache.shindig.gadgets.render.Renderer;
+import org.apache.shindig.gadgets.render.RenderingResults;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Map;
+
+public class HtmlAccelServletTest extends ServletTestFixture {
+
+  private static final String REWRITE_CONTENT = "working rewrite";
+  
+  private HtmlAccelServlet servlet;
+  private Renderer renderer;
+
+  @Before
+  public void setUp() throws Exception {
+    servlet = new HtmlAccelServlet();
+    servlet.setRequestPipeline(pipeline);
+    servlet.setUrlGenerator(new FakeUrlGenerator());
+    renderer = mock(Renderer.class);
+    servlet.setRenderer(renderer);
+  }
+
+  @Test
+  public void testHtmlAccelNoData() throws Exception {
+    String url = "http://example.org/data.html";;
+    
+    HttpRequest req = new HttpRequest(Uri.parse(url));
+    expect(pipeline.execute(req)).andReturn(null).once();
+    expect(request.getParameter("url")).andReturn(url).once();
+    replay();
+    
+    servlet.doGet(request, recorder);
+    verify();
+    assertEquals("Error fetching data", recorder.getResponseAsString());
+    assertEquals(400, recorder.getHttpStatusCode());
+  }
+
+  @Test
+  public void testHtmlAccelNoHtml() throws Exception {
+    String url = "http://example.org/data.xml";;
+    String data = "<html><body>Hello World</body></html>";
+    
+    HttpRequest req = new HttpRequest(Uri.parse(url));
+    HttpResponse resp = new HttpResponseBuilder()
+        .setResponse(data.getBytes())
+        .setHeader("Content-Type", "text/xml")
+        .setHttpStatusCode(200)
+        .create();
+    expect(pipeline.execute(req)).andReturn(resp).once();
+    expect(request.getParameter("url")).andReturn(url).once();
+    replay();
+    
+    servlet.doGet(request, recorder);
+    verify();
+    assertEquals(data, recorder.getResponseAsString());
+  }
+
+  @Test
+  public void testHtmlAccelRewriteSimple() throws Exception {
+    String url = "http://example.org/data.html";;
+    String data = "<html><body>Hello World</body></html>";
+    
+    HttpRequest req = new HttpRequest(Uri.parse(url));
+    HttpResponse resp = new HttpResponseBuilder()
+        .setResponse(data.getBytes())
+        .setHeader("Content-Type", "text/html")
+        .setHttpStatusCode(200)
+        .create();
+    expect(pipeline.execute(req)).andReturn(resp).once();
+    expect(request.getParameter("url")).andReturn(url).once();
+    expect(request.getRequestURL()).andReturn(new 
StringBuffer("gmodules.com/gadgets/accel"))
+        .once();
+    expect(request.getQueryString()).andReturn("url=" + url).once();
+    expect(renderer.render(isA(GadgetContext.class)))
+        .andReturn(RenderingResults.ok(REWRITE_CONTENT));
+    replay();
+    
+    servlet.doGet(request, recorder);
+    verify();
+    assertEquals(REWRITE_CONTENT, recorder.getResponseAsString());
+    assertEquals(200, recorder.getHttpStatusCode());
+  }
+
+  @Test
+  public void testHtmlAccelParams() throws Exception {
+
+    Renderer newRenderer = new Renderer(null, null, null, lockedDomainService) 
{
+      @Override
+      public RenderingResults render(GadgetContext context) {
+        assertTrue(HtmlAccelServlet.isAccel(context));
+        assertEquals("accel", context.getParameter("container"));
+        return RenderingResults.ok(REWRITE_CONTENT);
+      }
+    };
+    servlet.setRenderer(newRenderer);
+    Map<String,String> paramMap = Maps.newHashMap();
+    paramMap.put("container","accel");
+    servlet.setAddedServletParams(paramMap);
+    
+    String url = "http://example.org/data.html";;
+    
+    HttpRequest req = new HttpRequest(Uri.parse(url));
+    HttpResponse resp = new HttpResponseBuilder()
+        .setHeader("Content-Type", "text/html")
+        .setHttpStatusCode(200)
+        .create();
+    expect(pipeline.execute(req)).andReturn(resp).once();
+    expect(request.getParameter("url")).andReturn(url).once();
+    expect(request.getRequestURL()).andReturn(new 
StringBuffer("gmodules.com/gadgets/accel"))
+        .once();
+    expect(request.getQueryString()).andReturn("url=" + url).once();
+    replay();
+   
+    servlet.doGet(request, recorder);
+    verify();
+  }
+  
+  private static class FakeUrlGenerator implements UrlGenerator {
+
+    public UrlValidationStatus validateJsUrl(String url) {
+      throw new UnsupportedOperationException();
+    }
+
+    public String getIframeUrl(Gadget gadget) {
+      throw new UnsupportedOperationException();
+    }
+
+    public UrlValidationStatus validateIframeUrl(String url) {
+      return UrlValidationStatus.VALID_UNVERSIONED;
+    }
+
+    public String getBundledJsUrl(Collection<String> features, GadgetContext 
context) {
+      throw new UnsupportedOperationException();
+    }
+
+    public String getGadgetDomainOAuthCallback(String container, String 
gadgetHost) {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+
+}

Modified: 
incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml?rev=904981&r1=904980&r2=904981&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml 
(original)
+++ incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml 
Sun Jan 31 05:10:45 2010
@@ -78,6 +78,14 @@
     </servlet-class>
   </servlet>
 
+  <!-- Accelerate a page -->
+  <servlet>
+    <servlet-name>accel</servlet-name>
+    <servlet-class>
+      org.apache.shindig.gadgets.servlet.HtmlAccelServlet
+    </servlet-class>
+  </servlet>
+
   <!-- Proxy -->
   <servlet>
     <servlet-name>proxy</servlet-name>
@@ -212,6 +220,11 @@
   </servlet-mapping>
 
   <servlet-mapping>
+    <servlet-name>accel</servlet-name>
+    <url-pattern>/gadgets/accel</url-pattern>
+  </servlet-mapping>
+
+  <servlet-mapping>
     <servlet-name>metadata</servlet-name>
     <url-pattern>/gadgets/metadata</url-pattern>
   </servlet-mapping>

Modified: incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml?rev=904981&r1=904980&r2=904981&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml 
(original)
+++ incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml Sun Jan 
31 05:10:45 2010
@@ -122,6 +122,13 @@
     </servlet-class>
   </servlet>
 
+  <servlet>
+    <servlet-name>accel</servlet-name>
+    <servlet-class>
+      org.apache.shindig.gadgets.servlet.HtmlAccelServlet
+    </servlet-class>
+  </servlet>
+
   <!-- Proxy -->
   <servlet>
     <servlet-name>proxy</servlet-name>
@@ -264,6 +271,11 @@
   </servlet-mapping>
 
   <servlet-mapping>
+    <servlet-name>accel</servlet-name>
+    <url-pattern>/gadgets/accel</url-pattern>
+  </servlet-mapping>
+
+  <servlet-mapping>
     <servlet-name>metadata</servlet-name>
     <url-pattern>/gadgets/metadata</url-pattern>
   </servlet-mapping>

Modified: 
incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/JettyLauncher.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/JettyLauncher.java?rev=904981&r1=904980&r2=904981&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/JettyLauncher.java
 (original)
+++ 
incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/JettyLauncher.java
 Sun Jan 31 05:10:45 2010
@@ -17,13 +17,16 @@
  */
 package org.apache.shindig.server;
 
+import org.apache.commons.collections.map.HashedMap;
 import org.apache.shindig.auth.AuthenticationServletFilter;
 import org.apache.shindig.common.PropertiesModule;
 import org.apache.shindig.common.servlet.GuiceServletContextListener;
+import org.apache.shindig.gadgets.DefaultGadgetSpecFactory;
 import org.apache.shindig.gadgets.DefaultGuiceModule;
 import org.apache.shindig.gadgets.oauth.OAuthModule;
 import org.apache.shindig.gadgets.servlet.ConcatProxyServlet;
 import org.apache.shindig.gadgets.servlet.GadgetRenderingServlet;
+import org.apache.shindig.gadgets.servlet.HtmlAccelServlet;
 import org.apache.shindig.gadgets.servlet.JsServlet;
 import org.apache.shindig.gadgets.servlet.MakeRequestServlet;
 import org.apache.shindig.gadgets.servlet.ProxyServlet;
@@ -38,6 +41,7 @@
 import org.mortbay.resource.Resource;
 
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.Map;
 
 import com.google.common.base.Joiner;
@@ -49,6 +53,7 @@
 public class JettyLauncher {
 
   private static final String GADGET_BASE = "/gadgets/ifr";
+  private static final String ACCEL_BASE = "/gadgets/accel";
   private static final String PROXY_BASE = "/gadgets/proxy";
   private static final String MAKEREQUEST_BASE = "/gadgets/makeRequest";
   private static final String GADGETS_RPC_BASE = "/gadgets/api/rpc/*";
@@ -104,6 +109,11 @@
     context.addServlet(gadgetServletHolder, GADGET_BASE);
     context.addFilter(AuthenticationServletFilter.class, GADGET_BASE, 0);
 
+    // Attach the html acceleration rendering servlet
+    ServletHolder accelServletHolder = new ServletHolder(new 
HtmlAccelServlet());
+    context.addServlet(accelServletHolder, ACCEL_BASE);
+    context.addFilter(AuthenticationServletFilter.class, ACCEL_BASE, 0);
+
     // Attach the make-request servlet
     ServletHolder makeRequestHolder = new ServletHolder(new 
MakeRequestServlet());
     context.addServlet(makeRequestHolder, MAKEREQUEST_BASE);


Reply via email to