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));
+ }
+}