You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by et...@apache.org on 2008/09/26 01:39:00 UTC

svn commit: r699132 - in /incubator/shindig/trunk/java: gadgets/src/main/java/org/apache/shindig/gadgets/ gadgets/src/main/java/org/apache/shindig/gadgets/preload/ gadgets/src/main/java/org/apache/shindig/gadgets/render/ gadgets/src/main/java/org/apach...

Author: etnu
Date: Thu Sep 25 16:38:59 2008
New Revision: 699132

URL: http://svn.apache.org/viewvc?rev=699132&view=rev
Log:
Swapped rendering pipeline.

This swap isn't quite feature complete yet:

- Does not do variable substitution (coming in a few minutes)
- Does not validate locked domain (current code was broken anyway, will be fixed shortly)

This also doesn't fully eliminate the old code path (GadgetServer) because we still need it for metadata. To be removed shortly.

Also updated end to end tests to display a more useful error message when tests fail due to rendering issues. Disabled rewriting for these since it was masking problems.

There's a somewhat large change here, which is to pass MutableContent to rewriters, making it so that only the rewriter registry ever has to worry about creating parsers. This also adds consistency to rewriting, with a MutableContent always being an explicit object.



Removed:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingTask.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetRenderingTaskTest.java
Modified:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetServer.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistry.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CaptureRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HtmlContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/AppendingRewriter.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistryTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/FeatureBasedRewriterTestBase.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java
    incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java
    incubator/shindig/trunk/java/server/src/test/resources/endtoend/errorTest.xml
    incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml
    incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPersonTest.xml

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java Thu Sep 25 16:38:59 2008
@@ -27,6 +27,9 @@
 import org.apache.shindig.gadgets.oauth.BasicOAuthStoreConsumerKeyAndSecret;
 import org.apache.shindig.gadgets.oauth.OAuthStore;
 import org.apache.shindig.gadgets.oauth.BasicOAuthStoreConsumerKeyAndSecret.KeyType;
+import org.apache.shindig.gadgets.preload.HttpPreloader;
+import org.apache.shindig.gadgets.preload.Preloader;
+import org.apache.shindig.gadgets.render.RenderingContentRewriter;
 import org.apache.shindig.gadgets.rewrite.ContentRewriter;
 import org.apache.shindig.gadgets.rewrite.lexer.DefaultContentRewriter;
 
@@ -81,6 +84,7 @@
     bind(ExecutorService.class).toInstance(service);
 
     bind(new TypeLiteral<List<ContentRewriter>>(){}).toProvider(ContentRewritersProvider.class);
+    bind(new TypeLiteral<List<Preloader>>(){}).toProvider(PreloaderProvider.class);
 
     // TODO: This is not the proper way to use a Guice module. It needs to be fixed before we can
     // do a release.
@@ -204,12 +208,26 @@
     private final List<ContentRewriter> rewriters;
 
     @Inject
-    public ContentRewritersProvider(DefaultContentRewriter optimizingRewriter) {
-      rewriters = Lists.<ContentRewriter>newArrayList(optimizingRewriter);
+    public ContentRewritersProvider(DefaultContentRewriter optimizingRewriter,
+                                    RenderingContentRewriter renderingRewriter) {
+      rewriters = Lists.<ContentRewriter>newArrayList(optimizingRewriter, renderingRewriter);
     }
 
     public List<ContentRewriter> get() {
       return rewriters;
     }
   }
+
+  private static class PreloaderProvider implements Provider<List<Preloader>> {
+    private final List<Preloader> preloaders;
+
+    @Inject
+    public PreloaderProvider(HttpPreloader httpPreloader) {
+      preloaders = Lists.<Preloader>newArrayList(httpPreloader);
+    }
+
+    public List<Preloader> get() {
+      return preloaders;
+    }
+  }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java Thu Sep 25 16:38:59 2008
@@ -18,9 +18,7 @@
 package org.apache.shindig.gadgets;
 
 import org.apache.shindig.common.ContainerConfig;
-import org.apache.shindig.common.util.Check;
 import org.apache.shindig.gadgets.http.HttpResponse;
-import org.apache.shindig.gadgets.parse.GadgetHtmlNode;
 import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
 import org.apache.shindig.gadgets.preload.Preloads;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
@@ -46,9 +44,7 @@
   private GadgetSpec spec;
   private Preloads preloads;
   private View currentView;
-
-  @Deprecated
-  private MutableContent mutableContent;
+  private String content;
 
   @Deprecated
   private Collection<JsLibrary> jsLibraries;
@@ -72,14 +68,9 @@
     this.context = context;
     this.spec = spec;
     this.jsLibraries = jsLibraries;
-    this.currentView = getView(containerConfig);
-
-    mutableContent = new MutableContent(contentParser);
-    if (this.currentView != null) {
-      // View might be invalid or associated with no content (type=URL)
-      mutableContent.setContent(this.currentView.getContent());
-    } else {
-      mutableContent.setContent(null);
+    currentView = getView(containerConfig);
+    if (currentView != null) {
+      content = currentView.getContent();
     }
   }
 
@@ -107,19 +98,16 @@
     return spec;
   }
 
-
   /**
    * Sets the current content of the rendered output of this gadget.
    */
-  public Gadget setContent(String newContent) {
-    Check.notNull(mutableContent, "Can not set content without setting mutable content.");
-    mutableContent.setContent(newContent);
+  public Gadget setContent(String content) {
+    this.content = content;
     return this;
   }
 
   public String getContent() {
-    Check.notNull(mutableContent, "Can not get content without setting mutable content.");
-    return mutableContent.getContent();
+    return content;
   }
 
   /**
@@ -157,22 +145,6 @@
     return spec.getModulePrefs().getLocale(context.getLocale());
   }
 
-  @Deprecated
-  public Gadget setMutableContent(MutableContent mutableContent) {
-    this.mutableContent = mutableContent;
-    return this;
-  }
-
-  @Deprecated
-  public MutableContent getMutableContent() {
-    return mutableContent;
-  }
-
-  @Deprecated
-  public GadgetHtmlNode getParseTree() {
-    return mutableContent.getParseTree();
-  }
-
   /**
    * @return A mutable collection of JsLibrary objects attached to this Gadget.
    */

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetServer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetServer.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetServer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetServer.java Thu Sep 25 16:38:59 2008
@@ -49,6 +49,7 @@
  * Gadget
  */
 @Singleton
+@Deprecated
 public class GadgetServer {
   private final ExecutorService executor;
   private final GadgetFeatureRegistry registry;
@@ -57,9 +58,9 @@
   private final ContentRewriterRegistry rewriterRegistry;
   private final GadgetHtmlParser htmlParser;
 
-  private ContentFetcherFactory preloadFetcherFactory;
-  private GadgetSpecFactory specFactory;
-  private MessageBundleFactory bundleFactory;
+  private final ContentFetcherFactory preloadFetcherFactory;
+  private final GadgetSpecFactory specFactory;
+  private final MessageBundleFactory bundleFactory;
 
   @Inject
   public GadgetServer(ExecutorService executor,

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderService.java Thu Sep 25 16:38:59 2008
@@ -36,8 +36,7 @@
   private final List<? extends Preloader> preloaders;
 
   @Inject
-  public ConcurrentPreloaderService(ExecutorService executor,
-      List<? extends Preloader> preloaders) {
+  public ConcurrentPreloaderService(ExecutorService executor, List<Preloader> preloaders) {
     this.executor = executor;
     this.preloaders = preloaders;
   }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java Thu Sep 25 16:38:59 2008
@@ -27,6 +27,8 @@
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.oauth.OAuthArguments;
 import org.apache.shindig.gadgets.preload.PreloaderService;
+import org.apache.shindig.gadgets.preload.Preloads;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterRegistry;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.View;
 
@@ -38,12 +40,15 @@
 public class HtmlRenderer {
   private final ContentFetcherFactory fetcher;
   private final PreloaderService preloader;
+  private final ContentRewriterRegistry rewriter;
 
   @Inject
   public HtmlRenderer(ContentFetcherFactory fetcher,
-                  PreloaderService preloader) {
+                      PreloaderService preloader,
+                      ContentRewriterRegistry rewriter) {
     this.fetcher = fetcher;
     this.preloader = preloader;
+    this.rewriter = rewriter;
   }
 
   /**
@@ -65,10 +70,11 @@
       GadgetContext context = gadget.getContext();
       GadgetSpec spec = gadget.getSpec();
 
-      gadget.setPreloads(preloader.preload(context, spec));
+      Preloads preloads = preloader.preload(context, spec);
 
       if (view.getHref() == null) {
-        return view.getContent();
+        gadget.setPreloads(preloads);
+        return doRewriting(gadget, view.getContent());
       } else {
         // TODO: Add current url to GadgetContext to support transitive proxying.
         HttpRequest request = new HttpRequest(Uri.fromJavaUri(view.getHref()))
@@ -78,10 +84,20 @@
             .setContainer(context.getContainer())
             .setGadget(Uri.fromJavaUri(context.getUrl()));
         HttpResponse response = fetcher.fetch(request);
-        return response.getResponseAsString();
+        if (response.getHttpStatusCode() != HttpResponse.SC_OK) {
+          throw new RenderingException("Unable to reach remote host. HTTP status " +
+              response.getHttpStatusCode());
+        }
+        return doRewriting(gadget, response.getResponseAsString());
       }
     } catch (GadgetException e) {
       throw new RenderingException(e);
     }
   }
+
+  private String doRewriting(Gadget gadget, String content) throws GadgetException {
+    gadget.setContent(content);
+    rewriter.rewriteGadget(gadget);
+    return gadget.getContent();
+  }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/Renderer.java Thu Sep 25 16:38:59 2008
@@ -77,8 +77,11 @@
       return RenderingResults.error("Unsupported parent parameter. Check your container code.");
     }
 
+    // TODO: Locked domain.
+
     try {
       GadgetSpec spec = gadgetSpecFactory.getGadgetSpec(context);
+      // TODO: Variable substitution.
       View view = getView(context, spec);
 
       if (view == null) {

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java Thu Sep 25 16:38:59 2008
@@ -113,9 +113,9 @@
     return RewriterResults.notCacheable();
   }
 
-  public RewriterResults rewrite(Gadget gadget) {
+  public RewriterResults rewrite(Gadget gadget, MutableContent mutableContent) {
     try {
-      GadgetContent content = createGadgetContent(gadget);
+      GadgetContent content = createGadgetContent(gadget, mutableContent);
 
       injectFeatureLibraries(gadget, content);
       // This can be one script block.
@@ -125,7 +125,7 @@
       content.appendHead("</script>");
       injectOnLoadHandlers(content);
       // TODO: Use preloads when RenderedGadget gets promoted to Gadget.
-      finalizeDocument(gadget, content);
+      mutableContent.setContent(finalizeDocument(gadget, content));
       return RewriterResults.notCacheable();
     } catch (GadgetException e) {
       // TODO: Rewriter interface needs to be modified to handle GadgetException or
@@ -348,9 +348,9 @@
   /**
    * Produces GadgetContent by parsing the document into 3 pieces (head, body, and tail). If the
    */
-  private GadgetContent createGadgetContent(Gadget gadget) {
+  private GadgetContent createGadgetContent(Gadget gadget, MutableContent mutableContent) {
     GadgetContent content = new GadgetContent();
-    String doc = gadget.getContent();
+    String doc = mutableContent.getContent();
     if (doc.contains("<html>") && doc.contains("</html>")) {
       Matcher matcher = DOCUMENT_SPLIT_PATTERN.matcher(doc);
       if (matcher.matches()) {
@@ -399,8 +399,8 @@
   /**
    * Produces a final document for the gadget's content.
    */
-  private void finalizeDocument(Gadget gadget, GadgetContent content) {
-    gadget.setContent(content.assemble());
+  private String finalizeDocument(Gadget gadget, GadgetContent content) {
+    return content.assemble();
   }
 
   private static class GadgetContent {

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistry.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistry.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistry.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistry.java Thu Sep 25 16:38:59 2008
@@ -59,7 +59,7 @@
       @Named("shindig.rewritten-content.cache.capacity")int capacity,
       @Named("shindig.rewritten-content.cache.minTTL")long minCacheTtl) {
     super(rewriters, htmlParser);
-    // minTtl = 0 and maxTtl = MAX_VALUE because the underlying cache is willing to store data 
+    // minTtl = 0 and maxTtl = MAX_VALUE because the underlying cache is willing to store data
     // with any TTL value specified. Entries are added with a given TTL value per slightly
     // different logic by this class: if a rewrite pass has a cacheTtl lower than minCacheTtl,
     // it's simply not added.
@@ -104,17 +104,21 @@
       return true;
     }
 
+    MutableContent mc = getMutableContent(gadget.getContent());
+
     long cacheTtl = Long.MAX_VALUE;
     String original = gadget.getContent();
     for (ContentRewriter rewriter : getRewriters()) {
-      RewriterResults rr = rewriter.rewrite(gadget);
+      RewriterResults rr = rewriter.rewrite(gadget, mc);
       if (rr == null) {
         cacheTtl = 0;
       } else {
         cacheTtl = Math.min(cacheTtl, rr.getCacheTtl());
       }
     }
-    
+
+    gadget.setContent(mc.getContent());
+
     if (cacheTtl >= minCacheTtl) {
       // Only cache if the cacheTtl is greater than the minimum time configured for doing so.
       // This prevents cache churn and may be more efficient when rewriting is cheaper
@@ -154,15 +158,15 @@
     if (cacheTtl >= minCacheTtl) {
       rewrittenCache.addElementWithTtl(cacheKey, mc.getContent(), cacheTtl);
     }
-    
+
     if (!original.equals(mc.getContent())) {
       return new HttpResponseBuilder(resp).setResponseString(mc.getContent()).create();
     }
-    
+
     // Not rewritten, just return original.
     return resp;
   }
-  
+
   // Methods for testing purposes
   void setMinCacheTtl(long minCacheTtl) {
     this.minCacheTtl = minCacheTtl;

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CaptureRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CaptureRewriter.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CaptureRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/CaptureRewriter.java Thu Sep 25 16:38:59 2008
@@ -41,7 +41,7 @@
     return rewroteResponse;
   }
 
-  public RewriterResults rewrite(Gadget gadget) {
+  public RewriterResults rewrite(Gadget gadget, MutableContent content) {
     rewroteView = true;
     return results();
   }
@@ -49,14 +49,14 @@
   public boolean viewWasRewritten() {
     return rewroteView;
   }
-  
+
   private RewriterResults results() {
     if (cacheTtl == -1) {
       return RewriterResults.cacheableIndefinitely();
     }
     return RewriterResults.cacheable(cacheTtl);
   }
-  
+
   /**
    * Sets cache TTL. -1 means cacheable indefinitely.
    * @param cacheTtl

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ContentRewriter.java Thu Sep 25 16:38:59 2008
@@ -44,5 +44,5 @@
    * @param gadget Gadget to rewrite.
    * @return Object indicating results cacheability, or null (indicates not cacheable).
    */
-  RewriterResults rewrite(Gadget gadget);
+  RewriterResults rewrite(Gadget gadget, MutableContent content);
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistry.java Thu Sep 25 16:38:59 2008
@@ -58,11 +58,15 @@
       return false;
     }
 
+    MutableContent mc = getMutableContent(originalContent);
+
     for (ContentRewriter rewriter : rewriters) {
-      rewriter.rewrite(gadget);
+      rewriter.rewrite(gadget, mc);
     }
 
-    return !originalContent.equals(gadget.getContent());
+    String currentContent = mc.getContent();
+    gadget.setContent(currentContent);
+    return !originalContent.equals(currentContent);
   }
 
   /** {@inheritDoc} */
@@ -87,7 +91,7 @@
     mc.setContent(content);
     return mc;
   }
-  
+
   protected List<ContentRewriter> getRewriters() {
     return rewriters;
   }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HtmlContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HtmlContentRewriter.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HtmlContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/HtmlContentRewriter.java Thu Sep 25 16:38:59 2008
@@ -33,7 +33,7 @@
  * was derived in doing so.
  */
 public abstract class HtmlContentRewriter implements ContentRewriter {
-  
+
   protected abstract RewriterResults rewrite(GadgetHtmlNode root, URI baseUri);
 
   public static String getMimeType(HttpRequest request, HttpResponse original) {
@@ -43,7 +43,7 @@
     }
     return mimeType != null ? mimeType.toLowerCase() : null;
   }
-  
+
   public RewriterResults rewrite(HttpRequest request, HttpResponse original,
       MutableContent content) {
     String mimeType = getMimeType(request, original);
@@ -53,10 +53,10 @@
     return null;
   }
 
-  public RewriterResults rewrite(Gadget gadget) {
-    return rewriteHtml(gadget.getParseTree(), gadget.getSpec().getUrl());
+  public RewriterResults rewrite(Gadget gadget, MutableContent content) {
+    return rewriteHtml(content.getParseTree(), gadget.getSpec().getUrl());
   }
-  
+
   private RewriterResults rewriteHtml(GadgetHtmlNode root, URI baseUri) {
     if (root != null) {
       return rewrite(root, baseUri);

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriter.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/JsTagConcatContentRewriter.java Thu Sep 25 16:38:59 2008
@@ -18,15 +18,6 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-
 import org.apache.shindig.common.util.Utf8UrlCoder;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.MutableContent;
@@ -36,14 +27,23 @@
 import org.apache.shindig.gadgets.servlet.ProxyBase;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
 public class JsTagConcatContentRewriter implements ContentRewriter {
   private final static int MAX_URL_LENGTH = 1500;
-  
+
   private final ContentRewriterFeature.Factory rewriterFeatureFactory;
   private final String concatUrlBase;
-  
+
   private static final String DEFAULT_CONCAT_URL_BASE = "/gadgets/concat?";
-  
+
   public JsTagConcatContentRewriter(ContentRewriterFeature.Factory rewriterFeatureFactory,
       String concatUrlBase) {
     this.rewriterFeatureFactory = rewriterFeatureFactory;
@@ -54,41 +54,42 @@
     }
   }
 
-  public RewriterResults rewrite(HttpRequest request, HttpResponse original, MutableContent content) {
+  public RewriterResults rewrite(HttpRequest request, HttpResponse original,
+      MutableContent content) {
     // JS Concatenation not supported for HTTP responses at present.
     return null;
   }
 
-  public RewriterResults rewrite(Gadget gadget) {
+  public RewriterResults rewrite(Gadget gadget, MutableContent content) {
     ContentRewriterFeature rewriterFeature = rewriterFeatureFactory.get(gadget.getSpec());
     if (!rewriterFeature.isRewriteEnabled() ||
         !rewriterFeature.getIncludedTags().contains("script")) {
       return null;
     }
-    
+
     // Bootstrap queue of children over which to iterate,
     // ie. lists of siblings to potentially combine
     Queue<GadgetHtmlNode> nodesToProcess =
         new LinkedList<GadgetHtmlNode>();
-    nodesToProcess.add(gadget.getParseTree());
-    
+    nodesToProcess.add(content.getParseTree());
+
     String concatBase = getJsConcatBase(gadget.getSpec(), rewriterFeature);
-    
+
     while (!nodesToProcess.isEmpty()) {
       GadgetHtmlNode parentNode = nodesToProcess.remove();
       if (!parentNode.isText()) {
         List<GadgetHtmlNode> childList = parentNode.getChildren();
-        
+
         // Iterate over children next in depth-first fashion.
         // Text nodes (such as <script src> processed here) will be ignored.
         nodesToProcess.addAll(childList);
-        
+
         List<GadgetHtmlNode> toRemove = new ArrayList<GadgetHtmlNode>();
         List<URI> scripts = new ArrayList<URI>();
         boolean processScripts = false;
         for (int i = 0; i < childList.size(); ++i) {
           GadgetHtmlNode cur = childList.get(i);
-        
+
           // Find consecutive <script src=...> tags
           if (!cur.isText() &&
                cur.getTagName().equalsIgnoreCase("script") &&
@@ -110,27 +111,27 @@
           } else if (scripts.size() > 0) {
             processScripts = true;
           }
-          
+
           if (i == (childList.size() - 1)) {
             processScripts = true;
           }
-        
+
           if (processScripts && scripts.size() > 0) {
             // Tags found. Concatenate scripts together.
             List<URI> concatUris = getConcatenatedUris(concatBase, scripts);
-            
+
             // Insert concatenated nodes before first match
             for (URI concatUri : concatUris) {
               GadgetHtmlNode newScript = new GadgetHtmlNode("script", null);
               newScript.setAttribute("src", concatUri.toString());
               parentNode.insertBefore(newScript, toRemove.get(0));
             }
-            
+
             // Remove contributing match nodes
             for (GadgetHtmlNode remove : toRemove) {
               parentNode.removeChild(remove);
             }
-            
+
             processScripts = false;
             scripts.clear();
             toRemove.clear();
@@ -138,10 +139,10 @@
         }
       }
     }
-    
+
     return RewriterResults.cacheableIndefinitely();
   }
-  
+
   private List<URI> getConcatenatedUris(String concatBase, List<URI> uris) {
     List<URI> concatUris = new LinkedList<URI>();
     int paramIndex = 1;
@@ -174,7 +175,7 @@
     }
     return concatUris;
   }
-  
+
   String getJsConcatBase(GadgetSpec spec, ContentRewriterFeature rewriterFeature) {
     return concatUrlBase +
            ProxyBase.REWRITE_MIME_TYPE_PARAM +

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/NoOpContentRewriter.java Thu Sep 25 16:38:59 2008
@@ -35,7 +35,7 @@
     return null;
   }
 
-  public RewriterResults rewrite(Gadget gadget) {
+  public RewriterResults rewrite(Gadget gadget, MutableContent content) {
 	return null;
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleLinksContentRewriter.java Thu Sep 25 16:38:59 2008
@@ -18,23 +18,21 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import java.util.LinkedList;
-import java.util.Queue;
-
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.MutableContent;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.parse.GadgetHtmlNode;
-import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
 
 import java.net.URI;
+import java.util.LinkedList;
+import java.util.Queue;
 
 public class StyleLinksContentRewriter implements ContentRewriter {
   // TODO: consider providing helper base class for node-visitor content rewriters
   private final ContentRewriterFeature.Factory rewriterFeatureFactory;
   private final LinkRewriter linkRewriter;
-  
+
   public StyleLinksContentRewriter(ContentRewriterFeature.Factory rewriterFeatureFactory,
       LinkRewriter linkRewriter) {
     this.rewriterFeatureFactory = rewriterFeatureFactory;
@@ -52,33 +50,33 @@
     return RewriterResults.cacheableIndefinitely();
   }
 
-  public RewriterResults rewrite(Gadget gadget) {
+  public RewriterResults rewrite(Gadget gadget, MutableContent content) {
     ContentRewriterFeature rewriterFeature = rewriterFeatureFactory.get(gadget.getSpec());
-    if (linkRewriter == null || 
+    if (linkRewriter == null ||
         !rewriterFeature.isRewriteEnabled() ||
         !rewriterFeature.getIncludedTags().contains("style")) {
       return null;
     }
-    
-    return rewriteHtml(gadget.getParseTree(), gadget.getSpec().getUrl());
+
+    return rewriteHtml(content.getParseTree(), gadget.getSpec().getUrl());
   }
-  
+
   private RewriterResults rewriteHtml(GadgetHtmlNode root, URI baseUri) {
     if (root == null) {
       return null;
     }
-    
+
     Queue<GadgetHtmlNode> nodesToProcess =
       new LinkedList<GadgetHtmlNode>();
-    
+
     nodesToProcess.addAll(root.getChildren());
-  
+
     while (!nodesToProcess.isEmpty()) {
       GadgetHtmlNode curNode = nodesToProcess.remove();
       if (!curNode.isText()) {
         // Depth-first iteration over children. Order doesn't matter anyway.
         nodesToProcess.addAll(curNode.getChildren());
-        
+
         if (curNode.getTagName().equalsIgnoreCase("style")) {
           String styleText = getNodeChildText(curNode);
           curNode.clearChildren();
@@ -86,14 +84,14 @@
         }
       }
     }
-    
+
     return RewriterResults.cacheableIndefinitely();
   }
-  
+
   private String rewriteCss(String styleText, URI baseUri) {
     return CssRewriter.rewrite(styleText, baseUri, linkRewriter);
   }
-  
+
   private static String getNodeChildText(GadgetHtmlNode node) {
     // TODO: move this to GadgetHtmlNode as a helper
     StringBuilder builder = new StringBuilder();
@@ -104,5 +102,5 @@
     }
     return builder.toString();
   }
-  
+
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/lexer/DefaultContentRewriter.java Thu Sep 25 16:38:59 2008
@@ -110,10 +110,10 @@
     return RewriterResults.cacheableIndefinitely();
   }
 
-  public RewriterResults rewrite(Gadget gadget) {
+  public RewriterResults rewrite(Gadget gadget, MutableContent content) {
     StringWriter sw = new StringWriter();
     GadgetSpec spec = gadget.getSpec();
-    if (rewrite(spec, spec.getUrl(), new StringReader(gadget.getContent()), "text/html", sw)) {
+    if (rewrite(spec, spec.getUrl(), new StringReader(content.getContent()), "text/html", sw)) {
       gadget.setContent(sw.toString());
     }
     return RewriterResults.cacheableIndefinitely();

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetRenderingServlet.java Thu Sep 25 16:38:59 2008
@@ -18,9 +18,11 @@
 package org.apache.shindig.gadgets.servlet;
 
 import org.apache.shindig.common.servlet.InjectedServlet;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.render.Renderer;
+import org.apache.shindig.gadgets.render.RenderingResults;
 
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 
 import java.io.IOException;
 
@@ -28,19 +30,46 @@
 import javax.servlet.http.HttpServletResponse;
 
 /**
- * Servlet for rendering Gadgets, typically in an IFRAME.
+ * Servlet for rendering Gadgets.
  */
 public class GadgetRenderingServlet extends InjectedServlet {
+  private static final int DEFAULT_CACHE_TTL = 60 * 5;
+  private Renderer renderer;
 
-  private Provider<GadgetRenderingTask> renderProvider;
   @Inject
-  public void setGadgetRenderer(Provider<GadgetRenderingTask> renderProvider) {
-    this.renderProvider = renderProvider;
+  public void setRenderer(Renderer renderer) {
+    this.renderer = renderer;
+  }
+
+  private void render(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+    GadgetContext context = new HttpGadgetContext(req);
+    RenderingResults results = renderer.render(context);
+    switch (results.getStatus()) {
+      case OK:
+        if (context.getIgnoreCache()) {
+          HttpUtil.setCachingHeaders(resp, 0);
+        } else if (req.getParameter("v") != null) {
+          // Versioned files get cached indefinitely
+          HttpUtil.setCachingHeaders(resp, true);
+        } else {
+          // Unversioned files get cached for 5 minutes.
+          // TODO: This should be configurable
+          HttpUtil.setCachingHeaders(resp, DEFAULT_CACHE_TTL, true);
+        }
+        resp.setHeader("Content-Type", "text/html; charset=utf-8");
+        resp.getWriter().print(results.getContent());
+        break;
+      case ERROR:
+        resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, results.getErrorMessage());
+        break;
+      case MUST_REDIRECT:
+        resp.sendRedirect(results.getRedirect().toString());
+        break;
+    }
   }
 
   @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
-      throws IOException {
+  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
     // If an If-Modified-Since header is ever provided, we always say
     // not modified. This is because when there actually is a change,
     // cache busting should occur.
@@ -50,12 +79,11 @@
       resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
       return;
     }
-    renderProvider.get().process(req, resp);
+    render(req, resp);
   }
-  
+
   @Override
-  protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
-      throws IOException {
-    renderProvider.get().process(req, resp);
+  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+    render(req, resp);
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/ConcurrentPreloaderServiceTest.java Thu Sep 25 16:38:59 2008
@@ -51,8 +51,8 @@
     preloader.tasks.put(PRELOAD_STRING_KEY,
         new TestPreloadCallable(new DataPreload(PRELOAD_STRING_VALUE)));
 
-    PreloaderService service
-        = new ConcurrentPreloaderService(new TestExecutorService(), Arrays.asList(preloader));
+    PreloaderService service = new ConcurrentPreloaderService(new TestExecutorService(),
+        Arrays.<Preloader>asList(preloader));
 
     assertEquals(PRELOAD_STRING_VALUE,
                  service.preload(null, null).getData(PRELOAD_STRING_KEY).toJson());
@@ -70,7 +70,7 @@
         new TestPreloadCallable(new DataPreload(PRELOAD_MAP_VALUE)));
 
     PreloaderService service = new ConcurrentPreloaderService(new TestExecutorService(),
-        Arrays.asList(preloader, preloader2));
+        Arrays.<Preloader>asList(preloader, preloader2));
 
     Preloads preloads = service.preload(null, null);
 
@@ -82,8 +82,8 @@
   @Test(expected = PreloadException.class)
   public void exceptionsArePropagated() throws PreloadException {
     preloader.tasks.put(PRELOAD_STRING_KEY, new TestPreloadCallable(null));
-    PreloaderService service
-        = new ConcurrentPreloaderService(new TestExecutorService(), Arrays.asList(preloader));
+    PreloaderService service = new ConcurrentPreloaderService(new TestExecutorService(),
+        Arrays.<Preloader>asList(preloader));
     service.preload(null, null).getData(PRELOAD_STRING_KEY);
   }
 

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java Thu Sep 25 16:38:59 2008
@@ -33,6 +33,7 @@
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.preload.PreloaderService;
 import org.apache.shindig.gadgets.preload.Preloads;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterRegistry;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.View;
 
@@ -66,7 +67,8 @@
 
   private final FakeContentFetcherFactory fetcher = new FakeContentFetcherFactory();
   private final FakePreloaderService preloaderService = new FakePreloaderService();
-  private final HtmlRenderer renderer = new HtmlRenderer(fetcher, preloaderService);
+  private final FakeContentRewriterRegistry rewriter = new FakeContentRewriterRegistry();
+  private final HtmlRenderer renderer = new HtmlRenderer(fetcher, preloaderService, rewriter);
 
   private Gadget makeGadget(String content) throws GadgetException {
     GadgetSpec spec = new GadgetSpec(URI.create("#"),
@@ -120,7 +122,11 @@
     assertTrue("Preloading not performed.", preloaderService.wasPreloaded);
   }
 
-  // TODO: rewriting
+  @Test
+  public void doRewriting() throws Exception {
+    renderer.render(makeGadget(BASIC_HTML_CONTENT));
+    assertTrue("Rewriting not performed.", rewriter.wasRewritten);
+  }
 
   private static class FakeContentFetcherFactory extends ContentFetcherFactory {
     private final Map<Uri, HttpResponse> plainResponses = Maps.newHashMap();
@@ -183,4 +189,17 @@
       return null;
     }
   }
+
+  private static class FakeContentRewriterRegistry implements ContentRewriterRegistry {
+    private boolean wasRewritten = false;
+
+    public boolean rewriteGadget(Gadget gadget) {
+      wasRewritten = true;
+      return true;
+    }
+
+    public HttpResponse rewriteHttpResponse(HttpRequest req, HttpResponse resp) {
+      throw new UnsupportedOperationException();
+    }
+  }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RendererTest.java Thu Sep 25 16:38:59 2008
@@ -218,7 +218,7 @@
     private RenderingException exception;
 
     public FakeHtmlRenderer() {
-      super(null, null);
+      super(null, null, null);
     }
 
     @Override

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java Thu Sep 25 16:38:59 2008
@@ -93,7 +93,6 @@
     GadgetSpec spec = new GadgetSpec(URI.create("#"), gadgetXml);
     return new Gadget()
         .setContext(new GadgetContext())
-        .setMutableContent(new MutableContent(null))
         .setPreloads(new NullPreloads())
         .setSpec(spec)
         .setContent(spec.getView("default").getContent());
@@ -104,13 +103,20 @@
     return makeGadgetWithSpec(defaultXml).setContent(content);
   }
 
+  private void rewrite(Gadget gadget) {
+    MutableContent mc = new MutableContent(null);
+    mc.setContent(gadget.getContent());
+    assertEquals(0, rewriter.rewrite(gadget, mc).getCacheTtl());
+    gadget.setContent(mc.getContent());
+  }
+
   @Test
   public void defaultOutput() throws Exception {
     Gadget gadget = makeGadgetWithContent(BODY_CONTENT);
 
     control.replay();
 
-    assertEquals(0, rewriter.rewrite(gadget).getCacheTtl());
+    rewrite(gadget);
 
     Matcher matcher = DOCUMENT_SPLIT_PATTERN.matcher(gadget.getContent());
     assertTrue("Output is not valid HTML.", matcher.matches());
@@ -157,7 +163,7 @@
     featureRegistry.addInline("foo", "does-not-matter");
     control.replay();
 
-    assertEquals(0, rewriter.rewrite(gadget).getCacheTtl());
+    rewrite(gadget);
 
     Matcher matcher = DOCUMENT_SPLIT_PATTERN.matcher(gadget.getContent());
     assertTrue("Output is not valid HTML.", matcher.matches());
@@ -189,7 +195,7 @@
 
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     assertTrue("Bi-directional locale settings not preserved.",
         gadget.getContent().contains("<body dir='rtl'>"));
@@ -232,7 +238,7 @@
     featureRegistry.addInline("baz", "does-not-matter");
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     Set<String> actual = getInjectedScript(gadget);
     Set<String> expected = Sets.immutableSortedSet("foo", "bar", "baz");
@@ -253,7 +259,7 @@
     featureRegistry.addInline("foo", "foo_content();");
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     assertTrue("Requested scripts not inlined.", gadget.getContent().contains("foo_content();"));
   }
@@ -285,7 +291,7 @@
     featureRegistry.addInline("baz", "does-not-matter");
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     Set<String> actual = getInjectedScript(gadget);
     Set<String> expected = Sets.immutableSortedSet("bar", "baz");
@@ -320,7 +326,7 @@
     featureRegistry.addInline("baz", "does-not-matter");
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     Set<String> actual = getInjectedScript(gadget);
     Set<String> expected = Sets.immutableSortedSet("baz");
@@ -356,7 +362,7 @@
     expect(config.getJsonObject("default", "gadgets.features")).andReturn(conf);
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     JSONObject json = getConfigJson(gadget);
     assertEquals("blah", json.get("foo"));
@@ -391,7 +397,7 @@
     expect(config.getJsonObject("default", "gadgets.features")).andReturn(conf);
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     JSONObject json = getConfigJson(gadget);
     assertEquals("blah", json.get("foo"));
@@ -417,7 +423,7 @@
     expect(config.getJsonObject("default", "gadgets.features")).andReturn(conf);
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     JSONObject json = getConfigJson(gadget);
     assertEquals("blah", json.get("foo"));
@@ -445,7 +451,7 @@
 
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     Pattern prefsPattern
         = Pattern.compile("(?:.*)gadgets\\.Prefs\\.setMessages_\\((.*)\\);(?:.*)", Pattern.DOTALL);
@@ -469,7 +475,7 @@
 
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
   }
 
   @Test
@@ -485,7 +491,7 @@
 
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     // rewrite will throw if the optional unsupported feature doesn't work.
   }
@@ -529,7 +535,7 @@
     Gadget gadget = makeGadgetWithContent("").setPreloads(preloads);
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     JSONObject json = getPreloadedJson(gadget);
     for (Map.Entry<String, Object> entry : preloadData.entrySet()) {
@@ -551,7 +557,7 @@
     Gadget gadget = makeGadgetWithContent("").setPreloads(preloads);
     control.replay();
 
-    rewriter.rewrite(gadget);
+    rewrite(gadget);
 
     JSONObject json = getPreloadedJson(gadget);
 

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/AppendingRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/AppendingRewriter.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/AppendingRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/AppendingRewriter.java Thu Sep 25 16:38:59 2008
@@ -30,12 +30,12 @@
 class AppendingRewriter implements ContentRewriter {
   private String appender;
   private final long cacheTtl;
-  
+
   AppendingRewriter(String appender) {
     this.appender = appender;
     this.cacheTtl = 0;
   }
-  
+
   AppendingRewriter(String appender, long cacheTtl) {
     this.appender = appender;
     this.cacheTtl = cacheTtl;
@@ -48,12 +48,12 @@
     return RewriterResults.cacheable(cacheTtl);
   }
 
-  public RewriterResults rewrite(Gadget gadget) {
+  public RewriterResults rewrite(Gadget gadget, MutableContent content) {
     // Appends appender to the end of the input string.
-	gadget.setContent(gadget.getContent() + appender);
+	gadget.setContent(content.getContent() + appender);
 	return RewriterResults.cacheable(cacheTtl);
   }
-  
+
   void setAppender(String newAppender) {
     // This can be used to simulate a rewriter that returns different
     // results per run for the same input content.

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistryTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistryTest.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistryTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/CachingContentRewriterRegistryTest.java Thu Sep 25 16:38:59 2008
@@ -21,13 +21,11 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import org.apache.shindig.common.ContainerConfig;
 import org.apache.shindig.common.cache.Cache;
 import org.apache.shindig.common.cache.CacheProvider;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
-import org.apache.shindig.gadgets.JsLibrary;
 import org.apache.shindig.gadgets.MutableContent;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
@@ -36,12 +34,9 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
-import org.easymock.classextension.EasyMock;
-import org.easymock.classextension.IMocksControl;
 import org.junit.Test;
 
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -54,8 +49,6 @@
   private final FakeCacheProvider provider = new FakeCacheProvider();
   private final CachingContentRewriterRegistry registry
       = new CachingContentRewriterRegistry(contentRewriters, null, provider, 100, 0);
-  private final IMocksControl control = EasyMock.createNiceControl();
-  private final ContainerConfig config = control.createMock(ContainerConfig.class);
 
   @Test
   public void gadgetGetsCached() throws Exception {
@@ -63,9 +56,10 @@
     String xml = "<Module><ModulePrefs title=''/><Content>" + body + "</Content></Module>";
     GadgetSpec spec = new GadgetSpec(URI.create("#"), xml);
     GadgetContext context = new GadgetContext();
-    Gadget gadget = new Gadget(context, spec, new ArrayList<JsLibrary>(), config, null);
-
-    control.replay();
+    Gadget gadget = new Gadget()
+        .setContext(context)
+        .setSpec(spec)
+        .setContent(body);
 
     registry.rewriteGadget(gadget);
 
@@ -82,16 +76,13 @@
 
     GadgetContext context = new GadgetContext();
 
-    control.replay();
-
-    // We have to re-create Gadget objects because they get mutated directly, which is really
-    // inconsistent with the behavior of rewriteHttpResponse.
-    Gadget gadget = new Gadget(context, spec, new ArrayList<JsLibrary>(), config, null);
-    registry.rewriteGadget(gadget);
-    gadget = new Gadget(context, spec, new ArrayList<JsLibrary>(), config, null);
-    registry.rewriteGadget(gadget);
-    gadget = new Gadget(context, spec, new ArrayList<JsLibrary>(), config, null);
-    registry.rewriteGadget(gadget);
+    for (int i = 0; i < 3; ++i) {
+      Gadget gadget = new Gadget()
+          .setContext(context)
+          .setSpec(spec)
+          .setContent(body);
+      registry.rewriteGadget(gadget);
+    }
 
     assertEquals(3, provider.readCount);
     assertEquals(1, provider.writeCount);
@@ -109,9 +100,10 @@
       }
     };
 
-    Gadget gadget = new Gadget(context, spec, new ArrayList<JsLibrary>(), config, null);
-
-    control.replay();
+    Gadget gadget = new Gadget()
+        .setContext(context)
+        .setSpec(spec)
+        .setContent(body);
 
     registry.rewriteGadget(gadget);
 
@@ -190,24 +182,25 @@
     assertFalse("Cache was written using identical keys.",
         provider.keys.get(0).equals(provider.keys.get(1)));
   }
-  
+
   @Test
   public void rewriteBelowMinCacheDoesntWriteToCache() throws Exception {
     registry.setMinCacheTtl(1000);
     captureRewriter.setCacheTtl(500);
-    
+
     String body = "Hello, world";
     String xml = "<Module><ModulePrefs title=''/><Content>" + body + "</Content></Module>";
     GadgetSpec spec = new GadgetSpec(URI.create("#"), xml);
     GadgetContext context = new GadgetContext();
 
-    control.replay();
-
     // We have to re-create Gadget objects because they get mutated directly, which is really
     // inconsistent with the behavior of rewriteHttpResponse.
-    Gadget gadget = new Gadget(context, spec, new ArrayList<JsLibrary>(), config, null);
+    Gadget gadget = new Gadget()
+        .setContext(context)
+        .setSpec(spec)
+        .setContent(body);
     registry.rewriteGadget(gadget);
-    
+
     assertEquals(1, provider.readCount);
     assertEquals(0, provider.writeCount);
   }
@@ -255,12 +248,12 @@
     }
 
     @Override
-    public RewriterResults rewrite(Gadget gadget) {
-      super.rewrite(gadget);
-      gadget.setContent(gadget.getContent() + "-modified");
+    public RewriterResults rewrite(Gadget gadget, MutableContent content) {
+      super.rewrite(gadget, content);
+      content.setContent(content.getContent() + "-modified");
       return RewriterResults.cacheableIndefinitely();
     }
-    
+
   }
-  
+
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/FeatureBasedRewriterTestBase.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/FeatureBasedRewriterTestBase.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/FeatureBasedRewriterTestBase.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/FeatureBasedRewriterTestBase.java Thu Sep 25 16:38:59 2008
@@ -17,16 +17,17 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import org.easymock.classextension.EasyMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.classextension.EasyMock.replay;
 
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.MutableContent;
 import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
 import org.apache.shindig.gadgets.parse.ParsedHtmlNode;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
-import org.apache.shindig.gadgets.spec.View;
+
+import org.easymock.classextension.EasyMock;
 
 import junit.framework.TestCase;
 
@@ -36,7 +37,7 @@
 import java.util.List;
 import java.util.Set;
 
-public class FeatureBasedRewriterTestBase extends TestCase {
+public abstract class FeatureBasedRewriterTestBase extends TestCase {
   protected URI baseUri;
 
   @Override
@@ -44,12 +45,12 @@
     super.setUp();
     baseUri = new URI("http://gadget.org/dir/gadget.xml");
   }
-  
+
   protected ContentRewriterFeature.Factory mockContentRewriterFeatureFactory(
       ContentRewriterFeature feature) {
     return new MockRewriterFeatureFactory(feature);
   }
-  
+
   protected ContentRewriterFeature makeFeature(String... includedTags) {
     ContentRewriterFeature rewriterFeature =
         EasyMock.createNiceMock(ContentRewriterFeature.class);
@@ -63,32 +64,43 @@
     replay(rewriterFeature);
     return rewriterFeature;
   }
-  
-  protected String rewriteHelper(ContentRewriter rewriter, String s,
-      ParsedHtmlNode[] p) throws Exception {
+
+  protected String rewriteHelper(ContentRewriter rewriter, String s, ParsedHtmlNode[] p)
+      throws Exception {
     GadgetHtmlParser parser = EasyMock.createNiceMock(GadgetHtmlParser.class);
     List<ParsedHtmlNode> expected = p != null ? Arrays.asList(p) : null;
     expect(parser.parse(s)).andReturn(expected).anyTimes();
-    View view = EasyMock.createNiceMock(View.class);
-    expect(view.getContent()).andReturn(s).anyTimes();
-    expect(view.getName()).andReturn(GadgetSpec.DEFAULT_VIEW).anyTimes();
-    GadgetSpec spec = EasyMock.createNiceMock(GadgetSpec.class);
-    expect(spec.getUrl()).andReturn(baseUri).anyTimes();
-    expect(spec.getView(GadgetSpec.DEFAULT_VIEW)).andReturn(view).anyTimes();
-    replay(parser, view, spec);
-    Gadget gadget = new Gadget(new GadgetContext(), spec, null, null, parser);
-    rewriter.rewrite(gadget);
-    return gadget.getContent();
+
+    replay(parser);
+
+    MutableContent mc = new MutableContent(parser);
+    mc.setContent(s);
+
+    GadgetSpec spec = new GadgetSpec(baseUri,
+        "<Module><ModulePrefs title=''/><Content><![CDATA[" + s + "]]></Content></Module>");
+
+    GadgetContext context = new GadgetContext() {
+      @Override
+      public URI getUrl() {
+        return baseUri;
+      }
+    };
+
+    Gadget gadget = new Gadget()
+        .setContext(context)
+        .setSpec(spec);
+    rewriter.rewrite(gadget, mc);
+    return mc.getContent();
   }
-  
+
   private static class MockRewriterFeatureFactory extends ContentRewriterFeature.Factory {
     private final ContentRewriterFeature feature;
-    
+
     public MockRewriterFeatureFactory(ContentRewriterFeature feature) {
       super(".*", "", "HTTP", null);
       this.feature = feature;
     }
-    
+
     @Override
     public ContentRewriterFeature get(GadgetSpec spec) {
       return feature;

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ServletTestFixture.java Thu Sep 25 16:38:59 2008
@@ -22,9 +22,9 @@
 import static junitx.framework.ComparableAssert.assertLesser;
 
 import org.apache.shindig.common.util.DateUtil;
+import org.apache.shindig.gadgets.DefaultUrlGenerator;
 import org.apache.shindig.gadgets.GadgetTestFixture;
 import org.apache.shindig.gadgets.LockedDomainService;
-import org.apache.shindig.gadgets.DefaultUrlGenerator;
 
 import org.apache.commons.lang.StringUtils;
 
@@ -41,7 +41,6 @@
   public final HttpServletRequest request = mock(HttpServletRequest.class);
   public final HttpServletResponse response = mock(HttpServletResponse.class);
   public final HttpServletResponseRecorder recorder = new HttpServletResponseRecorder(response);
-  public final GadgetRenderingTask gadgetRenderer;
   public final JsonRpcHandler jsonRpcHandler;
   public final DefaultUrlGenerator urlGenerator = mock(DefaultUrlGenerator.class);
   public final LockedDomainService lockedDomainService = mock(LockedDomainService.class);
@@ -50,8 +49,6 @@
 
   public ServletTestFixture() {
     HttpUtil.setTimeSource(timeSource);
-    gadgetRenderer = new GadgetRenderingTask(gadgetServer, bundleFactory,
-        registry, containerConfig, urlGenerator, lockedDomainService);
     jsonRpcHandler = new JsonRpcHandler(executor, gadgetServer, urlGenerator);
   }
 

Modified: incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java (original)
+++ incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java Thu Sep 25 16:38:59 2008
@@ -20,6 +20,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
 
 import org.apache.shindig.auth.BasicSecurityToken;
 import org.apache.shindig.auth.BasicSecurityTokenDecoder;
@@ -59,7 +60,7 @@
   private WebClient webClient;
   private CollectingAlertHandler alertHandler;
   private SecurityToken token;
-  
+
   @Test
   public void checkResources() throws Exception {
     for ( String resource : EXPECTED_RESOURCES ) {
@@ -166,7 +167,12 @@
     BasicSecurityTokenDecoder decoder = new BasicSecurityTokenDecoder();
     url += "&st=" + URLEncoder.encode(decoder.encodeToken(token), "UTF-8");
     url += "&testMethod=" + URLEncoder.encode(testMethod, "UTF-8");
-    return (HtmlPage) webClient.getPage(url);
+    url += "&nocache=1";
+    Page page = webClient.getPage(url);
+    if (!(page instanceof HtmlPage)) {
+      fail("Got wrong page type. Was: " + page.getWebResponse().getContentType());
+    }
+    return (HtmlPage) page;
   }
 
   /**

Modified: incubator/shindig/trunk/java/server/src/test/resources/endtoend/errorTest.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/test/resources/endtoend/errorTest.xml?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/test/resources/endtoend/errorTest.xml (original)
+++ incubator/shindig/trunk/java/server/src/test/resources/endtoend/errorTest.xml Thu Sep 25 16:38:59 2008
@@ -21,6 +21,9 @@
   <ModulePrefs title="EndToEndTest">
     <Require feature="opensocial-0.8" />
     <Require feature="views" />
+    <Optional feature="content-rewrite">
+      <Param name="exclude-urls">.*</Param>
+    </Optional>
   </ModulePrefs>
   <Content type="html">
     <![CDATA[

Modified: incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml (original)
+++ incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml Thu Sep 25 16:38:59 2008
@@ -21,6 +21,9 @@
   <ModulePrefs title="EndToEndTest">
     <Require feature="opensocial-0.8"/>
     <Require feature="views"/>
+    <Optional feature="content-rewrite">
+      <Param name="exclude-urls">.*</Param>
+    </Optional>
   </ModulePrefs>
   <Content type="html">
     <![CDATA[

Modified: incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPersonTest.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPersonTest.xml?rev=699132&r1=699131&r2=699132&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPersonTest.xml (original)
+++ incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPersonTest.xml Thu Sep 25 16:38:59 2008
@@ -21,6 +21,9 @@
   <ModulePrefs title="EndToEndTest">
     <Require feature="opensocial-0.8" />
     <Require feature="views" />
+    <Optional feature="content-rewrite">
+      <Param name="exclude-urls">.*</Param>
+    </Optional>
   </ModulePrefs>
   <Content type="html">
     <![CDATA[