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