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/18 22:50:17 UTC
svn commit: r696796 - in
/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets:
AbstractMessageBundleFactory.java BasicGadgetSpecFactory.java
BasicMessageBundleFactory.java CachingWebRetrievalFactory.java
Author: johnh
Date: Thu Sep 18 13:50:17 2008
New Revision: 696796
URL: http://svn.apache.org/viewvc?rev=696796&view=rev
Log:
Getting rid of CachingWebRetrievalFactory.
Removed:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/CachingWebRetrievalFactory.java
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractMessageBundleFactory.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicMessageBundleFactory.java
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractMessageBundleFactory.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractMessageBundleFactory.java?rev=696796&r1=696795&r2=696796&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractMessageBundleFactory.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractMessageBundleFactory.java Thu Sep 18 13:50:17 2008
@@ -17,7 +17,6 @@
*/
package org.apache.shindig.gadgets;
-import org.apache.shindig.common.cache.CacheProvider;
import org.apache.shindig.gadgets.spec.GadgetSpec;
import org.apache.shindig.gadgets.spec.LocaleSpec;
import org.apache.shindig.gadgets.spec.MessageBundle;
@@ -29,15 +28,7 @@
* Core implementation of MessageBundleFactory that ensures proper MessageBundle creation and
* delegates caching and network retrieval to concreate implementations.
*/
-public abstract class AbstractMessageBundleFactory
- extends CachingWebRetrievalFactory<MessageBundle, LocaleSpec, URI>
- implements MessageBundleFactory {
-
- protected AbstractMessageBundleFactory(CacheProvider cacheProvider,
- int capacity, long minTtl, long maxTtl) {
- super(cacheProvider, capacity, minTtl, maxTtl);
- }
-
+public abstract class AbstractMessageBundleFactory implements MessageBundleFactory {
private static final Locale ALL_ALL = new Locale("all", "ALL");
public MessageBundle getBundle(GadgetSpec spec, Locale locale, boolean ignoreCache)
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java?rev=696796&r1=696795&r2=696796&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicGadgetSpecFactory.java Thu Sep 18 13:50:17 2008
@@ -19,6 +19,7 @@
package org.apache.shindig.gadgets;
import org.apache.shindig.common.cache.CacheProvider;
+import org.apache.shindig.common.cache.TtlCache;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.gadgets.http.HttpFetcher;
import org.apache.shindig.gadgets.http.HttpRequest;
@@ -41,40 +42,51 @@
* Basic implementation of a gadget spec factory.
*/
@Singleton
-public class BasicGadgetSpecFactory extends CachingWebRetrievalFactory<GadgetSpec, URI, URI>
- implements GadgetSpecFactory {
+public class BasicGadgetSpecFactory implements GadgetSpecFactory {
static final Logger logger = Logger.getLogger(BasicGadgetSpecFactory.class.getName());
private final HttpFetcher fetcher;
private final ExecutorService executor;
-
- @Override
- protected URI getCacheKeyFromQueryObj(URI queryObj) {
- return queryObj;
- }
-
- @Override
- protected Logger getLogger() {
- return logger;
- }
+ private final TtlCache<URI, GadgetSpec> ttlCache;
public GadgetSpec getGadgetSpec(GadgetContext context) throws GadgetException {
return getGadgetSpec(context.getUrl(), context.getIgnoreCache());
}
-
+
/**
* Retrieves a gadget specification from the cache or from the Internet.
*/
- public GadgetSpec getGadgetSpec(URI url, boolean ignoreCache) throws GadgetException {
- return doCachedFetch(url, ignoreCache);
+ public GadgetSpec getGadgetSpec(URI gadgetUri, boolean ignoreCache) throws GadgetException {
+ if (ignoreCache) {
+ return fetchObjectAndCache(gadgetUri, ignoreCache);
+ }
+
+ TtlCache.CachedObject<GadgetSpec> cached = null;
+ synchronized(ttlCache) {
+ cached = ttlCache.getElementWithExpiration(gadgetUri);
+ }
+
+ if (cached.obj == null || cached.isExpired) {
+ try {
+ return fetchObjectAndCache(gadgetUri, ignoreCache);
+ } catch (GadgetException e) {
+ // Failed to re-fetch raw object. Use cached object if it exists.
+ if (cached.obj == null) {
+ throw e;
+ } else {
+ logger.info("GadgetSpec fetch failed for " + gadgetUri + " - using cached.");
+ }
+ }
+ }
+
+ return cached.obj;
}
/**
* Retrieves a gadget specification from the Internet, processes its views and
* adds it to the cache.
*/
- protected FetchedObject<GadgetSpec> retrieveRawObject(URI url, boolean ignoreCache)
- throws GadgetException {
+ private GadgetSpec fetchObjectAndCache(URI url, boolean ignoreCache) throws GadgetException {
HttpRequest request = new HttpRequest(Uri.fromJavaUri(url)).setIgnoreCache(ignoreCache);
HttpResponse response = fetcher.fetch(request);
if (response.getHttpStatusCode() != HttpResponse.SC_OK) {
@@ -114,23 +126,21 @@
}
}
- // Annotate this spec instance with the expiration time (as a Long) associated
- // with its retrieval. This enables CachingContentRewriterRegistry to properly
- // cache rewritten content generated from Gadgets based on the spec.
- spec.setAttribute(GadgetSpec.EXPIRATION_ATTRIB, new Long(response.getCacheExpiration()));
+ ttlCache.addElement(url, spec, response.getCacheExpiration());
- return new FetchedObject<GadgetSpec>(spec, response.getCacheExpiration());
+ return spec;
}
@Inject
public BasicGadgetSpecFactory(HttpFetcher fetcher,
- CacheProvider cacheProvider,
- ExecutorService executor,
- @Named("shindig.gadget-spec.cache.capacity")int gadgetSpecCacheCapacity,
- @Named("shindig.gadget-spec.cache.minTTL")long minTtl,
- @Named("shindig.gadget-spec.cache.maxTTL")long maxTtl) {
- super(cacheProvider, gadgetSpecCacheCapacity, minTtl, maxTtl);
+ CacheProvider cacheProvider,
+ ExecutorService executor,
+ @Named("shindig.gadget-spec.cache.capacity")int gadgetSpecCacheCapacity,
+ @Named("shindig.gadget-spec.cache.minTTL")long minTtl,
+ @Named("shindig.gadget-spec.cache.maxTTL")long maxTtl) {
this.fetcher = fetcher;
this.executor = executor;
+ this.ttlCache =
+ new TtlCache<URI, GadgetSpec>(cacheProvider, gadgetSpecCacheCapacity, minTtl, maxTtl);
}
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicMessageBundleFactory.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicMessageBundleFactory.java?rev=696796&r1=696795&r2=696796&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicMessageBundleFactory.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/BasicMessageBundleFactory.java Thu Sep 18 13:50:17 2008
@@ -19,6 +19,7 @@
package org.apache.shindig.gadgets;
import org.apache.shindig.common.cache.CacheProvider;
+import org.apache.shindig.common.cache.TtlCache;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.gadgets.http.HttpFetcher;
import org.apache.shindig.gadgets.http.HttpRequest;
@@ -40,9 +41,37 @@
public class BasicMessageBundleFactory extends AbstractMessageBundleFactory {
static final Logger logger = Logger.getLogger(BasicMessageBundleFactory.class.getName());
private final HttpFetcher fetcher;
-
+ private final TtlCache<URI, MessageBundle> ttlCache;
+
@Override
- protected FetchedObject<MessageBundle> retrieveRawObject(LocaleSpec locale,
+ protected MessageBundle fetchBundle(LocaleSpec locale, boolean ignoreCache)
+ throws GadgetException {
+ if (ignoreCache) {
+ return fetchAndCacheBundle(locale, ignoreCache);
+ }
+
+ TtlCache.CachedObject<MessageBundle> cached = null;
+
+ synchronized(ttlCache) {
+ cached = ttlCache.getElementWithExpiration(locale.getMessages());
+ }
+
+ if (cached.obj == null || cached.isExpired) {
+ try {
+ return fetchAndCacheBundle(locale, ignoreCache);
+ } catch (GadgetException e) {
+ if (cached.obj == null) {
+ throw e;
+ } else {
+ logger.info("Message bundle fetch failed for " + locale + " - using cached.");
+ }
+ }
+ }
+
+ return cached.obj;
+ }
+
+ private MessageBundle fetchAndCacheBundle(LocaleSpec locale,
boolean ignoreCache) throws GadgetException {
URI url = locale.getMessages();
HttpRequest request = new HttpRequest(Uri.fromJavaUri(url)).setIgnoreCache(ignoreCache);
@@ -54,22 +83,8 @@
}
MessageBundle bundle = new MessageBundle(locale, response.getResponseAsString());
- return new FetchedObject<MessageBundle>(bundle, response.getCacheExpiration());
- }
-
- @Override
- protected URI getCacheKeyFromQueryObj(LocaleSpec queryObj) {
- return queryObj.getMessages();
- }
-
- @Override
- protected Logger getLogger() {
- return logger;
- }
-
- protected MessageBundle fetchBundle(LocaleSpec locale, boolean ignoreCache)
- throws GadgetException {
- return doCachedFetch(locale, ignoreCache);
+ ttlCache.addElement(url, bundle, response.getCacheExpiration());
+ return bundle;
}
@Inject
@@ -78,7 +93,7 @@
@Named("shindig.message-bundle.cache.capacity")int capacity,
@Named("shindig.message-bundle.cache.minTTL")long minTtl,
@Named("shindig.message-bundle.cache.maxTTL")long maxTtl) {
- super(cacheProvider, capacity, minTtl, maxTtl);
this.fetcher = fetcher;
+ this.ttlCache = new TtlCache<URI, MessageBundle>(cacheProvider, capacity, minTtl, maxTtl);
}
}