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>