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