You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by jo...@apache.org on 2010/03/08 18:06:16 UTC

svn commit: r920403 - in /shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/parse/caja/ main/java/org/apache/shindig/gadgets/render/ main/java/org/apache/shindig/gadgets/rewrite/ main/java/org/apache/shindig/gadgets/rewrite/old/ main...

Author: johnh
Date: Mon Mar  8 17:06:15 2010
New Revision: 920403

URL: http://svn.apache.org/viewvc?rev=920403&view=rev
Log:
Moving HTMLContentRewriter and hangers-on (*LinkRewriter and others) to "old" package directories, in advance of introducing "new" replacements. This allows use of/rolling back to previous functionality during transition and prove-out of the new code.


Added:
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ContentRewriterUris.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java
      - copied, changed from r919548, shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultConcatLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultProxyingLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/LinkRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java
      - copied, changed from r919548, shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriterTest.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java
Removed:
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterUris.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultConcatLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultProxyingLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/LinkRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriterTest.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterTest.java
Modified:
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/DefaultSanitizingProxyingLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingGadgetRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyingLinkRewriter.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizerTest.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java?rev=920403&r1=920402&r2=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java Mon Mar  8 17:06:15 2010
@@ -20,7 +20,7 @@
 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.GadgetException;
-import org.apache.shindig.gadgets.rewrite.LinkRewriter;
+import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
 
 import com.google.caja.lang.css.CssSchema;
 import com.google.caja.parser.AbstractParseTreeNode;

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/DefaultSanitizingProxyingLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/DefaultSanitizingProxyingLinkRewriterFactory.java?rev=920403&r1=920402&r2=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/DefaultSanitizingProxyingLinkRewriterFactory.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/DefaultSanitizingProxyingLinkRewriterFactory.java Mon Mar  8 17:06:15 2010
@@ -23,7 +23,7 @@
 
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
-import org.apache.shindig.gadgets.rewrite.ContentRewriterUris;
+import org.apache.shindig.gadgets.rewrite.old.ContentRewriterUris;
 
 @Singleton
 public class DefaultSanitizingProxyingLinkRewriterFactory implements

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingGadgetRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingGadgetRewriter.java?rev=920403&r1=920402&r2=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingGadgetRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingGadgetRewriter.java Mon Mar  8 17:06:15 2010
@@ -23,8 +23,8 @@
 import org.apache.shindig.gadgets.parse.caja.CajaCssSanitizer;
 import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
 import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
-import org.apache.shindig.gadgets.rewrite.LinkRewriter;
 import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyingLinkRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyingLinkRewriter.java?rev=920403&r1=920402&r2=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyingLinkRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyingLinkRewriter.java Mon Mar  8 17:06:15 2010
@@ -21,8 +21,8 @@
 
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
-import org.apache.shindig.gadgets.rewrite.ContentRewriterUris;
-import org.apache.shindig.gadgets.rewrite.ProxyingLinkRewriter;
+import org.apache.shindig.gadgets.rewrite.old.ContentRewriterUris;
+import org.apache.shindig.gadgets.rewrite.old.ProxyingLinkRewriter;
 import org.apache.shindig.gadgets.servlet.ProxyBase;
 
 /**

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java?rev=920403&r1=920402&r2=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java Mon Mar  8 17:06:15 2010
@@ -22,6 +22,8 @@
 import org.apache.shindig.gadgets.render.RenderingGadgetRewriter;
 import org.apache.shindig.gadgets.render.SanitizingGadgetRewriter;
 import org.apache.shindig.gadgets.render.SanitizingRequestRewriter;
+import org.apache.shindig.gadgets.rewrite.old.CssRequestRewriter;
+import org.apache.shindig.gadgets.rewrite.old.HTMLContentRewriter;
 import org.apache.shindig.gadgets.servlet.CajaContentRewriter;
 
 import java.util.List;

Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriter.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriter.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriter.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,118 @@
+/*
+ * 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.old;
+
+import com.google.common.collect.Lists;
+
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.common.util.Utf8UrlCoder;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+import org.apache.shindig.gadgets.servlet.ProxyBase;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.LinkedHashSet;
+import java.util.List;
+
+public class ConcatLinkRewriter {
+  private final static int MAX_URL_LENGTH = 1500;
+
+  private final ContentRewriterUris rewriterUris;
+
+  private final ContentRewriterFeature.Config rewriterFeature;
+  private final Uri gadgetUri;
+  private final String container;
+  private final boolean debug;
+  private final boolean ignoreCache;
+
+  public ConcatLinkRewriter(ContentRewriterUris rewriterUris, Uri gadgetUri,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
+      boolean ignoreCache) {
+    this.rewriterUris = rewriterUris;
+    this.rewriterFeature = rewriterFeature;
+    this.gadgetUri = gadgetUri;
+    this.container = container;
+    this.debug = debug;
+    this.ignoreCache = ignoreCache;
+  }
+
+  public List<Uri> rewrite(String mimeType, LinkedHashSet<Uri> uris) {
+    String concatBase = getConcatBase(gadgetUri, rewriterFeature, mimeType,
+        container);
+    List<Uri> concatUris = Lists.newLinkedList();
+    int paramIndex = 1;
+    StringBuilder builder = null;
+    int maxUriLen = MAX_URL_LENGTH + concatBase.length();
+    try {
+      int uriIx = 0;
+      //
+      for (Uri uri : uris) {
+        String uriStr = uri.toString();
+        if (builder != null && builder.length() + uriStr.length() > maxUriLen) {
+          // The next one will go over limit
+          concatUris.add(Uri.parse(builder.toString()));
+          builder = null;
+          paramIndex = 1;
+          
+          // If the current uri is too long, simply don't rewrite, since
+          // concat is for developers benefit
+          if(uriStr.length() > MAX_URL_LENGTH) {
+            concatUris.add(uri);
+            continue;
+          }
+        } 
+
+        if (paramIndex == 1) {
+          builder = new StringBuilder(concatBase);
+          if (debug)
+            builder.append("debug=1&");
+          if (ignoreCache)
+            builder.append("nocache=1&");
+          if (rewriterFeature.getExpires() != null) {
+            builder.append(ProxyBase.REFRESH_PARAM).append('=').append(rewriterFeature.getExpires().toString()).append('&');
+          }
+        } else {
+          builder.append('&');
+        }
+        builder.append(paramIndex).append('=').append(
+            URLEncoder.encode(uriStr, "UTF-8"));
+        ++paramIndex;
+        ++uriIx;
+      }
+      if (builder != null)
+        concatUris.add(Uri.parse(builder.toString()));
+    } catch (UnsupportedEncodingException e) {
+      throw new RuntimeException(e);
+    }
+    return concatUris;
+  }
+
+  protected String getConcatBase(Uri gadgetUri, ContentRewriterFeature.Config feature,
+      String mimeType, String container) {
+    String concatBaseNoGadget = rewriterUris.getConcatBase(container);
+    return concatBaseNoGadget
+        + ProxyBase.REWRITE_MIME_TYPE_PARAM
+        + '='
+        + mimeType
+        + ((gadgetUri == null) ? "" : "&gadget="
+            + Utf8UrlCoder.encode(gadgetUri.toString())) + "&fp="
+        + feature.getFingerprint() + '&';
+  }
+
+}

Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriterFactory.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriterFactory.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ConcatLinkRewriterFactory.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,32 @@
+/*
+ * 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.old;
+
+import com.google.inject.ImplementedBy;
+
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+
+@ImplementedBy(DefaultConcatLinkRewriterFactory.class)
+public interface ConcatLinkRewriterFactory {
+  public ConcatLinkRewriter create(Uri gadgetUri,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
+      boolean ignoreCache);
+
+}

Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ContentRewriterUris.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ContentRewriterUris.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ContentRewriterUris.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ContentRewriterUris.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,63 @@
+/*
+ * 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.old;
+
+import org.apache.shindig.config.ContainerConfig;
+
+import com.google.common.base.Preconditions;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+/**
+ * Provider of base URIs to HTMLContentRewriter and CSSContentRewriter.
+ */
+public class ContentRewriterUris {
+  private final ContainerConfig config;
+  private final String proxyBaseNoGadget;
+  private final String concatBaseNoGadget;
+
+  public static final String PROXY_BASE_CONFIG_PROPERTY = "gadgets.rewriteProxyBase";
+  public static final String CONCAT_BASE_CONFIG_PROPERTY = "gadgets.rewriteConcatBase";
+
+  @Inject
+  public ContentRewriterUris(
+      ContainerConfig config,
+      @Named("shindig.content-rewrite.proxy-url")String proxyBaseNoGadget,
+      @Named("shindig.content-rewrite.concat-url")String concatBaseNoGadget) {
+    this.config = config;
+    this.proxyBaseNoGadget = proxyBaseNoGadget;
+    this.concatBaseNoGadget = concatBaseNoGadget;
+  }
+  
+  public String getProxyBase(String container) {
+    container = firstNonNull(container, ContainerConfig.DEFAULT_CONTAINER);
+    
+    return firstNonNull(config.getString(container, PROXY_BASE_CONFIG_PROPERTY),
+        proxyBaseNoGadget);
+  }
+  
+  public String getConcatBase(String container) {
+    container = firstNonNull(container, ContainerConfig.DEFAULT_CONTAINER);
+    
+    return firstNonNull(config.getString(container, CONCAT_BASE_CONFIG_PROPERTY),
+        concatBaseNoGadget);
+  }
+  private static <T> T firstNonNull(T first, T second) {
+    return first != null ? first : Preconditions.checkNotNull(second);
+  }
+}

Copied: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java (from r919548, shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriter.java)
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java?p2=shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java&p1=shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriter.java&r1=919548&r2=920403&rev=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java Mon Mar  8 17:06:15 2010
@@ -15,7 +15,7 @@
  * 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;
+package org.apache.shindig.gadgets.rewrite.old;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
@@ -24,7 +24,13 @@
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.rewrite.RequestRewriter;
+import org.apache.shindig.gadgets.rewrite.RewriterUtils;
 import org.apache.shindig.gadgets.rewrite.RewritingException;
+import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
+import org.apache.shindig.gadgets.rewrite.old.ProxyingLinkRewriterFactory;
 import org.w3c.dom.Element;
 
 import java.io.IOException;

Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultConcatLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultConcatLinkRewriterFactory.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultConcatLinkRewriterFactory.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultConcatLinkRewriterFactory.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ */
+
+/*
+ * To add signing
+ */
+package org.apache.shindig.gadgets.rewrite.old;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+
+@Singleton
+public class DefaultConcatLinkRewriterFactory implements
+    ConcatLinkRewriterFactory {
+
+  private final ContentRewriterUris rewriterUris;
+
+  @Inject
+  public DefaultConcatLinkRewriterFactory(ContentRewriterUris rewriterUris) {
+    this.rewriterUris = rewriterUris;
+  }
+
+  public ConcatLinkRewriter create(Uri gadgetUri,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
+      boolean ignoreCache) {
+    return new ConcatLinkRewriter(rewriterUris, gadgetUri, rewriterFeature,
+        container, debug, ignoreCache);
+  }
+}

Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultProxyingLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultProxyingLinkRewriterFactory.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultProxyingLinkRewriterFactory.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/DefaultProxyingLinkRewriterFactory.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,44 @@
+/*
+ * 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.old;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+
+@Singleton
+public class DefaultProxyingLinkRewriterFactory implements
+    ProxyingLinkRewriterFactory {
+
+  private final ContentRewriterUris rewriterUris;
+
+  @Inject
+  public DefaultProxyingLinkRewriterFactory(ContentRewriterUris rewriterUris) {
+    this.rewriterUris = rewriterUris;
+  }
+
+  public ProxyingLinkRewriter create(Uri gadgetUri,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
+      boolean ignoreCache) {
+    return new ProxyingLinkRewriter(rewriterUris, gadgetUri, rewriterFeature,
+        container, debug, ignoreCache);
+  }
+}

Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,319 @@
+/**
+ * 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.old;
+
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.common.xml.DomUtil;
+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.rewrite.ContentRewriterFeature;
+import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
+import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.rewrite.RequestRewriter;
+import org.apache.shindig.gadgets.rewrite.RewriterUtils;
+import org.apache.shindig.gadgets.rewrite.RewritingException;
+import org.apache.shindig.gadgets.spec.View;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.inject.Inject;
+
+/**
+ * Perform rewriting of HTML content including
+ * - Concatenating & proxying of referred script content
+ * - Concatenating & proxying of stylesheet links
+ * - Moving all style into head and converting @imports into links
+ * - Proxying referred content of images and embeds
+ */
+public class HTMLContentRewriter implements GadgetRewriter, RequestRewriter {
+  
+  private final static String JS_MIME_TYPE = "text/javascript";
+
+  public final static Set<String> TAGS = ImmutableSet.of("img", "embed", "link", "script", "style");
+
+  private final static ImmutableMap<String, ImmutableSet<String>> LINKING_TAG_ATTRS = ImmutableMap.of(
+      "img", ImmutableSet.of("src"),
+      "embed", ImmutableSet.of("src")
+  );
+
+  private final ContentRewriterFeature.Factory rewriterFeatureFactory;
+  private final CssRequestRewriter cssRewriter;
+  private final ConcatLinkRewriterFactory concatLinkRewriterFactory;
+  private final ProxyingLinkRewriterFactory proxyingLinkRewriterFactory;
+
+  @Inject
+  public HTMLContentRewriter(ContentRewriterFeature.Factory rewriterFeatureFactory,
+      CssRequestRewriter cssRewriter,
+      ConcatLinkRewriterFactory concatLinkRewriterFactory,
+      ProxyingLinkRewriterFactory proxyingLinkRewriterFactory) {
+    this.rewriterFeatureFactory = rewriterFeatureFactory;
+    this.cssRewriter = cssRewriter;
+    this.concatLinkRewriterFactory = concatLinkRewriterFactory;
+    this.proxyingLinkRewriterFactory = proxyingLinkRewriterFactory;
+  }
+
+  public boolean rewrite(HttpRequest request, HttpResponse original,
+      MutableContent content) throws RewritingException {
+    if (RewriterUtils.isHtml(request, original)) {
+      ContentRewriterFeature.Config feature = rewriterFeatureFactory.get(request);
+      return rewriteImpl(feature, request.getGadget(), request.getUri(), content,
+          request.getContainer(), false, request.getIgnoreCache());
+    }
+    
+    return false;
+  }
+
+  public void rewrite(Gadget gadget, MutableContent content) throws RewritingException {
+    // Don't rewrite urls if caja is enabled since caja will inline them anyway
+    if (gadget.getSpec().getModulePrefs().getFeatures().containsKey("caja") ||
+        "1".equals(gadget.getContext().getParameter("caja"))) {
+      return;
+    }
+    
+    ContentRewriterFeature.Config feature = rewriterFeatureFactory.get(gadget.getSpec());
+    Uri contentBase = gadget.getSpec().getUrl();
+    View view = gadget.getCurrentView();
+    if (view != null && view.getHref() != null) {
+      contentBase = view.getHref();
+    }
+    
+    rewriteImpl(feature, gadget.getSpec().getUrl(), contentBase, content,
+        gadget.getContext().getContainer(), gadget.getContext().getDebug(),
+        gadget.getContext().getIgnoreCache());
+  }
+
+  boolean rewriteImpl(ContentRewriterFeature.Config feature, Uri gadgetUri,
+      Uri contentBase, MutableContent content, String container, boolean debug,
+      boolean ignoreCache) throws RewritingException {
+    if (!feature.isRewriteEnabled() || content.getDocument() == null) {
+      return false;
+    }
+
+    // Get ALL interesting tags
+    List<Element> tagList =
+        DomUtil.getElementsByTagNameCaseInsensitive(content.getDocument(), TAGS);
+
+    Element head = (Element)DomUtil.getFirstNamedChildNode(
+        content.getDocument().getDocumentElement(), "head");
+
+    boolean mutated = false;
+
+
+    // 1st step. Rewrite links in all embedded style tags. Convert @import statements into
+    // links and add them to the tag list.
+    // Move all style and link tags into head and concat the link tags
+    mutated = rewriteStyleTags(head, tagList, feature, gadgetUri, contentBase, container, debug, ignoreCache);
+    // Concat script links
+    mutated |= rewriteJsTags(tagList, feature, gadgetUri, contentBase, container, debug, ignoreCache);
+    // Rewrite links in images, embeds etc
+    mutated |= rewriteContentReferences(tagList, feature, gadgetUri, contentBase, container, debug, ignoreCache);
+
+    if (mutated) {
+      MutableContent.notifyEdit(content.getDocument());
+    }
+
+    return mutated;
+  }
+
+  protected boolean rewriteStyleTags(Element head, List<Element> elementList,
+      ContentRewriterFeature.Config feature, Uri gadgetUri, Uri contentBase, String container,
+      boolean debug, boolean ignoreCache) throws RewritingException {
+    if (!feature.getIncludedTags().contains("style")) {
+      return false;
+    }
+    boolean mutated = false;
+
+    // Filter to just style tags
+    Iterable<Element> styleTags = Lists.newArrayList(Iterables.filter(elementList,
+        new Predicate<Element>() {
+      public boolean apply(Element element) {
+        return element.getNodeName().equalsIgnoreCase("style");
+      }
+    }));
+
+    LinkRewriter linkRewriter = proxyingLinkRewriterFactory.create(gadgetUri,
+        feature, container, debug, ignoreCache);
+
+    for (Element styleTag : styleTags) {
+      mutated |= true;
+      if (styleTag.getParentNode() != head) {
+        styleTag.getParentNode().removeChild(styleTag);
+        head.appendChild(styleTag);
+      }
+
+      List<String> extractedUrls = cssRewriter.rewrite(
+          styleTag, contentBase, linkRewriter, true);
+      for (String extractedUrl : extractedUrls) {
+        // Add extracted urls as link elements to head
+        Element newLink = head.getOwnerDocument().createElement("link");
+        newLink.setAttribute("rel", "stylesheet");
+        newLink.setAttribute("type", "text/css");
+        newLink.setAttribute("href", extractedUrl);
+        head.appendChild(newLink);
+        elementList.add(newLink);
+      }
+    }
+
+    // Filter to just stylesheet link tags
+    List<Element> linkTags = Lists.newArrayList(Iterables.filter(elementList,
+        new Predicate<Element>() {
+          public boolean apply(Element element) {
+            return element.getNodeName().equalsIgnoreCase("link") &&
+                ("stylesheet".equalsIgnoreCase(element.getAttribute("rel")) ||
+                    element.getAttribute("type").toLowerCase().contains("css"));
+          }
+        }));
+
+    concatenateTags(feature, linkTags, gadgetUri, contentBase, "text/css", "href", container, debug, ignoreCache);
+
+    return mutated;
+  }
+
+  protected boolean rewriteJsTags(List<Element> elementList, ContentRewriterFeature.Config feature,
+      Uri gadgetUri, Uri contentBase, String container, boolean debug, boolean ignoreCache) {
+    if (!feature.getIncludedTags().contains("script")) {
+      return false;
+    }
+    boolean mutated = false;
+
+    // Filter to just script tags
+    List<Element> scriptTags = Lists.newArrayList(Iterables.filter(elementList,
+        new Predicate<Element>() {
+      public boolean apply(Element node) {
+        if (node.getNodeName().equalsIgnoreCase("script")) {
+          String type = node.getAttribute("type");
+          return type == null || type.length() == 0 || type.equalsIgnoreCase(JS_MIME_TYPE);
+        }
+        return false;
+      }
+    }));
+
+    List<Element> concatenateable = Lists.newArrayList();
+    for (int i = 0; i < scriptTags.size(); i++) {
+      Element scriptTag = scriptTags.get(i);
+      Element nextSciptTag = null;
+      if (i + 1 < scriptTags.size()) {
+        nextSciptTag = scriptTags.get(i+1);
+      }
+      if (scriptTag.hasAttribute("src") &&
+          feature.shouldRewriteURL(scriptTag.getAttribute("src"))) {
+        mutated = true;
+        concatenateable.add(scriptTag);
+        if (nextSciptTag == null ||
+            !nextSciptTag.equals(getNextSiblingElement(scriptTag))) {
+          // Next tag is not concatenateable
+          concatenateTags(feature, concatenateable, gadgetUri, contentBase, JS_MIME_TYPE, "src", container, debug, ignoreCache);
+          concatenateable.clear();
+        }
+      } else {
+        concatenateTags(feature, concatenateable, gadgetUri, contentBase, JS_MIME_TYPE, "src", container, debug, ignoreCache);
+        concatenateable.clear();
+      }
+    }
+    concatenateTags(feature, concatenateable, gadgetUri, contentBase, JS_MIME_TYPE, "src", container, debug, ignoreCache);
+    return mutated;
+  }
+
+  protected boolean rewriteContentReferences(List<Element> elementList,
+      ContentRewriterFeature.Config feature, Uri gadgetUri, Uri contentBase, String container,
+      boolean debug, boolean ignoreCache) {
+    boolean mutated = false;
+    LinkRewriter rewriter = proxyingLinkRewriterFactory.create(gadgetUri,
+        feature, container, debug, ignoreCache);
+
+    final Set<String> tagNames = Sets.intersection(LINKING_TAG_ATTRS.keySet(), feature.getIncludedTags());
+
+    // Filter to just style tags
+    Iterable<Element> tags = Iterables.filter(elementList, new Predicate<Element>() {
+      public boolean apply(Element node) {
+        return tagNames.contains(node.getNodeName().toLowerCase());
+      }
+    });
+
+    for (Element node : tags) {
+      NamedNodeMap attributes = node.getAttributes();
+      Set<String> rewriteable = LINKING_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(), contentBase));
+        }
+      }
+    }
+    return mutated;
+  }
+
+  private void concatenateTags(final ContentRewriterFeature.Config feature,
+      List<Element> tags, Uri gadgetUri, Uri contentBase, String mimeType,
+      final String attr, String container, boolean debug, boolean ignoreCache) {
+    // Filter out excluded URLs
+    tags = Lists.newArrayList(Iterables.filter(tags, new Predicate<Element>() {
+      public boolean apply(Element element) {
+        return (element.hasAttribute(attr) && feature.shouldRewriteURL(element.getAttribute(attr)));
+      }
+    }));
+
+    // Eliminate duplicates while maintaining order
+    LinkedHashSet<Uri> nodeRefList = Sets.newLinkedHashSet();
+    for (Element tag : tags) {
+      try {
+        nodeRefList.add(contentBase.resolve(Uri.parse(tag.getAttribute(attr))));
+      } catch (IllegalArgumentException e) {
+        // Same behavior as JavascriptTagMerger
+        // Perhaps switch to ignoring script src instead?
+        throw new RuntimeException(e);
+      }
+    }
+
+    List<Uri> concatented = concatLinkRewriterFactory.create(gadgetUri,
+        feature, container, debug, ignoreCache).rewrite(mimeType, nodeRefList);
+    
+    for (int i = 0; i < tags.size(); i++) {
+      if (i < concatented.size()) {
+        // Set new URLs into existing tags
+        tags.get(i).setAttribute(attr, concatented.get(i).toString());
+      } else {
+        // Remove remainder
+        tags.get(i).getParentNode().removeChild(tags.get(i));
+      }
+    }
+  }
+
+
+  private Element getNextSiblingElement(Element elem) {
+    Node n = elem;
+    n = n.getNextSibling();
+    while (n != null && n.getNodeType() != Node.ELEMENT_NODE) {
+      n = n.getNextSibling();
+    }
+    return (Element)n;
+  }
+}

Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/LinkRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/LinkRewriter.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/LinkRewriter.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/LinkRewriter.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,30 @@
+/*
+ * 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.old;
+
+import org.apache.shindig.common.uri.Uri;
+
+/**
+ * Rewrite a link
+ */
+public interface LinkRewriter {
+
+  public String rewrite(String link, Uri context);
+
+}

Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriter.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriter.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriter.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,97 @@
+/*
+ * 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.old;
+
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.common.util.Utf8UrlCoder;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+import org.apache.shindig.gadgets.servlet.ProxyBase;
+
+/**
+ * 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 {
+
+  protected final ContentRewriterUris rewriterUris;
+  protected final ContentRewriterFeature.Config rewriterFeature;
+  protected final Uri gadgetUri;
+  protected final String container;
+  protected final boolean debug;
+  protected final boolean ignoreCache;
+  
+  public ProxyingLinkRewriter(ContentRewriterUris rewriterUris, Uri gadgetUri,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
+      boolean ignoreCache) {
+    this.rewriterUris = rewriterUris;
+    this.rewriterFeature = rewriterFeature;
+    this.gadgetUri = gadgetUri;
+    this.container = container;
+    this.debug = debug;
+    this.ignoreCache = ignoreCache;
+  }
+
+  public String rewrite(String link, Uri context) {
+    String prefix = rewriterUris.getProxyBase(container);
+    Uri parsedPrefix = Uri.parse(prefix);
+    link = link.trim();
+    // We shouldnt bother proxying empty URLs
+    if (link.length() == 0) {
+      return link;
+    }
+
+    try {
+      Uri linkUri = processLink(parsedPrefix, Uri.parse(link));
+      Uri uri = context.resolve(linkUri);
+      if (rewriterFeature.shouldRewriteURL(uri.toString())) {
+        StringBuilder result = new StringBuilder();
+        result.append(prefix);
+        result.append(Utf8UrlCoder.encode(uri.toString()));
+        result.append(((gadgetUri == null) ? "" : "&gadget=" + Utf8UrlCoder.encode(gadgetUri.toString()))); 
+        result.append("&fp=");
+        result.append(rewriterFeature.getFingerprint());
+        if(debug)
+          result.append("&debug=1");
+        if(ignoreCache)
+          result.append("&nocache=1");
+        if (rewriterFeature.getExpires() != null &&
+            rewriterFeature.getExpires() != ContentRewriterFeature.EXPIRES_DEFAULT) {
+          result.append('&').append(ProxyBase.REFRESH_PARAM).append('=').append(rewriterFeature.getExpires().toString());
+        }
+        return result.toString();
+      } else {
+        return uri.toString();
+      }
+    } catch (IllegalArgumentException use) {
+      // Unrecoverable. Just return link
+      return link;
+    }
+  }
+
+  /**
+   * Preprocess link to avoid double-proxying
+   */
+  private Uri processLink(Uri parsedPrefix, Uri original) {
+    if (parsedPrefix.getPath().equals(original.getPath())) {
+      // Link is already rewritten to the proxy so extract the url param
+      return Uri.parse(original.getQueryParameter("url"));
+    }
+    return original;
+  }
+}

Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterFactory.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterFactory.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterFactory.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,32 @@
+/*
+ * 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.old;
+
+import com.google.inject.ImplementedBy;
+
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+
+@ImplementedBy(DefaultProxyingLinkRewriterFactory.class)
+public interface ProxyingLinkRewriterFactory {
+  public ProxyingLinkRewriter create(Uri gadgetUri,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
+      boolean ignoreCache);
+}
+

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java?rev=920403&r1=920402&r2=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java Mon Mar  8 17:06:15 2010
@@ -45,7 +45,7 @@
 /**
  * Servlet which concatenates the content of several proxied HTTP responses
  *
- * @see org.apache.shindig.gadgets.rewrite.HTMLContentRewriter
+ * @see org.apache.shindig.gadgets.rewrite.old.HTMLContentRewriter
  */
 public class ConcatProxyServlet extends InjectedServlet {
 

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizerTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizerTest.java?rev=920403&r1=920402&r2=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizerTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizerTest.java Mon Mar  8 17:06:15 2010
@@ -19,7 +19,7 @@
 
 import org.apache.shindig.common.EasyMockTestCase;
 import org.apache.shindig.common.uri.Uri;
-import org.apache.shindig.gadgets.rewrite.LinkRewriter;
+import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
 import org.apache.shindig.gadgets.servlet.ProxyBase;
 
 import com.google.caja.parser.css.CssTree;

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java?rev=920403&r1=920402&r2=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java Mon Mar  8 17:06:15 2010
@@ -31,6 +31,9 @@
 import org.apache.shindig.gadgets.http.RequestPipeline;
 import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
 import org.apache.shindig.gadgets.parse.ParseModule;
+import org.apache.shindig.gadgets.rewrite.old.ContentRewriterUris;
+import org.apache.shindig.gadgets.rewrite.old.DefaultProxyingLinkRewriterFactory;
+import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 
 import com.google.inject.AbstractModule;
@@ -179,7 +182,7 @@
     return originalText.replace("test.com", "mock.com");
   }
 
-  ContentRewriterFeature.Factory mockContentRewriterFeatureFactory(
+  protected ContentRewriterFeature.Factory mockContentRewriterFeatureFactory(
       ContentRewriterFeature.Config feature) {
     return new FakeRewriterFeatureFactory(feature);
   }
@@ -198,12 +201,12 @@
     return rewrittenContent;
   }
 
-  MutableContent rewriteContent(GadgetRewriter rewriter, String s,
+  protected MutableContent rewriteContent(GadgetRewriter rewriter, String s,
       final String container) throws Exception {
     return rewriteContent(rewriter, s, container, false, false);
   }
   
-  MutableContent rewriteContent(GadgetRewriter rewriter, String s,
+  protected MutableContent rewriteContent(GadgetRewriter rewriter, String s,
       final String container, final boolean debug, final boolean ignoreCache)
       throws Exception {
     MutableContent mc = new MutableContent(parser, s);

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java?rev=920403&r1=920402&r2=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java Mon Mar  8 17:06:15 2010
@@ -24,6 +24,8 @@
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.rewrite.old.CssRequestRewriter;
+import org.apache.shindig.gadgets.rewrite.old.HTMLContentRewriter;
 import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;

Copied: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java (from r919548, shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriterTest.java)
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java?p2=shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java&p1=shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriterTest.java&r1=919548&r2=920403&rev=920403&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CssRequestRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java Mon Mar  8 17:06:15 2010
@@ -15,7 +15,7 @@
  * 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;
+package org.apache.shindig.gadgets.rewrite.old;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -27,6 +27,12 @@
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpResponseBuilder;
 import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;
+import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.rewrite.old.DefaultProxyingLinkRewriterFactory;
+import org.apache.shindig.gadgets.rewrite.old.HTMLContentRewriter;
+import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
 import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;

Added: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java (added)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,412 @@
+/**
+ * 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.old;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;
+import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.rewrite.XPathWrapper;
+import org.apache.shindig.gadgets.rewrite.old.HTMLContentRewriter;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.Document;
+
+/**
+ *
+ */
+public class HTMLContentRewriterTest extends BaseRewriterTestCase {
+  private HTMLContentRewriter rewriter;
+  private HTMLContentRewriter rewriterNoOverrideExpires;
+
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+    ContentRewriterFeature.Config overrideFeatureNoOverrideExpires = rewriterFeatureFactory
+        .get(createSpecWithRewrite(".*", ".*exclude.*", null,
+            HTMLContentRewriter.TAGS));
+    ContentRewriterFeature.Factory factoryNoOverrideExpires = mockContentRewriterFeatureFactory(overrideFeatureNoOverrideExpires);
+
+    rewriterNoOverrideExpires = new HTMLContentRewriter(
+        factoryNoOverrideExpires, new CssRequestRewriter(
+            factoryNoOverrideExpires, new CajaCssLexerParser(),
+            new DefaultProxyingLinkRewriterFactory(rewriterUris)),
+        new DefaultConcatLinkRewriterFactory(rewriterUris),
+        new DefaultProxyingLinkRewriterFactory(rewriterUris));
+    
+    ContentRewriterFeature.Config overrideFeature = rewriterFeatureFactory
+        .get(createSpecWithRewrite(".*", ".*exclude.*", "3600",
+            HTMLContentRewriter.TAGS));
+    ContentRewriterFeature.Factory factory = mockContentRewriterFeatureFactory(overrideFeature);
+
+    rewriter = new HTMLContentRewriter(factory, new CssRequestRewriter(factory,
+        new CajaCssLexerParser(), new DefaultProxyingLinkRewriterFactory(
+            rewriterUris)), new DefaultConcatLinkRewriterFactory(rewriterUris),
+        new DefaultProxyingLinkRewriterFactory(rewriterUris));
+  }
+
+  @Test
+  public void testScriptsBasic() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritescriptbasic.html"));
+    Document doc = rewriteContent(rewriter, content, null).getDocument();
+
+    XPathWrapper wrapper = new XPathWrapper(doc);
+
+    // Head should contain 1 script tag
+    // TODO: restore head vs. body script position
+    // assertEquals("headScript1", wrapper.getValue("/html/head/script"));
+    // assertEquals(1, wrapper.getNodeList("/html/head/script").getLength());
+
+    // Body should contain 11 script tags after rewrite
+    assertEquals(12, wrapper.getNodeList("/html/body/script").getLength());
+
+    int scriptIx = 1;
+    assertEquals("headScript1", wrapper.getValue("/html/body/script[" + (scriptIx++) + ']'));
+    assertEquals("bodyScript1", wrapper.getValue("/html/body/script[" + (scriptIx++) + ']'));
+
+    // Second script should contain two concatenated urls
+    assertEquals(wrapper.getValue("/html/body/script[" + (scriptIx++) + "]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F1.js" +
+            "&2=http%3A%2F%2Fwww.example.org%2F2.js");
+
+    assertEquals("bodyScript2", wrapper.getValue("/html/body/script[" + (scriptIx++) + ']'));
+
+    // Fourth script should contain one concatenated url
+    assertEquals(wrapper.getValue("/html/body/script[" + (scriptIx++) + "]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript" +
+            "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F3.js");
+
+    // Fifth script should contain a retained comment
+    assertEquals("<!-- retain-comment -->",
+        wrapper.getValue("/html/body/script[" + (scriptIx++) + ']'));
+
+    // An excluded URL between contiguous tags prevents them being concatentated
+    assertEquals(wrapper.getValue("/html/body/script[" + (scriptIx++) + "]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F4.js");
+
+    // Excluded URL is untouched
+    assertEquals("http://www.example.org/excluded/5.js",
+        wrapper.getValue("/html/body/script[" + (scriptIx++) + "]/@src"));
+
+    assertEquals(wrapper.getValue("/html/body/script[" + (scriptIx++) + "]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F6.js" +
+            "&2=http%3A%2F%2Fwww.example.org%2F10.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&3=http%3A%2F%2Fwww.example.org%2F11.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&4=http%3A%2F%2Fwww.example.org%2F12.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&5=http%3A%2F%2Fwww.example.org%2F13.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&6=http%3A%2F%2Fwww.example.org%2F14.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&7=http%3A%2F%2Fwww.example.org%2F15.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&8=http%3A%2F%2Fwww.example.org%2F16.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&9=http%3A%2F%2Fwww.example.org%2F17.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&10=http%3A%2F%2Fwww.example.org%2F18.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&11=http%3A%2F%2Fwww.example.org%2F19.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
+
+    // Did it split the request
+    assertEquals(wrapper.getValue("/html/body/script[" + (scriptIx++) + "]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F20.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&2=http%3A%2F%2Fwww.example.org%2F21.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&3=http%3A%2F%2Fwww.example.org%2F22.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&4=http%3A%2F%2Fwww.example.org%2F23.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
+    
+    // Handle long requests
+    assertEquals("http://www.example.org/23-long.js&0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
 789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+        wrapper.getValue("/html/body/script[" + (scriptIx++) + "]/@src"));
+
+    // Resume concating
+    assertEquals(wrapper.getValue("/html/body/script[" + (scriptIx++) + "]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F24.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&2=http%3A%2F%2Fwww.example.org%2F25.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
+  }
+  
+  @Test
+  public void testScriptsBasicNoCache() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritescriptbasic.html"));
+    Document doc = rewriteContent(rewriter, content, null, false, true).getDocument();
+
+    XPathWrapper wrapper = new XPathWrapper(doc);
+
+    // Second script should contain two concatenated urls with nocache
+    // TODO restore this to "2" when converted to non-tag-reordering parser
+    assertEquals(wrapper.getValue("/html/body/script[3]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&nocache=1&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F1.js" +
+            "&2=http%3A%2F%2Fwww.example.org%2F2.js");
+
+    // And check the last script
+    // TODO restore this to "11" when converted to non-tag-reordering parser
+    assertEquals(wrapper.getValue("/html/body/script[12]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&nocache=1&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F24.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&2=http%3A%2F%2Fwww.example.org%2F25.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
+  }
+
+  @Test
+  public void testScriptsBasicNoCacheAndDebug() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritescriptbasic.html"));
+    Document doc = rewriteContent(rewriter, content, null, true, true).getDocument();
+
+    XPathWrapper wrapper = new XPathWrapper(doc);
+
+    // Second script should contain two concatenated urls with nocache and debug
+    // TODO restore this to "2" when converted to non-tag-reordering parser
+    assertEquals(wrapper.getValue("/html/body/script[3]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&debug=1&nocache=1&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F1.js" +
+            "&2=http%3A%2F%2Fwww.example.org%2F2.js");
+
+    // and check the last script
+    // TODO restore this to "11" when converted to non-tag-reordering parser
+    assertEquals(wrapper.getValue("/html/body/script[12]/@src"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" +
+            "&fp=1150739864&debug=1&nocache=1&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2F24.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
+            "&2=http%3A%2F%2Fwww.example.org%2F25.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
+  }
+  
+  @Test
+  public void testScriptsForContainer() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritescriptbasic.html"));
+    String text = rewriteContent(rewriter, content, MOCK_CONTAINER).getContent();
+    // Verify that the correct concat base was used
+    assertFalse(text.contains(DEFAULT_CONCAT_BASE));
+    assertTrue(text.contains(MOCK_CONCAT_BASE));
+  }
+  
+  @Test
+  public void testLinksBasic() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
+    Document doc = rewriteContent(rewriter, content, null).getDocument();
+
+    XPathWrapper wrapper = new XPathWrapper(doc);
+
+    // Image is rewritten to proxy, relative path is resolved
+    assertEquals(wrapper.getValue("//img[1]/@src"),
+        "http://www.test.com/dir/proxy?" +
+            "url=http%3A%2F%2Fwww.example.org%2Fimg.gif" +
+            "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=3600");
+
+    // Excluded image is untouched
+    assertEquals("http://www.example.org/excluded/img.gif", wrapper.getValue("//img[2]/@src"));
+
+    // Embed target is rewritten to proxy
+    assertEquals(wrapper.getValue("//embed[1]/@src"),
+        "http://www.test.com/dir/proxy?" +
+            "url=http%3A%2F%2Fwww.example.org%2Fsome.swf" +
+            "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=3600");
+
+    // Excluded embed is untouched
+    assertEquals("http://www.example.org/excluded/some.swf", wrapper.getValue("//embed[2]/@src"));
+  }
+
+  @Test
+  public void testLinksBasicNoOverrideExpires() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
+    Document doc = rewriteContent(rewriterNoOverrideExpires, content, null).getDocument();
+
+    XPathWrapper wrapper = new XPathWrapper(doc);
+
+    // Image is rewritten to proxy, relative path is resolved
+    assertEquals(wrapper.getValue("//img[1]/@src"),
+        "http://www.test.com/dir/proxy?" +
+            "url=http%3A%2F%2Fwww.example.org%2Fimg.gif" +
+            "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=86400");
+
+    // Excluded image is untouched
+    assertEquals("http://www.example.org/excluded/img.gif", wrapper.getValue("//img[2]/@src"));
+
+    // Embed target is rewritten to proxy
+    assertEquals(wrapper.getValue("//embed[1]/@src"),
+        "http://www.test.com/dir/proxy?" +
+            "url=http%3A%2F%2Fwww.example.org%2Fsome.swf" +
+            "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=86400");
+
+    // Excluded embed is untouched
+    assertEquals("http://www.example.org/excluded/some.swf", wrapper.getValue("//embed[2]/@src"));
+  }
+
+  @Test
+  public void testLinksBasicNoCache() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
+    Document doc = rewriteContent(rewriter, content, null, false, true).getDocument();
+
+    XPathWrapper wrapper = new XPathWrapper(doc);
+
+    // Image is rewritten to proxy, relative path is resolved
+    assertEquals(wrapper.getValue("//img[1]/@src"),
+        "http://www.test.com/dir/proxy?" +
+            "url=http%3A%2F%2Fwww.example.org%2Fimg.gif" +
+            "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&nocache=1&refresh=3600");
+
+    // Excluded image is untouched
+    assertEquals("http://www.example.org/excluded/img.gif", wrapper.getValue("//img[2]/@src"));
+
+    // Embed target is rewritten to proxy
+    assertEquals(wrapper.getValue("//embed[1]/@src"),
+        "http://www.test.com/dir/proxy?" +
+            "url=http%3A%2F%2Fwww.example.org%2Fsome.swf" +
+            "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&nocache=1&refresh=3600");
+
+    // Excluded embed is untouched
+    assertEquals("http://www.example.org/excluded/some.swf", wrapper.getValue("//embed[2]/@src"));
+  }
+
+  @Test
+  public void testLinksBasicNoCacheAndDebug() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
+    Document doc = rewriteContent(rewriter, content, null, true, true).getDocument();
+
+    XPathWrapper wrapper = new XPathWrapper(doc);
+
+    // Image is rewritten to proxy, relative path is resolved
+    assertEquals(wrapper.getValue("//img[1]/@src"),
+        "http://www.test.com/dir/proxy?" +
+            "url=http%3A%2F%2Fwww.example.org%2Fimg.gif" +
+            "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&debug=1&nocache=1&refresh=3600");
+
+    // Excluded image is untouched
+    assertEquals("http://www.example.org/excluded/img.gif", wrapper.getValue("//img[2]/@src"));
+
+    // Embed target is rewritten to proxy
+    assertEquals(wrapper.getValue("//embed[1]/@src"),
+        "http://www.test.com/dir/proxy?" +
+            "url=http%3A%2F%2Fwww.example.org%2Fsome.swf" +
+            "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&debug=1&nocache=1&refresh=3600");
+
+    // Excluded embed is untouched
+    assertEquals("http://www.example.org/excluded/some.swf", wrapper.getValue("//embed[2]/@src"));
+  }
+
+  @Test
+  public void testLinksForContainer() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
+    String text = rewriteContent(rewriter, content, MOCK_CONTAINER).getContent();
+    // Verify that the correct proxy base was used
+    assertFalse(text.contains(DEFAULT_PROXY_BASE));
+    assertTrue(text.contains(MOCK_PROXY_BASE));
+  }
+  
+  @Test
+  public void testStyleBasic() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestylebasic.html"));
+    MutableContent mc = rewriteContent(rewriter, content, null);
+    Document doc = mc.getDocument();
+
+    XPathWrapper wrapper = new XPathWrapper(doc);
+
+    // ALL style links and @import targets are rewritten to concat
+    // Note that relative URLs are fully resolved
+    assertEquals(wrapper.getValue("//link[1]/@href"),
+        "http://www.test.com/dir/concat?" +
+            "rewriteMime=text/css&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=3600" +
+            "&1=http%3A%2F%2Fwww.example.org%2Flinkedstyle1.css" +
+            "&2=http%3A%2F%2Fwww.example.org%2Flinkedstyle3.css" +
+            "&3=http%3A%2F%2Fwww.example.org%2Fimportedstyle1.css" +
+            "&4=http%3A%2F%2Fwww.example.org%2Fimportedstyle3.css" +
+            "&5=http%3A%2F%2Fwww.example.org%2Fimportedstyle4.css");
+
+    // Untouched link target
+    assertEquals("http://www.example.org/excluded/linkedstyle2.css",
+        wrapper.getValue("//link[2]/@href"));
+
+    // Untouched @import taget converted to a link
+    assertEquals("/excluded/importedstyle2.css",
+        wrapper.getValue("//link[3]/@href"));
+
+    // Body should contain 1 style element
+    assertEquals(1, wrapper.getNodeList("//style").getLength());
+
+    // All @imports are stripped
+    assertEquals("div { color : black; }", wrapper.getValue("//style[1]").trim());
+  }
+
+  @Test
+  public void testStyleBasic2() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestyle2.html"));
+    String expected = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestyle2-expected.html"));
+    MutableContent mc = rewriteContent(rewriter, content, null);
+    assertEquals(StringUtils.deleteWhitespace(mc.getContent()),
+                 StringUtils.deleteWhitespace(expected));
+  }
+
+  @Test
+  public void testStyleForContainer() throws Exception {
+    String content = IOUtils.toString(this.getClass().getClassLoader().
+        getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestylebasic.html"));
+    String text = rewriteContent(rewriter, content, MOCK_CONTAINER).getContent();
+    // Verify that the correct concat base was used
+    assertFalse(text.contains(DEFAULT_CONCAT_BASE));
+    assertTrue(text.contains(MOCK_CONCAT_BASE));
+  }
+
+  @Test
+  public void testNoRewriteUnknownMimeType() throws Exception {
+    MutableContent mc = control.createMock(MutableContent.class); 
+    HttpRequest req = control.createMock(HttpRequest.class);
+    EasyMock.expect(req.getRewriteMimeType()).andReturn("unknown");
+    control.replay();
+    assertFalse(rewriter.rewrite(req, fakeResponse, mc));
+    control.verify();
+  }
+}

Added: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java?rev=920403&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java (added)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java Mon Mar  8 17:06:15 2010
@@ -0,0 +1,115 @@
+/*
+ * 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.old;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+import org.apache.shindig.gadgets.rewrite.old.DefaultProxyingLinkRewriterFactory;
+import org.apache.shindig.gadgets.rewrite.old.ProxyingLinkRewriter;
+import org.junit.Test;
+
+/**
+ * Test of proxying rewriter
+ */
+public class ProxyingLinkRewriterTest extends BaseRewriterTestCase {
+
+  private String rewrite(String uri) {
+    return defaultLinkRewriter.rewrite(uri, SPEC_URL);
+  }
+
+  @Test
+  public void testAbsoluteRewrite() {
+    String val = "http://a.b.com";
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=-1311250572&refresh=86400",
+        rewrite(val));
+  }
+
+  @Test
+  public void testAbsoluteRewriteNoCache() {
+    String val = "http://a.b.com";
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=-1311250572&nocache=1&refresh=86400",
+        defaultLinkRewriterNoCache.rewrite(val, SPEC_URL));
+  }
+
+  @Test
+  public void testAbsoluteRewriteNoCacheAndDebug() {
+    String val = "http://a.b.com";
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fa.b.com&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=-1311250572&debug=1&nocache=1&refresh=86400",
+        defaultLinkRewriterNoCacheAndDebug.rewrite(val, SPEC_URL));
+  }
+
+  @Test
+  public void testHostRelativeRewrite() {
+    String val = "/somepath/test.gif";
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fsomepath%2Ftest.gif&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=-1311250572&refresh=86400",
+        rewrite(val));
+  }
+
+  @Test
+  public void testPathRelativeRewrite() {
+    String val = "test.gif";
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fdir%2Ftest.gif&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=-1311250572&refresh=86400",
+        rewrite(val));
+  }
+
+  @Test
+  public void testLeadingAndTrailingSpace() {
+    String val = " test.gif ";
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fdir%2Ftest.gif&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=-1311250572&refresh=86400",
+        rewrite(val));
+  }
+
+  @Test
+  public void testWithRefresh() throws Exception {
+    ContentRewriterFeature.Config contentRewriterFeature = new ContentRewriterFeature.DefaultConfig(
+        ".*", "", "3600", "embed,img,script,link,style", "false", "false");
+    ProxyingLinkRewriter rewriter = new DefaultProxyingLinkRewriterFactory(
+        defaultContainerRewriterUris).create(SPEC_URL, contentRewriterFeature,
+        "default", false, false);
+    String val = " test.gif ";
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fdir%2Ftest.gif&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=-1311250572&refresh=3600",
+        rewriter.rewrite(val, SPEC_URL));
+  }
+
+  @Test
+  public void testWithBadRefresh() throws Exception {
+    ContentRewriterFeature.Config contentRewriterFeature = new ContentRewriterFeature.DefaultConfig(
+        ".*", "", "HTTP", "embed,img,script,link,style", "false", "false");
+    ProxyingLinkRewriter rewriter = new DefaultProxyingLinkRewriterFactory(
+        defaultContainerRewriterUris).create(SPEC_URL, contentRewriterFeature,
+        "default", false, false);
+    String val = " test.gif ";
+    assertEquals("http://www.test.com/dir/proxy?url=http%3A%2F%2Fwww.example.org%2Fdir%2Ftest.gif&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=-1311250572",
+        rewriter.rewrite(val, SPEC_URL));
+  }
+
+  @Test
+  public void testInvalidCharRewrite() {
+    String val = "/images/opensocial/movie_trivia/76/${quiz.picture_url}";
+    assertEquals(val,
+        rewrite(val));
+  }
+
+  @Test
+  public void testEmpty() {
+    String val = " ";
+    assertEquals("", rewrite(val));
+  }
+}