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/02/23 04:06:19 UTC

svn commit: r915152 [1/2] - in /shindig/trunk/java: common/conf/ gadgets/src/main/java/org/apache/shindig/gadgets/render/ gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ gadgets/src/test/java/org/apache/shindig/gadgets/render/ gadgets/src/tes...

Author: johnh
Date: Tue Feb 23 03:06:18 2010
New Revision: 915152

URL: http://svn.apache.org/viewvc?rev=915152&view=rev
Log:
Removes ContentRewriterFeatureFactory and instead stuffs it into
ContentRewriterFeature, whose data-containing class in turn is
subdivided to ContentRewriterFeature.Config for differentiation.

It (hopefully) cleans up the ContentRewriter configuration logic into a
more direct inheritance model:
* DefaultConfig provides "default" values as bound previously.
* Config provides a constructor that uses a Spec's Feature values to
override those found in DefaultConfig, as appropriate.
* Includes/excludes also separated into a MatchBundle class to avoid
repeated logic.


Removed:
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureFactory.java
Modified:
    shindig/trunk/java/common/conf/shindig.properties
    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/render/SanitizingProxyingLinkRewriterFactory.java
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriter.java
    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/ContentRewriterFeature.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/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/render/SanitizingGadgetRewriterTest.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriterTest.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/ContentRewriterFeatureTestCase.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.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/common/conf/shindig.properties
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/conf/shindig.properties?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/common/conf/shindig.properties (original)
+++ shindig/trunk/java/common/conf/shindig.properties Tue Feb 23 03:06:18 2010
@@ -55,6 +55,7 @@
 shindig.content-rewrite.expires=86400
 shindig.content-rewrite.proxy-url=/gadgets/proxy?url=
 shindig.content-rewrite.concat-url=/gadgets/concat?
+shindig.content-rewrite.enable-split-js-concat=false
 
 #
 # Default set of forced libs to allow for better caching

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=915152&r1=915151&r2=915152&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 Tue Feb 23 03:06:18 2010
@@ -38,7 +38,7 @@
   }
 
   public SanitizingProxyingLinkRewriter create(Uri gadgetUri,
-      ContentRewriterFeature rewriterFeature, String container,
+      ContentRewriterFeature.Config rewriterFeature, String container,
       String expectedMime, boolean debug, boolean nocache) {
     return new SanitizingProxyingLinkRewriter(rewriterUris, gadgetUri,
         rewriterFeature, container, expectedMime, debug, nocache);

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=915152&r1=915151&r2=915152&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 Tue Feb 23 03:06:18 2010
@@ -22,7 +22,6 @@
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.parse.caja.CajaCssSanitizer;
 import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
-import org.apache.shindig.gadgets.rewrite.ContentRewriterFeatureFactory;
 import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
 import org.apache.shindig.gadgets.rewrite.LinkRewriter;
 import org.apache.shindig.gadgets.rewrite.MutableContent;
@@ -99,13 +98,13 @@
   private final Set<String> allowedTags;
   private final Set<String> allowedAttributes;
   private final CajaCssSanitizer cssSanitizer;
-  private final ContentRewriterFeatureFactory rewriterFeatureFactory;
+  private final ContentRewriterFeature.Factory rewriterFeatureFactory;
   private final SanitizingProxyingLinkRewriterFactory sanitizingProxyingLinkRewriterFactory;
 
   @Inject
   public SanitizingGadgetRewriter(@AllowedTags Set<String> allowedTags,
       @AllowedAttributes Set<String> allowedAttributes,
-      ContentRewriterFeatureFactory rewriterFeatureFactory,
+      ContentRewriterFeature.Factory rewriterFeatureFactory,
       CajaCssSanitizer cssSanitizer,
       SanitizingProxyingLinkRewriterFactory sanitizingProxyingLinkRewriterFactory) {
     this.allowedTags = allowedTags;
@@ -142,7 +141,7 @@
     NodeSanitizer(Gadget gadget) {
       this.context = gadget.getSpec().getUrl();
       Integer expires = rewriterFeatureFactory.getDefault().getExpires();
-      ContentRewriterFeature rewriterFeature =
+      ContentRewriterFeature.Config rewriterFeature =
           rewriterFeatureFactory.createRewriteAllFeature(expires == null ? -1 : expires);
 
       SanitizingProxyingLinkRewriter cssImportRewriter = sanitizingProxyingLinkRewriterFactory

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=915152&r1=915151&r2=915152&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 Tue Feb 23 03:06:18 2010
@@ -34,7 +34,7 @@
   private final String expectedMime;
 
   public SanitizingProxyingLinkRewriter(ContentRewriterUris rewriterUris,
-      Uri gadgetUri, ContentRewriterFeature rewriterFeature, String container,
+      Uri gadgetUri, ContentRewriterFeature.Config rewriterFeature, String container,
       String expectedMime, boolean debug, boolean nocache) {
     super(rewriterUris, gadgetUri, rewriterFeature, container, debug, nocache);
     this.expectedMime = expectedMime;

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyingLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyingLinkRewriterFactory.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyingLinkRewriterFactory.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyingLinkRewriterFactory.java Tue Feb 23 03:06:18 2010
@@ -26,6 +26,6 @@
 @ImplementedBy(DefaultSanitizingProxyingLinkRewriterFactory.class)
 public interface SanitizingProxyingLinkRewriterFactory {
   public SanitizingProxyingLinkRewriter create(Uri gadgetUri,
-      ContentRewriterFeature rewriterFeature, String container,
+      ContentRewriterFeature.Config rewriterFeature, String container,
       String expectedMime, boolean debug, boolean nocache);
 }

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriter.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriter.java Tue Feb 23 03:06:18 2010
@@ -27,7 +27,6 @@
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.parse.caja.CajaCssSanitizer;
 import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
-import org.apache.shindig.gadgets.rewrite.ContentRewriterFeatureFactory;
 import org.apache.shindig.gadgets.rewrite.MutableContent;
 import org.apache.shindig.gadgets.rewrite.RequestRewriter;
 
@@ -45,12 +44,12 @@
     Logger.getLogger(SanitizingRequestRewriter.class.getName());
 
   private final CajaCssSanitizer cssSanitizer;
-  private final ContentRewriterFeatureFactory rewriterFeatureFactory;
+  private final ContentRewriterFeature.Factory rewriterFeatureFactory;
   private final SanitizingProxyingLinkRewriterFactory sanitizingProxyingLinkRewriterFactory;
   
   @Inject
   public SanitizingRequestRewriter(
-      ContentRewriterFeatureFactory rewriterFeatureFactory,
+      ContentRewriterFeature.Factory rewriterFeatureFactory,
       CajaCssSanitizer cssSanitizer,
       SanitizingProxyingLinkRewriterFactory sanitizingProxyingLinkRewriterFactory) {
     this.cssSanitizer = cssSanitizer;
@@ -61,7 +60,7 @@
   public boolean rewrite(HttpRequest request, HttpResponse resp, MutableContent content) {
     // Content fetched through the proxy can stipulate that it must be sanitized.
     if (request.isSanitizationRequested()) {
-      ContentRewriterFeature rewriterFeature =
+      ContentRewriterFeature.Config rewriterFeature =
         rewriterFeatureFactory.createRewriteAllFeature(request.getCacheTtl());
       if (StringUtils.isEmpty(request.getRewriteMimeType())) {
         logger.log(Level.WARNING, "Request to sanitize without content type for "
@@ -130,7 +129,7 @@
    * Sanitize a CSS file.
    */
   private boolean rewriteProxiedCss(HttpRequest request, HttpResponse response,
-      MutableContent content, ContentRewriterFeature rewriterFeature) {
+      MutableContent content, ContentRewriterFeature.Config rewriterFeature) {
     String sanitized = "";
     try {
       String contentType = response.getHeader("Content-Type");

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriter.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriter.java Tue Feb 23 03:06:18 2010
@@ -34,14 +34,14 @@
 
   private final ContentRewriterUris rewriterUris;
 
-  private final ContentRewriterFeature rewriterFeature;
+  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 rewriterFeature, String container, boolean debug,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
       boolean ignoreCache) {
     this.rewriterUris = rewriterUris;
     this.rewriterFeature = rewriterFeature;
@@ -102,7 +102,7 @@
     return concatUris;
   }
 
-  protected String getConcatBase(Uri gadgetUri, ContentRewriterFeature feature,
+  protected String getConcatBase(Uri gadgetUri, ContentRewriterFeature.Config feature,
       String mimeType, String container) {
     String concatBaseNoGadget = rewriterUris.getConcatBase(container);
     return concatBaseNoGadget

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriterFactory.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriterFactory.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ConcatLinkRewriterFactory.java Tue Feb 23 03:06:18 2010
@@ -25,7 +25,7 @@
 @ImplementedBy(DefaultConcatLinkRewriterFactory.class)
 public interface ConcatLinkRewriterFactory {
   public ConcatLinkRewriter create(Uri gadgetUri,
-      ContentRewriterFeature rewriterFeature, String container, boolean debug,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
       boolean ignoreCache);
 
 }

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeature.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeature.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeature.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeature.java Tue Feb 23 03:06:18 2010
@@ -17,18 +17,25 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.GadgetSpecFactory;
+import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.spec.Feature;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
 import java.util.Set;
 import java.util.regex.Pattern;
 
@@ -40,338 +47,361 @@
  * result. For legacy applications include-urls and exclude-urls, which are
  * regular expressions as well as a common seperated list in include-tags.
  * Default values are container specific.
- * 
- * TODO: This really needs to be fixed, because it makes GadgetSpec mutable. It
- * is *ONLY* needed by code in the rewrite package.
  */
 public class ContentRewriterFeature {
-
   protected static final String INCLUDE_URLS = "include-urls";
   protected static final String EXCLUDE_URLS = "exclude-urls";
   protected static final String INCLUDE_URL = "include-url";
   protected static final String EXCLUDE_URL = "exclude-url";
   protected static final String INCLUDE_TAGS = "include-tags";
   protected static final String EXPIRES = "expires";
+  
+  public static final Integer EXPIRES_DEFAULT = -1;  // -1 = Use HTTP.
 
-  public static final String EXPIRES_DEFAULT = "HTTP";
-
-  // Use tree set to maintain order for fingerprint
-  protected Set<String> includeTags;
-
-  protected enum PATTERNS {
+  protected enum PatternOptions {
     ALL, NONE, REGEX, STRINGS
   }
-
-  protected PATTERNS includePatterns;
-  protected PATTERNS excludePatterns;
-
-  protected Pattern includePattern;
-  protected Pattern excludePattern;
-  protected Pattern excludeOverridePattern;
-  protected Collection<String> includes;
-  protected Collection<String> excludes;
-
-  // If null then dont enforce a min TTL for proxied content. Use contents
-  // headers
-  protected Integer expires;
-
-  protected Integer fingerprint;
-
+  
   /**
-   * Constructor which takes a gadget spec and the default container settings
-   * 
-   * @param spec
-   * @param defaultInclude
-   *          As a regex
-   * @param defaultExclude
-   *          As a regex
-   * @param defaultExpires
-   *          Either "HTTP" or a ttl in seconds
-   * @param defaultTags
-   *          Set of default tags that can be rewritten
+   * Factory for content rewriter features.
    */
-  public ContentRewriterFeature(GadgetSpec spec, String defaultInclude,
-      String defaultExclude, String defaultExpires, Set<String> defaultTags,
-      boolean onlyAllowExcludes) {
-    Feature f = null;
-    if (spec != null) {
-      f = spec.getModulePrefs().getFeatures().get("content-rewrite");
-    }
-    setUpIncludes(f, defaultInclude, onlyAllowExcludes);
-    setUpExcludes(f, defaultExclude, onlyAllowExcludes);
-    setUpIncludeTags(f, defaultTags, onlyAllowExcludes);
-    setUpExpires(f, defaultExpires, onlyAllowExcludes);
-  }
+  @Singleton
+  public static class Factory {
+    private final GadgetSpecFactory specFactory;
+    private final Config defaultConfig;
+
+    @Inject
+    public Factory(GadgetSpecFactory specFactory, DefaultConfig defaultConfig) {
+      this.specFactory = specFactory;
+      this.defaultConfig = defaultConfig;
+    }
 
-  protected void setUpExpires(Feature f, String defaultExpires,
-      boolean onlyAllowExcludes) {
-    Integer defaultExpiresVal = null;
-    try {
-      defaultExpiresVal = new Integer(defaultExpires);
-    } catch (NumberFormatException e) {
-      // ignore
-    }
-    List<String> expiresOptions = Lists.newArrayListWithCapacity(3);
-    if (f != null) {
-      if (f.getParams().containsKey(EXPIRES)) {
-        String p = normalizeParam(f.getParam(EXPIRES), null);
-        Integer expiresParamVal = null;
+    public Config getDefault() {
+      return defaultConfig;
+    }
+    
+    public Config get(HttpRequest request) {
+      return get(request.getGadget());
+    }
+
+    public Config get(final Uri gadgetUri) {
+      GadgetSpec spec;
+      if (gadgetUri != null) {
         try {
-          expiresParamVal = new Integer(p);
-        } catch (NumberFormatException e) {
-          // ignore
+          GadgetContext context = new GadgetContext() {
+            @Override
+            public Uri getUrl() {
+              return gadgetUri;
+            }
+          };
+
+          spec = specFactory.getGadgetSpec(context);
+          if (spec != null) {
+            return get(spec);
+          }
+        } catch (GadgetException ge) {
+          // Falls through to default.
         }
-        if (!onlyAllowExcludes || defaultExpiresVal == null
-            || (expiresParamVal != null && expiresParamVal < defaultExpiresVal))
-          expiresOptions.add(p);
       }
+      return defaultConfig;
     }
 
-    expiresOptions.add(defaultExpires);
-    expiresOptions.add(EXPIRES_DEFAULT);
-
-    for (String expiryOption : expiresOptions) {
+    public Config get(GadgetSpec spec) {
+      Config rewriterFeature =
+          (Config)spec.getAttribute("content-rewriter");
+      if (rewriterFeature != null) return rewriterFeature;
+      rewriterFeature = new Config(spec, defaultConfig);
+      spec.setAttribute("content-rewriter", rewriterFeature);
+      return rewriterFeature;
+    }
+
+    /**
+     * Create a rewriter feature that allows all URIs to be rewritten.
+     */
+    public Config createRewriteAllFeature(int ttl) {
+      return new Config(
+          ".*", "", (ttl == -1) ? "HTTP" : Integer.toString(ttl),
+          "", false, true);
+    }
+  }
+  
+  @Singleton
+  public static class DefaultConfig extends Config {
+    @Inject
+    public DefaultConfig(
+        @Named("shindig.content-rewrite.include-urls")String includeUrls,
+        @Named("shindig.content-rewrite.exclude-urls")String excludeUrls,
+        @Named("shindig.content-rewrite.expires")String expires,
+        @Named("shindig.content-rewrite.include-tags")String includeTags,
+        @Named("shindig.content-rewrite.only-allow-excludes")String onlyAllowExcludes,
+        @Named("shindig.content-rewrite.enable-split-js-concat")String enableSplitJsConcat) {
+      super(includeUrls, excludeUrls, expires, includeTags,
+          Boolean.parseBoolean(onlyAllowExcludes), Boolean.parseBoolean(enableSplitJsConcat));
+    }
+  }
+  
+  public static class Config {
+    private final MatchBundle includes;
+    private final MatchBundle excludes;
+
+    // Use tree set to maintain order for fingerprint
+    private final Set<String> includeTags;
+
+    // If null then dont enforce a min TTL for proxied content.
+    // Use contents headers
+    private final Integer expires;
+    private final boolean onlyAllowExcludes;
+    private final boolean enableSplitJs;
+    
+    // Lazily computed
+    private Integer fingerprint;
+    
+    /**
+     * Constructor which takes a gadget spec and container settings
+     * as "raw" input strings.
+     * 
+     * @param defaultInclude As a regex
+     * @param defaultExclude As a regex
+     * @param defaultExpires Either "HTTP" or a ttl in seconds
+     * @param defaultTags Set of default tags that can be rewritten
+     * @param onlyAllowExcludes If includes are always implicitly "all"
+     * @param enableSplitJs If split-JS technique is enabled
+     */
+    Config(String defaultInclude,
+        String defaultExclude, String defaultExpires, String defaultTags,
+        boolean onlyAllowExcludes, boolean enableSplitJs) {
+      // Set up includes from defaultInclude param
+      this.includes = getMatchBundle(paramTrim(defaultInclude),
+          Collections.<String>emptyList());
+      
+      // Set up excludes from defaultExclude param
+      this.excludes = getMatchBundle(paramTrim(defaultExclude),
+          Collections.<String>emptyList());
+
+      // Parse includeTags
+      ImmutableSet.Builder<String> includeTagsBuilder = ImmutableSet.builder();
+      for (String s : paramTrim(defaultTags).toLowerCase().split("\\s*,\\s*")) {
+        if (s != null && s.length() > 0) {
+          includeTagsBuilder.add(s);
+        }
+      }
+      this.includeTags = includeTagsBuilder.build();
+      
+      // Parse expires field
+      int expiresVal = EXPIRES_DEFAULT;
       try {
-        expires = new Integer(expiryOption);
-        break;
-      } catch (NumberFormatException nfe) {
-        // Not an integer
-        if (EXPIRES_DEFAULT.equalsIgnoreCase(expiryOption)) {
-          break;
+        expiresVal = Integer.parseInt(paramTrim(defaultExpires));
+      } catch (NumberFormatException e) {
+        // Fall through to default.
+      }
+      this.expires = expiresVal;
+      
+      // Save config for onlyAllowExcludes
+      this.onlyAllowExcludes = onlyAllowExcludes;
+      this.enableSplitJs = enableSplitJs;
+    }
+    
+    Config(GadgetSpec spec, Config defaultConfig) {
+      this.onlyAllowExcludes = defaultConfig.onlyAllowExcludes;
+      
+      Feature f = spec.getModulePrefs().getFeatures().get("content-rewrite");
+      
+      // Include overrides.
+      // Note: Shindig originally supported the plural versions with regular
+      // expressions. But the OpenSocial specification v0.9 allows for singular
+      // spellings, with multiple values. Plus they are case insensitive substrings.
+      // For backward compatibility, if the singular versions are present they
+      // will override the plural versions. 10/6/09
+      String includeRegex = defaultConfig.includes.param;
+      Collection<String> includeUrls = Lists.newArrayList();
+      if (f != null && !onlyAllowExcludes) {
+        if (f.getParams().containsKey(INCLUDE_URLS)) {
+          includeRegex = f.getParam(INCLUDE_URLS);
+        }
+        Collection<String> paramUrls = f.getParamCollection(INCLUDE_URL);
+        for (String url : paramUrls) {
+          includeUrls.add(url.trim().toLowerCase());
         }
       }
-    }
-  }
-
-  protected void setUpIncludeTags(Feature f, Set<String> defaultTags,
-      boolean onlyAllowExcludes) {
-    this.includeTags = ImmutableSortedSet.copyOf(defaultTags);
-    if (f != null) {
-      String includeTagList = f.getParam(INCLUDE_TAGS);
-      if (includeTagList != null) {
-        Set<String> tags = Sets.newTreeSet();
-        for (String tag : StringUtils.split(includeTagList, ',')) {
-          if (tag != null) {
-            tags.add(tag.trim().toLowerCase());
+      this.includes = getMatchBundle(includeRegex, includeUrls);
+      
+      // Exclude overrides. Only use the exclude regex specified by the
+      // gadget spec if !onlyAllowExcludes.
+      String excludeRegex = defaultConfig.excludes.param;
+      Collection<String> excludeUrls = Lists.newArrayList();
+      if (f != null) {
+        if (f.getParams().containsKey(EXCLUDE_URLS)) {
+          excludeRegex = f.getParam(EXCLUDE_URLS);
+        }
+        Collection<String> eParamUrls = f.getParamCollection(EXCLUDE_URL);
+        for (String url : eParamUrls) {
+          excludeUrls.add(url.trim().toLowerCase());
+        }
+      }
+      this.excludes = getMatchBundle(excludeRegex, excludeUrls);
+      
+      // Spec-specified include tags.
+      Set<String> tagsVal = null;
+      if (f != null && f.getParams().containsKey(INCLUDE_TAGS)) {
+        tagsVal = Sets.newTreeSet();
+        for (String tag : StringUtils.split(f.getParam(INCLUDE_TAGS), ',')) {
+          if (!StringUtils.isEmpty(tag)) {
+            tagsVal.add(tag.trim().toLowerCase());
           }
         }
         if (onlyAllowExcludes) {
-          tags.retainAll(defaultTags);
+          // Only excludes are allowed. Keep only subset of
+          // specified tags that are in the defaults.
+          tagsVal.retainAll(defaultConfig.includeTags);
         }
-        includeTags = tags;
-      }
-    }
-  }
-
-  // Note: Shindig originally supported the plural versions with regular
-  // expressions. But the OpenSocial specification v0.9 allows for singular
-  // spellings, with multiple values. Plus they are case insensitive substrings.
-  // For backward compatibility, if the singular versions are present they
-  // will override the plural versions. 10/6/09
-
-  protected void setUpIncludes(Feature f, String defaultInclude,
-      boolean onlyAllowExcludes) {
-    String includeRegex = normalizeParam(defaultInclude, null);
-
-    if (f != null && !onlyAllowExcludes) {
-      if (f.getParams().containsKey(INCLUDE_URLS)) {
-        includeRegex = normalizeParam(f.getParam(INCLUDE_URLS), includeRegex);
-      }
-
-      Collection<String> includeUrls = f.getParamCollection(INCLUDE_URL);
-      if (includeUrls.isEmpty()) {
-        includes = Collections.emptyList();
-      } else if (includeUrls.contains("*")) {
-        includes = Collections.singleton("*");
-      } else {
-        includes = new ArrayList<String>(includeUrls.size());
-        for (String s : includeUrls) {
-          if (s.length() > 0)
-            includes.add(s.toLowerCase());
-        }
-      }
-    } else {
-      includes = Collections.emptyList();
-    }
-
-    if (includes.isEmpty()
-        && (includeRegex == null || "".equals(includeRegex))) {
-      includePatterns = PATTERNS.NONE;
-    } else if (includes.size() > 0) {
-      if (includes.size() == 1 && "*".equals(includes.iterator().next())) {
-        includePatterns = PATTERNS.ALL;
       } else {
-        includePatterns = PATTERNS.STRINGS;
+        tagsVal = ImmutableSortedSet.copyOf(defaultConfig.includeTags);
       }
-    } else {
-      if (".*".equals(includeRegex)) {
-        includePatterns = PATTERNS.ALL;
-      } else {
-        includePatterns = PATTERNS.REGEX;
-      }
-      includePattern = Pattern.compile(includeRegex);
-    }
-  }
+      this.includeTags = tagsVal;
 
-  protected void setUpExcludes(Feature f, String defaultExclude,
-      boolean onlyAllowExcludes) {
-    String excludeRegex = normalizeParam(defaultExclude, null);
-    String excludeOverrideRegex = onlyAllowExcludes ? excludeRegex : null;
-
-    if (f != null) {
-      // Note use of default for exclude as null here to allow clearing value in
-      // the presence of a container default.
-      if (f.getParams().containsKey(EXCLUDE_URLS)) {
-        excludeRegex = normalizeParam(f.getParam(EXCLUDE_URLS), null);
-      }
-
-      Collection<String> excludeUrls = f.getParamCollection(EXCLUDE_URL);
-      if (excludeUrls.isEmpty()) {
-        excludes = Collections.emptyList();
-      } else if (excludeUrls.contains("*")) {
-        excludes = Collections.singleton("*");
-      } else {
-        excludes = new ArrayList<String>(excludeUrls.size());
-        // Override Shindig defaults
-        excludeRegex = null;
-        for (String s : excludeUrls) {
-          if (s.length() > 0)
-            excludes.add(s.toLowerCase());
-        }
-      }
-    } else {
-      excludes = Collections.emptyList();
-    }
-
-    if (excludes.isEmpty()
-        && (excludeRegex == null || "".equals(excludeRegex))) {
-      excludePatterns = PATTERNS.NONE;
-    } else if (excludes.size() > 0) {
-      if (excludes.size() == 1 && "*".equals(excludes.iterator().next())) {
-        excludePatterns = PATTERNS.ALL;
-      } else {
-        excludePatterns = PATTERNS.STRINGS;
+      // Let spec/feature override if present and smaller than default.
+      int expiresVal = defaultConfig.expires;
+      if (f != null && f.getParams().containsKey(EXPIRES)) {
+        try {
+          int overrideVal = Integer.parseInt(f.getParam(EXPIRES));
+          expiresVal = Math.min(overrideVal, expiresVal);
+        } catch (NumberFormatException e) {
+          // Falls through to default.
+          if ("HTTP".equalsIgnoreCase(f.getParam(EXPIRES).trim())) {
+            expiresVal = EXPIRES_DEFAULT;
+          }
+        }
       }
-    } else {
-      if (".*".equals(excludeRegex)) {
-        excludePatterns = PATTERNS.ALL;
+      this.expires = expiresVal;
+      this.enableSplitJs = defaultConfig.enableSplitJs;
+    }
+    
+    private String paramTrim(String param) {
+      if (param == null) {
+        return param;
+      }
+      
+      return param.trim();
+    }
+    
+    private MatchBundle getMatchBundle(String regex, Collection<String> matches) {
+      MatchBundle bundle = new MatchBundle();
+      bundle.param = regex;
+      bundle.matches = matches;
+      
+      if (bundle.matches.isEmpty() && StringUtils.isEmpty(bundle.param)) {
+        bundle.options = PatternOptions.NONE;
+      } else if (bundle.matches.size() == 1) {
+        String firstVal = bundle.matches.iterator().next();
+        if ("*".equals(firstVal)) {
+          bundle.options = PatternOptions.ALL;
+        } else if ("".equals(firstVal)){
+          bundle.options = PatternOptions.NONE;
+        } else {
+          bundle.options = PatternOptions.STRINGS;
+        }
+      } else if (bundle.matches.size() > 1) {
+        bundle.options = PatternOptions.STRINGS;
       } else {
-        excludePatterns = PATTERNS.REGEX;
+        if (".*".equals(bundle.param)) {
+          bundle.options = PatternOptions.ALL;
+        } else {
+          bundle.options = PatternOptions.REGEX;
+        }
+        bundle.pattern = Pattern.compile(bundle.param);
       }
-      excludePattern = Pattern.compile(excludeRegex);
+      return bundle;
     }
-
-    if (excludeOverrideRegex != null
-        && !excludeOverrideRegex.equals(excludeRegex)) {
-      excludeOverridePattern = Pattern.compile(excludeOverrideRegex);
-      if (excludePatterns == PATTERNS.NONE)
-        excludePatterns = PATTERNS.REGEX;
+    
+    private static class MatchBundle {
+      private String param;
+      private PatternOptions options;
+      private Pattern pattern;
+      private Collection<String> matches;
     }
-  }
 
-  protected String normalizeParam(String paramValue, String defaultVal) {
-    if (paramValue == null) {
-      return defaultVal;
-    }
-    paramValue = paramValue.trim();
-    if (paramValue.length() == 0) {
-      return defaultVal;
+    protected boolean shouldInclude(String url) {
+      return matcherMatches(url, includes);
     }
-    return paramValue;
-  }
 
-  protected boolean shouldInclude(String url) {
-    switch (includePatterns) {
-    case NONE:
-      return false;
-    case ALL:
-      return true;
-    case REGEX:
-      return includePattern.matcher(url).find();
-    case STRINGS:
-      // "*" is handled by ALL
-      String urllc = url.toLowerCase();
-      for (String substr : includes) {
-        if (urllc.indexOf(substr) >= 0)
-          return true;
-      }
-      return false;
+    protected boolean shouldExclude(String url) {
+      return matcherMatches(url, excludes);
     }
-    return false;
-  }
-
-  protected boolean shouldExclude(String url) {
-    switch (excludePatterns) {
-    case NONE:
-      return false;
-    case ALL:
-      return true;
-    case REGEX:
-      return (excludeOverridePattern != null && excludeOverridePattern.matcher(
-          url).find())
-          || (excludePattern != null && excludePattern.matcher(url).find());
-    case STRINGS:
-      if (excludeOverridePattern != null
-          && excludeOverridePattern.matcher(url).find())
+    
+    private static boolean matcherMatches(String url, MatchBundle bundle) {
+      switch (bundle.options) {
+      case NONE:
+        return false;
+      case ALL:
         return true;
-      // "*" is handled by ALL
-      String urllc = url.toLowerCase();
-      for (String substr : excludes) {
-        if (urllc.indexOf(substr) >= 0)
-          return true;
+      case REGEX:
+        return bundle.pattern.matcher(url).find();
+      case STRINGS:
+        // "*" is handled by ALL
+        String urllc = url.toLowerCase();
+        for (String substr : bundle.matches) {
+          if (urllc.indexOf(substr) >= 0)
+            return true;
+        }
+        return false;
       }
       return false;
     }
-    return false;
-  }
-
-  public boolean isRewriteEnabled() {
-    return includePatterns != PATTERNS.NONE && excludePatterns != PATTERNS.ALL;
-  }
 
-  public boolean shouldRewriteURL(String url) {
-    return shouldInclude(url) && !shouldExclude(url);
-  }
+    public boolean isRewriteEnabled() {
+      return includes.options != PatternOptions.NONE &&
+             excludes.options != PatternOptions.ALL;
+    }
 
-  public boolean shouldRewriteTag(String tag) {
-    if (tag != null) {
-      return this.includeTags.contains(tag.toLowerCase());
+    public boolean shouldRewriteURL(String url) {
+      return shouldInclude(url) && !shouldExclude(url);
     }
-    return false;
-  }
 
-  public Set<String> getIncludedTags() {
-    return includeTags;
-  }
+    public boolean shouldRewriteTag(String tag) {
+      if (tag != null) {
+        return this.includeTags.contains(tag.toLowerCase());
+      }
+      return false;
+    }
 
-  /**
-   * @return the min TTL to enforce or null if proxy should respect headers
-   */
-  public Integer getExpires() {
-    return expires;
-  }
+    public Set<String> getIncludedTags() {
+      return includeTags;
+    }
 
-  /**
-   * @return fingerprint of rewriting rule for cache-busting
-   */
-  public int getFingerprint() {
-    if (fingerprint == null) {
-      int result;
-      result = (includePattern != null ? includePattern.pattern().hashCode()
-          : 0);
-      for (String s : includes) {
-        result = 31 * result + s.hashCode();
-      }
-      result = 31 * result
-          + (excludePattern != null ? excludePattern.pattern().hashCode() : 0);
-      for (String s : excludes) {
-        result = 31 * result + s.hashCode();
-      }
-      for (String s : includeTags) {
-        result = 31 * result + s.hashCode();
+    /**
+     * @return the min TTL to enforce or null if proxy should respect headers
+     */
+    public Integer getExpires() {
+      return expires;
+    }
+    
+    public boolean isSplitJsEnabled() {
+      return enableSplitJs;
+    }
+
+    /**
+     * @return fingerprint of rewriting rule for cache-busting
+     */
+    public int getFingerprint() {
+      if (fingerprint == null) {
+        int result =
+            (includes.pattern != null ?
+              includes.pattern.pattern().hashCode() : 0);
+        for (String s : includes.matches) {
+          result = 31 * result + s.hashCode();
+        }
+        result = 31 * result +
+            (excludes.pattern != null ?
+              excludes.pattern.pattern().hashCode() : 0);
+        for (String s : excludes.matches) {
+          result = 31 * result + s.hashCode();
+        }
+        for (String s : includeTags) {
+          result = 31 * result + s.hashCode();
+        }
+        fingerprint = result;
       }
-      fingerprint = result;
+      return fingerprint;
     }
-    return fingerprint;
   }
 }

Modified: 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/CssRequestRewriter.java?rev=915152&r1=915151&r2=915152&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/CssRequestRewriter.java Tue Feb 23 03:06:18 2010
@@ -48,12 +48,12 @@
 
   private static final Logger logger = Logger.getLogger(CssRequestRewriter.class.getName());
 
-  private final ContentRewriterFeatureFactory rewriterFeatureFactory;
+  private final ContentRewriterFeature.Factory rewriterFeatureFactory;
   private final CajaCssLexerParser cssParser;
   private final ProxyingLinkRewriterFactory proxyingLinkRewriterFactory;
 
   @Inject
-  public CssRequestRewriter(ContentRewriterFeatureFactory rewriterFeatureFactory,
+  public CssRequestRewriter(ContentRewriterFeature.Factory rewriterFeatureFactory,
       CajaCssLexerParser cssParser,
       ProxyingLinkRewriterFactory proxyingLinkRewriterFactory) {
     this.rewriterFeatureFactory = rewriterFeatureFactory;
@@ -66,7 +66,7 @@
     if (!RewriterUtils.isCss(request, original)) {
       return false;
     }
-    ContentRewriterFeature feature = rewriterFeatureFactory.get(request);
+    ContentRewriterFeature.Config feature = rewriterFeatureFactory.get(request);
     String css = content.getContent();
     StringWriter sw = new StringWriter((css.length() * 110) / 100);
     rewrite(new StringReader(css), request.getUri(),

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultConcatLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultConcatLinkRewriterFactory.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultConcatLinkRewriterFactory.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultConcatLinkRewriterFactory.java Tue Feb 23 03:06:18 2010
@@ -38,7 +38,7 @@
   }
 
   public ConcatLinkRewriter create(Uri gadgetUri,
-      ContentRewriterFeature rewriterFeature, String container, boolean debug,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
       boolean ignoreCache) {
     return new ConcatLinkRewriter(rewriterUris, gadgetUri, rewriterFeature,
         container, debug, ignoreCache);

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultProxyingLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultProxyingLinkRewriterFactory.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultProxyingLinkRewriterFactory.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultProxyingLinkRewriterFactory.java Tue Feb 23 03:06:18 2010
@@ -35,7 +35,7 @@
   }
 
   public ProxyingLinkRewriter create(Uri gadgetUri,
-      ContentRewriterFeature rewriterFeature, String container, boolean debug,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
       boolean ignoreCache) {
     return new ProxyingLinkRewriter(rewriterUris, gadgetUri, rewriterFeature,
         container, debug, ignoreCache);

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriter.java Tue Feb 23 03:06:18 2010
@@ -57,13 +57,13 @@
       "embed", ImmutableSet.of("src")
   );
 
-  private final ContentRewriterFeatureFactory rewriterFeatureFactory;
+  private final ContentRewriterFeature.Factory rewriterFeatureFactory;
   private final CssRequestRewriter cssRewriter;
   private final ConcatLinkRewriterFactory concatLinkRewriterFactory;
   private final ProxyingLinkRewriterFactory proxyingLinkRewriterFactory;
 
   @Inject
-  public HTMLContentRewriter(ContentRewriterFeatureFactory rewriterFeatureFactory,
+  public HTMLContentRewriter(ContentRewriterFeature.Factory rewriterFeatureFactory,
       CssRequestRewriter cssRewriter,
       ConcatLinkRewriterFactory concatLinkRewriterFactory,
       ProxyingLinkRewriterFactory proxyingLinkRewriterFactory) {
@@ -76,7 +76,7 @@
   public boolean rewrite(HttpRequest request, HttpResponse original,
       MutableContent content) throws RewritingException {
     if (RewriterUtils.isHtml(request, original)) {
-      ContentRewriterFeature feature = rewriterFeatureFactory.get(request);
+      ContentRewriterFeature.Config feature = rewriterFeatureFactory.get(request);
       return rewriteImpl(feature, request.getGadget(), request.getUri(), content,
           request.getContainer(), false, request.getIgnoreCache());
     }
@@ -91,7 +91,7 @@
       return;
     }
     
-    ContentRewriterFeature feature = rewriterFeatureFactory.get(gadget.getSpec());
+    ContentRewriterFeature.Config feature = rewriterFeatureFactory.get(gadget.getSpec());
     Uri contentBase = gadget.getSpec().getUrl();
     View view = gadget.getCurrentView();
     if (view != null && view.getHref() != null) {
@@ -103,7 +103,7 @@
         gadget.getContext().getIgnoreCache());
   }
 
-  boolean rewriteImpl(ContentRewriterFeature feature, Uri gadgetUri,
+  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) {
@@ -137,7 +137,7 @@
   }
 
   protected boolean rewriteStyleTags(Element head, List<Element> elementList,
-      ContentRewriterFeature feature, Uri gadgetUri, Uri contentBase, String container,
+      ContentRewriterFeature.Config feature, Uri gadgetUri, Uri contentBase, String container,
       boolean debug, boolean ignoreCache) throws RewritingException {
     if (!feature.getIncludedTags().contains("style")) {
       return false;
@@ -190,7 +190,7 @@
     return mutated;
   }
 
-  protected boolean rewriteJsTags(List<Element> elementList, ContentRewriterFeature feature,
+  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;
@@ -236,7 +236,7 @@
   }
 
   protected boolean rewriteContentReferences(List<Element> elementList,
-      ContentRewriterFeature feature, Uri gadgetUri, Uri contentBase, String container,
+      ContentRewriterFeature.Config feature, Uri gadgetUri, Uri contentBase, String container,
       boolean debug, boolean ignoreCache) {
     boolean mutated = false;
     LinkRewriter rewriter = proxyingLinkRewriterFactory.create(gadgetUri,
@@ -265,7 +265,7 @@
     return mutated;
   }
 
-  private void concatenateTags(final ContentRewriterFeature feature,
+  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

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriter.java Tue Feb 23 03:06:18 2010
@@ -29,14 +29,14 @@
 public class ProxyingLinkRewriter implements LinkRewriter {
 
   protected final ContentRewriterUris rewriterUris;
-  protected final ContentRewriterFeature rewriterFeature;
+  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 rewriterFeature, String container, boolean debug,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
       boolean ignoreCache) {
     this.rewriterUris = rewriterUris;
     this.rewriterFeature = rewriterFeature;
@@ -69,7 +69,8 @@
           result.append("&debug=1");
         if(ignoreCache)
           result.append("&nocache=1");
-        if (rewriterFeature.getExpires() != null) {
+        if (rewriterFeature.getExpires() != null &&
+            rewriterFeature.getExpires() != ContentRewriterFeature.EXPIRES_DEFAULT) {
           result.append('&').append(ProxyBase.REFRESH_PARAM).append('=').append(rewriterFeature.getExpires().toString());
         }
         return result.toString();

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterFactory.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterFactory.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterFactory.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ProxyingLinkRewriterFactory.java Tue Feb 23 03:06:18 2010
@@ -25,7 +25,7 @@
 @ImplementedBy(DefaultProxyingLinkRewriterFactory.class)
 public interface ProxyingLinkRewriterFactory {
   public ProxyingLinkRewriter create(Uri gadgetUri,
-      ContentRewriterFeature rewriterFeature, String container, boolean debug,
+      ContentRewriterFeature.Config rewriterFeature, String container, boolean debug,
       boolean ignoreCache);
 }
 

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/SanitizingGadgetRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/SanitizingGadgetRewriterTest.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/SanitizingGadgetRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/SanitizingGadgetRewriterTest.java Tue Feb 23 03:06:18 2010
@@ -24,7 +24,7 @@
 import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
 import org.apache.shindig.gadgets.parse.caja.CajaCssSanitizer;
 import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
-import org.apache.shindig.gadgets.rewrite.ContentRewriterFeatureFactory;
+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.servlet.ProxyBase;
@@ -110,8 +110,9 @@
   private GadgetRewriter createRewriter(Set<String> tags, Set<String> attributes) {
     Set<String> newTags = new HashSet<String>(tags);
     newTags.addAll(DEFAULT_TAGS);
-    ContentRewriterFeatureFactory rewriterFeatureFactory =
-        new ContentRewriterFeatureFactory(null, ".*", "", "HTTP", "embed,img,script,link,style", "false");
+    ContentRewriterFeature.Factory rewriterFeatureFactory =
+        new ContentRewriterFeature.Factory(null,
+          new ContentRewriterFeature.DefaultConfig(".*", "", "HTTP", "embed,img,script,link,style", "false", "false"));
     return new SanitizingGadgetRewriter(newTags, attributes, rewriterFeatureFactory,
         new CajaCssSanitizer(new CajaCssParser()), new DefaultSanitizingProxyingLinkRewriterFactory(rewriterUris));
   }

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriterTest.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/SanitizingRequestRewriterTest.java Tue Feb 23 03:06:18 2010
@@ -29,7 +29,7 @@
 import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
 import org.apache.shindig.gadgets.parse.caja.CajaCssSanitizer;
 import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
-import org.apache.shindig.gadgets.rewrite.ContentRewriterFeatureFactory;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
 import org.apache.shindig.gadgets.rewrite.MutableContent;
 import org.apache.shindig.gadgets.rewrite.RequestRewriter;
 import org.junit.Test;
@@ -53,8 +53,9 @@
   }
 
   private RequestRewriter createRewriter(Set<String> tags, Set<String> attributes) {
-    ContentRewriterFeatureFactory rewriterFeatureFactory =
-        new ContentRewriterFeatureFactory(null, ".*", "", "HTTP", "embed,img,script,link,style", "false");
+    ContentRewriterFeature.Factory rewriterFeatureFactory =
+        new ContentRewriterFeature.Factory(null,
+          new ContentRewriterFeature.DefaultConfig(".*", "", "HTTP", "embed,img,script,link,style", "false", "false"));
     return new SanitizingRequestRewriter(rewriterFeatureFactory,
         new CajaCssSanitizer(new CajaCssParser()), new DefaultSanitizingProxyingLinkRewriterFactory(rewriterUris));
   }

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=915152&r1=915151&r2=915152&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 Tue Feb 23 03:06:18 2010
@@ -57,10 +57,11 @@
     replaceDefaultWithMockServer(DEFAULT_PROXY_BASE);
   public static final String MOCK_CONCAT_BASE =
     replaceDefaultWithMockServer(DEFAULT_CONCAT_BASE);
+  protected final String TAGS = "embed,img,script,link,style";
 
   protected Set<String> tags;
-  protected ContentRewriterFeature defaultRewriterFeature;
-  protected ContentRewriterFeatureFactory rewriterFeatureFactory;
+  protected ContentRewriterFeature.Config defaultRewriterFeature;
+  protected ContentRewriterFeature.Factory rewriterFeatureFactory;
   protected LinkRewriter defaultLinkRewriter;
   protected LinkRewriter defaultLinkRewriterNoCache;
   protected LinkRewriter defaultLinkRewriterNoCacheAndDebug;
@@ -73,8 +74,9 @@
 
   @Before
   public void setUp() throws Exception {
-    rewriterFeatureFactory = new ContentRewriterFeatureFactory(null, ".*", "", "86400",
-        "embed,img,script,link,style", "false");
+    rewriterFeatureFactory = new ContentRewriterFeature.Factory(null,
+        new ContentRewriterFeature.DefaultConfig(".*", "", "86400",
+          "embed,img,script,link,style", "false", "false"));
     defaultRewriterFeature = rewriterFeatureFactory.getDefault();
     tags = defaultRewriterFeature.getIncludedTags();
     defaultContainerRewriterUris = new ContentRewriterUris(
@@ -177,8 +179,8 @@
     return originalText.replace("test.com", "mock.com");
   }
 
-  ContentRewriterFeatureFactory mockContentRewriterFeatureFactory(
-      ContentRewriterFeature feature) {
+  ContentRewriterFeature.Factory mockContentRewriterFeatureFactory(
+      ContentRewriterFeature.Config feature) {
     return new FakeRewriterFeatureFactory(feature);
   }
 
@@ -238,21 +240,21 @@
     return mc;
   }
 
-  private static class FakeRewriterFeatureFactory extends ContentRewriterFeatureFactory {
-    private final ContentRewriterFeature feature;
+  private static class FakeRewriterFeatureFactory extends ContentRewriterFeature.Factory {
+    private final ContentRewriterFeature.Config feature;
 
-    public FakeRewriterFeatureFactory(ContentRewriterFeature feature) {
-      super(null, ".*", "", "HTTP", "", "false");
+    public FakeRewriterFeatureFactory(ContentRewriterFeature.Config feature) {
+      super(null, new ContentRewriterFeature.DefaultConfig(".*", "", "HTTP", "", "false", "false"));
       this.feature = feature;
     }
 
     @Override
-    public ContentRewriterFeature get(GadgetSpec spec) {
+    public ContentRewriterFeature.Config get(GadgetSpec spec) {
       return feature;
     }
 
     @Override
-    public ContentRewriterFeature get(HttpRequest request) {
+    public ContentRewriterFeature.Config get(HttpRequest request) {
       return feature;
     }
   }

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java Tue Feb 23 03:06:18 2010
@@ -28,65 +28,79 @@
  * Test basic parsing of content-rewriter feature
  */
 public class ContentRewriterFeatureTestCase extends BaseRewriterTestCase {
-
   @Test
   public void testContainerDefaultIncludeAll() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithoutRewrite(), ".*", "", "0", tags, false);
+    defaultRewriterFeature =
+        new ContentRewriterFeature.Config(createSpecWithoutRewrite(),
+          new ContentRewriterFeature.DefaultConfig(
+            ".*", "", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   @Test
   public void testContainerDefaultIncludeNone() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithoutRewrite(), "", ".*", "0", tags, false);
+    defaultRewriterFeature =
+        new ContentRewriterFeature.Config(createSpecWithoutRewrite(),
+          new ContentRewriterFeature.DefaultConfig(
+            "", ".*", "0", TAGS, "false", "false"));
     assertFalse(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   @Test
   public void testContainerDefaultExcludeOverridesInclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithoutRewrite(), ".*", ".*", "0",
-        tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(createSpecWithoutRewrite(),
+        new ContentRewriterFeature.DefaultConfig(
+          ".*", ".*", "0", TAGS, "false", "false"));
     assertFalse(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   @Test
   public void testSpecExcludeOverridesContainerDefaultInclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite("", ".*", "0", tags), ".*",
-        "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("", ".*", "0", tags),
+        new ContentRewriterFeature.DefaultConfig(
+          ".*", "", "0", TAGS, "false", "false"));
     assertFalse(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   @Test
   public void testSpecExcludeOnlyOverridesContainerDefaultInclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(null, ".*", null, null), ".*",
-        "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite(null, ".*", null, null),
+        new ContentRewriterFeature.DefaultConfig(
+          ".*", "", "0", TAGS, "false", "false"));
     assertFalse(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   @Test
   public void testSpecExcludeOverridesContainerDefaultExclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(".*", "", "0", tags), "",
-        ".*", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite(".*", "", "0", tags),
+        new ContentRewriterFeature.DefaultConfig(
+          "", ".*", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   @Test
   public void testExcludeOverridesInclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewrite("test\\.com", "test", "0", tags), "", "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "test", "0", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   @Test
   public void testIncludeOnlyMatch() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewrite("test\\.com", "testx", "0", tags), "", "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "0", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://testx.test.com"));
@@ -94,8 +108,9 @@
 
   @Test
   public void testTagRewrite() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewrite("test\\.com", "testx", "0", tags), "", "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "0", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "0", TAGS, "false", "false"));
     assertFalse(defaultRewriterFeature.shouldRewriteTag("IFRAME"));
     assertTrue(defaultRewriterFeature.shouldRewriteTag("img"));
     assertTrue(defaultRewriterFeature.shouldRewriteTag("ScripT"));
@@ -104,8 +119,9 @@
   @Test
   public void testOverrideTagRewrite() throws Exception {
     Set<String> newTags = Sets.newHashSet("iframe");
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewrite("test\\.com", "testx", "0", newTags), "", "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "0", newTags),
+        new ContentRewriterFeature.DefaultConfig("", "", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.shouldRewriteTag("IFRAME"));
     assertFalse(defaultRewriterFeature.shouldRewriteTag("img"));
     assertFalse(defaultRewriterFeature.shouldRewriteTag("ScripT"));
@@ -114,31 +130,35 @@
 
   @Test
   public void testExpiresTimeParse() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewrite("test\\.com", "testx", "12345", tags), "", "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "12345", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "0", TAGS, "false", "false"));
     assertNotNull(defaultRewriterFeature.getExpires());
     assertNotNull(defaultRewriterFeature.getExpires() == 12345);
   }
 
   @Test
   public void testExpiresHTTPParse() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewrite("test\\.com", "testx", "htTp ", tags), "", "", "12345", tags, false);
-    assertNull(defaultRewriterFeature.getExpires());
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "htTp ", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "12345", TAGS, "false", "false"));
+    assertEquals(ContentRewriterFeature.EXPIRES_DEFAULT, defaultRewriterFeature.getExpires());
   }
 
   @Test
   public void testExpiresInvalidParse() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewrite("test\\.com", "testx", "junk", tags), "", "", "12345", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "junk", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "12345", TAGS, "false", "false"));
     assertNotNull(defaultRewriterFeature.getExpires());
     assertNotNull(defaultRewriterFeature.getExpires() == 12345);
   }
 
   @Test
   public void testSpecEmptyContainerWithExclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(null, null, null, null), ".*",
-        "test", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite(null, null, null, null),
+        new ContentRewriterFeature.DefaultConfig(".*", "test", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.foobar.com"));
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
@@ -146,8 +166,9 @@
 
   @Test
   public void testSpecExcludeOnlyOverridesContainerWithExclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(null, "", null, null), ".*",
-        "test", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite(null, "", null, null),
+        new ContentRewriterFeature.DefaultConfig(".*", "test", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.foobar.com"));
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
@@ -155,8 +176,9 @@
 
   @Test
   public void testSpecEmptyDoesNotOverridesContainerDefaultNoInclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(null, null, null, null), "",
-        "test", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite(null, null, null, null),
+        new ContentRewriterFeature.DefaultConfig("", "test", "0", TAGS, "false", "false"));
     assertFalse(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.foobar.com"));
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
@@ -164,10 +186,25 @@
 
   @Test
   public void testSpecIncludeOnlyOverridesContainerDefaultNoInclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(".*", null, null, null), "",
-        "test", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite(".*", null, null, null),
+        new ContentRewriterFeature.DefaultConfig("", "test", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.foobar.com"));
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
+  
+  @Test
+  public void testSplitJsSupported() throws Exception {
+    defaultRewriterFeature =
+        new ContentRewriterFeature.DefaultConfig("", "test", "0", TAGS, "false", "true");
+    assertTrue(defaultRewriterFeature.isSplitJsEnabled());
+  }
+  
+  @Test
+  public void testSplitJsNotSupported() throws Exception {
+    defaultRewriterFeature =
+      new ContentRewriterFeature.DefaultConfig("", "test", "0", TAGS, "false", "false");
+    assertFalse(defaultRewriterFeature.isSplitJsEnabled());
+  }
 }

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.java Tue Feb 23 03:06:18 2010
@@ -33,9 +33,9 @@
   @Test
   public void testSpecExcludeOverridesContainerDefaultInclude()
       throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(new String[] { "" }, new String[] { "*" },
-            "0", tags), ".*", "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(new String[] { "" }, new String[] { "*" }, "0", tags),
+        new ContentRewriterFeature.DefaultConfig(".*", "", "0", TAGS, "false", "false"));
     assertFalse(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
@@ -43,9 +43,9 @@
   @Test
   public void testSpecExcludeOverridesMultipleContainerDefaultInclude()
       throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(new String[] { "" }, new String[] { "foo",
-            "bar" }, "0", tags), ".*", "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(null, new String[] { "foo", "bar" }, "0", tags),
+        new ContentRewriterFeature.DefaultConfig(".*", "", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.foo.com"));
@@ -55,9 +55,9 @@
   @Test
   public void testSpecExcludeOnlyOverridesContainerDefaultInclude()
       throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(null, new String[] { "*" }, null, null), ".*",
-        "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(null, new String[] { "*" }, null, null),
+        new ContentRewriterFeature.DefaultConfig(".*", "", "0", TAGS, "false", "false"));
     assertFalse(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
@@ -65,27 +65,27 @@
   @Test
   public void testSpecExcludeOverridesContainerDefaultExclude()
       throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(new String[] { "*" }, new String[] { "" },
-            "0", tags), "", ".*", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(new String[] { "*" }, new String[] { "" }, "0", tags),
+        new ContentRewriterFeature.DefaultConfig("", ".*", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   @Test
   public void testExcludeOverridesInclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(new String[] { "test.com" },
-            new String[] { "test" }, "0", tags), "", "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(new String[] { "test.com" }, new String[] { "test" }, "0", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
   }
 
   @Test
   public void testIncludeOnlyMatch() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(new String[] { "test.com" },
-            new String[] { "testx" }, "0", tags), "", "", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(new String[] { "test.com" }, new String[] { "testx" }, "0", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
     assertFalse(defaultRewriterFeature
@@ -94,9 +94,9 @@
 
   @Test
   public void testSpecEmptyContainerWithExclude() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(null, null, null, null), ".*", "test", "0",
-        tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(null, null, null, null),
+        new ContentRewriterFeature.DefaultConfig(".*", "test", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.foobar.com"));
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
@@ -105,9 +105,9 @@
   @Test
   public void testSpecExcludeOnlyOverridesContainerWithExclude()
       throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(null, new String[] { "" }, null, null), ".*",
-        "test", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(null, new String[] { "" }, null, null),
+        new ContentRewriterFeature.DefaultConfig(".*", "test", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.foobar.com"));
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
@@ -116,9 +116,9 @@
   @Test
   public void testSpecEmptyDoesNotOverridesContainerDefaultNoInclude()
       throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(null, null, null, null), "", "test", "0",
-        tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(null, null, null, null),
+        new ContentRewriterFeature.DefaultConfig("", "test", "0", TAGS, "false", "false"));
     assertFalse(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature
         .shouldRewriteURL("http://www.foobar.com"));
@@ -128,9 +128,9 @@
   @Test
   public void testSpecIncludeOnlyOverridesContainerDefaultNoInclude()
       throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(new String[] { "*" }, null, null, null), "",
-        "test", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(new String[] { "*" }, null, null, null),
+        new ContentRewriterFeature.DefaultConfig("", "test", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.foobar.com"));
     assertFalse(defaultRewriterFeature.shouldRewriteURL("http://www.test.com"));
@@ -139,9 +139,9 @@
   @Test
   public void testSpecIncludeMultipleOnlyOverridesContainerDefaultNoInclude()
       throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(new String[] { "foo", "bar" }, null, null,
-            null), "", "test", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(new String[] { "foo", "bar" }, null, null, null),
+        new ContentRewriterFeature.DefaultConfig("", "test", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.foo.com"));
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.bar.com"));
@@ -151,9 +151,10 @@
   @Test
   public void testSpecIncludeMultipleOnlyOverridesContainerDefaultInclude()
       throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
-        createSpecWithRewriteOS9(new String[] { "foo", "bar" }, null, null,
-            null), ".*", "test", "0", tags, false);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewriteOS9(new String[] { "foo", "bar" }, null, null, null),
+        new ContentRewriterFeature.DefaultConfig(
+            ".*", "test", "0", TAGS, "false", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.foo.com"));
     assertTrue(defaultRewriterFeature.shouldRewriteURL("http://www.bar.com"));
@@ -162,9 +163,10 @@
 
   @Test
   public void testSpecExcludeDisallowOverrideIncludeUrls() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(
-        "norewrite", null, null, null), "^http://www.include.com", "def",
-        "3600", tags, true);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("norewrite", null, null, null),
+        new ContentRewriterFeature.DefaultConfig(
+            "^http://www.include.com", "def", "3600", TAGS, "true", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature
         .shouldRewriteURL("http://www.include.com/abc"));
@@ -175,24 +177,26 @@
   }
 
   @Test
-  public void testSpecExcludeDisallowOverrideExcludeUrls() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(
-        null, "abc", null, null), "^http://www.include.com", "def", "3600",
-        tags, true);
+  public void testSpecExcludeOverrideExcludeUrls() throws Exception {
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite(null, "abc", null, null),
+        new ContentRewriterFeature.DefaultConfig(
+            "^http://www.include.com", "def", "3600", TAGS, "true", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertFalse(defaultRewriterFeature
         .shouldRewriteURL("http://www.include.com/abc"));
     assertFalse(defaultRewriterFeature
-        .shouldRewriteURL("http://www.include.com/def"));
-    assertFalse(defaultRewriterFeature
         .shouldRewriteURL("http://www.norewrite.com/abc"));
+    assertTrue(defaultRewriterFeature
+        .shouldRewriteURL("http://www.include.com/def"));
   }
 
   @Test
   public void testSpecExcludeDisallowOverrideIncludeUrlOS9() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
         createSpecWithRewriteOS9(new String[] { "abc" }, null, null, null),
-        "^http://www.include.com", "", "3600", tags, true);
+        new ContentRewriterFeature.DefaultConfig(
+            "^http://www.include.com", "", "3600", TAGS, "true", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature
         .shouldRewriteURL("http://www.include.com/abc"));
@@ -202,9 +206,10 @@
 
   @Test
   public void testSpecExcludeDisallowOverrideExcludeUrlOS9() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
         createSpecWithRewriteOS9(null, new String[] { "def" }, null, null),
-        "^http://www.include.com", "", "3600", tags, true);
+        new ContentRewriterFeature.DefaultConfig(
+            "^http://www.include.com", "", "3600", TAGS, "true", "false"));
     assertTrue(defaultRewriterFeature.isRewriteEnabled());
     assertTrue(defaultRewriterFeature
         .shouldRewriteURL("http://www.include.com/abc"));
@@ -216,33 +221,36 @@
 
   @Test
   public void testSpecExcludeDisallowOverrideDefaultExpires() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(
-        "test\\.com", "testx", "3000", tags), "", "", "", tags, true);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "3000", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "", TAGS, "true", "false"));
     assertNotNull(defaultRewriterFeature.getExpires());
     assertNotNull(defaultRewriterFeature.getExpires() == 3000);
   }
 
   @Test
   public void testSpecExcludeDisallowOverrideExpiresGreater() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(
-        "test\\.com", "testx", "8000", tags), "", "", "3000", tags, true);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "8000", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "3000", TAGS, "true", "false"));
     assertNotNull(defaultRewriterFeature.getExpires());
     assertNotNull(defaultRewriterFeature.getExpires() == 3000);
   }
 
   @Test
   public void testSpecExcludeDisallowOverrideExpiresLesser() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(
-        "test\\.com", "testx", "2000", tags), "", "", "3000", tags, true);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "2000", tags),
+        new ContentRewriterFeature.DefaultConfig("", "", "3000", TAGS, "true", "false"));
     assertNotNull(defaultRewriterFeature.getExpires());
     assertNotNull(defaultRewriterFeature.getExpires() == 2000);
   }
 
   @Test
   public void testSpecExcludeDisallowOverrideTagsSubset() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(
-        "test\\.com", "testx", "0", Sets.newHashSet("img")),
-        "", "", "0", Sets.newHashSet("img", "script"), true);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite("test\\.com", "testx", "0", Sets.newHashSet("img")),
+        new ContentRewriterFeature.DefaultConfig("", "", "0", "img,script", "true", "false"));
     assertFalse(defaultRewriterFeature.shouldRewriteTag("IFRAME"));
     assertTrue(defaultRewriterFeature.shouldRewriteTag("img"));
     assertFalse(defaultRewriterFeature.shouldRewriteTag("ScripT"));
@@ -250,9 +258,9 @@
 
   @Test
   public void testSpecExcludeDisallowOverrideTagsSuperset() throws Exception {
-    defaultRewriterFeature = new ContentRewriterFeature(createSpecWithRewrite(
-        "test\\.com", "testx", "0", Sets.newHashSet("img", "script", "link")),
-        "", "", "0", Sets.newHashSet("img", "script"), true);
+    defaultRewriterFeature = new ContentRewriterFeature.Config(
+        createSpecWithRewrite( "test\\.com", "testx", "0", Sets.newHashSet("img", "script", "link")),
+        new ContentRewriterFeature.DefaultConfig("", "", "0", "img,script", "true", "false"));
     assertFalse(defaultRewriterFeature.shouldRewriteTag("IFRAME"));
     assertTrue(defaultRewriterFeature.shouldRewriteTag("img"));
     assertTrue(defaultRewriterFeature.shouldRewriteTag("ScripT"));

Modified: 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/CssRequestRewriterTest.java?rev=915152&r1=915151&r2=915152&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/CssRequestRewriterTest.java Tue Feb 23 03:06:18 2010
@@ -49,18 +49,18 @@
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    ContentRewriterFeature overrideFeatureNoOverrideExpires = rewriterFeatureFactory
+    ContentRewriterFeature.Config overrideFeatureNoOverrideExpires = rewriterFeatureFactory
         .get(createSpecWithRewrite(".*", ".*exclude.*", null,
             HTMLContentRewriter.TAGS));
-    ContentRewriterFeatureFactory factoryNoOverrideExpires = mockContentRewriterFeatureFactory(overrideFeatureNoOverrideExpires);
+    ContentRewriterFeature.Factory factoryNoOverrideExpires = mockContentRewriterFeatureFactory(overrideFeatureNoOverrideExpires);
     rewriterNoOverrideExpires = new CssRequestRewriter(
         factoryNoOverrideExpires, new CajaCssLexerParser(),
         new DefaultProxyingLinkRewriterFactory(rewriterUris));
 
-    ContentRewriterFeature overrideFeature =
+    ContentRewriterFeature.Config overrideFeature =
         rewriterFeatureFactory.get(createSpecWithRewrite(".*", ".*exclude.*", "3600",
             HTMLContentRewriter.TAGS));
-    ContentRewriterFeatureFactory factory = mockContentRewriterFeatureFactory(overrideFeature);
+    ContentRewriterFeature.Factory factory = mockContentRewriterFeatureFactory(overrideFeature);
     rewriter = new CssRequestRewriter(factory, new CajaCssLexerParser(),
         new DefaultProxyingLinkRewriterFactory(rewriterUris));
     dummyUri = Uri.parse("http://www.w3c.org");

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java?rev=915152&r1=915151&r2=915152&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/HTMLContentRewriterTest.java Tue Feb 23 03:06:18 2010
@@ -42,10 +42,10 @@
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    ContentRewriterFeature overrideFeatureNoOverrideExpires = rewriterFeatureFactory
+    ContentRewriterFeature.Config overrideFeatureNoOverrideExpires = rewriterFeatureFactory
         .get(createSpecWithRewrite(".*", ".*exclude.*", null,
             HTMLContentRewriter.TAGS));
-    ContentRewriterFeatureFactory factoryNoOverrideExpires = mockContentRewriterFeatureFactory(overrideFeatureNoOverrideExpires);
+    ContentRewriterFeature.Factory factoryNoOverrideExpires = mockContentRewriterFeatureFactory(overrideFeatureNoOverrideExpires);
 
     rewriterNoOverrideExpires = new HTMLContentRewriter(
         factoryNoOverrideExpires, new CssRequestRewriter(
@@ -54,10 +54,10 @@
         new DefaultConcatLinkRewriterFactory(rewriterUris),
         new DefaultProxyingLinkRewriterFactory(rewriterUris));
     
-    ContentRewriterFeature overrideFeature = rewriterFeatureFactory
+    ContentRewriterFeature.Config overrideFeature = rewriterFeatureFactory
         .get(createSpecWithRewrite(".*", ".*exclude.*", "3600",
             HTMLContentRewriter.TAGS));
-    ContentRewriterFeatureFactory factory = mockContentRewriterFeatureFactory(overrideFeature);
+    ContentRewriterFeature.Factory factory = mockContentRewriterFeatureFactory(overrideFeature);
 
     rewriter = new HTMLContentRewriter(factory, new CssRequestRewriter(factory,
         new CajaCssLexerParser(), new DefaultProxyingLinkRewriterFactory(