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/11/06 23:47:35 UTC

svn commit: r712000 - in /incubator/shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/rewrite/ test/java/org/apache/shindig/gadgets/rewrite/ test/java/org/apache/shindig/gadgets/rewrite/lexer/

Author: lryan
Date: Thu Nov  6 14:47:09 2008
New Revision: 712000

URL: http://svn.apache.org/viewvc?rev=712000&view=rev
Log:
Fix relative link generation in LinkingTagRewriter
Re-work initializtion of DOM rewriters
Simplification of DOM rewriter tests
More thorough DOM vs Lex benchmarking

Added:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureFactory.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriterUtils.java
Removed:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HtmlContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/FeatureBasedRewriterTestBase.java
Modified:
    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/JsTagConcatContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.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/JsTagConcatContentRewriterTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriterTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriterTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/lexer/JavascriptTagMergerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/lexer/LinkingTagRewriterTest.java

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=712000&r1=711999&r2=712000&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 Nov  6 14:47:09 2008
@@ -17,11 +17,10 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
+import com.google.common.collect.Lists;
 import org.apache.shindig.gadgets.spec.Feature;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 
-import com.google.common.collect.Lists;
-
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
@@ -72,7 +71,10 @@
                                 String defaultExclude,
                                 String defaultExpires,
       Set<String> defaultTags) {
-    Feature f = spec.getModulePrefs().getFeatures().get("content-rewrite");
+    Feature f = null;
+    if (spec != null) {
+      f = spec.getModulePrefs().getFeatures().get("content-rewrite");
+    }
     String includeRegex = normalizeParam(defaultInclude, null);
     String excludeRegex = normalizeParam(defaultExclude, null);
 
@@ -195,30 +197,4 @@
     }
     return fingerprint;
   }
-
-  public static class Factory {
-    private final String defaultIncludeUrls;
-    private final String defaultExcludeUrls;
-    private final String defaultExpires;
-    private final Set<String> defaultIncludeTags;
-
-    public Factory(String includeUrls, String excludeUrls, String expires,
-        Set<String> includeTags) {
-      defaultIncludeUrls = includeUrls;
-      defaultExcludeUrls = excludeUrls;
-      defaultExpires = expires;
-      defaultIncludeTags = includeTags;
-    }
-
-    public ContentRewriterFeature get(GadgetSpec spec) {
-      ContentRewriterFeature rewriterFeature =
-        (ContentRewriterFeature)spec.getAttribute("content-rewrite");
-      if (rewriterFeature == null) {
-        rewriterFeature = new ContentRewriterFeature(spec, defaultIncludeUrls,
-            defaultExcludeUrls, defaultExpires, defaultIncludeTags);
-        spec.setAttribute("content-rewrite", rewriterFeature);
-      }
-      return rewriterFeature;
-    }
-  }
 }

Added: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureFactory.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureFactory.java?rev=712000&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureFactory.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureFactory.java Thu Nov  6 14:47:09 2008
@@ -0,0 +1,96 @@
+/*
+ * 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.inject.Inject;
+import com.google.inject.name.Named;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.GadgetSpecFactory;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.spec.GadgetSpec;
+
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Factory for content rewriter features
+ */
+public class ContentRewriterFeatureFactory {
+
+  private final GadgetSpecFactory specFactory;
+  private final String includeUrls;
+  private final String excludeUrls;
+  private final String expires;
+  private final Set<String> includeTags;
+
+  private ContentRewriterFeature defaultFeature;
+
+  @Inject
+  public ContentRewriterFeatureFactory(
+      GadgetSpecFactory specFactory,
+      @Named("shindig.content-rewrite.include-urls")String includeUrls,
+      @Named("shindig.content-rewrite.exclude-urls")String excludeUrls,
+      @Named("shindig.content-rewrite.expires")String expires,
+      @Named("shindig.content-rewrite.include-tags")String includeTags) {
+    this.specFactory = specFactory;
+    this.includeUrls = includeUrls;
+    this.excludeUrls = excludeUrls;
+    this.expires = expires;
+    this.includeTags = new HashSet<String>();
+    for (String s : includeTags.split(",")) {
+      if (s != null && s.trim().length() > 0) {
+        this.includeTags.add(s.trim().toLowerCase());
+      }
+    }
+    defaultFeature = new ContentRewriterFeature(null, includeUrls, excludeUrls, expires,
+        this.includeTags);
+  }
+
+  public ContentRewriterFeature getDefault() {
+    return defaultFeature;
+  }
+
+  public ContentRewriterFeature get(HttpRequest request) {
+    Uri gadgetUri = request.getGadget();
+    GadgetSpec spec;
+    if (gadgetUri != null) {
+      URI gadgetJavaUri = gadgetUri.toJavaUri();
+      try {
+        spec = specFactory.getGadgetSpec(gadgetJavaUri, false);
+        if (spec != null) {
+          return get(spec);
+        }
+      } catch (GadgetException ge) {
+        return defaultFeature;
+      }
+    }
+    return defaultFeature;
+  }
+
+  public ContentRewriterFeature get(GadgetSpec spec) {
+    ContentRewriterFeature rewriterFeature =
+        (ContentRewriterFeature)spec.getAttribute("content-rewriter");
+    if (rewriterFeature != null) return rewriterFeature;
+    rewriterFeature
+        = new ContentRewriterFeature(spec, includeUrls, excludeUrls, expires, includeTags);
+    spec.setAttribute("content-rewriter", rewriterFeature);
+    return rewriterFeature;
+  }
+}

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriter.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriter.java Thu Nov  6 14:47:09 2008
@@ -20,13 +20,14 @@
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.util.Utf8UrlCoder;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.servlet.ProxyBase;
-import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.View;
 import org.w3c.dom.Node;
 
@@ -39,15 +40,15 @@
 
 public class JsTagConcatContentRewriter implements ContentRewriter {
   private final static int MAX_URL_LENGTH = 1500;
-
-  private final ContentRewriterFeature.Factory rewriterFeatureFactory;
-  private final String concatUrlBase;
-
   private static final String DEFAULT_CONCAT_URL_BASE = "/gadgets/concat?";
   private static final HashSet<String> TAG_NAMES = Sets.newHashSet("script");
 
-  public JsTagConcatContentRewriter(ContentRewriterFeature.Factory rewriterFeatureFactory,
-      String concatUrlBase) {
+  private final ContentRewriterFeatureFactory rewriterFeatureFactory;
+  private final String concatUrlBase;
+
+  @Inject
+  public JsTagConcatContentRewriter(ContentRewriterFeatureFactory rewriterFeatureFactory,
+      @Named("shindig.content-rewrite.concat-url")String concatUrlBase) {
     this.rewriterFeatureFactory = rewriterFeatureFactory;
     if (concatUrlBase != null) {
       this.concatUrlBase = concatUrlBase;
@@ -58,28 +59,36 @@
 
   public RewriterResults rewrite(HttpRequest request, HttpResponse original,
       MutableContent content) {
-    // JS Concatenation not supported for HTTP responses at present.
+    if (RewriterUtils.isHtml(request, original)) {
+      ContentRewriterFeature feature = rewriterFeatureFactory.get(request);
+      return rewriteImpl(feature, getJsConcatBase(request.getGadget(), feature),
+          request.getUri(), content);
+    }
     return null;
   }
 
   public RewriterResults rewrite(Gadget gadget, MutableContent content) {
-    ContentRewriterFeature rewriterFeature = rewriterFeatureFactory.get(gadget.getSpec());
-    if (!rewriterFeature.isRewriteEnabled() ||
-        !rewriterFeature.getIncludedTags().contains("script")) {
-      return null;
-    }
-
-    // Get all the script tags
-    List<Node> nodeList =
-        HtmlContentRewriter.getElementsByTagNameCaseInsensitive(content.getDocument(), TAG_NAMES);
-
-
-    String concatBase = getJsConcatBase(gadget.getSpec(), rewriterFeature);
+    ContentRewriterFeature feature = rewriterFeatureFactory.get(gadget.getSpec());
     Uri contentBase = gadget.getSpec().getUrl();
     View view = gadget.getCurrentView();
     if (view != null && view.getHref() != null) {
       contentBase = view.getHref();
     }
+    return rewriteImpl(feature, getJsConcatBase(gadget.getSpec().getUrl(), feature), contentBase,
+        content);
+  }
+
+  protected RewriterResults rewriteImpl(ContentRewriterFeature feature, String concatBase,
+                                        Uri contentBase, MutableContent content) {
+    if (!feature.isRewriteEnabled() ||
+        !feature.getIncludedTags().contains("script") ||
+        content.getDocument() == null) {
+      return null;
+    } 
+
+    // Get all the script tags
+    List<Node> nodeList =
+        RewriterUtils.getElementsByTagNameCaseInsensitive(content.getDocument(), TAG_NAMES);
 
     boolean mutated = false;
     List<Node> concatenateable = new ArrayList<Node>();
@@ -171,12 +180,11 @@
     return concatUris;
   }
 
-  String getJsConcatBase(GadgetSpec spec, ContentRewriterFeature rewriterFeature) {
+  String getJsConcatBase(Uri gadgetUri, ContentRewriterFeature rewriterFeature) {
     return concatUrlBase +
            ProxyBase.REWRITE_MIME_TYPE_PARAM +
            "=text/javascript&" +
-           "gadget=" +
-           Utf8UrlCoder.encode(spec.getUrl().toString()) +
+           ((gadgetUri == null) ? "" : "&gadget=" + Utf8UrlCoder.encode(gadgetUri.toString())) +
            "&fp=" +
            rewriterFeature.getFingerprint() +
            '&';
@@ -189,5 +197,4 @@
     }
     return n;
   }
-
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriter.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriter.java Thu Nov  6 14:47:09 2008
@@ -18,80 +18,83 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import org.w3c.dom.Document;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponse;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
-import org.w3c.dom.traversal.DocumentTraversal;
-import org.w3c.dom.traversal.NodeFilter;
-import org.w3c.dom.traversal.NodeIterator;
 
 import java.net.URI;
-import java.util.*;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class LinkingTagContentRewriter implements ContentRewriter {
+
+  private final static Map<String, Set<String>> SUPPORTED_TAG_ATTRS = Maps.newHashMap();
+
+  static {
+    SUPPORTED_TAG_ATTRS.put("img", Sets.newHashSet("src"));
+    SUPPORTED_TAG_ATTRS.put("embed", Sets.newHashSet("src"));
+    SUPPORTED_TAG_ATTRS.put("link", Sets.newHashSet("href"));
+  }
 
-public class LinkingTagContentRewriter extends HtmlContentRewriter {
-  private final LinkRewriter linkRewriter;
-  private final Map<String, Set<String>> tagAttributeTargets;
-
-  public LinkingTagContentRewriter(LinkRewriter linkRewriter,
-                                   Map<String, Set<String>> attributeTargets) {
-    this.linkRewriter = linkRewriter;
-    if (attributeTargets != null) {
-      this.tagAttributeTargets = attributeTargets;
-    } else {
-      this.tagAttributeTargets = getDefaultTargets();
-    }
+  private final ContentRewriterFeatureFactory rewriterFactory;
+  private String proxyUrl;
+
+  @Inject
+  public LinkingTagContentRewriter(ContentRewriterFeatureFactory rewriterFactory,
+      @Named("shindig.content-rewrite.proxy-url")String proxyUrl) {
+    this.rewriterFactory = rewriterFactory;
+    this.proxyUrl = proxyUrl;
   }
 
-  @Override
-  protected RewriterResults rewrite(Document root, final URI baseUri) {
-    if (linkRewriter == null) {
-      // Sanity test.
-      return null;
-    }
+  public RewriterResults rewrite(HttpRequest request, HttpResponse original, MutableContent content) {
+    return rewriteImpl(rewriterFactory.get(request), content,
+        request.getUri(), request.getGadget());
+  }
+
+  public RewriterResults rewrite(Gadget gadget, MutableContent content) {
+    return rewriteImpl(rewriterFactory.get(gadget.getSpec()), content,
+        gadget.getSpec().getUrl(), gadget.getSpec().getUrl());
+  }
+
+  protected RewriterResults rewriteImpl(ContentRewriterFeature feature, MutableContent content,
+                                        Uri baseUri, Uri gadgetUri) {
+    if (content.getDocument() == null) return null;
+    
     boolean mutated = false;
+    LinkRewriter rewriter = createLinkRewriter(gadgetUri.toJavaUri(), feature);
 
-    if (root instanceof DocumentTraversal) {
-      NodeIterator nodeIterator = ((DocumentTraversal) root)
-          .createNodeIterator(root, NodeFilter.SHOW_ELEMENT,
-              new NodeFilter() {
-                public short acceptNode(Node n) {
-                  Set<String> stringSet = tagAttributeTargets.get(n.getNodeName().toUpperCase());
-                  if (stringSet != null) {
-                    NamedNodeMap attributes = n.getAttributes();
-                    // TODO - Check is NodeMap lookup is case insensitive, if so use that
-                    for (String attribute : stringSet) {
-                      for (int j = 0; j < attributes.getLength(); j++) {
-                        Node attributeNode = attributes.item(j);
-                        if (attributeNode.getNodeName().equalsIgnoreCase(attribute)) {
-                          attributeNode.setNodeValue(linkRewriter.rewrite(
-                              attributeNode.getNodeValue(), baseUri));
-                        }
-                      }
-                    }
-                    return NodeFilter.FILTER_ACCEPT;
-                  } else {
-                    return NodeFilter.FILTER_REJECT;
-                  }
-                }
-              }, false);
-      
-      while (nodeIterator.nextNode() != null) {
-        mutated= true;
+    Set<String> tags = SUPPORTED_TAG_ATTRS.keySet();
+    tags.retainAll(feature.getIncludedTags());
+    List<Node> nodes = RewriterUtils.getElementsByTagNameCaseInsensitive(
+        content.getDocument(), tags);
+
+    for (Node node : nodes) {
+      NamedNodeMap attributes = node.getAttributes();
+      Set<String> rewriteable = SUPPORTED_TAG_ATTRS.get(node.getNodeName().toLowerCase());
+      for (int i = 0; i < attributes.getLength(); i++) {
+        Node attr = attributes.item(i);
+        if (rewriteable.contains(attr.getNodeName().toLowerCase())) {
+          mutated = true;
+          attr.setNodeValue(rewriter.rewrite(attr.getNodeValue(), baseUri.toJavaUri()));
+        }
       }
     }
-
     if (mutated) {
-      MutableContent.notifyEdit(root);
+      MutableContent.notifyEdit(content.getDocument());
     }
 
     return RewriterResults.cacheableIndefinitely();
   }
 
-  private static Map<String, Set<String>> getDefaultTargets() {
-    Map<String, Set<String>> targets = new HashMap<String, Set<String>>();
-    targets.put("IMG", new HashSet<String>(Arrays.asList("src")));
-    targets.put("EMBED", new HashSet<String>(Arrays.asList("src")));
-    targets.put("LINK", new HashSet<String>(Arrays.asList("href")));
-    return targets;
+  protected LinkRewriter createLinkRewriter(URI gadgetUri, ContentRewriterFeature feature) {
+    return new ProxyingLinkRewriter(gadgetUri, feature, proxyUrl);
   }
 }
\ No newline at end of file

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/MutableContent.java Thu Nov  6 14:47:09 2008
@@ -91,6 +91,22 @@
       }
     }
   }
+
+
+  /**
+   * Sets the object's document. Note, this operation
+   * may be done at any time, even after a parse tree node has been retrieved
+   * and modified (though a warning will be emitted in this case).
+   * @param doc New document.
+   */
+  public void setDocument(Document doc) {
+    document = doc;
+    if (editListener != null) {
+      editListener.nodeEdited();
+    } else {
+      editListener = new ContentEditListener();
+    }
+  }
   
   /**
    * Retrieves the object contents in parse tree form, if a
@@ -136,7 +152,7 @@
   }
   
   // Intermediary object tracking edit behavior for the MutableHtmlContent to help maintain
-  // state consistency. GadgetHtmlNode calls nodeEdited whenever a modification
+  // state consistency. Modifiers of doucments call nodeEdited whenever a modification
   // is made to its original source.
   private class ContentEditListener {
     private boolean stringEdited = 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=712000&r1=711999&r2=712000&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 Nov  6 14:47:09 2008
@@ -56,8 +56,7 @@
       if (rewriterFeature.shouldRewriteURL(uri.toString())) {
         String result = prefix
             + Utf8UrlCoder.encode(uri.toString())
-            + "&gadget="
-            + Utf8UrlCoder.encode(gadgetUri.toString())
+            + ((gadgetUri == null) ? "" : "&gadget=" + Utf8UrlCoder.encode(gadgetUri.toString()))
             + "&fp="
             + rewriterFeature.getFingerprint();
         if (rewriterFeature.getExpires() != null) {

Added: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriterUtils.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriterUtils.java?rev=712000&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriterUtils.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriterUtils.java Thu Nov  6 14:47:09 2008
@@ -0,0 +1,78 @@
+/*
+ * 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.Lists;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponse;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.traversal.DocumentTraversal;
+import org.w3c.dom.traversal.NodeFilter;
+import org.w3c.dom.traversal.NodeIterator;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Various utility functions used by rewriters
+ */
+public class RewriterUtils {
+  public static List<Node> getElementsByTagNameCaseInsensitive(Document doc,
+      final Set<String> lowerCaseNames) {
+    final List<Node> result = Lists.newArrayList();
+    NodeIterator nodeIterator = ((DocumentTraversal) doc)
+        .createNodeIterator(doc, NodeFilter.SHOW_ELEMENT,
+            new NodeFilter() {
+              public short acceptNode(Node n) {
+                if (lowerCaseNames.contains(n.getNodeName().toLowerCase())) {
+                  return NodeFilter.FILTER_ACCEPT;
+                }
+                return NodeFilter.FILTER_REJECT;
+              }
+            }, false);
+    for (Node n = nodeIterator.nextNode(); n != null ; n = nodeIterator.nextNode()) {
+      result.add(n);
+    }
+    return result;
+  }
+
+  public static boolean isHtml(HttpRequest request, HttpResponse original) {
+    String mimeType = getMimeType(request, original);
+    return mimeType != null && (mimeType.contains("html"));
+  }
+
+  public static boolean isCss(HttpRequest request, HttpResponse original) {
+    String mimeType = getMimeType(request, original);
+    return mimeType != null && mimeType.contains("css");
+  }
+
+  public static boolean isJavascript(HttpRequest request, HttpResponse original) {
+    String mimeType = getMimeType(request, original);
+    return mimeType != null && mimeType.contains("javascript");
+  }
+
+  public static String getMimeType(HttpRequest request, HttpResponse original) {
+    String mimeType = request.getRewriteMimeType();
+    if (mimeType == null) {
+      mimeType = original.getHeader("Content-Type");
+    }
+    return mimeType != null ? mimeType.toLowerCase() : null;
+  }
+}

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java Thu Nov  6 14:47:09 2008
@@ -19,6 +19,8 @@
 package org.apache.shindig.gadgets.rewrite;
 
 import com.google.common.collect.Sets;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.xml.XmlUtil;
 import org.apache.shindig.gadgets.Gadget;
@@ -32,31 +34,37 @@
 import java.util.List;
 
 public class StyleLinksContentRewriter implements ContentRewriter {
-  // TODO: consider providing helper base class for node-visitor content rewriters
-  private final ContentRewriterFeature.Factory rewriterFeatureFactory;
-  private final LinkRewriter linkRewriter;
+  private final ContentRewriterFeatureFactory rewriterFeatureFactory;
+  private final String proxyUrl;
 
-  public StyleLinksContentRewriter(ContentRewriterFeature.Factory rewriterFeatureFactory,
-      LinkRewriter linkRewriter) {
+  @Inject
+  public StyleLinksContentRewriter(ContentRewriterFeatureFactory rewriterFeatureFactory,
+      @Named("shindig.content-rewrite.proxy-url")String proxyUrl) {
     this.rewriterFeatureFactory = rewriterFeatureFactory;
-    this.linkRewriter = linkRewriter;
+    this.proxyUrl = proxyUrl;
   }
 
   public RewriterResults rewrite(HttpRequest request, HttpResponse original,
       MutableContent content) {
-    String mimeType = HtmlContentRewriter.getMimeType(request, original);
-    if (mimeType.contains("html")) {
-      rewriteHtml(content.getDocument(), request.getUri().toJavaUri());
-    } else if (mimeType.contains("css")) {
-      content.setContent(rewriteCss(content.getContent(), request.getUri().toJavaUri()));
+    ContentRewriterFeature rewriterFeature = rewriterFeatureFactory.get(request);
+    if (!rewriterFeature.isRewriteEnabled() ||
+        !rewriterFeature.getIncludedTags().contains("style")) {
+      return null;
+    }
+
+    if (RewriterUtils.isHtml(request, original)) {
+      rewriteHtml(content.getDocument(), request.getUri().toJavaUri(),
+          createLinkRewriter(request.getGadget().toJavaUri(), rewriterFeature));
+    } else if (RewriterUtils.isCss(request, original)) {
+      content.setContent(rewriteCss(content.getContent(), request.getUri().toJavaUri(),
+          createLinkRewriter(request.getGadget().toJavaUri(), rewriterFeature)));
     }
     return RewriterResults.cacheableIndefinitely();
   }
 
   public RewriterResults rewrite(Gadget gadget, MutableContent content) {
     ContentRewriterFeature rewriterFeature = rewriterFeatureFactory.get(gadget.getSpec());
-    if (linkRewriter == null ||
-        !rewriterFeature.isRewriteEnabled() ||
+    if (!rewriterFeature.isRewriteEnabled() ||
         !rewriterFeature.getIncludedTags().contains("style")) {
       return null;
     }
@@ -67,10 +75,15 @@
       base = view.getHref();
     }
 
-    return rewriteHtml(content.getDocument(), base.toJavaUri());
+    return rewriteHtml(content.getDocument(), base.toJavaUri(),
+        createLinkRewriter(gadget.getSpec().getUrl().toJavaUri(), rewriterFeature));
+  }
+
+  protected LinkRewriter createLinkRewriter(URI gadgetUri, ContentRewriterFeature feature) {
+    return new ProxyingLinkRewriter(gadgetUri, feature, proxyUrl);
   }
 
-  private RewriterResults rewriteHtml(Document doc, URI baseUri) {
+  private RewriterResults rewriteHtml(Document doc, URI baseUri, LinkRewriter linkRewriter) {
     if (doc == null) {
       return null;
     }
@@ -85,7 +98,7 @@
 
     // Move all style tags into head
     // TODO Convert all @imports into a concatenated link tag
-    List<Node> styleTags = HtmlContentRewriter.getElementsByTagNameCaseInsensitive(doc,
+    List<Node> styleTags = RewriterUtils.getElementsByTagNameCaseInsensitive(doc,
         Sets.newHashSet("style"));
     for (Node styleNode : styleTags) {      
       mutated = true;
@@ -93,7 +106,7 @@
         styleNode.getParentNode().removeChild(styleNode);
         head.appendChild(styleNode);
       }
-      styleNode.setTextContent(rewriteCss(styleNode.getTextContent(), baseUri));
+      styleNode.setTextContent(rewriteCss(styleNode.getTextContent(), baseUri, linkRewriter));
     }
 
     if (mutated) {
@@ -102,7 +115,7 @@
     return RewriterResults.cacheableIndefinitely();
   }
 
-  private String rewriteCss(String styleText, URI baseUri) {
+  private String rewriteCss(String styleText, URI baseUri, LinkRewriter linkRewriter) {
     return CssRewriter.rewrite(styleText, baseUri, linkRewriter);
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java Thu Nov  6 14:47:09 2008
@@ -17,39 +17,52 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.EasyMockTestCase;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
+import org.apache.shindig.gadgets.parse.ParseModule;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 
-import com.google.common.collect.Sets;
-
-import org.apache.commons.lang.StringUtils;
-
+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.parse("http://example.org/g.xml");
+  public static final Uri SPEC_URL = Uri.parse("http://example.org/dir/g.xml");
+  public static final String DEFAULT_PROXY_BASE = "http://www.test.com/dir/proxy?url=";
+
   protected Set<String> tags;
-  protected ContentRewriterFeature contentRewriterFeature;
-  protected LinkRewriter defaultRewriter;
+  protected ContentRewriterFeature defaultRewriterFeature;
+  protected ContentRewriterFeatureFactory rewriterFeatureFactory;
+  protected LinkRewriter defaultLinkRewriter;
+  protected GadgetHtmlParser parser;
+  protected Injector injector;
 
   @Override
   protected void setUp() throws Exception {
     super.setUp();
-    tags = Sets.newHashSet("embed", "img", "script", "link");
-    contentRewriterFeature = new ContentRewriterFeature(getSpecWithoutRewrite(), ".*", "", "HTTP",
-        tags);
-    defaultRewriter = new ProxyingLinkRewriter(
+    rewriterFeatureFactory = new ContentRewriterFeatureFactory(null, ".*", "", "HTTP",
+        "embed,img,script,link,style");
+    defaultRewriterFeature = rewriterFeatureFactory.getDefault();
+    tags = defaultRewriterFeature.getIncludedTags();
+    defaultLinkRewriter = new ProxyingLinkRewriter(
       SPEC_URL.toJavaUri(),
-      contentRewriterFeature,
-      "http://www.test.com/proxy?url=");
+        defaultRewriterFeature,
+        DEFAULT_PROXY_BASE);
+    injector = Guice.createInjector(new ParseModule());
+    parser = injector.getInstance(GadgetHtmlParser.class);
   }
 
-  protected GadgetSpec getSpecWithRewrite(String include, String exclude, String expires,
+  public static GadgetSpec createSpecWithRewrite(String include, String exclude, String expires,
       Set<String> tags) throws GadgetException {
     String xml = "<Module>" +
                  "<ModulePrefs title=\"title\">" +
@@ -65,7 +78,7 @@
     return new GadgetSpec(SPEC_URL, xml);
   }
 
-  protected GadgetSpec getSpecWithoutRewrite() throws GadgetException {
+  public static GadgetSpec createSpecWithoutRewrite() throws GadgetException {
     String xml = "<Module>" +
                  "<ModulePrefs title=\"title\">" +
                  "</ModulePrefs>" +
@@ -73,4 +86,64 @@
                  "</Module>";
     return new GadgetSpec(SPEC_URL, xml);
   }
+
+  ContentRewriterFeatureFactory mockContentRewriterFeatureFactory(
+      ContentRewriterFeature feature) {
+    return new FakeRewriterFeatureFactory(feature);
+  }
+
+  String rewriteHelper(ContentRewriter rewriter, String s)
+      throws Exception {
+    MutableContent mc = rewriteContent(rewriter, s);
+    String rewrittenContent = mc.getContent();
+
+    // Strip around the HTML tags for convenience
+    int htmlTagIndex = rewrittenContent.indexOf("<HTML>");
+    if (htmlTagIndex != -1) {
+      return rewrittenContent.substring(htmlTagIndex + 6,
+          rewrittenContent.lastIndexOf("</HTML>"));
+    }
+    return rewrittenContent;
+  }
+
+  MutableContent rewriteContent(ContentRewriter rewriter, String s)
+      throws Exception {
+    MutableContent mc = new MutableContent(parser);
+    mc.setContent(s);
+
+    GadgetSpec spec = new GadgetSpec(SPEC_URL,
+        "<Module><ModulePrefs title=''/><Content><![CDATA[" + s + "]]></Content></Module>");
+
+    GadgetContext context = new GadgetContext() {
+      @Override
+      public URI getUrl() {
+        return SPEC_URL.toJavaUri();
+      }
+    };
+
+    Gadget gadget = new Gadget()
+        .setContext(context)
+        .setSpec(spec);
+    rewriter.rewrite(gadget, mc);
+    return mc;
+  }
+
+  private static class FakeRewriterFeatureFactory extends ContentRewriterFeatureFactory {
+    private final ContentRewriterFeature feature;
+
+    public FakeRewriterFeatureFactory(ContentRewriterFeature feature) {
+      super(null, ".*", "", "HTTP", "");
+      this.feature = feature;
+    }
+
+    @Override
+    public ContentRewriterFeature get(GadgetSpec spec) {
+      return feature;
+    }
+
+    @Override
+    public ContentRewriterFeature get(HttpRequest request) {
+      return feature;
+    }
+  }
 }

Modified: 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=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java Thu Nov  6 14:47:09 2008
@@ -27,89 +27,89 @@
 public class ContentRewriterFeatureTestCase extends BaseRewriterTestCase {
 
   public void testContainerDefaultIncludeAll() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(getSpecWithoutRewrite(), ".*", "", "0", tags);
-    assertTrue(contentRewriterFeature.isRewriteEnabled());
-    assertTrue(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithoutRewrite(), ".*", "", "0", tags);
+    assertTrue(defaultRewriterFeature.isRewriteEnabled());
+    assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   public void testContainerDefaultIncludeNone() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(getSpecWithoutRewrite(), "", ".*", "0", tags);
-    assertFalse(contentRewriterFeature.isRewriteEnabled());
-    assertFalse(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithoutRewrite(), "", ".*", "0", tags);
+    assertFalse(defaultRewriterFeature.isRewriteEnabled());
+    assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   public void testContainerDefaultExcludeOverridesInclude() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(getSpecWithoutRewrite(), ".*", ".*", "0",
+    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithoutRewrite(), ".*", ".*", "0",
         tags);
-    assertFalse(contentRewriterFeature.isRewriteEnabled());
-    assertFalse(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+    assertFalse(defaultRewriterFeature.isRewriteEnabled());
+    assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   public void testSpecExcludeOverridesContainerDefaultInclude() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(getSpecWithRewrite("", ".*", "0", tags), ".*",
+    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite("", ".*", "0", tags), ".*",
         "", "0", tags);
-    assertFalse(contentRewriterFeature.isRewriteEnabled());
-    assertFalse(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+    assertFalse(defaultRewriterFeature.isRewriteEnabled());
+    assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   public void testSpecIncludeOverridesContainerDefaultExclude() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(getSpecWithRewrite(".*", "", "0", tags), "",
+    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(".*", "", "0", tags), "",
         ".*", "0", tags);
-    assertTrue(contentRewriterFeature.isRewriteEnabled());
-    assertTrue(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+    assertTrue(defaultRewriterFeature.isRewriteEnabled());
+    assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   public void testExcludeOverridesInclude() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(
-        getSpecWithRewrite("test\\.com", "test", "0", tags), "", "", "0", tags);
-    assertTrue(contentRewriterFeature.isRewriteEnabled());
-    assertFalse(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
+    defaultRewriterFeature = new ContentRewriterFeature(
+        createSpecWithRewrite("test\\.com", "test", "0", tags), "", "", "0", tags);
+    assertTrue(defaultRewriterFeature.isRewriteEnabled());
+    assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   public void testIncludeOnlyMatch() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(
-        getSpecWithRewrite("test\\.com", "testx", "0", tags), "", "", "0", tags);
-    assertTrue(contentRewriterFeature.isRewriteEnabled());
-    assertTrue(contentRewriterFeature.shouldRewriteURL("http://www.test.com"));
-    assertFalse(contentRewriterFeature.shouldRewriteURL("http://testx.test.com"));
+    defaultRewriterFeature = new ContentRewriterFeature(
+        createSpecWithRewrite("test\\.com", "testx", "0", tags), "", "", "0", tags);
+    assertTrue(defaultRewriterFeature.isRewriteEnabled());
+    assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
+    assertFalse(defaultRewriterFeature.shouldRewriteURL("http://testx.test.com"));
   }
 
   public void testTagRewrite() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(
-        getSpecWithRewrite("test\\.com", "testx", "0", tags), "", "", "0", tags);
-    assertFalse(contentRewriterFeature.shouldRewriteTag("IFRAME"));
-    assertTrue(contentRewriterFeature.shouldRewriteTag("img"));
-    assertTrue(contentRewriterFeature.shouldRewriteTag("ScripT"));
+    defaultRewriterFeature = new ContentRewriterFeature(
+        createSpecWithRewrite("test\\.com", "testx", "0", tags), "", "", "0", tags);
+    assertFalse(defaultRewriterFeature.shouldRewriteTag("IFRAME"));
+    assertTrue(defaultRewriterFeature.shouldRewriteTag("img"));
+    assertTrue(defaultRewriterFeature.shouldRewriteTag("ScripT"));
   }
 
   public void testOverrideTagRewrite() throws Exception {
     Set<String> newTags = Sets.newHashSet("iframe");
-    contentRewriterFeature = new ContentRewriterFeature(
-        getSpecWithRewrite("test\\.com", "testx", "0", newTags), "", "", "0", tags);
-    assertTrue(contentRewriterFeature.shouldRewriteTag("IFRAME"));
-    assertFalse(contentRewriterFeature.shouldRewriteTag("img"));
-    assertFalse(contentRewriterFeature.shouldRewriteTag("ScripT"));
-    assertFalse(contentRewriterFeature.shouldRewriteTag("link"));
+    defaultRewriterFeature = new ContentRewriterFeature(
+        createSpecWithRewrite("test\\.com", "testx", "0", newTags), "", "", "0", tags);
+    assertTrue(defaultRewriterFeature.shouldRewriteTag("IFRAME"));
+    assertFalse(defaultRewriterFeature.shouldRewriteTag("img"));
+    assertFalse(defaultRewriterFeature.shouldRewriteTag("ScripT"));
+    assertFalse(defaultRewriterFeature.shouldRewriteTag("link"));
   }
 
   public void testExpiresTimeParse() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(
-        getSpecWithRewrite("test\\.com", "testx", "12345", tags), "", "", "0", tags);
-    assertNotNull(contentRewriterFeature.getExpires());
-    assertNotNull(contentRewriterFeature.getExpires() == 12345);
+    defaultRewriterFeature = new ContentRewriterFeature(
+        createSpecWithRewrite("test\\.com", "testx", "12345", tags), "", "", "0", tags);
+    assertNotNull(defaultRewriterFeature.getExpires());
+    assertNotNull(defaultRewriterFeature.getExpires() == 12345);
   }
 
   public void testExpiresHTTPParse() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(
-        getSpecWithRewrite("test\\.com", "testx", "htTp ", tags), "", "", "12345", tags);
-    assertNull(contentRewriterFeature.getExpires());
+    defaultRewriterFeature = new ContentRewriterFeature(
+        createSpecWithRewrite("test\\.com", "testx", "htTp ", tags), "", "", "12345", tags);
+    assertNull(defaultRewriterFeature.getExpires());
   }
 
   public void testExpiresInvalidParse() throws Exception {
-    contentRewriterFeature = new ContentRewriterFeature(
-        getSpecWithRewrite("test\\.com", "testx", "junk", tags), "", "", "12345", tags);
-    assertNotNull(contentRewriterFeature.getExpires());
-    assertNotNull(contentRewriterFeature.getExpires() == 12345);
+    defaultRewriterFeature = new ContentRewriterFeature(
+        createSpecWithRewrite("test\\.com", "testx", "junk", tags), "", "", "12345", tags);
+    assertNotNull(defaultRewriterFeature.getExpires());
+    assertNotNull(defaultRewriterFeature.getExpires() == 12345);
   }
 
 }

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=712000&r1=711999&r2=712000&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 Nov  6 14:47:09 2008
@@ -38,7 +38,7 @@
   }
 
   private void validateRewritten(String content, String expected) {
-    validateRewritten(content, dummyUri, defaultRewriter, expected);
+    validateRewritten(content, dummyUri, defaultLinkRewriter, expected);
   }
 
   public void testUrlDeclarationRewrite() {
@@ -46,8 +46,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&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}";
+        "div {list-style-image:url(\"http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com%2Fbullet.gif&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334\");list-style-position:outside;margin:5px;padding:0}\n" +
+         ".someid {background-image:url(\"http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com%2Fbigimg.png&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334\");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/JsTagConcatContentRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriterTest.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriterTest.java Thu Nov  6 14:47:09 2008
@@ -18,34 +18,15 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.apache.shindig.common.uri.Uri;
-import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
-import org.apache.shindig.gadgets.parse.ParseModule;
-import org.apache.shindig.gadgets.spec.GadgetSpec;
-import static org.easymock.EasyMock.expect;
-import org.easymock.classextension.EasyMock;
-import static org.easymock.classextension.EasyMock.replay;
-import org.w3c.dom.Document;
-
-public class JsTagConcatContentRewriterTest extends FeatureBasedRewriterTestBase {
+public class JsTagConcatContentRewriterTest extends BaseRewriterTestCase {
   private JsTagConcatContentRewriter rewriter;
   private String concatBase;
-  private GadgetHtmlParser htmlParser;
 
   @Override
   protected void setUp() throws Exception {
     super.setUp();
-    ContentRewriterFeature jsFeature = makeFeature("script");
-    Injector injector = Guice.createInjector(new ParseModule());
-    htmlParser = injector.getInstance(GadgetHtmlParser.class);
-    ContentRewriterFeature.Factory factory = mockContentRewriterFeatureFactory(jsFeature);
-    rewriter = new JsTagConcatContentRewriter(factory, null);
-    GadgetSpec spec = EasyMock.createNiceMock(GadgetSpec.class);
-    expect(spec.getUrl()).andReturn(Uri.fromJavaUri(baseUri)).anyTimes();
-    replay(spec);
-    concatBase = rewriter.getJsConcatBase(spec, jsFeature);
+    rewriter = new JsTagConcatContentRewriter(rewriterFeatureFactory, DEFAULT_PROXY_BASE);
+    concatBase = rewriter.getJsConcatBase(SPEC_URL, defaultRewriterFeature);
   }
 
   public void testJSMergePreserveNoExternal() throws Exception {
@@ -53,16 +34,14 @@
         + "doSomething\n"
         + "</script>";
 
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(rewritten, s);
   }
 
   public void testJSMergePreserveNoScript() throws Exception {
     String s
         = "<DIV id=\"test\">ceci ne pas une script</DIV>";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(rewritten, s);
   }
 
@@ -70,16 +49,14 @@
     String s = "<script>" +
         "<!--\ndoSomething\n-->" +
         "</script>";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(rewritten, s);
   }
 
   public void testJSMergeSingleScriptReWrite() throws Exception {
     String s = "<script src=\"http://a.b.com/1.js\"></script>";
     String expected = "<script src=\"" + concatBase + "1=http%3A%2F%2Fa.b.com%2F1.js\"></script>";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(rewritten, expected);
   }
 
@@ -88,8 +65,7 @@
         + "<script src=\"http://a.b.com/2.js\"></script>";
     String expected
         = "<script src=\"" + concatBase + "1=http%3A%2F%2Fa.b.com%2F1.js&2=http%3A%2F%2Fa.b.com%2F2.js\"></script>";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(rewritten, expected);
   }
 
@@ -109,8 +85,7 @@
         + "<script>\n"
         + "doSomething\n"
         + "</script>";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(rewritten, expected);
   }
 
@@ -124,26 +99,23 @@
         "<script src=\"" + concatBase + "1=http%3A%2F%2Fa.b.com%2F1.js&2=http%3A%2F%2Fa.b.com%2F2.js\"></script>" +
         "<script><!-- doSomething --></script>" +
         "<script src=\"" + concatBase + "1=http%3A%2F%2Fa.b.com%2F3.js&2=http%3A%2F%2Fa.b.com%2F4.js\"></script>";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(expected, rewritten);
   }
 
   public void testJSMergeDerelativizeHostRelative() throws Exception {
     String s = "<script src=\"/1.js\"></script>";
     String expected
-        = "<script src=\"" + concatBase + "1=http%3A%2F%2Fgadget.org%2F1.js\"></script>";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+        = "<script src=\"" + concatBase + "1=http%3A%2F%2Fexample.org%2F1.js\"></script>";
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(rewritten, expected);
   }
 
   public void testJSMergeDerelativizePathRelative() throws Exception {
     String s = "<script src=\"1.js\"></script>";
     String expected
-        = "<script src=\"" + concatBase + "1=http%3A%2F%2Fgadget.org%2Fdir%2F1.js\"></script>";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+        = "<script src=\"" + concatBase + "1=http%3A%2F%2Fexample.org%2Fdir%2F1.js\"></script>";
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(rewritten, expected);
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LexerVsDomRewriteBenchmark.java Thu Nov  6 14:47:09 2008
@@ -18,22 +18,28 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
+import com.google.inject.Guice;
+import com.google.inject.Injector;
 import org.apache.commons.io.IOUtils;
+import org.apache.shindig.common.PropertiesModule;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.DefaultGuiceModule;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.oauth.OAuthModule;
 import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
-import org.apache.shindig.gadgets.parse.HtmlSerializer;
 import org.apache.shindig.gadgets.parse.ParseModule;
 import org.apache.shindig.gadgets.parse.caja.CajaHtmlParser;
 import org.apache.shindig.gadgets.parse.nekohtml.NekoHtmlParser;
 import org.apache.shindig.gadgets.parse.nekohtml.NekoSimplifiedHtmlParser;
-import org.apache.shindig.gadgets.rewrite.lexer.HtmlRewriter;
+import org.apache.shindig.gadgets.rewrite.lexer.DefaultContentRewriter;
 import org.apache.shindig.gadgets.rewrite.lexer.HtmlTagTransformer;
-import org.apache.shindig.gadgets.rewrite.lexer.LinkingTagRewriter;
+import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.w3c.dom.Document;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.net.URI;
-import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -55,10 +61,14 @@
 
   // Caja lexer
   private Map<String, HtmlTagTransformer> defaultTransformerMap;
-  private URI dummyUri;
 
-  private LinkingTagContentRewriter domRewriter;
+  private LinkingTagContentRewriter linkRewriter;
+  private JsTagConcatContentRewriter jsConcatRewriter;
+  private StyleLinksContentRewriter styleLinksRewriter;
   private boolean warmup;
+  private ContentRewriterFeatureFactory factory;
+  private DefaultContentRewriter lexerRewriter;
+  private Gadget gadget;
 
   private LexerVsDomRewriteBenchmark(String file, int numRuns) throws Exception {
     File inputFile = new File(file);
@@ -67,27 +77,35 @@
       System.exit(1);
     }
 
-     LinkRewriter linkRewriter = new LinkRewriter() {
-      public String rewrite(String link, URI context) {
-        return link;
-      }
-    };
+    Injector injector = Guice.createInjector(new PropertiesModule(), new OAuthModule(),
+        new DefaultGuiceModule());
 
     // Lexer setup
-    dummyUri = new URI("http://www.w3c.org");
-    URI relativeBase = new URI("http://a.b.com/");
-    LinkingTagRewriter lexerRewriter = new LinkingTagRewriter(
-        linkRewriter, new URI("http://a.b.com/"));
-    defaultTransformerMap = new HashMap<String, HtmlTagTransformer>();
-    for (String tag : lexerRewriter.getSupportedTags()) {
-      defaultTransformerMap .put(tag, lexerRewriter);
-    }
+    lexerRewriter = injector.getInstance(DefaultContentRewriter.class);
     // End lexer setup
 
     // DOM setup
-    domRewriter = new LinkingTagContentRewriter(linkRewriter, null);
+    this.linkRewriter = injector.getInstance(LinkingTagContentRewriter.class);
+    this.jsConcatRewriter = injector.getInstance(JsTagConcatContentRewriter.class);
+    this.styleLinksRewriter = injector.getInstance(StyleLinksContentRewriter.class);
+    factory = injector.getInstance(ContentRewriterFeatureFactory.class);
     // End DOM setup
 
+    final Uri url = Uri.parse("http://www.example.org/dummy.xml");
+    GadgetSpec spec = new GadgetSpec(url,
+        "<Module><ModulePrefs title=''/><Content><![CDATA[]]></Content></Module>");
+
+    GadgetContext context = new GadgetContext() {
+      @Override
+      public URI getUrl() {
+        return url.toJavaUri();
+      }
+    };
+
+    gadget = new Gadget()
+        .setContext(context)
+        .setSpec(spec);
+
     content = new String(IOUtils.toByteArray(new FileInputStream(file)));
     this.numRuns = numRuns;
     warmup = true;
@@ -95,6 +113,7 @@
     //run(cajaParser);
     run(nekoParser);
     run(nekoSimpleParser);
+    runNoParse(nekoSimpleParser);
     Thread.sleep(5000L);
     warmup = false;
     System.out.println("Lexer------");
@@ -105,6 +124,10 @@
     run(nekoParser);
     System.out.println("NekoSimple-------");
     run(nekoSimpleParser);
+    System.out.println("No-Parse rewrite full DOM-------");
+    runNoParse(nekoParser);
+    System.out.println("No-Parse rewrite simple DOM-------");
+    runNoParse(nekoSimpleParser);
   }
 
   private void output(String content) {
@@ -116,7 +139,10 @@
   private void runLexer() throws Exception {
    long startTime = System.currentTimeMillis();
     for (int i = 0; i < numRuns; i++) {
-      HtmlRewriter.rewrite(content, dummyUri, defaultTransformerMap);
+      MutableContent mc = new MutableContent(null);
+      mc.setContent(content);
+      lexerRewriter.rewrite(gadget, mc);
+      mc.getContent();
     }
     long time = System.currentTimeMillis() - startTime;
     output("Lexer Rewrite [" + time + " ms total: " +
@@ -126,9 +152,12 @@
   private void run(GadgetHtmlParser parser) throws Exception {
     long startTime = System.currentTimeMillis();
     for (int i = 0; i < numRuns; i++) {
-      Document document = parser.parseDom(content);
-      domRewriter.rewrite(document, dummyUri);
-      HtmlSerializer.serialize(document);
+      MutableContent mc = new MutableContent(parser);
+      mc.setContent(content);
+      linkRewriter.rewrite(gadget, mc);
+      jsConcatRewriter.rewrite(gadget, mc);
+      styleLinksRewriter.rewrite(gadget, mc);
+      mc.getContent();
     }
     long time = System.currentTimeMillis() - startTime;
     output("DOM Rewrite [" + time + " ms total: " +
@@ -136,6 +165,23 @@
 
   }
 
+  private void runNoParse(GadgetHtmlParser parser) throws Exception {
+    Document doc = parser.parseDom(content);
+    long startTime = System.currentTimeMillis();
+    for (int i = 0; i < numRuns; i++) {
+      MutableContent mc = new MutableContent(parser);
+      mc.setDocument((Document)doc.cloneNode(true));
+      linkRewriter.rewrite(gadget, mc);
+      jsConcatRewriter.rewrite(gadget, mc);
+      styleLinksRewriter.rewrite(gadget, mc);
+      mc.getContent();
+    }
+    long time = System.currentTimeMillis() - startTime;
+    output("DOM no-parse Rewrite [" + time + " ms total: " +
+          ((double)time)/numRuns + "ms/run]");
+
+  }
+
 
   public static void main(String[] args) {
     // Test can be run as standalone program to test out serialization and parsing

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriterTest.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/LinkingTagContentRewriterTest.java Thu Nov  6 14:47:09 2008
@@ -18,32 +18,27 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
-import org.apache.shindig.gadgets.parse.ParseModule;
-import org.w3c.dom.Document;
-
 import java.net.URI;
 
-public class LinkingTagContentRewriterTest extends FeatureBasedRewriterTestBase {
+public class LinkingTagContentRewriterTest extends BaseRewriterTestCase {
   private LinkingTagContentRewriter rewriter;
-  private GadgetHtmlParser htmlParser;
   
   private static final String LINK_PREFIX = "px-";
 
   @Override
   protected void setUp() throws Exception {
     super.setUp();
-    Injector injector = Guice.createInjector(new ParseModule());
-    htmlParser = injector.getInstance(GadgetHtmlParser.class);
-    LinkRewriter pfxLinkRewriter = new LinkRewriter() {
-      public String rewrite(String uri, URI context) {
-        // Just prefixes with LINK_PREFIX
-        return LINK_PREFIX + uri;
+    rewriter = new LinkingTagContentRewriter(rewriterFeatureFactory, DEFAULT_PROXY_BASE) {
+      @Override
+      protected LinkRewriter createLinkRewriter(URI gadgetUri, ContentRewriterFeature feature) {
+        return new LinkRewriter() {
+          public String rewrite(String uri, URI context) {
+            // Just prefixes with LINK_PREFIX
+            return LINK_PREFIX + uri;
+          }
+        };
       }
     };
-    rewriter = new LinkingTagContentRewriter(pfxLinkRewriter, null);
   }
   
   public void testLinkingTagStandardRewrite() throws Exception {
@@ -55,21 +50,14 @@
         + "<img src=\"" + LINK_PREFIX + "http://a.b.com/img2.gif\">"
         + "<embed src=\"" + LINK_PREFIX + "http://a.b.com/some.mov\"></embed>"
         + "<link href=\"" + LINK_PREFIX + "http://a.b.com/link.html\">";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(rewriter, s, document);
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(rewritten, expected);
   }
+
   
-  public void testLinkingTagIgnoredWithNoRewriter() throws Exception {
-    String s = "<img src=\"http://a.b.com/img.gif\"></img>";
-    Document document = htmlParser.parseDom(s);
-    String rewritten = rewriteHelper(new LinkingTagContentRewriter(null, null), s, document);
-    assertEquals(s, rewritten);
-  }
-  
-  public void testLinkingTagIgnoredWithBadParse() throws Exception {
+  public void testLinkingTagWithBadParse() throws Exception {
     String s = "<img src=\"http://a.b.com/img.gif></img>";
-    String rewritten = rewriteHelper(rewriter, s, null);
+    String rewritten = rewriteHelper(rewriter, s);
     assertEquals(s, rewritten);  // null = couldn't parse
   }
 }

Modified: 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=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterTest.java Thu Nov  6 14:47:09 2008
@@ -25,43 +25,43 @@
 public class ProxyingLinkRewriterTest extends BaseRewriterTestCase {
 
   private String rewrite(String uri) {
-    return defaultRewriter.rewrite(uri, SPEC_URL.toJavaUri());
+    return defaultLinkRewriter.rewrite(uri, SPEC_URL.toJavaUri());
   }
 
   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",
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334",
         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",
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fexample.org%2Fsomepath%2Ftest.gif&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334",
         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",
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fexample.org%2Fdir%2Ftest.gif&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334",
         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",
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fexample.org%2Fdir%2Ftest.gif&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334",
         rewrite(val));
   }
 
   public void testWithRefresh() throws Exception {
     ContentRewriterFeature contentRewriterFeature = new ContentRewriterFeature(
-        getSpecWithoutRewrite(), ".*", "", "86400",
-        Sets.newHashSet("embed", "img", "script", "link"));
+        createSpecWithoutRewrite(), ".*", "", "86400",
+        Sets.newHashSet("embed", "img", "script", "link", "style"));
     ProxyingLinkRewriter rewriter = new ProxyingLinkRewriter(
       SPEC_URL.toJavaUri(),
       contentRewriterFeature,
-      "http://www.test.com/proxy?url=");
+        DEFAULT_PROXY_BASE);
     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&refresh=86400",
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fexample.org%2Fdir%2Ftest.gif&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334&refresh=86400",
         rewriter.rewrite(val, SPEC_URL.toJavaUri()));
   }
 

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriterTest.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriterTest.java Thu Nov  6 14:47:09 2008
@@ -19,37 +19,27 @@
 package org.apache.shindig.gadgets.rewrite;
 
 import com.google.common.collect.Sets;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
-import org.apache.shindig.gadgets.parse.ParseModule;
-import org.w3c.dom.Document;
 
 import java.net.URI;
 
-public class StyleLinksContentRewriterTest extends FeatureBasedRewriterTestBase {
-  private LinkRewriter pfxLinkRewriter;
-  private ContentRewriterFeature styleFeature;
+public class StyleLinksContentRewriterTest extends BaseRewriterTestCase {
   private StyleLinksContentRewriter rewriter;
   
   private static final String LINK_PREFIX = "px-";
 
-  private GadgetHtmlParser htmlParser;
-
   @Override
   protected void setUp() throws Exception {
     super.setUp();
-    Injector injector = Guice.createInjector(new ParseModule());
-    htmlParser = injector.getInstance(GadgetHtmlParser.class);
-    pfxLinkRewriter = new LinkRewriter() {
-      public String rewrite(String uri, URI context) {
-        // Just prefixes with LINK_PREFIX
-        return LINK_PREFIX + uri;
+    rewriter = new StyleLinksContentRewriter(rewriterFeatureFactory, DEFAULT_PROXY_BASE) {
+      protected LinkRewriter createLinkRewriter(URI gadgetUri, ContentRewriterFeature feature) {
+        return new LinkRewriter() {
+          public String rewrite(String uri, URI context) {
+            // Just prefixes with LINK_PREFIX
+            return LINK_PREFIX + uri;
+          }
+        };
       }
     };
-    styleFeature = makeFeature("style");
-    ContentRewriterFeature.Factory factory = mockContentRewriterFeatureFactory(styleFeature);
-    rewriter = new StyleLinksContentRewriter(factory, pfxLinkRewriter);
   }
   
   public void testStyleTagRewrites() throws Exception {
@@ -58,46 +48,27 @@
       ".someid {background-image:url(http://a.b.com/bigimg.png);float:right;width:165px;height:23px;margin-top:4px;margin-left:5px}";
     String s = "<style>" + css + "</style>";
 
-    Document document = htmlParser.parseDom(s);
-
     String rewritten =
       "div {list-style-image:url(\"" + LINK_PREFIX + "http://a.b.com/bullet.gif\");list-style-position:outside;margin:5px;padding:0}\n" +
       ".someid {background-image:url(\"" + LINK_PREFIX + "http://a.b.com/bigimg.png\");float:right;width:165px;height:23px;margin-top:4px;margin-left:5px}";
     // Rewrite, document is mutated in-place
-    rewriteHelper(rewriter, s, document);
+    MutableContent content = rewriteContent(rewriter, s);
     assertEquals(rewritten,
-        HtmlContentRewriter.getElementsByTagNameCaseInsensitive(document,
+        RewriterUtils.getElementsByTagNameCaseInsensitive(content.getDocument(),
             Sets.newHashSet("style")).get(0).getTextContent());
   }
   
-  public void testStyleTagRewritesIgnoredOnBadParse() throws Exception {
-    String css = 
-      "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 s = "<style>" + css + "</style";
-    assertEquals(s, rewriteHelper(rewriter, s, null));
-  }
-  
   public void testStyleTagRewritesIgnoredOnNoFeatureKey() throws Exception {
-    ContentRewriterFeature overrideFeature = makeFeature("foo");  // doesn't include "style"
-    ContentRewriterFeature.Factory factory = mockContentRewriterFeatureFactory(overrideFeature);
-    StyleLinksContentRewriter overrideRewriter = new StyleLinksContentRewriter(factory, pfxLinkRewriter);
-    String css =
-      "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 s = "<style>" + css + "</style>";
-    Document document = htmlParser.parseDom(s);
-    assertEquals(s, rewriteHelper(overrideRewriter, s, document));
-  }
-  
-  public void testStyleTagRewritesIgnoredOnNullLinkRewriter() throws Exception {
-    ContentRewriterFeature.Factory factory = mockContentRewriterFeatureFactory(styleFeature);
-    StyleLinksContentRewriter overrideRewriter = new StyleLinksContentRewriter(factory, null);
+    ContentRewriterFeature overrideFeature =
+        rewriterFeatureFactory.get(createSpecWithRewrite(".*", "", "HTTP",
+            Sets.newConcurrentHashSet("foo")));  // doesn't include "style"
+    ContentRewriterFeatureFactory factory = mockContentRewriterFeatureFactory(overrideFeature);
+    StyleLinksContentRewriter overrideRewriter =
+        new StyleLinksContentRewriter(factory, LINK_PREFIX);
     String css =
       "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 s = "<style>" + css + "</style>";
-    Document document = htmlParser.parseDom(s);
-    assertEquals(s, rewriteHelper(overrideRewriter, s, document));
+    assertEquals(s, rewriteHelper(overrideRewriter, s));
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/lexer/JavascriptTagMergerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/lexer/JavascriptTagMergerTest.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/lexer/JavascriptTagMergerTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/lexer/JavascriptTagMergerTest.java Thu Nov  6 14:47:09 2008
@@ -40,7 +40,7 @@
     URI relativeBase = new URI("http://a.b.com/");
     defaultTransformerMap = new HashMap<String, HtmlTagTransformer>();
     defaultTransformerMap
-        .put("script", new JavascriptTagMerger(getSpecWithoutRewrite(), contentRewriterFeature,
+        .put("script", new JavascriptTagMerger(createSpecWithoutRewrite(), defaultRewriterFeature,
             "http://www.test.com/concat?", relativeBase));
   }
 
@@ -77,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&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&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%2Fdir%2Fg.xml&fp=-182800334&1=http%3A%2F%2Fa.b.com%2F1.js\" type=\"text/javascript\"></script>";
     validateRewritten(original, rewritten);
   }
 
@@ -85,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&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 src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334&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);
   }
 
@@ -101,7 +101,7 @@
     String rewritten = "<script type=\"text/javascript\">\n"
         + "doSomething\n"
         + "</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 src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334&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>";
@@ -115,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&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 src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334&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&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>";
+            + "<script src=\"http://www.test.com/concat?rewriteMime=text/javascript&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334&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&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&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%2Fdir%2Fg.xml&fp=-182800334&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&gadget=http%3A%2F%2Fexample.org%2Fg.xml&fp=-840722081&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%2Fdir%2Fg.xml&fp=-182800334&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/lexer/LinkingTagRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/lexer/LinkingTagRewriterTest.java?rev=712000&r1=711999&r2=712000&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/lexer/LinkingTagRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/lexer/LinkingTagRewriterTest.java Thu Nov  6 14:47:09 2008
@@ -38,8 +38,7 @@
     super.setUp();
     dummyUri = new URI("http://www.w3c.org");
     URI relativeBase = new URI("http://a.b.com/");
-    LinkingTagRewriter rewriter = new LinkingTagRewriter(defaultRewriter, relativeBase);
-
+    LinkingTagRewriter rewriter = new LinkingTagRewriter(defaultLinkRewriter, relativeBase);
     defaultTransformerMap = new HashMap<String, HtmlTagTransformer>();
     for (String tag : rewriter.getSupportedTags()) {
       defaultTransformerMap
@@ -61,9 +60,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&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\"/>";
+    String expected = "<img src=\"http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com%2Fimg.gif&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334\"></img>\n"
+        + "<IMG src=\"http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com%2Fimg.gif&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334\"/>\n"
+        + "<eMbeD src=\"http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com%2Fsome.mov&gadget=http%3A%2F%2Fexample.org%2Fdir%2Fg.xml&fp=-182800334\" width=\"100\" height=\"30px\"/>";
     validateRewritten(original, expected);
   }