You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by lr...@apache.org on 2008/06/05 14:30:40 UTC
svn commit: r663584 - in /incubator/shindig/trunk: features/core.io/
java/gadgets/conf/ java/gadgets/src/main/java/org/apache/shindig/gadgets/
java/gadgets/src/main/java/org/apache/shindig/gadgets/http/
java/gadgets/src/main/java/org/apache/shindig/gad...
Author: lryan
Date: Thu Jun 5 05:30:39 2008
New Revision: 663584
URL: http://svn.apache.org/viewvc?rev=663584&view=rev
Log:
Complete content rewriting feature. Includes configurable rules, carrying through of rewriting to makeRequest calls etc.
Added:
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/ContentRewriterFeatureTestCase.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterTest.java
incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/
incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/feather.png (with props)
incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.css
incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.js
incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.css
incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.js
incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteroff.xml
incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.html
incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.xml
Modified:
incubator/shindig/trunk/features/core.io/io.js
incubator/shindig/trunk/java/gadgets/conf/gadgets.properties
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.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/ContentRewriterFeature.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRewriter.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriter.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMerger.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRewriterTest.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HtmlRewriterTest.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMergerTest.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagRewriterTest.java
Modified: incubator/shindig/trunk/features/core.io/io.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core.io/io.js?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core.io/io.js (original)
+++ incubator/shindig/trunk/features/core.io/io.js Thu Jun 5 05:30:39 2008
@@ -308,7 +308,8 @@
numEntries : params.NUM_ENTRIES || "3",
getSummaries : !!params.GET_SUMMARIES,
signOwner : signOwner || "true",
- signViewer : signViewer || "true"
+ signViewer : signViewer || "true",
+ gadget : gadget.util.getUrlParameters()["url"]
};
if (!respondWithPreload(paramData, params, callback, processResponse)) {
Modified: incubator/shindig/trunk/java/gadgets/conf/gadgets.properties
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/conf/gadgets.properties?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/conf/gadgets.properties (original)
+++ incubator/shindig/trunk/java/gadgets/conf/gadgets.properties Thu Jun 5 05:30:39 2008
@@ -7,7 +7,9 @@
signing.key-file=
locked-domain.enabled=false
locked-domain.embed-host=127.0.0.1:8080
-content-rewrite.enabled=true
+content-rewrite.include-urls=.*
+content-rewrite.exclude-urls=
+content-rewrite.include-tags=link,script,embed,img,style
cache.capacity=10000
gadget-spec.cache.capacity=0
message-bundle.cache.capacity=0
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java Thu Jun 5 05:30:39 2008
@@ -28,7 +28,6 @@
import org.apache.shindig.gadgets.http.HttpRequest;
import org.apache.shindig.gadgets.http.HttpResponse;
import org.apache.shindig.gadgets.rewrite.ContentRewriter;
-import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
import org.apache.shindig.gadgets.spec.GadgetSpec;
import org.apache.shindig.gadgets.spec.View;
@@ -49,8 +48,6 @@
private final ContentRewriter rewriter;
- private final boolean enableRewrite;
-
private final long specMinTTL;
// A cache of GadgetSpecs with expirations
@@ -84,12 +81,10 @@
response.getHttpStatusCode());
} else {
spec = new GadgetSpec(gadgetUri, response.getResponseAsString());
- if (new ContentRewriterFeature(spec, enableRewrite).isRewriteEnabled()) {
- for (View v : spec.getViews().values()) {
- if (v.getType() == View.ContentType.HTML && rewriter != null) {
- v.setRewrittenContent(
- rewriter.rewrite(gadgetUri, v.getContent(), "text/html"));
- }
+ for (View v : spec.getViews().values()) {
+ if (v.getType() == View.ContentType.HTML && rewriter != null) {
+ v.setRewrittenContent(
+ rewriter.rewriteGadgetView(spec, v.getContent(), "text/html"));
}
}
// Add the updated spec back to the cache and force the min TTL
@@ -114,20 +109,18 @@
@Inject
public BasicGadgetSpecFactory(HttpFetcher specFetcher,
ContentRewriter rewriter,
- @Named("content-rewrite.enabled")boolean defaultEnableRewrite,
@Named("gadget-spec.cache.capacity")int gadgetSpecCacheCapacity,
@Named("gadget-spec.cache.minTTL")long minTTL) {
this.specFetcher = specFetcher;
this.rewriter = rewriter;
- this.enableRewrite = defaultEnableRewrite;
this.inMemorySpecCache = new LruCache<URI, SpecTimeoutPair>(
gadgetSpecCacheCapacity);
this.specMinTTL = minTTL;
}
private static class SpecTimeoutPair {
- private GadgetSpec spec;
- private long timeout;
+ private final GadgetSpec spec;
+ private final long timeout;
private SpecTimeoutPair(GadgetSpec spec, long timeout) {
this.spec = spec;
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java Thu Jun 5 05:30:39 2008
@@ -360,6 +360,7 @@
public boolean viewerSigned = true;
public ContentRewriter rewriter = null;
public String rewriteMimeType = null;
+ public URI gadgetUri;
public Options() {}
@@ -371,6 +372,9 @@
this.ownerSigned = copyFrom.ownerSigned;
this.viewerSigned = copyFrom.viewerSigned;
this.rewriter = copyFrom.rewriter;
+ if (copyFrom.gadgetUri != null) {
+ this.gadgetUri = URI.create(copyFrom.gadgetUri.toString());
+ }
}
}
}
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=663584&r1=663583&r2=663584&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 Thu Jun 5 05:30:39 2008
@@ -19,6 +19,7 @@
import org.apache.shindig.gadgets.http.HttpRequest;
import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.spec.GadgetSpec;
import java.io.Reader;
import java.io.Writer;
@@ -31,35 +32,20 @@
/**
* Rewrite the original content located at source
- * @param request Originating request
+ * @param request Originating request
* @param original Original content
* @return A rewritten copy of the original or null if no rewriting occurred
*/
public HttpResponse rewrite(HttpRequest request, HttpResponse original);
/**
- * Rewrite the original content located at source
- * @param source Location of the original content
+ * Rewrite the original gadget content located at source
+ * @param spec GadgetSpec to use for rewriting rules. May be null
* @param original Original content
* @param mimeType A string containing the mime type of the content, may
* contain other content as allowed in the HTTP Content-Type
* header
* @return A rewritten copy of the original or null if no rewriting occurred
*/
- public String rewrite(URI source, String original, String mimeType);
-
- /**
- * Rewrite the content in the original response located at source
- * @param source Location of the original content
- * @param original Original content
- * @param mimeType A string containing the mime type of the content, may
- * contain other content as allowed in the HTTP Content-Type
- * header
- * @param rewritten Target of rewritten content, not written to if no
- * rewriting is done.
- * @return true if rewrite occurred, false otherwise
- */
- public boolean rewrite(URI source, Reader original, String mimeType,
- Writer rewritten);
-
+ public String rewriteGadgetView(GadgetSpec spec, String original, String mimeType);
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeature.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeature.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeature.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeature.java Thu Jun 5 05:30:39 2008
@@ -20,26 +20,134 @@
import org.apache.shindig.gadgets.spec.Feature;
import org.apache.shindig.gadgets.spec.GadgetSpec;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.regex.Pattern;
+
/**
- * Parser for the "proxy-rewrite" feature
+ * Parser for the "content-rewrite" feature. The supported params are
+ * include-urls,exclude-urls,include-tags. Default values are container specific
*/
public class ContentRewriterFeature {
- private boolean isEnabled;
+ private static final String INCLUDE_URLS = "include-urls";
+ private static final String EXCLUDE_URLS = "exclude-urls";
+ private static final String INCLUDE_TAGS = "include-tags";
+
+ // Use tree set to maintain order for fingerprint
+ private TreeSet<String> includeTags;
+
+ private boolean includeAll;
+ private boolean includeNone;
+
+ private Pattern include;
+ private Pattern exclude;
- public ContentRewriterFeature(GadgetSpec spec, boolean containerDefault) {
+ private Integer fingerprint;
+
+ /**
+ * Constructor which takes a gadget spec and the default container settings
+ *
+ * @param spec
+ * @param defaultInclude As a regex
+ * @param defaultExclude As a regex
+ * @param defaultTags Set of default tags that can be rewritten
+ */
+ public ContentRewriterFeature(GadgetSpec spec, String defaultInclude,
+ String defaultExclude, Set<String> defaultTags) {
Feature f = spec.getModulePrefs().getFeatures().get("content-rewrite");
- isEnabled = containerDefault;
+ String includeRegex = normalizeParam(defaultInclude, null);
+ String excludeRegex = normalizeParam(defaultExclude, null);
+ this.includeTags = new TreeSet<String>(defaultTags);
+
if (f != null) {
- if ("NONE".equalsIgnoreCase(f.getParams().get("include"))) {
- isEnabled = false;
- } else if ("ALL".equalsIgnoreCase(f.getParams().get("include"))) {
- isEnabled = true;
+ if (f.getParams().containsKey(INCLUDE_URLS)) {
+ includeRegex = normalizeParam(f.getParams().get(INCLUDE_URLS), includeRegex);
+ }
+
+ // Note use of default for exclude as null here to allow clearing value in the
+ // presence of a container default.
+ if (f.getParams().containsKey(EXCLUDE_URLS)) {
+ excludeRegex = normalizeParam(f.getParams().get(EXCLUDE_URLS), null);
}
+ String includeTagList = f.getParams().get(INCLUDE_TAGS);
+ if (includeTagList != null) {
+ TreeSet<String> tags = new TreeSet<String>();
+ for (String tag : includeTagList.split(",")) {
+ if (tag != null) {
+ tags.add(tag.trim().toLowerCase());
+ }
+ }
+ includeTags = tags;
+ }
+ }
+
+ if (".*".equals(includeRegex) && excludeRegex == null) {
+ includeAll = true;
+ }
+
+ if (".*".equals(excludeRegex) || includeRegex == null) {
+ includeNone = true;
+ }
+
+ if (includeRegex != null) {
+ include = Pattern.compile(includeRegex);
+ }
+ if (excludeRegex != null) {
+ exclude = Pattern.compile(excludeRegex);
}
}
+ private String normalizeParam(String paramValue, String defaultVal) {
+ if (paramValue == null) {
+ return defaultVal;
+ }
+ paramValue = paramValue.trim();
+ if (paramValue.length() == 0) {
+ return defaultVal;
+ }
+ return paramValue;
+ }
+
public boolean isRewriteEnabled() {
- return isEnabled;
+ return !includeNone;
+ }
+
+ public boolean shouldRewriteURL(String url) {
+ if (includeNone) {
+ return false;
+ } else if (includeAll) {
+ return true;
+ } else if (include.matcher(url).find()) {
+ return !(exclude != null && exclude.matcher(url).find());
+ }
+ return false;
+ }
+
+ public boolean shouldRewriteTag(String tag) {
+ if (tag != null) {
+ return this.includeTags.contains(tag.toLowerCase());
+ }
+ return false;
+ }
+
+ public Set<String> getIncludedTags() {
+ return includeTags;
+ }
+
+ /**
+ * @return fingerprint of rewriting rule for cache-busting
+ */
+ public int getFingerprint() {
+ if (fingerprint == null) {
+ int result;
+ result = (include != null ? include.pattern().hashCode() : 0);
+ result = 31 * result + (exclude != null ? exclude.pattern().hashCode() : 0);
+ for (String s : includeTags) {
+ result = 31 * result + s.hashCode();
+ }
+ fingerprint = result;
+ }
+ return fingerprint;
}
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRewriter.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRewriter.java Thu Jun 5 05:30:39 2008
@@ -76,7 +76,7 @@
URI base, LinkRewriter rewriter) {
Matcher matcher = urlMatcher.matcher(token.text);
if (!matcher.find()) return token.text;
- return "url(\"" + rewriter.rewrite(matcher.group(2), base) + "\")";
+ return "url(\"" + rewriter.rewrite(matcher.group(2).trim(), base) + "\")";
}
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriter.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriter.java Thu Jun 5 05:30:39 2008
@@ -17,8 +17,13 @@
*/
package org.apache.shindig.gadgets.rewrite;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import org.apache.shindig.gadgets.GadgetException;
+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.spec.GadgetSpec;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
@@ -30,14 +35,35 @@
import java.io.Writer;
import java.net.URI;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
/**
* Default implementation of content rewriting.
*/
public class DefaultContentRewriter implements ContentRewriter {
- public DefaultContentRewriter() {
+ private final GadgetSpecFactory specFactory;
+ private final String includeUrls;
+ private final String excludeUrls;
+ private final Set<String> includeTags;
+
+ @Inject
+ public DefaultContentRewriter(
+ GadgetSpecFactory specFactory,
+ @Named("content-rewrite.include-urls")String includeUrls,
+ @Named("content-rewrite.exclude-urls")String excludeUrls,
+ @Named("content-rewrite.include-tags")String includeTags) {
+ this.specFactory = specFactory;
+ this.includeUrls = includeUrls;
+ this.excludeUrls = excludeUrls;
+ this.includeTags = new HashSet<String>();
+ for (String s : includeTags.split(",")) {
+ if (s != null && s.trim().length() > 0) {
+ this.includeTags.add(s.trim().toLowerCase());
+ }
+ }
}
public HttpResponse rewrite(HttpRequest request, HttpResponse original) {
@@ -50,7 +76,11 @@
if (request.getOptions() != null && request.getOptions().rewriteMimeType != null) {
mimeType = request.getOptions().rewriteMimeType;
}
- if (rewrite(request.getUri(),
+ GadgetSpec spec = null;
+ if (request.getOptions() != null && request.getOptions().gadgetUri != null) {
+ spec = specFactory.getGadgetSpec(request.getOptions().gadgetUri, false);
+ }
+ if (rewrite(spec, request.getUri(),
new InputStreamReader(original.getResponse(), original.getEncoding()),
mimeType,
output)) {
@@ -61,42 +91,63 @@
return null;
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException(uee);
+ } catch (GadgetException ge) {
+ return null;
}
}
- public String rewrite(URI source, String original, String mimeType) {
+ public String rewriteGadgetView(GadgetSpec spec, String view, String mimeType) {
StringWriter sw = new StringWriter();
- if (rewrite(source, new StringReader(original), mimeType, sw)) {
+ if (rewrite(spec, spec.getUrl(), new StringReader(view), mimeType, sw)) {
return sw.toString();
} else {
return null;
}
}
- public boolean rewrite(URI source, Reader r, String mimeType, Writer w) {
+ private boolean rewrite(GadgetSpec spec, URI source, Reader r, String mimeType, Writer w) {
+ // Dont rewrite content if the spec is unavailable
+ if (spec == null) {
+ return false;
+ }
+
+ // Store the feature in the spec so we dont keep parsing it
+ ContentRewriterFeature rewriterFeature = (ContentRewriterFeature)spec.getAttribute("content-rewrite");
+ if (rewriterFeature == null) {
+ rewriterFeature = new ContentRewriterFeature(spec, includeUrls, excludeUrls, includeTags);
+ spec.setAttribute("content-rewrite", rewriterFeature);
+ }
+
+ if (!rewriterFeature.isRewriteEnabled()) {
+ return false;
+ }
if (isHTML(mimeType)) {
Map<String, HtmlTagTransformer> transformerMap
= new HashMap<String, HtmlTagTransformer>();
if (getProxyUrl() != null) {
- LinkRewriter linkRewriter = createLinkRewriter();
+ LinkRewriter linkRewriter = createLinkRewriter(spec, rewriterFeature);
LinkingTagRewriter rewriter = new LinkingTagRewriter(
linkRewriter,
source);
- for (String tag : rewriter.getSupportedTags()) {
+ Set<String> toProcess = new HashSet<String>(rewriter.getSupportedTags());
+ toProcess.retainAll(rewriterFeature.getIncludedTags());
+ for (String tag : toProcess) {
transformerMap.put(tag, rewriter);
}
- transformerMap.put("style", new StyleTagRewriter(source, linkRewriter));
+ if (rewriterFeature.getIncludedTags().contains("style")) {
+ transformerMap.put("style", new StyleTagRewriter(source, linkRewriter));
+ }
}
- if (getConcatUrl() != null) {
+ if (getConcatUrl() != null && rewriterFeature.getIncludedTags().contains("script")) {
transformerMap
- .put("script", new JavascriptTagMerger(getConcatUrl(), source));
+ .put("script", new JavascriptTagMerger(spec, rewriterFeature, getConcatUrl(), source));
}
HtmlRewriter.rewrite(r, source, transformerMap, w);
return true;
} else if (isCSS(mimeType)) {
if (getProxyUrl() != null) {
- CssRewriter.rewrite(r, source, createLinkRewriter(), w);
+ CssRewriter.rewrite(r, source, createLinkRewriter(spec, rewriterFeature), w);
return true;
} else {
return false;
@@ -123,7 +174,7 @@
return "/gadgets/concat?";
}
- protected LinkRewriter createLinkRewriter() {
- return new ProxyingLinkRewriter(getProxyUrl());
+ protected LinkRewriter createLinkRewriter(GadgetSpec spec, ContentRewriterFeature rewriterFeature) {
+ return new ProxyingLinkRewriter(spec.getUrl(), rewriterFeature, getProxyUrl());
}
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMerger.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMerger.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMerger.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMerger.java Thu Jun 5 05:30:39 2008
@@ -19,6 +19,8 @@
package org.apache.shindig.gadgets.rewrite;
import org.apache.shindig.gadgets.servlet.ProxyHandler;
+import org.apache.shindig.gadgets.spec.GadgetSpec;
+import org.apache.shindig.common.util.Utf8UrlCoder;
import com.google.caja.lexer.HtmlTokenType;
import com.google.caja.lexer.Token;
@@ -53,12 +55,19 @@
* form www.host.com/concat?
* @param relativeUrlBase to resolve relative urls
*/
- public JavascriptTagMerger(String concatBase, URI relativeUrlBase) {
+ public JavascriptTagMerger(GadgetSpec spec, ContentRewriterFeature rewriterFeature,
+ String concatBase, URI relativeUrlBase) {
// Force the mime-type to mimic browser expectation so rewriters
// can function properly
this.concatBase = concatBase
+ ProxyHandler.REWRITE_MIME_TYPE_PARAM
- + "=text/javascript&";
+ + "=text/javascript&"
+ + "gadget="
+ + Utf8UrlCoder.encode(spec.getUrl().toString())
+ + "&fp="
+ + rewriterFeature.getFingerprint()
+ + "&";
+
this.relativeUrlBase = relativeUrlBase;
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java Thu Jun 5 05:30:39 2008
@@ -20,10 +20,7 @@
import org.apache.shindig.gadgets.http.HttpRequest;
import org.apache.shindig.gadgets.http.HttpResponse;
-
-import java.io.Reader;
-import java.io.Writer;
-import java.net.URI;
+import org.apache.shindig.gadgets.spec.GadgetSpec;
/**
* A no-op content rewriter
@@ -37,12 +34,7 @@
return null;
}
- public String rewrite(URI source, String original, String mimeType) {
+ public String rewriteGadgetView(GadgetSpec spec, String original, String mimeType) {
return null;
}
-
- public boolean rewrite(URI source, Reader original, String mimeType,
- Writer rewritten) {
- return false;
- }
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java Thu Jun 5 05:30:39 2008
@@ -23,20 +23,38 @@
import java.net.URI;
/**
- * Simple link rewriter that expect to rewrite a link to the form
- * http://www.host.com/proxy/url=<url encoded link>
+ * Simple link rewriter that will rewrite a link to the form
+ * http://www.host.com/proxy/url=<url encoded link>&gadget=<gadget spec url>&fp=<fingeprint of rewriting rule>
*/
public class ProxyingLinkRewriter implements LinkRewriter {
private final String prefix;
+ private final ContentRewriterFeature rewriterFeature;
+ private final URI gadgetUri;
- public ProxyingLinkRewriter(String prefix) {
+ public ProxyingLinkRewriter(URI gadgetUri, ContentRewriterFeature rewriterFeature, String prefix) {
this.prefix = prefix;
+ this.rewriterFeature = rewriterFeature;
+ this.gadgetUri = gadgetUri;
}
public String rewrite(String link, URI context) {
+ link = link.trim();
+ // We shouldnt bother proxying empty URLs
+ if (link.length() == 0) {
+ return link;
+ }
URI uri = context.resolve(link);
- return prefix + Utf8UrlCoder.encode(uri.toString());
+ if (rewriterFeature.shouldRewriteURL(uri.toString())) {
+ return prefix
+ + Utf8UrlCoder.encode(uri.toString())
+ + "&gadget="
+ + Utf8UrlCoder.encode(gadgetUri.toString())
+ + "&fp="
+ + rewriterFeature.getFingerprint();
+ } else {
+ return uri.toString();
+ }
}
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java Thu Jun 5 05:30:39 2008
@@ -66,6 +66,7 @@
public static final String SIGN_OWNER = "signOwner";
public static final String URL_PARAM = "url";
public static final String REFRESH_PARAM = "refresh";
+ public static final String GADGET_PARAM = "gadget";
private static final Logger logger =
Logger.getLogger(ProxyHandler.class.getPackage().getName());
@@ -226,6 +227,9 @@
options.ownerSigned = Boolean
.parseBoolean(request.getParameter(SIGN_OWNER));
}
+ if (request.getParameter(GADGET_PARAM) != null) {
+ options.gadgetUri = URI.create(request.getParameter(GADGET_PARAM));
+ }
options.rewriter = rewriter;
// Allow the rewriter to use an externally forced mime type. This is needed
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java Thu Jun 5 05:30:39 2008
@@ -94,6 +94,20 @@
}
/**
+ * A map of attributes associated with the instance of the spec
+ * Used by handler classes to use specs to carry context.
+ * Not defined by the specification
+ */
+ private final Map<String, Object> attributes = new HashMap<String, Object>();
+ public Object getAttribute(String key) {
+ return attributes.get(key);
+ }
+
+ public void setAttribute(String key, Object o) {
+ attributes.put(key, o);
+ }
+
+ /**
* Performs substitutions on the spec. See individual elements for
* details on what gets substituted.
*
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java Thu Jun 5 05:30:39 2008
@@ -40,7 +40,7 @@
public final HttpFetcher fetcher = mock(HttpFetcher.class);
public final GadgetBlacklist blacklist = mock(GadgetBlacklist.class);
public final GadgetSpecFactory specFactory =
- new BasicGadgetSpecFactory(fetcher, new NoOpContentRewriter(), true, 0, 0L);
+ new BasicGadgetSpecFactory(fetcher, new NoOpContentRewriter(), 0, 0L);
public final MessageBundleFactory bundleFactory =
new BasicMessageBundleFactory(fetcher, 0, 0L);
public GadgetFeatureRegistry registry;
Added: 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=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java Thu Jun 5 05:30:39 2008
@@ -0,0 +1,71 @@
+/*
+ * 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.rewrite;
+
+import com.google.common.collect.Sets;
+import org.apache.commons.lang.StringUtils;
+import org.apache.shindig.gadgets.EasyMockTestCase;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.spec.GadgetSpec;
+
+import java.net.URI;
+import java.util.Set;
+
+/**
+ * Base class for testing content rewriting functionality
+ */
+public abstract class BaseRewriterTestCase extends EasyMockTestCase {
+ static final URI SPEC_URL = URI.create("http://example.org/g.xml");
+ protected Set<String> tags;
+ protected ContentRewriterFeature contentRewriterFeature;
+ protected LinkRewriter defaultRewriter;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ tags = Sets.newHashSet("embed", "img", "script", "link");
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithoutRewrite(), ".*", "", tags);
+ defaultRewriter = new ProxyingLinkRewriter(
+ SPEC_URL,
+ contentRewriterFeature,
+ "http://www.test.com/proxy?url=");
+ }
+
+ protected GadgetSpec getSpecWithRewrite(String include, String exclude, Set<String> tags) throws GadgetException {
+ String xml = "<Module>" +
+ "<ModulePrefs title=\"title\">" +
+ "<Optional feature=\"content-rewrite\">\n" +
+ " <Param name=\"include-urls\">" + include + "</Param>\n" +
+ " <Param name=\"exclude-urls\">" + exclude + "</Param>\n" +
+ " <Param name=\"include-tags\">" + StringUtils.join(tags, ",") + "</Param>\n" +
+ "</Optional>" +
+ "</ModulePrefs>" +
+ "<Content type=\"html\">Hello!</Content>" +
+ "</Module>";
+ return new GadgetSpec(SPEC_URL, xml);
+ }
+
+ protected GadgetSpec getSpecWithoutRewrite() throws GadgetException {
+ String xml = "<Module>" +
+ "<ModulePrefs title=\"title\">" +
+ "</ModulePrefs>" +
+ "<Content type=\"html\">Hello!</Content>" +
+ "</Module>";
+ return new GadgetSpec(SPEC_URL, xml);
+ }
+}
Added: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java?rev=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java Thu Jun 5 05:30:39 2008
@@ -0,0 +1,87 @@
+/*
+ * 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.rewrite;
+
+import com.google.common.collect.Sets;
+
+import java.util.Set;
+
+/**
+ * Test basic parsing of content-rewriter feature
+ */
+public class ContentRewriterFeatureTestCase extends BaseRewriterTestCase {
+
+ public void testContainerDefaultIncludeAll() throws Exception {
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithoutRewrite(), ".*", "", tags);
+ assertTrue(contentRewriterFeature.isRewriteEnabled());
+ assertTrue(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+ }
+
+ public void testContainerDefaultIncludeNone() throws Exception {
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithoutRewrite(), "", ".*", tags);
+ assertFalse(contentRewriterFeature.isRewriteEnabled());
+ assertFalse(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+ }
+
+ public void testContainerDefaultExcludeOverridesInclude() throws Exception {
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithoutRewrite(), ".*", ".*", tags);
+ assertFalse(contentRewriterFeature.isRewriteEnabled());
+ assertFalse(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+ }
+
+ public void testSpecExcludeOverridesContainerDefaultInclude() throws Exception {
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithRewrite("", ".*", tags), ".*", "", tags);
+ assertFalse(contentRewriterFeature.isRewriteEnabled());
+ assertFalse(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+ }
+
+ public void testSpecIncludeOverridesContainerDefaultExclude() throws Exception {
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithRewrite(".*", "", tags), "", ".*", tags);
+ assertTrue(contentRewriterFeature.isRewriteEnabled());
+ assertTrue(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+ }
+
+ public void testExcludeOverridesInclude() throws Exception {
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithRewrite("test\\.com", "test", tags), "", "", tags);
+ assertTrue(contentRewriterFeature.isRewriteEnabled());
+ assertFalse(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+ }
+
+ public void testIncludeOnlyMatch() throws Exception {
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithRewrite("test\\.com", "testx", tags), "", "", tags);
+ assertTrue(contentRewriterFeature.isRewriteEnabled());
+ assertTrue(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+ assertFalse(contentRewriterFeature.shouldRewriteURL("http://testx.test.com"));
+ }
+
+ public void testTagRewrite() throws Exception {
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithRewrite("test\\.com", "testx", tags), "", "", tags);
+ assertFalse(contentRewriterFeature.shouldRewriteTag("IFRAME"));
+ assertTrue(contentRewriterFeature.shouldRewriteTag("img"));
+ assertTrue(contentRewriterFeature.shouldRewriteTag("ScripT"));
+ }
+
+ public void testOverrideTagRewrite() throws Exception {
+ Set<String> newTags = Sets.newHashSet("iframe");
+ contentRewriterFeature = new ContentRewriterFeature(getSpecWithRewrite("test\\.com", "testx", newTags), "", "", tags);
+ assertTrue(contentRewriterFeature.shouldRewriteTag("IFRAME"));
+ assertFalse(contentRewriterFeature.shouldRewriteTag("img"));
+ assertFalse(contentRewriterFeature.shouldRewriteTag("ScripT"));
+ assertFalse(contentRewriterFeature.shouldRewriteTag("link"));
+ }
+}
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRewriterTest.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRewriterTest.java Thu Jun 5 05:30:39 2008
@@ -24,18 +24,14 @@
/**
* test CSS link rewriting
*/
-public class CssRewriterTest extends EasyMockTestCase {
+public class CssRewriterTest extends BaseRewriterTestCase {
private URI dummyUri;
- private LinkRewriter defaultRewriter = new ProxyingLinkRewriter(
- "http://www.test.com/proxy?url=");
-
@Override
protected void setUp() throws Exception {
super.setUp();
dummyUri = new URI("http://www.w3c.org");
- defaultRewriter = new ProxyingLinkRewriter("http://www.test.com/proxy?url=");
}
private void validateRewritten(String content, URI base,
@@ -52,8 +48,8 @@
"div {list-style-image:url('http://a.b.com/bullet.gif');list-style-position:outside;margin:5px;padding:0}\n" +
".someid {background-image:url(http://a.b.com/bigimg.png);float:right;width:165px;height:23px;margin-top:4px;margin-left:5px}";
String rewritten =
- "div {list-style-image:url(\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fbullet.gif\");list-style-position:outside;margin:5px;padding:0}\n" +
- ".someid {background-image:url(\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fbigimg.png\");float:right;width:165px;height:23px;margin-top:4px;margin-left:5px}";
+ "div {list-style-image:url(\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fbullet.gif&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081\");list-style-position:outside;margin:5px;padding:0}\n" +
+ ".someid {background-image:url(\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fbigimg.png&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081\");float:right;width:165px;height:23px;margin-top:4px;margin-left:5px}";
validateRewritten(original, rewritten);
}
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HtmlRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HtmlRewriterTest.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HtmlRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HtmlRewriterTest.java Thu Jun 5 05:30:39 2008
@@ -27,7 +27,7 @@
/**
* Test the HTML rewriter foundation for basic operation
*/
-public class HtmlRewriterTest extends EasyMockTestCase {
+public class HtmlRewriterTest extends BaseRewriterTestCase {
private URI dummyUri;
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMergerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMergerTest.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMergerTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/JavascriptTagMergerTest.java Thu Jun 5 05:30:39 2008
@@ -27,10 +27,9 @@
/**
* Test for Javascript tag merge functionality
*/
-public class JavascriptTagMergerTest extends EasyMockTestCase {
+public class JavascriptTagMergerTest extends BaseRewriterTestCase {
private URI dummyUri;
- private URI relativeBase;
private Map<String, HtmlTagTransformer> defaultTransformerMap;
@@ -38,11 +37,11 @@
protected void setUp() throws Exception {
super.setUp();
dummyUri = new URI("http://www.w3c.org");
- relativeBase = new URI("http://a.b.com/");
+ URI relativeBase = new URI("http://a.b.com/");
defaultTransformerMap = new HashMap<String, HtmlTagTransformer>();
defaultTransformerMap
- .put("script", new JavascriptTagMerger("http://www.test.com/concat?",
- relativeBase));
+ .put("script", new JavascriptTagMerger(getSpecWithoutRewrite(), contentRewriterFeature,
+ "http://www.test.com/concat?", relativeBase));
}
private void validateRewritten(String content, URI base,
@@ -78,7 +77,7 @@
public void testSingleScriptReWrite() {
String original = "<script src=\"http://a.b.com/1.js\"></script>";
String rewritten
- = "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&1=http%3A%2F%2Fa.b.com%2F1.js\" type=\"text/javascript\"></script>";
+ = "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&1=http%3A%2F%2Fa.b.com%2F1.js\" type=\"text/javascript\"></script>";
validateRewritten(original, rewritten);
}
@@ -86,7 +85,7 @@
String original = "<script src=\"http://a.b.com/1.js\"></script>\n"
+ "<script src=\"http://a.b.com/2.js\"></script>";
String rewritten
- = "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&1=http%3A%2F%2Fa.b.com%2F1.js&2=http%3A%2F%2Fa.b.com%2F2.js\" type=\"text/javascript\"></script>";
+ = "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&1=http%3A%2F%2Fa.b.com%2F1.js&2=http%3A%2F%2Fa.b.com%2F2.js\" type=\"text/javascript\"></script>";
validateRewritten(original, rewritten);
}
@@ -102,7 +101,7 @@
String rewritten = "<script type=\"text/javascript\">\n"
+ "doSomething\n"
+ "</script>"
- + "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&1=http%3A%2F%2Fa.b.com%2F1.js&2=http%3A%2F%2Fa.b.com%2F2.js\" type=\"text/javascript\"></script>"
+ + "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&1=http%3A%2F%2Fa.b.com%2F1.js&2=http%3A%2F%2Fa.b.com%2F2.js\" type=\"text/javascript\"></script>"
+ "<script type=\"text/javascript\">\n"
+ "doSomething\n"
+ "</script>";
@@ -116,23 +115,23 @@
+ "<script src=\"http://a.b.com/3.js\"></script>\n"
+ "<script src=\"http://a.b.com/4.js\"></script>";
String rewritten =
- "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&1=http%3A%2F%2Fa.b.com%2F1.js&2=http%3A%2F%2Fa.b.com%2F2.js\" type=\"text/javascript\"></script>"
+ "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&1=http%3A%2F%2Fa.b.com%2F1.js&2=http%3A%2F%2Fa.b.com%2F2.js\" type=\"text/javascript\"></script>"
+ "<script type=\"text/javascript\"><!-- doSomething --></script>"
- + "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&1=http%3A%2F%2Fa.b.com%2F3.js&2=http%3A%2F%2Fa.b.com%2F4.js\" type=\"text/javascript\"></script>";
+ + "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&1=http%3A%2F%2Fa.b.com%2F3.js&2=http%3A%2F%2Fa.b.com%2F4.js\" type=\"text/javascript\"></script>";
validateRewritten(original, rewritten);
}
public void testDerelativizeHostRelative() {
String original = "<script src=\"/1.js\"></script>";
String rewritten
- = "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&1=http%3A%2F%2Fa.b.com%2F1.js\" type=\"text/javascript\"></script>";
+ = "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&1=http%3A%2F%2Fa.b.com%2F1.js\" type=\"text/javascript\"></script>";
validateRewritten(original, rewritten);
}
public void testDerelativizePathRelative() {
String original = "<script src=\"1.js\"></script>";
String rewritten
- = "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&1=http%3A%2F%2Fa.b.com%2F1.js\" type=\"text/javascript\"></script>";
+ = "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&1=http%3A%2F%2Fa.b.com%2F1.js\" type=\"text/javascript\"></script>";
validateRewritten(original, rewritten);
}
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagRewriterTest.java?rev=663584&r1=663583&r2=663584&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagRewriterTest.java Thu Jun 5 05:30:39 2008
@@ -27,10 +27,9 @@
/**
* Test link rewriting
*/
-public class LinkingTagRewriterTest extends EasyMockTestCase {
+public class LinkingTagRewriterTest extends BaseRewriterTestCase {
private URI dummyUri;
- private URI relativeBase;
private Map<String, HtmlTagTransformer> defaultTransformerMap;
@@ -38,10 +37,8 @@
protected void setUp() throws Exception {
super.setUp();
dummyUri = new URI("http://www.w3c.org");
- relativeBase = new URI("http://a.b.com/");
- LinkingTagRewriter rewriter = new LinkingTagRewriter(
- new ProxyingLinkRewriter("http://www.test.com/proxy?url="),
- relativeBase);
+ URI relativeBase = new URI("http://a.b.com/");
+ LinkingTagRewriter rewriter = new LinkingTagRewriter(defaultRewriter, relativeBase);
defaultTransformerMap = new HashMap<String, HtmlTagTransformer>();
for (String tag : rewriter.getSupportedTags()) {
@@ -64,9 +61,9 @@
String original = "<img src=\"http://a.b.com/img.gif\"></img>\n"
+ "<IMG src=\"http://a.b.com/img.gif\"/>\n"
+ "<eMbeD src=\"http://a.b.com/some.mov\" width=\"100\" height=\"30px\"/>";
- String expected = "<img src=\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fimg.gif\"></img>\n"
- + "<IMG src=\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fimg.gif\"/>\n"
- + "<eMbeD src=\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fsome.mov\" width=\"100\" height=\"30px\"/>";
+ String expected = "<img src=\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fimg.gif&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081\"></img>\n"
+ + "<IMG src=\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fimg.gif&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081\"/>\n"
+ + "<eMbeD src=\"http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com%2Fsome.mov&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081\" width=\"100\" height=\"30px\"/>";
validateRewritten(original, expected);
}
Added: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterTest.java?rev=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterTest.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterTest.java Thu Jun 5 05:30:39 2008
@@ -0,0 +1,57 @@
+/*
+ * 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.rewrite;
+
+/**
+ * Test of proxying rewriter
+ */
+public class ProxyingLinkRewriterTest extends BaseRewriterTestCase {
+
+ private String rewrite(String uri) {
+ return defaultRewriter.rewrite(uri, SPEC_URL);
+ }
+
+ public void testAbsoluteRewrite() {
+ String val = "http://a.b.com";
+ assertEquals("http://www.test.com/proxy?url=http%3A%2F%2Fa.b.com&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081",
+ rewrite(val));
+ }
+
+ public void testHostRelativeRewrite() {
+ String val = "/somepath/test.gif";
+ assertEquals("http://www.test.com/proxy?url=http%3A%2F%2Fexample.org%2Fsomepath%2Ftest.gif&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081",
+ rewrite(val));
+ }
+
+ public void testPathRelativeRewrite() {
+ String val = "test.gif";
+ assertEquals("http://www.test.com/proxy?url=http%3A%2F%2Fexample.org%2Ftest.gif&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081",
+ rewrite(val));
+ }
+
+ public void testLeadingAndTrailingSpace() {
+ String val = " test.gif ";
+ assertEquals("http://www.test.com/proxy?url=http%3A%2F%2Fexample.org%2Ftest.gif&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081",
+ rewrite(val));
+ }
+
+ public void testEmpty() {
+ String val = " ";
+ assertEquals("", rewrite(val));
+ }
+}
Added: incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/feather.png
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/feather.png?rev=663584&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/feather.png
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.css
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.css?rev=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.css (added)
+++ incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.css Thu Jun 5 05:30:39 2008
@@ -0,0 +1,6 @@
+#backgrdiv {
+ background-image: url("feather.png");
+ background-repeat: no-repeat;
+ background-position: 20%;
+ border: 2px red solid;
+}
Added: incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.js?rev=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.js (added)
+++ incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter1.js Thu Jun 5 05:30:39 2008
@@ -0,0 +1 @@
+document.getElementById('jstarget1').innerHTML = "This content was loaded from rewriter1.js";
\ No newline at end of file
Added: incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.css
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.css?rev=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.css (added)
+++ incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.css Thu Jun 5 05:30:39 2008
@@ -0,0 +1,6 @@
+#backgrdiv2 {
+ background-image: url("feather.png");
+ background-repeat: no-repeat;
+ background-position: 20%;
+ border: 2px blue solid;
+}
Added: incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.js?rev=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.js (added)
+++ incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriter2.js Thu Jun 5 05:30:39 2008
@@ -0,0 +1 @@
+document.getElementById('jstarget2').innerHTML= "This content was loaded from rewriter2.js";
\ No newline at end of file
Added: incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteroff.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteroff.xml?rev=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteroff.xml (added)
+++ incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteroff.xml Thu Jun 5 05:30:39 2008
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Module>
+<ModulePrefs title="Rewriter demo"
+ height="250">
+<Optional feature="content-rewrite">
+ <Param name="exclude-urls">.*</Param>
+</Optional>
+</ModulePrefs>
+<Content type="html">
+<![CDATA[
+<style type="text/css"> @import url( http://localhost:8080/gadgets/files/samplecontainer/examples/rewriter/rewriter1.css ); </style>
+<link rel="stylesheet" type="text/css" href="http://localhost:8080/gadgets/files/samplecontainer/examples/rewriter/rewriter2.css"/>
+<p>Demostrates what happens when the rewriter is off</p>
+<div>
+ This is a URL in content that was not rewritten http://www.notrewritten.com
+</div>
+<div id="backgrdiv">
+ This div has a background <br/> image from imported CSS
+</div>
+<div id="backgrdiv2">
+ This div has a background <br/> image from linked CSS
+</div>
+<img id="rewriteimg" src="feather.png" alt="You can read this because without rewrite paths are not resolved relative to the gadget spec on render"/>
+<p id="jstarget1">If you can read this there is a problem</p>
+<p id="jstarget2">If you can read this there is a problem</p>
+<script type="text/javascript" src="http://localhost:8080/gadgets/files/samplecontainer/examples/rewriter/rewriter1.js"></script>
+<script type="text/javascript" src="http://localhost:8080/gadgets/files/samplecontainer/examples/rewriter/rewriter2.js"></script>
+<p>Rendering this gadget will have loaded the resources directly.
+Without the rewriter caching headers have not been set and there are
+more requests because javascript files have not been concatenated</p>
+]]>
+</Content>
+</Module>
Added: incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.html
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.html?rev=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.html (added)
+++ incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.html Thu Jun 5 05:30:39 2008
@@ -0,0 +1,17 @@
+<style type="text/css"> @import url( rewriter1.css ); </style>
+<link rel="stylesheet" type="text/css" href="rewriter2.css"/>
+<p>A simple gadget to demonstrate the content rewriter</p>
+<div>
+ This is a URL in content that was not rewritten http://www.notrewritten.com
+</div>
+<div id="backgrdiv">
+ This div has a background <br/> image from imported CSS
+</div>
+<div id="backgrdiv2">
+ This div has a background <br/> image from linked CSS
+</div>
+<p> This <img id="rewriteimg" src="feather.png" alt="If you can read this there is a problem"/> is an image tag that was rewritten</p>
+<p id="jstarget1">If you can read this there is a problem</p>
+<p id="jstarget2">If you can read this there is a problem</p>
+<script type="text/javascript" src="rewriter1.js"></script>
+<script type="text/javascript" src="rewriter2.js"></script>
Added: incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.xml?rev=663584&view=auto
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.xml (added)
+++ incubator/shindig/trunk/javascript/samplecontainer/examples/rewriter/rewriteron.xml Thu Jun 5 05:30:39 2008
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Module>
+<ModulePrefs title="Rewriter demo"
+ height="250">
+<Require feature="core"/>
+<Require feature="core.io"/>
+<Optional feature="content-rewrite">
+ <Param name="include-urls">.*</Param>
+</Optional>
+</ModulePrefs>
+<Content type="html">
+<![CDATA[
+<style type="text/css"> @import url( rewriter1.css ); </style>
+<link rel="stylesheet" type="text/css" href="rewriter2.css"/>
+<p>A simple gadget to demonstrate the content rewriter</p>
+<div>
+ This is a URL in content that was not rewritten http://www.notrewritten.com
+</div>
+<div id="backgrdiv">
+ This div has a background <br/> image from imported CSS
+</div>
+<div id="backgrdiv2">
+ This div has a background <br/> image from linked CSS
+</div>
+<p> This <img id="rewriteimg" src="feather.png" alt="If you can read this there is a problem"/> is an image tag that was rewritten</p>
+<p id="jstarget1">If you can read this there is a problem</p>
+<p id="jstarget2">If you can read this there is a problem</p>
+<script type="text/javascript" src="rewriter1.js"></script>
+<script type="text/javascript" src="rewriter2.js"></script>
+]]>
+</Content>
+</Module>