Beyond checking to ensure that rewriters are actually being run over the
appropriate objects (Gadget, in GadgetServerTest, and HttpResponse, in
MakeRequestHandlerTest and ProxyHandlerTest, each of which verify that
rewriter.[object]WasRewritten(), or not, as appropriate), what do you have
in mind?
At present there's no additional selection/applicability logic in the
ContentRewriter or ContentRewriterRegistry interface(s) -- every Rewriter
just a shot at each object, and it's up to those Rewriter(s) to choose
whether or not to do anything, so I'm not sure what else I can test aside
from ensuring that rewriter objects are called in the first place.

John

On Wed, Sep 10, 2008 at 4:37 PM, Kevin Brown <[EMAIL PROTECTED]> wrote:

> Now that rewriting is being done in appropriate places, there need to be
> tests to verify that rewriting is actually being invoked appropriately. We
> had several regressions in the other rewriter because of code changes that
> caused rewriting to be skipped.
>
> On Wed, Sep 10, 2008 at 3:23 PM, <[EMAIL PROTECTED]> wrote:
>
> > 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
> > - * [EMAIL PROTECTED] 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 [EMAIL PROTECTED] BasicContentRewriterRegistry} for actual 
> > rewriting, and a
> > + * [EMAIL PROTECTED] TtlCache}, whose underlying persistence is provided 
> > by [EMAIL PROTECTED]
> > 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());
> >   }
> >
> > -  /** [EMAIL PROTECTED] */
> > -  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;
> >   }
> >
> >   /** [EMAIL PROTECTED] */
> >   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;
> >   }
> >
> >   /** [EMAIL PROTECTED] */
> >   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);
> >
> >
> >
>

Reply via email to