Author: lryan
Date: Mon Nov 17 17:07:40 2008
New Revision: 718457

URL: http://svn.apache.org/viewvc?rev=718457&view=rev
Log:
Prevent character decoding of HttpResponses for non-rewriteable content. This 
is a moderate performance improvement
Clarify interface of ContentRewriter. 

Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/MutableContentTest.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
 Mon Nov 17 17:07:40 2008
@@ -19,13 +19,13 @@
 package org.apache.shindig.gadgets;
 
 import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.parse.ParseModule;
 import org.apache.shindig.gadgets.preload.HttpPreloader;
 import org.apache.shindig.gadgets.preload.Preloader;
 import org.apache.shindig.gadgets.render.RenderingContentRewriter;
 import org.apache.shindig.gadgets.rewrite.ContentRewriter;
 import org.apache.shindig.gadgets.rewrite.lexer.DefaultContentRewriter;
 import org.apache.shindig.gadgets.servlet.CajaContentRewriter;
-import org.apache.shindig.gadgets.parse.ParseModule;
 
 import com.google.common.collect.Lists;
 import com.google.inject.AbstractModule;

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
 Mon Nov 17 17:07:40 2008
@@ -116,8 +116,9 @@
     this.urlGenerator = urlGenerator;
   }
 
-  public RewriterResults rewrite(HttpRequest req, HttpResponse resp,  
MutableContent content) {
-    return RewriterResults.cacheableIndefinitely();
+  public RewriterResults rewrite(HttpRequest req, HttpResponse resp, 
MutableContent content) {
+    // Rendering does not rewrite arbitrary HTTP responses currently
+    return null;
   }
 
   public RewriterResults rewrite(Gadget gadget, MutableContent mutableContent) 
{

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java
 Mon Nov 17 17:07:40 2008
@@ -32,7 +32,7 @@
    * @param request Originating request, as context.
    * @param original Original HTTP response, for context.
    * @param content Original content.
-   * @return Object indicating results cacheability, or null (indicates not 
cacheable).
+   * @return Object indicating results cacheability or null indicating no 
rewriting occurred
    */
   RewriterResults rewrite(HttpRequest request, HttpResponse original, 
MutableContent content);
 
@@ -41,7 +41,7 @@
    * for the bulk of this.
    *
    * @param gadget Gadget to rewrite.
-   * @return Object indicating results cacheability, or null (indicates not 
cacheable).
+   * @return Object indicating results cacheability or null indicating no 
rewriting occurred
    */
   RewriterResults rewrite(Gadget gadget, MutableContent content);
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java
 Mon Nov 17 17:07:40 2008
@@ -17,16 +17,16 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import com.google.inject.Inject;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetException;
 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.parse.GadgetHtmlParser;
-import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.View;
 
+import com.google.inject.Inject;
+
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
@@ -54,7 +54,7 @@
       // Nothing to rewrite.
       return null;
     }
-    MutableContent mc = getMutableContent(gadget.getSpec(), currentView);
+    MutableContent mc = new MutableContent(htmlParser, 
currentView.getContent());
 
     for (ContentRewriter rewriter : rewriters) {
       rewriter.rewrite(gadget, mc);
@@ -68,8 +68,7 @@
       // Nothing to rewrite.
       return null;
     }
-
-    MutableContent mc = getMutableContent(content);
+    MutableContent mc = new MutableContent(htmlParser, content);
 
     for (ContentRewriter rewriter : rewriters) {
       rewriter.rewrite(gadget, mc);
@@ -80,30 +79,17 @@
 
   /** [EMAIL PROTECTED] */
   public HttpResponse rewriteHttpResponse(HttpRequest req, HttpResponse resp) {
-    String originalContent = resp.getResponseAsString();
-    MutableContent mc = getMutableContent(originalContent);
+    MutableContent mc = new MutableContent(htmlParser, resp);
 
+    boolean wasRewritten = false;
     for (ContentRewriter rewriter : rewriters) {
-      rewriter.rewrite(req, resp, mc);
+      wasRewritten |= (rewriter.rewrite(req, resp, mc) != null);
     }
 
-    String rewrittenContent = mc.getContent();
-    if (rewrittenContent.equals(originalContent)) {
-      return resp;
+    if (wasRewritten) {
+      return new 
HttpResponseBuilder(resp).setResponseString(mc.getContent()).create();
     }
-
-    return new 
HttpResponseBuilder(resp).setResponseString(rewrittenContent).create();
-  }
-
-  protected MutableContent getMutableContent(String content) {
-    MutableContent mc = new MutableContent(htmlParser, content, null);
-    return mc;
-  }
-
-  protected MutableContent getMutableContent(GadgetSpec spec, View v) throws 
GadgetException {
-    // TODO - Consider using caching here to avoid parse costs
-    MutableContent mc = new MutableContent(htmlParser, v.getContent(), null);
-    return mc;
+    return resp;
   }
 
   protected List<ContentRewriter> getRewriters() {

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java
 Mon Nov 17 17:07:40 2008
@@ -18,8 +18,10 @@
 package org.apache.shindig.gadgets.rewrite;
 
 import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
 import org.apache.shindig.gadgets.parse.HtmlSerializer;
+
 import org.w3c.dom.Document;
 
 /**
@@ -28,6 +30,7 @@
  */
 public class MutableContent {
   private String content;
+  private HttpResponse contentSource;
   private Document document;
   private final GadgetHtmlParser contentParser;
 
@@ -41,22 +44,23 @@
   }
 
   /**
-   * NOTE! Passed documents are cloned to ensure they are safe prior to 
rewriting
+   * Construct with decoded string content
    */
-  public MutableContent(GadgetHtmlParser contentParser, String content, 
Document document) {
+  public MutableContent(GadgetHtmlParser contentParser, String content) {
     this.contentParser = contentParser;
     this.content = content;
-    this.document = document;
-    if (document != null) {
-      // There are many shared document instances so cloning is essential
-      // TODO - Consider doing a late clone
-      this.document = (Document) document.cloneNode(true);
-      HtmlSerializer.copySerializer(document, this.document);
-      this.document.setUserData(MUTABLE_CONTENT_LISTENER, this, null);
-    }
+  }
 
+  /**
+   * Construct with HttpResponse so we can defer string decoding until we 
actually need
+   * the content. Given that we dont rewrite many mime types this is a 
performance advantage
+   */
+  public MutableContent(GadgetHtmlParser contentParser, HttpResponse 
contentSource) {
+    this.contentParser = contentParser;
+    this.contentSource = contentSource;
   }
 
+
   /**
    * Retrieves the current content for this object in String form.
    * If content has been retrieved in parse tree form and has
@@ -68,8 +72,14 @@
    * @return Renderable/active content.
    */
   public String getContent() {
-    if (content == null && document != null) {
-      content = HtmlSerializer.serialize(document);
+    if (content == null) {
+      if (contentSource != null) {
+        content = contentSource.getResponseAsString();
+        // Clear on first use
+        contentSource = null;
+      } else if (document != null) {
+        content = HtmlSerializer.serialize(document);
+      }
     }
     return content;
   }
@@ -84,6 +94,7 @@
     if (content == null || !content.equals(newContent)) {
       content = newContent;
       document = null;
+      contentSource = null;
     }
   }
 
@@ -95,6 +106,7 @@
   public void documentChanged() {
     if (document != null) {
       content = null;
+      contentSource = null;
     }
   }
   
@@ -112,12 +124,8 @@
     if (document != null) {
       return document;
     }
-    if (content == null || contentParser == null) {
-      return null;
-    }
-  
     try {
-      document = contentParser.parseDom(content);
+      document = contentParser.parseDom(getContent());
       document.setUserData(MUTABLE_CONTENT_LISTENER, this, null);
     } catch (GadgetException e) {
       // TODO: emit info message
@@ -125,4 +133,12 @@
     }
     return document;
   }
+
+  /**
+   * True if current state has a parsed document. Allows rewriters to switch 
mode based on
+   * which content is most readily available
+   */
+  public boolean hasDocument() {
+    return (document != null);
+  }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java
 Mon Nov 17 17:07:40 2008
@@ -23,7 +23,13 @@
 import org.apache.shindig.gadgets.GadgetSpecFactory;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
-import org.apache.shindig.gadgets.rewrite.*;
+import org.apache.shindig.gadgets.rewrite.ContentRewriter;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+import org.apache.shindig.gadgets.rewrite.CssRewriter;
+import org.apache.shindig.gadgets.rewrite.LinkRewriter;
+import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.rewrite.ProxyingLinkRewriter;
+import org.apache.shindig.gadgets.rewrite.RewriterResults;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.View;
 
@@ -31,7 +37,12 @@
 import com.google.inject.Singleton;
 import com.google.inject.name.Named;
 
-import java.io.*;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -94,37 +105,34 @@
       if (request.getGadget() != null) {
         spec = specFactory.getGadgetSpec(request.getGadget().toJavaUri(), 
false);
       }
-      if (rewrite(spec, request.getUri(),
-                  new StringReader(content.getContent()),
-                  mimeType,
-                  output)) {
+      if (rewrite(spec, request.getUri(), content, mimeType, output)) {
         content.setContent(new String(baos.toByteArray()));
+        return RewriterResults.cacheableIndefinitely();
       }
     } catch (UnsupportedEncodingException uee) {
       throw new RuntimeException(uee);
     } catch (GadgetException ge) {
       // Couldn't retrieve gadgetSpec
     }
-
-    return RewriterResults.cacheableIndefinitely();
+    return null;
   }
 
   public RewriterResults rewrite(Gadget gadget, MutableContent content) {
     StringWriter sw = new StringWriter();
     GadgetSpec spec = gadget.getSpec();
-    StringReader reader = new StringReader(content.getContent());
     Uri base = spec.getUrl();
     View view = gadget.getCurrentView();
     if (view != null && view.getHref() != null) {
       base = view.getHref();
     }
-    if (rewrite(spec, base, reader, "text/html", sw)) {
+    if (rewrite(spec, base, content, "text/html", sw)) {
       content.setContent(sw.toString());
+      return RewriterResults.cacheableIndefinitely();
     }
-    return RewriterResults.cacheableIndefinitely();
+    return null;
   }
 
-  private boolean rewrite(GadgetSpec spec, Uri source, Reader r, String 
mimeType, Writer w) {
+  private boolean rewrite(GadgetSpec spec, Uri source, MutableContent mc, 
String mimeType, Writer w) {
     // Dont rewrite content if the spec is unavailable
     if (spec == null) {
       return false;
@@ -158,11 +166,12 @@
         transformerMap
             .put("script", new JavascriptTagMerger(spec, rewriterFeature, 
getConcatUrl(), source));
       }
-      HtmlRewriter.rewrite(r, source, transformerMap, w);
+      HtmlRewriter.rewrite(new StringReader(mc.getContent()), source, 
transformerMap, w);
       return true;
     } else if (isCSS(mimeType)) {
       if (getProxyUrl() != null) {
-        CssRewriter.rewrite(r, source, createLinkRewriter(spec, 
rewriterFeature), w, false);
+        CssRewriter.rewrite(new StringReader(mc.getContent()), source,
+            createLinkRewriter(spec, rewriterFeature), w, false);
         return true;
       } else {
         return false;

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
 Mon Nov 17 17:07:40 2008
@@ -50,7 +50,7 @@
   private final Logger logger = 
Logger.getLogger(CajaContentRewriter.class.getName());
 
   public RewriterResults rewrite(HttpRequest req, HttpResponse resp, 
MutableContent content) {
-    return RewriterResults.cacheableIndefinitely();
+    return null;
   }
 
   public RewriterResults rewrite(Gadget gadget, MutableContent content) {
@@ -105,7 +105,7 @@
       }      
       content.setContent(output.toString());
     }
-    return RewriterResults.notCacheable();
+    return null;
   }
 
   private void throwCajolingException(Exception cause, MessageQueue mq) {

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
 Mon Nov 17 17:07:40 2008
@@ -18,34 +18,58 @@
  */
 package org.apache.shindig.gadgets.render;
 
-import com.google.caja.util.Join;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
 import org.apache.shindig.common.ContainerConfig;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.xml.XmlUtil;
-import org.apache.shindig.gadgets.*;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.GadgetFeature;
+import org.apache.shindig.gadgets.GadgetFeatureRegistry;
+import org.apache.shindig.gadgets.JsLibrary;
+import org.apache.shindig.gadgets.MessageBundleFactory;
+import org.apache.shindig.gadgets.UrlGenerator;
 import org.apache.shindig.gadgets.preload.NullPreloads;
 import org.apache.shindig.gadgets.preload.PreloadException;
 import org.apache.shindig.gadgets.preload.PreloadedData;
 import org.apache.shindig.gadgets.preload.Preloads;
-import static org.apache.shindig.gadgets.render.RenderingContentRewriter.*;
+import static 
org.apache.shindig.gadgets.render.RenderingContentRewriter.BEFORE_HEAD_GROUP;
+import static 
org.apache.shindig.gadgets.render.RenderingContentRewriter.BODY_ATTRIBUTES_GROUP;
+import static 
org.apache.shindig.gadgets.render.RenderingContentRewriter.BODY_GROUP;
+import static 
org.apache.shindig.gadgets.render.RenderingContentRewriter.DEFAULT_HEAD_CONTENT;
+import static 
org.apache.shindig.gadgets.render.RenderingContentRewriter.DOCUMENT_SPLIT_PATTERN;
+import static 
org.apache.shindig.gadgets.render.RenderingContentRewriter.FEATURES_KEY;
+import static 
org.apache.shindig.gadgets.render.RenderingContentRewriter.HEAD_GROUP;
+import static 
org.apache.shindig.gadgets.render.RenderingContentRewriter.INSERT_BASE_ELEMENT_KEY;
 import org.apache.shindig.gadgets.rewrite.MutableContent;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.LocaleSpec;
 import org.apache.shindig.gadgets.spec.MessageBundle;
 import org.apache.shindig.gadgets.spec.View;
+
+import com.google.caja.util.Join;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
 import static org.easymock.EasyMock.expect;
 import org.easymock.classextension.EasyMock;
 import org.easymock.classextension.IMocksControl;
 import org.json.JSONException;
 import org.json.JSONObject;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.*;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -84,7 +108,7 @@
   }
 
   private String rewrite(Gadget gadget, String content) {
-    MutableContent mc = new MutableContent(null, content, null);
+    MutableContent mc = new MutableContent(null, content);
     assertEquals(0, rewriter.rewrite(gadget, mc).getCacheTtl());
     return mc.getContent();
   }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java
 Mon Nov 17 17:07:40 2008
@@ -17,7 +17,6 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.PropertiesModule;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.EasyMockTestCase;
@@ -25,6 +24,8 @@
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetException;
 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.parse.GadgetHtmlParser;
 import org.apache.shindig.gadgets.parse.ParseModule;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
@@ -32,6 +33,8 @@
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
+import org.apache.commons.lang.StringUtils;
+
 import java.net.URI;
 import java.util.Set;
 
@@ -49,6 +52,7 @@
   protected LinkRewriter defaultLinkRewriter;
   protected GadgetHtmlParser parser;
   protected Injector injector;
+  protected HttpResponse fakeResponse;
 
   @Override
   protected void setUp() throws Exception {
@@ -63,6 +67,8 @@
         DEFAULT_PROXY_BASE);
     injector = Guice.createInjector(new ParseModule(), new PropertiesModule());
     parser = injector.getInstance(GadgetHtmlParser.class);
+    fakeResponse = new HttpResponseBuilder().setHeader("Content-Type", 
"unknown")
+        .setResponse(new byte[]{ (byte)0xFE, (byte)0xFF}).create();
   }
 
   public static GadgetSpec createSpecWithRewrite(String include, String 
exclude, String expires,
@@ -111,7 +117,7 @@
 
   MutableContent rewriteContent(ContentRewriter rewriter, String s)
       throws Exception {
-    MutableContent mc = new MutableContent(parser, s, null);
+    MutableContent mc = new MutableContent(parser, s);
 
     GadgetSpec spec = new GadgetSpec(SPEC_URL,
         "<Module><ModulePrefs title=''/><Content><![CDATA[" + s + 
"]]></Content></Module>");

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CSSContentRewriterTest.java
 Mon Nov 17 17:07:40 2008
@@ -17,12 +17,14 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpResponseBuilder;
 
+import org.apache.commons.io.IOUtils;
+import org.easymock.classextension.EasyMock;
+
 /**
  *
  */
@@ -51,10 +53,19 @@
     HttpResponse response = new 
HttpResponseBuilder().setHeader("Content-Type", "text/css")
       .setResponseString(content).create();
 
-    MutableContent mc = new MutableContent(null, content, null);
+    MutableContent mc = new MutableContent(null, content);
     rewriter.rewrite(request, response, mc);
 
     assertEquals(expected, mc.getContent());
   }
 
+    public void testNoRewriteUnknownMimeType() {
+    // Strict mock as we expect no calls
+    MutableContent mc = mock(MutableContent.class, true);
+    HttpRequest req = mock(HttpRequest.class);
+    EasyMock.expect(req.getRewriteMimeType()).andReturn("unknown");
+    replay();
+    assertNull(rewriter.rewrite(req, fakeResponse, mc));
+    verify();
+  }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java
 Mon Nov 17 17:07:40 2008
@@ -17,34 +17,28 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import org.apache.shindig.common.PropertiesModule;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
-import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
-import org.apache.shindig.gadgets.parse.ParseModule;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 
 import com.google.common.collect.Lists;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import junit.framework.TestCase;
+
+import org.easymock.classextension.EasyMock;
 
 import java.util.Arrays;
 import java.util.List;
 
-public class DefaultContentRewriterRegistryTest extends TestCase {
+public class DefaultContentRewriterRegistryTest extends BaseRewriterTestCase {
   private static final Uri SPEC_URL = 
Uri.parse("http://example.org/gadget.xml";);
   private List<CaptureRewriter> rewriters;
   private List<ContentRewriter> contentRewriters;
   private ContentRewriterRegistry registry;
-  private GadgetHtmlParser parser;
 
   protected void setUp() throws Exception {
-    Injector injector = Guice.createInjector(new ParseModule(), new 
PropertiesModule());
-    parser = injector.getInstance(GadgetHtmlParser.class);
+    super.setUp();
     rewriters = Arrays.asList(new CaptureRewriter(), new CaptureRewriter());
     contentRewriters = Lists.<ContentRewriter>newArrayList(rewriters);
     registry = new DefaultContentRewriterRegistry(contentRewriters, parser);
@@ -96,4 +90,26 @@
 
     assertEquals(body, rewritten); 
   }
+
+  /**
+   * This test ensures that we dont call HttpRespose.getResponseAsString for 
content types
+   * that are not rewriteable by the default set of content rewriters. This is 
important
+   * from a performance and content consistency standpoint. Because 
HttpResonse is final
+   * we test that no new
+   */
+  public void testNoDecodeHttpResponseForUnRewriteableMimeTypes() {
+    List<ContentRewriter> rewriters = Lists.newArrayList();
+    rewriters.add(injector.getInstance(HTMLContentRewriter.class));
+    rewriters.add(injector.getInstance(CSSContentRewriter.class));
+    registry = new DefaultContentRewriterRegistry(rewriters, parser);
+
+    HttpRequest req = mock(HttpRequest.class);
+    EasyMock.expect(req.getRewriteMimeType()).andReturn("unknown");
+
+    replay();
+    HttpResponse rewritten = registry.rewriteHttpResponse(req, fakeResponse);
+    // Assert that response is untouched
+    assertTrue(rewritten == fakeResponse);
+    verify();
+  }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java
 Mon Nov 17 17:07:40 2008
@@ -17,8 +17,10 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import org.apache.commons.io.IOUtils;
+import org.apache.shindig.gadgets.http.HttpRequest;
 
+import org.apache.commons.io.IOUtils;
+import org.easymock.classextension.EasyMock;
 import org.w3c.dom.Document;
 
 /**
@@ -155,4 +157,13 @@
         "div { color : black; }");
   }
 
+  public void testNoRewriteUnknownMimeType() {
+    // Strict mock as we expect no calls
+    MutableContent mc = mock(MutableContent.class, true);
+    HttpRequest req = mock(HttpRequest.class);
+    EasyMock.expect(req.getRewriteMimeType()).andReturn("unknown");
+    replay();
+    assertNull(rewriter.rewrite(req, fakeResponse, mc));
+    verify();
+  }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java
 Mon Nov 17 17:07:40 2008
@@ -18,7 +18,6 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.shindig.common.PropertiesModule;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.DefaultGuiceModule;
@@ -36,7 +35,8 @@
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-import org.w3c.dom.Document;
+
+import org.apache.commons.io.IOUtils;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -107,25 +107,20 @@
     this.numRuns = numRuns;
 
     warmup = true;
-    //runLexer();
+    runLexer();
     //run(cajaParser);
     run(nekoParser);
-    //run(nekoSimpleParser);
-    runNoParse(nekoSimpleParser);
+    run(nekoSimpleParser);
     Thread.sleep(5000L);
     warmup = false;
-    //System.out.println("Lexer------");
-    //runLexer();
+    System.out.println("Lexer------");
+    runLexer();
     //System.out.println("Caja-------");
     //run(cajaParser);
-    //System.out.println("Neko-------");
-    //run(nekoParser);
+    System.out.println("Neko-------");
+    run(nekoParser);
     System.out.println("NekoSimple-------");
     run(nekoSimpleParser);
-    System.out.println("No-Parse rewrite full DOM-------");
-    runNoParse(nekoParser);
-    System.out.println("No-Parse rewrite simple DOM-------");
-    runNoParse(nekoSimpleParser);
   }
 
   private void output(String content) {
@@ -137,7 +132,7 @@
   private void runLexer() throws Exception {
    long startTime = System.currentTimeMillis();
     for (int i = 0; i < numRuns; i++) {
-      MutableContent mc = new MutableContent(null, content, null);
+      MutableContent mc = new MutableContent(null, content);
       lexerRewriter.rewrite(gadget, mc);
       mc.getContent();
     }
@@ -149,7 +144,7 @@
   private void run(GadgetHtmlParser parser) throws Exception {
     long startTime = System.currentTimeMillis();
     for (int i = 0; i < numRuns; i++) {
-      MutableContent mc = new MutableContent(parser, content, null);
+      MutableContent mc = new MutableContent(parser, content);
       //linkRewriter.rewrite(gadget, mc);
       //jsConcatRewriter.rewrite(gadget, mc);
       //styleLinksRewriter.rewrite(gadget, mc);
@@ -162,21 +157,6 @@
 
   }
 
-  private void runNoParse(GadgetHtmlParser parser) throws Exception {
-    Document doc = parser.parseDom(content);
-    long startTime = System.currentTimeMillis();
-    for (int i = 0; i < numRuns; i++) {
-      MutableContent mc = new MutableContent(parser, null, doc);
-      htmlRewriter.rewrite(gadget, mc);          
-      mc.getContent();
-    }
-    long time = System.currentTimeMillis() - startTime;
-    output("DOM no-parse Rewrite [" + time + " ms total: " +
-          ((double)time)/numRuns + "ms/run]");
-
-  }
-
-
   public static void main(String[] args) {
     // Test can be run as standalone program to test out serialization and 
parsing
     // performance numbers, using Caja as a parser.

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/MutableContentTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/MutableContentTest.java?rev=718457&r1=718456&r2=718457&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/MutableContentTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/MutableContentTest.java
 Mon Nov 17 17:07:40 2008
@@ -24,7 +24,10 @@
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-import static org.junit.Assert.*;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Document;
@@ -39,7 +42,7 @@
     // sufficient given that this test doesn't exercise the parser extensively 
at all,
     // instead focusing on the additional utility provided by 
MutableHtmlContent
     Injector injector = Guice.createInjector(new ParseModule(), new 
PropertiesModule());
-    mhc = new MutableContent(injector.getInstance(GadgetHtmlParser.class), 
"DEFAULT VIEW", null);
+    mhc = new MutableContent(injector.getInstance(GadgetHtmlParser.class), 
"DEFAULT VIEW");
   }
   
   @Test


Reply via email to