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

svn commit: r694035 - in /incubator/shindig/trunk/java: common/src/main/java/org/apache/shindig/common/cache/ gadgets/src/main/java/org/apache/shindig/gadgets/http/ gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/ gadgets/src/main/java/org/apa...

Author: johnh
Date: Wed Sep 10 15:23:40 2008
New Revision: 694035

URL: http://svn.apache.org/viewvc?rev=694035&view=rev
Log:
Moving rewriting logic out of AbstractHttpCache and into [Caching]ContentRewriterRegistry. Caching of rewritten content
no longer occurs on an HttpResponse object (to be cleaned up), and is essentially just a rewriting optimization.

* AbstractHttpCache significantly cleaned up.
* CachingContentRewriterRegistry subclasses BasicContentRewriterRegistry rather than funky CachingWebRetrievalFactory.
* CCRR uses TtlCache under the hood for actual caching.
* MakeRequestHandler and ProxyHandler use injected ContentRewriterRegistry for rewriting.


Modified:
    incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/TtlCache.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.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/servlet/MakeRequestHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpCacheTest.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/servlet/MakeRequestHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyServletTest.java

Modified: incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/TtlCache.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/TtlCache.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/TtlCache.java (original)
+++ incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/cache/TtlCache.java Wed Sep 10 15:23:40 2008
@@ -109,11 +109,10 @@
    * minTtl, minTtl is used. If above maxTtl, maxTtl is used.
    * @param key Element key.
    * @param val Element value to cache.
-   * @param lifetime Intended lifetime, in millis, of the element's entry.
+   * @param expiration Time, in millis, that the value is to expire.
    */
-  public void addElement(K key, V val, long lifetime) {
+  public void addElement(K key, V val, long expiration) {
     long now = timeSource.currentTimeMillis();
-    long expiration = lifetime;
     expiration = Math.max(now + minTtl, Math.min(now + maxTtl, expiration));
     TimeoutPair<V> entry = new TimeoutPair<V>(val, expiration);
     synchronized(baseCache) {

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java Wed Sep 10 15:23:40 2008
@@ -17,40 +17,28 @@
  */
 package org.apache.shindig.gadgets.http;
 
-import org.apache.shindig.gadgets.MutableContent;
-import org.apache.shindig.gadgets.rewrite.ContentRewriter;
-import org.apache.shindig.gadgets.rewrite.ContentRewriterRegistry;
-
-import com.google.inject.Inject;
-
 /**
  * Base class for content caches. Defines cache expiration rules and
- * and restrictions on allowed content. Also enforces rewriting
- * on cacheable content.
- * TODO: separate this logic from rewriting - it's confusing
+ * and restrictions on allowed content.
  */
 public abstract class AbstractHttpCache implements HttpCache {
 
-  private ContentRewriterRegistry rewriterRegistry;
-  
-  @Inject
-  public void setRewriterRegistry(ContentRewriterRegistry registry) {
-    rewriterRegistry = registry;
-  }
+  // Implement these methods to create a concrete HttpCache class.
+  protected abstract HttpResponse getResponseImpl(String key);
+  protected abstract void addResponseImpl(String key, HttpResponse response);
+  protected abstract HttpResponse removeResponseImpl(String key);
   
   public final HttpResponse getResponse(HttpCacheKey key, HttpRequest request) {
     if (key.isCacheable()) {
       String keyString = key.toString();
       HttpResponse cached = getResponseImpl(keyString);
       if (responseStillUsable(cached)) {
-        return checkRewrite(keyString, request, cached);
+        return cached;
       }
     }
     return null;
   }
 
-  protected abstract HttpResponse getResponseImpl(String key);
-
   public HttpResponse addResponse(HttpCacheKey key, HttpRequest request, HttpResponse response) {
     if (key.isCacheable() && response != null) {
       // !!! Note that we only rewrite cacheable content. Move this call above the if
@@ -62,24 +50,17 @@
       }
 
       response = responseBuilder.create();
-      HttpResponse rewritten = checkRewrite(key.toString(), request, response);
-      if (rewritten == response) {
-        // Nothing rewritten (and thus cached). Cache the entry.
-        addResponseImpl(key.toString(), response);
-      } else {
-        return rewritten;
-      }
+      addResponseImpl(key.toString(), response);
       
       if (!request.getIgnoreCache() &&
            response.getRewritten() != null) {
         return response.getRewritten();
       }
     }
+    
     return response;
   }
 
-  protected abstract void addResponseImpl(String key, HttpResponse response);
-
   public HttpResponse removeResponse(HttpCacheKey key) {
     String keyString = key.toString();
     HttpResponse response = getResponseImpl(keyString);
@@ -90,8 +71,6 @@
     return null;
   }
 
-  protected abstract HttpResponse removeResponseImpl(String key);
-
   /**
    * Utility function to verify that an entry is cacheable and not expired
    * @return true If the response can be used.
@@ -102,50 +81,4 @@
     }    
     return response.getCacheExpiration() > System.currentTimeMillis();
   }
-
-  /**
-   * Add rewritten content to the response if its not there and
-   * we can add it. (Re-)cache if we created rewritten content.
-   * Return the appropriately re-written version if requested.
-   * @return Original response object if not rewritten; rewritten object if so.
-   */
-  protected HttpResponse checkRewrite(String key,
-      HttpRequest request, HttpResponse response) {
-    if (response == null) {
-      return null;
-    }
-
-    // Perform a rewrite and store the content back to the cache if the
-    // content is actually rewritten
-    if (response.getRewritten() == null) {
-      HttpResponse rewritten = rewrite(request, response);
-
-      if (rewritten != null) {
-        // TODO: Remove this and other rewriting logic from http cache when ready.
-        response = new HttpResponseBuilder(response).setRewritten(rewritten).create();
-        addResponseImpl(key, response);
-      }
-    }
-
-    // Return the rewritten version if requested
-    if (!request.getIgnoreCache() &&
-        rewriterRegistry != null &&
-        response.getRewritten() != null &&
-        response.getRewritten().getContentLength() > 0) {
-      return response.getRewritten();
-    }
-    
-    return response;
-  }
-
-  /**
-   * Rewrite the content.
-   * @return rewritten HttpResponse object, if rewriting occurred.
-   */
-  protected HttpResponse rewrite(HttpRequest request, HttpResponse response) {
-    if (rewriterRegistry != null) {
-      return rewriterRegistry.rewriteHttpResponse(request, response);
-    }
-    return null;
-  }
 }

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=694035&r1=694034&r2=694035&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 Wed Sep 10 15:23:40 2008
@@ -17,15 +17,14 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
-import java.util.List;
-import java.util.logging.Logger;
-
 import org.apache.shindig.common.cache.CacheProvider;
-import org.apache.shindig.gadgets.CachingWebRetrievalFactory;
+import org.apache.shindig.common.cache.TtlCache;
+import org.apache.shindig.common.util.HashUtil;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
 import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
 import org.apache.shindig.gadgets.rewrite.BasicContentRewriterRegistry;
 import org.apache.shindig.gadgets.rewrite.ContentRewriter;
@@ -34,93 +33,115 @@
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 
+import java.util.List;
+
 /**
- * Implementation of a content rewriter registry that delegates to
- * {@code BasicContentRewriterRegistry} for base operations, but also
- * provides a layer of caching atop that.
+ * Standard implementation of a content rewriter with caching logic layered atop it.
+ * Uses {@code BasicContentRewriterRegistry} for actual rewriting, and a
+ * {@code TtlCache}, whose underlying persistence is provided by {@code CacheProvider},
+ * as the cache.
  */
-public class CachingContentRewriterRegistry
-    extends CachingWebRetrievalFactory<String, Gadget, String>
-    implements ContentRewriterRegistry {
+public class CachingContentRewriterRegistry extends BasicContentRewriterRegistry {
   
-  static final Logger logger = Logger.getLogger(CachingContentRewriterRegistry.class.getName());
-  private final BasicContentRewriterRegistry baseRegistry;
+  private final TtlCache<String, String> rewrittenCache;
+  private String rewritersKey;
   
   @Inject
   public CachingContentRewriterRegistry(ContentRewriter firstRewriter,
       GadgetHtmlParser htmlParser,
       CacheProvider cacheProvider,
-      @Named("shindig.gadget-spec.cache.capacity")int capacity,
-      @Named("shindig.gadget-spec.cache.minTTL")long minTtl,
-      @Named("shindig.gadget-spec.cache.maxTTL")long maxTtl) {
-    // Cache configuration values are currently identical to those for the spec
-    // cache in BasicGadgetSpecFactory for backward compatibility (ensuring that if
-    // caching is set up for specs, it's set up for rewritten content as well)
-    // TODO: create separate rewritten-content config values.
-    super(cacheProvider, capacity, minTtl, maxTtl);
-    baseRegistry = new BasicContentRewriterRegistry(firstRewriter, htmlParser);
-  }
-
-  @Override
-  protected String getCacheKeyFromQueryObj(Gadget gadget) {
-    // Cache by URI + View. Since we always append a view, there should be no
-    // key conflicts associated with this operation.
-    return gadget.getSpec().getUrl().toString() + "#v=" + gadget.getCurrentView().getName();
-  }
-
-  @Override
-  protected Logger getLogger() {
-    return logger;
-  }
-
-  @Override
-  protected FetchedObject<String> retrieveRawObject(Gadget gadget,
-      boolean ignoreCache) throws GadgetException {
-    // Always attempt to rewrite the inbound gadget object.
-    // Even if that fails, the non-rewritten Gadget should be cached,
-    // to avoid superfluous rewrites later.
-    baseRegistry.rewriteGadget(gadget);
-    
-    // Expiration time of 30 minutes by default. This number is arbitrary.
-    // TODO: Make this value configurable.
-    long expiration = System.currentTimeMillis() + (1000 * 60 * 30);
-    Object expirationObj = gadget.getSpec().getAttribute(GadgetSpec.EXPIRATION_ATTRIB);
-    if (expirationObj instanceof Long) {
-      expiration = (Long)expirationObj;
-    }
-    
-    return new FetchedObject<String>(gadget.getContent(), expiration);
+      @Named("shindig.rewritten-content.cache.capacity")int capacity,
+      @Named("shindig.rewritten-content.cache.minTTL")long minTtl,
+      @Named("shindig.rewritten-content.cache.maxTTL")long maxTtl) {
+    super(firstRewriter, htmlParser);
+    rewrittenCache = new TtlCache<String, String>(cacheProvider, capacity, minTtl, maxTtl);
+  }
+
+  protected String getGadgetCacheKey(Gadget gadget) {
+    return getRewritersKey() + ":" + HashUtil.checksum(gadget.getContent().getBytes());
   }
   
-  /** {@inheritDoc} */
-  public List<ContentRewriter> getRewriters() {
-    return baseRegistry.getRewriters();
+  protected String getHttpResponseCacheKey(HttpRequest req, HttpResponse response) {
+    return getRewritersKey() + ":" + req.getUri().toString() + ":" + 
+        HashUtil.checksum(response.getResponseAsString().getBytes());
+  }
+  
+  private String getRewritersKey() {
+    if (rewritersKey == null) {
+      // No need for lock: "rewriter key" generation is idempotent
+      StringBuilder keyBuilder = new StringBuilder();
+      List<ContentRewriter> rewriters = getRewriters();
+      for (ContentRewriter rewriter : rewriters) {
+        keyBuilder.append(rewriter.getClass().getCanonicalName())
+            .append("-").append(rewriter.getClass().hashCode());
+      }
+      rewritersKey = keyBuilder.toString();
+    }
+    return rewritersKey;
   }
 
   /** {@inheritDoc} */
   public boolean rewriteGadget(Gadget gadget)
       throws GadgetException {
-    String cached = doCachedFetch(gadget, gadget.getContext().getIgnoreCache());
+    if (gadget.getContext().getIgnoreCache()) {
+      return super.rewriteGadget(gadget);
+    }
+    
+    String cacheKey = getGadgetCacheKey(gadget);
+    String cached = rewrittenCache.getElement(cacheKey);
     
-    // At present, the output of rewriting is just the string contained within
-    // the Gadget object. Thus, a successful cache hit results in copying over the
-    // rewritten value to the input gadget object.
-    // TODO: Clean up the ContentRewriter interface so rewriting "output" is clearer.
-    // TODO: If necessary later, copy other modified contents to Gadget object.
     if (cached != null) {
       gadget.setContent(cached);
       return true;
     }
     
-    return baseRegistry.rewriteGadget(gadget);
+    // Do a fresh rewrite and cache the results.
+    boolean rewritten = super.rewriteGadget(gadget);
+    if (rewritten) {
+      // Only cache if the rewriters did something.
+      long expiration = 0;
+      Object expirationObj = gadget.getSpec().getAttribute(GadgetSpec.EXPIRATION_ATTRIB);
+      if (expirationObj instanceof Long) {
+        expiration = (Long)expirationObj;
+      }
+      rewrittenCache.addElement(cacheKey, gadget.getContent(), expiration);
+    }
+
+    return rewritten;
   }
   
   /** {@inheritDoc} */
   public HttpResponse rewriteHttpResponse(HttpRequest req, HttpResponse resp) {
-    return baseRegistry.rewriteHttpResponse(req, resp);
-  }
-  
-  public void appendRewriter(ContentRewriter rewriter) {
-    baseRegistry.appendRewriter(rewriter);
+    if (req.getIgnoreCache()) {
+      return super.rewriteHttpResponse(req, resp);
+    }
+    
+    String cacheKey = getHttpResponseCacheKey(req, resp);
+    String cached = rewrittenCache.getElement(cacheKey);
+    
+    if (cached != null) {
+      return new HttpResponseBuilder(resp).setResponseString(cached).create();
+    }
+    
+    HttpResponse rewritten = super.rewriteHttpResponse(req, resp);
+    if (rewritten != null) {
+      // Favor forced cache TTL from request first, then
+      // the response's cache expiration, then the response's cache TTL
+      long forceTtl = req.getCacheTtl();
+      long expiration = 0;
+      if (forceTtl > 0) {
+        expiration = System.currentTimeMillis() + forceTtl;
+      } else {
+        expiration = resp.getCacheExpiration();
+      }
+      if (expiration == -1) {
+        expiration = System.currentTimeMillis() + resp.getCacheTtl();
+      }
+      
+      // All these are bounded by the provided TTLs
+      rewrittenCache.addElement(cacheKey, rewritten.getResponseAsString(), expiration);
+    }
+    
+    return rewritten;
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java Wed Sep 10 15:23:40 2008
@@ -29,6 +29,7 @@
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.oauth.OAuthArguments;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterRegistry;
 import org.apache.shindig.gadgets.spec.Auth;
 
 import com.google.inject.Inject;
@@ -49,7 +50,7 @@
  * Unlike ProxyHandler, this may perform operations such as OAuth or signed fetch.
  */
 @Singleton
-public class MakeRequestHandler extends ProxyBase{
+public class MakeRequestHandler extends ProxyBase {
   // Relaxed visibility for ease of integration. Try to avoid relying on these.
   public static final String UNPARSEABLE_CRUFT = "throw 1; < don't be evil' >";
   public static final String POST_DATA_PARAM = "postData";
@@ -63,10 +64,13 @@
   public static final String AUTHZ_PARAM = "authz";
 
   private final ContentFetcherFactory contentFetcherFactory;
+  private final ContentRewriterRegistry contentRewriterRegistry;
 
   @Inject
-  public MakeRequestHandler(ContentFetcherFactory contentFetcherFactory) {
+  public MakeRequestHandler(ContentFetcherFactory contentFetcherFactory,
+      ContentRewriterRegistry contentRewriterRegistry) {
     this.contentFetcherFactory = contentFetcherFactory;
+    this.contentRewriterRegistry = contentRewriterRegistry;
   }
 
   /**
@@ -94,6 +98,11 @@
 
     // Serialize the response
     HttpResponse results = fetcher.fetch(rcr);
+    
+    // Rewrite the response
+    if (contentRewriterRegistry != null) {
+      results = contentRewriterRegistry.rewriteHttpResponse(rcr, results);
+    }
 
     // Serialize the response
     String output = convertResponseToJson(authToken, request, results);

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java Wed Sep 10 15:23:40 2008
@@ -28,7 +28,7 @@
 import org.apache.shindig.gadgets.http.HttpFetcher;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
-import org.apache.shindig.gadgets.rewrite.ContentRewriter;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterRegistry;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -55,13 +55,15 @@
   // This is a limitation of Guice, but this workaround...works.
   private final HttpFetcher fetcher;
   private final LockedDomainService lockedDomainService;
+  private final ContentRewriterRegistry contentRewriterRegistry;
 
   @Inject
   public ProxyHandler(HttpFetcher fetcher,
                       LockedDomainService lockedDomainService,
-                      ContentRewriter rewriter) {
+                      ContentRewriterRegistry contentRewriterRegistry) {
     this.fetcher = fetcher;
     this.lockedDomainService = lockedDomainService;
+    this.contentRewriterRegistry = contentRewriterRegistry;
   }
 
   /**
@@ -116,10 +118,12 @@
 
     HttpRequest rcr = buildHttpRequest(request);
     HttpResponse results = fetcher.fetch(rcr);
+    if (contentRewriterRegistry != null) {
+      results = contentRewriterRegistry.rewriteHttpResponse(rcr, results);
+    }
 
     setResponseHeaders(request, response, results);   
 
-
     for (Map.Entry<String, List<String>> entry : results.getHeaders().entrySet()) {
       String name = entry.getKey();
       if (!DISALLOWED_RESPONSE_HEADERS.contains(name.toLowerCase())) {

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java Wed Sep 10 15:23:40 2008
@@ -64,7 +64,7 @@
     }
   }
   
-  protected static class CaptureRewriter implements ContentRewriter {
+  public static class CaptureRewriter implements ContentRewriter {
     private boolean rewroteView = false;
     private boolean rewroteResponse = false;
 

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpCacheTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpCacheTest.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpCacheTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpCacheTest.java Wed Sep 10 15:23:40 2008
@@ -46,7 +46,7 @@
     injector = Guice.createInjector(new TestCacheModule());
   }
   
-  public void testCacheWithRewritingOps() {
+  public void testCache() {
     // Setup: could move this elsewhere, but no real need right now.
     HttpCacheKey key = EasyMock.createNiceMock(HttpCacheKey.class);
     expect(key.isCacheable()).andReturn(true).anyTimes();
@@ -59,10 +59,12 @@
     
     // Actual test.
     AbstractHttpCache ahc = injector.getInstance(TestHttpCache.class);
-    HttpResponse rewritten = ahc.addResponse(key, request, response);
-    assertNotSame(rewritten, response);
-    assertEquals(PFX_STR + "foo", rewritten.getResponseAsString());
-    assertSame(rewritten, ahc.getResponse(key, request));
+    HttpResponse added = ahc.addResponse(key, request, response);
+    assertNotSame(added, response);
+    
+    // Not rewritten (anymore).
+    assertEquals("foo", added.getResponseAsString());
+    assertSame(added, ahc.getResponse(key, request));
     assertEquals(response, ahc.removeResponse(key));
   }
 

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=694035&r1=694034&r2=694035&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 Wed Sep 10 15:23:40 2008
@@ -21,8 +21,12 @@
 import static org.easymock.classextension.EasyMock.replay;
 
 import org.apache.shindig.common.cache.DefaultCacheProvider;
+import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.View;
 import org.easymock.classextension.EasyMock;
@@ -60,6 +64,10 @@
     expect(spec.getUrl()).andReturn(new URI("http://gadget.org/gadget.xml")).anyTimes();
     GadgetContext context = EasyMock.createNiceMock(GadgetContext.class);
     expect(context.getView()).andReturn(GadgetSpec.DEFAULT_VIEW).anyTimes();
+    HttpRequest request = new HttpRequest(Uri.parse("http://request.org/cgi-bin/request.py"));
+    request.setCacheTtl(Integer.MAX_VALUE);
+    HttpResponse resp = new HttpResponseBuilder().setResponseString(inputContent)
+        .setCacheTtl(-1).setExpirationTime(-1).setHttpStatusCode(200).create();
     replay(context, view, spec);
     
     Gadget gadget = new Gadget(context, spec, null, null, null);
@@ -69,6 +77,11 @@
     assertTrue(r.rewriteGadget(gadget));
     assertEquals(rewrittenContent, gadget.getContent());
     
+    // Likewise for the http response
+    HttpResponse rewrittenResp = r.rewriteHttpResponse(request, resp);
+    assertNotSame(rewrittenResp, resp);
+    assertEquals(rewrittenContent, rewrittenResp.getResponseAsString());
+    
     r.appendRewriter(new AppendingRewriter("-end"));
     
     // Should also be rewritten the second time, but with the previous
@@ -76,5 +89,8 @@
     Gadget nextGadget = new Gadget(context, spec, null, null, null);
     assertTrue(r.rewriteGadget(nextGadget));
     assertEquals(rewrittenContent, nextGadget.getContent());
+    
+    HttpResponse rewrittenResp2 = r.rewriteHttpResponse(request, resp);
+    assertEquals(rewrittenContent, rewrittenResp2.getResponseAsString());
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java Wed Sep 10 15:23:40 2008
@@ -31,6 +31,7 @@
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpResponseBuilder;
+import org.apache.shindig.gadgets.rewrite.BasicContentRewriterRegistry;
 import org.apache.shindig.gadgets.spec.Auth;
 
 import com.google.common.collect.Lists;
@@ -52,7 +53,8 @@
   private static final String RESPONSE_BODY = "makeRequest response body";
   private static final SecurityToken DUMMY_TOKEN = new FakeGadgetToken();
 
-  private final MakeRequestHandler handler = new MakeRequestHandler(contentFetcherFactory);
+  private final MakeRequestHandler handler = new MakeRequestHandler(contentFetcherFactory,
+      new BasicContentRewriterRegistry(rewriter, null));
 
   private void expectGetAndReturnBody(String response) throws Exception {
     expectGetAndReturnBody(fetcher, response);
@@ -100,6 +102,7 @@
     JSONObject results = extractJsonFromResponse();
     assertEquals(HttpResponse.SC_OK, results.getInt("rc"));
     assertEquals(RESPONSE_BODY, results.get("body"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testExplicitHeaders() throws Exception {
@@ -128,6 +131,7 @@
     JSONObject results = extractJsonFromResponse();
     assertEquals(HttpResponse.SC_OK, results.getInt("rc"));
     assertEquals(RESPONSE_BODY, results.get("body"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testPostRequest() throws Exception {
@@ -140,6 +144,7 @@
 
     assertEquals(HttpResponse.SC_OK, results.getInt("rc"));
     assertEquals(RESPONSE_BODY, results.get("body"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   @Test
@@ -172,6 +177,7 @@
     assertEquals(entryLink, entry.getString("Link"));
     assertNull("getSummaries has the wrong default value (should be false).",
         entry.optString("Summary", null));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testFetchFeedWithParameters() throws Exception {
@@ -218,6 +224,7 @@
     assertEquals(entryLink, entry.getString("Link"));
     assertTrue("getSummaries not parsed correctly.", entry.has("Summary"));
     assertEquals(entrySummary, entry.getString("Summary"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testFetchEmptyDocument() throws Exception {
@@ -229,6 +236,7 @@
 
     assertEquals(HttpResponse.SC_OK, results.getInt("rc"));
     assertEquals("", results.get("body"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testSignedGetRequest() throws Exception {
@@ -245,6 +253,7 @@
     JSONObject results = extractJsonFromResponse();
 
     assertEquals(RESPONSE_BODY, results.get("body"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testSignedPostRequest() throws Exception {
@@ -263,6 +272,7 @@
     assertEquals(RESPONSE_BODY, results.get("body"));
     assertFalse("A security token was returned when it was not requested.",
         results.has("st"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testChangeSecurityToken() throws Exception {
@@ -281,6 +291,7 @@
 
     assertEquals(RESPONSE_BODY, results.get("body"));
     assertEquals("updated", results.getString("st"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testDoOAuthRequest() throws Exception {
@@ -301,6 +312,7 @@
 
     assertEquals(HttpResponse.SC_OK, results.getInt("rc"));
     assertEquals(RESPONSE_BODY, results.get("body"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testInvalidSigningTypeTreatedAsNone() throws Exception {
@@ -313,6 +325,7 @@
 
     assertEquals(HttpResponse.SC_OK, results.getInt("rc"));
     assertEquals(RESPONSE_BODY, results.get("body"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testBadHttpResponseIsPropagated() throws Exception {
@@ -324,6 +337,7 @@
     JSONObject results = extractJsonFromResponse();
 
     assertEquals(HttpResponse.SC_INTERNAL_SERVER_ERROR, results.getInt("rc"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testBadSecurityTokenThrows() throws Exception {
@@ -355,5 +369,6 @@
     JSONObject results = extractJsonFromResponse();
 
     assertEquals(RESPONSE_BODY, results.getString("foo"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java Wed Sep 10 15:23:40 2008
@@ -48,7 +48,7 @@
       = Collections.enumeration(Collections.<String>emptyList());
 
   private final MakeRequestServlet servlet = new MakeRequestServlet();
-  private final MakeRequestHandler handler = new MakeRequestHandler(contentFetcherFactory);
+  private final MakeRequestHandler handler = new MakeRequestHandler(contentFetcherFactory, null);
 
   private final HttpRequest internalRequest = new HttpRequest(REQUEST_URL);
   private final HttpResponse internalResponse = new HttpResponse(RESPONSE_BODY);

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java Wed Sep 10 15:23:40 2008
@@ -23,6 +23,7 @@
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpResponseBuilder;
+import org.apache.shindig.gadgets.rewrite.BasicContentRewriterRegistry;
 import static org.easymock.EasyMock.expect;
 
 import javax.servlet.http.HttpServletResponse;
@@ -36,7 +37,7 @@
   private final static String DATA_ONE = "hello world";
 
   private final ProxyHandler proxyHandler
-      = new ProxyHandler(fetcher, lockedDomainService, rewriter);
+      = new ProxyHandler(fetcher, lockedDomainService, new BasicContentRewriterRegistry(rewriter, null));
 
   private void expectGetAndReturnData(String url, byte[] data) throws Exception {
     HttpRequest req = new HttpRequest(Uri.parse(url));
@@ -69,6 +70,7 @@
     verify();
 
     assertEquals(HttpServletResponse.SC_NOT_MODIFIED, recorder.getHttpStatusCode());
+    assertFalse(rewriter.responseWasRewritten());
   }
 
   public void testLockedDomainEmbed() throws Exception {
@@ -81,6 +83,7 @@
     verify();
 
     assertEquals(DATA_ONE, recorder.getResponseAsString());
+    assertTrue(rewriter.responseWasRewritten());
   }
 
   public void testLockedDomainFailedEmbed() throws Exception {
@@ -115,5 +118,6 @@
 
     assertEquals(contentType, recorder.getHeader("Content-Type"));
     assertEquals(magicGarbage, recorder.getHeader("X-Magic-Garbage"));
+    assertTrue(rewriter.responseWasRewritten());
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyServletTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyServletTest.java?rev=694035&r1=694034&r2=694035&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyServletTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyServletTest.java Wed Sep 10 15:23:40 2008
@@ -44,7 +44,7 @@
   private static final String ERROR_MESSAGE = "Broken!";
 
   private final ProxyHandler proxyHandler
-      = new ProxyHandler(fetcher, lockedDomainService, rewriter);
+      = new ProxyHandler(fetcher, lockedDomainService, null);
   private final ProxyServlet servlet = new ProxyServlet();
   private final HttpRequest internalRequest = new HttpRequest(REQUEST_URL);
   private final HttpResponse internalResponse = new HttpResponse(RESPONSE_BODY);