haul 2004/03/06 13:00:39
Modified:
src/blocks/scratchpad/java/org/apache/cocoon/components/source/impl
CachingSource.java AsyncCachingSource.java
RefresherImpl.java
Log:
Add log statements for swallowed exceptions
Extract some methods in RefresherImpl
Extract some constants in RefresherImpl
(IOW just moving things around)
Revision Changes Path
1.6 +18 -4
cocoon-2.1/src/blocks/scratchpad/java/org/apache/cocoon/components/source/impl/CachingSource.java
Index: CachingSource.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/scratchpad/java/org/apache/cocoon/components/source/impl/CachingSource.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- CachingSource.java 5 Mar 2004 10:07:25 -0000 1.5
+++ CachingSource.java 6 Mar 2004 21:00:39 -0000 1.6
@@ -109,7 +109,10 @@
protected Source source;
/**
- * Construct a new object
+ * Construct a new object. Syntax for cached source:
+ * "<code>cache-protocol</code>" + "<code>://</code>" +
"<code>seconds</code>"
+ * + "<code>@</code>" + "<code>wrapped-URL</code>".
+ *
*/
public CachingSource( String location,
Map parameters)
@@ -313,6 +316,11 @@
SourceValidity expiresValidity =
this.cachedResponse.getValidityObjects()[0];
if ( this.expires != -1
&& (this.expires == 0 || expiresValidity.isValid() !=
SourceValidity.VALID)) {
+ // TODO: according to SourceValidity.isValid() validity
should be checked against
+ // new validity object if UNKNOWN is returned
+ // maybe this is too expensive?
+
+ // remove from cache if not valid anymore
this.cache.remove( this.streamKey );
this.cachedResponse = null;
}
@@ -332,7 +340,7 @@
/**
* Initialize the cache
*/
- protected void initCache(boolean alternative)
+ protected boolean initCache(boolean alternative)
throws IOException, SAXException {
this.initSource();
boolean storeResponse = false;
@@ -356,10 +364,16 @@
if ( storeResponse && this.expires > 0 ) {
try {
this.cache.store(this.streamKey, this.cachedResponse);
+ if (this.getLogger().isDebugEnabled()) {
+ this.getLogger().debug("Storing response for
"+this.streamKey.getKey());
+ }
} catch (ProcessingException ignore) {
- // we ignore this
+ if (this.getLogger().isDebugEnabled()) {
+ this.getLogger().debug("Ignoring exception when storing
response.", ignore) ;
+ }
}
}
+ return storeResponse;
}
/**
1.5 +11 -1
cocoon-2.1/src/blocks/scratchpad/java/org/apache/cocoon/components/source/impl/AsyncCachingSource.java
Index: AsyncCachingSource.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/scratchpad/java/org/apache/cocoon/components/source/impl/AsyncCachingSource.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AsyncCachingSource.java 5 Mar 2004 10:07:25 -0000 1.4
+++ AsyncCachingSource.java 6 Mar 2004 21:00:39 -0000 1.5
@@ -91,9 +91,19 @@
try {
this.cache.store(this.streamKey, this.cachedResponse);
} catch (ProcessingException ignore) {
+ if (this.getLogger().isDebugEnabled()) {
+ this.getLogger().debug("Storing cached
response, ignoring exception:",ignore);
+ }
}
response = this.cachedResponse.getResponse();
+ if (this.getLogger().isDebugEnabled()) {
+ this.getLogger().debug("Using fresh response for
"+this.streamKey.getKey());
+ }
+ } else {
+ if (this.getLogger().isDebugEnabled()) {
+ this.getLogger().debug("Using cached response for
"+this.streamKey.getKey());
+ }
}
return new ByteArrayInputStream(response);
}
1.5 +137 -70
cocoon-2.1/src/blocks/scratchpad/java/org/apache/cocoon/components/source/impl/RefresherImpl.java
Index: RefresherImpl.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/scratchpad/java/org/apache/cocoon/components/source/impl/RefresherImpl.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- RefresherImpl.java 5 Mar 2004 10:07:25 -0000 1.4
+++ RefresherImpl.java 6 Mar 2004 21:00:39 -0000 1.5
@@ -29,6 +29,7 @@
import org.apache.avalon.framework.CascadingException;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.SAXConfigurationHandler;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.parameters.ParameterException;
@@ -61,6 +62,20 @@
extends AbstractLogEnabled
implements Parameterizable, ThreadSafe, Refresher, Serviceable,
Disposable, CronJob {
+ private static final String PARAM_CACHE_ROLE = "cache-role";
+ private static final String PARAM_CACHE_EXPIRES = "cache-expires";
+ private static final String PARAM_SCHEDULER_TARGET = "scheduler-target";
+ private static final String PARAM_WRITE_INTERVAL = "write-interval";
+ private static final String PARAM_WRITE_TARGET = "write-target";
+
+ private static final String CACHE_KEY = "cache-key";
+
+ private static final String TAGNAME_TARGET = "target";
+ private static final String ATTR_CACHE = "cache";
+ private static final String ATTR_EXPIRES = "expires";
+ private static final String ATTR_KEY = "key";
+ private static final String ATTR_URI = "uri";
+
protected String schedulerTarget;
protected ServiceManager manager;
@@ -80,63 +95,108 @@
* @see
org.apache.avalon.framework.parameters.Parameterizable#parameterize(org.apache.avalon.framework.parameters.Parameters)
*/
public void parameterize(Parameters parameters) throws
ParameterException {
- this.schedulerTarget = parameters.getParameter("scheduler-target");
- int writeInterval =
parameters.getParameterAsInteger("write-interval", 0);
+ this.schedulerTarget =
parameters.getParameter(PARAM_SCHEDULER_TARGET);
+ int writeInterval =
parameters.getParameterAsInteger(PARAM_WRITE_INTERVAL, 0);
if ( writeInterval > 0) {
- try {
- this.writeSource =
this.resolver.resolveURI(parameters.getParameter("write-source"));
- } catch (IOException ioe) {
- throw new ParameterException("Error getting write-source.",
ioe);
- }
- if (!(this.writeSource instanceof ModifiableSource)) {
- throw new ParameterException("Write-source is not
modifiable.");
- }
- SAXConfigurationHandler b = new SAXConfigurationHandler();
- try {
- SourceUtil.toSAX(this.manager, this.writeSource,
this.writeSource.getMimeType(), b);
- } catch (Exception ignore) {
- this.getLogger().warn("Unable to read configuration from " +
this.writeSource.getURI());
- }
- final Configuration conf = b.getConfiguration();
- if ( conf != null ) {
- final Configuration[] childs = conf.getChildren("target");
- if ( childs != null ) {
- for(int i=0; i < childs.length; i++) {
- try {
- String uri =
URLDecoder.decode(childs[i].getAttribute("uri"));
- int expires =
childs[i].getAttributeAsInteger("expires");
- String cache = childs[i].getAttribute("cache");
- String key =
URLDecoder.decode(childs[i].getAttribute("key"));
- SimpleCacheKey cacheKey = new
SimpleCacheKey(key, false);
- TargetConfiguration tc = new
TargetConfiguration(cacheKey, uri, expires, cache);
- this.entries.put(key, tc);
- final String name = cacheKey.getKey();
-
- this.scheduler.addPeriodicJob(name,
this.schedulerTarget,
- expires,
- true,
- tc.parameters,
- tc.map);
-
- } catch (CascadingException ignore) {
- }
-
- }
- }
- }
- try {
- this.scheduler.addPeriodicJob(this.getClass().getName(),
-
parameters.getParameter("write-target"),
- (long)writeInterval * 1000,
- true,
- null,
- null);
- } catch (CascadingException ignore) {
- }
+ this.setupRefreshJobSource(parameters);
+ final Configuration conf = this.readRefreshJobConfiguration();
+ this.setupRefreshJobs(conf);
+ this.registerSelfWithScheduler(parameters, writeInterval);
}
}
- /* (non-Javadoc)
+ /**
+ * @param parameters
+ * @param writeInterval
+ */
+ private void registerSelfWithScheduler(Parameters parameters, int
writeInterval) {
+ try {
+ this.scheduler.addPeriodicJob(this.getClass().getName(),
+
parameters.getParameter(PARAM_WRITE_TARGET),
+ (long)writeInterval * 1000,
+ true,
+ null,
+ null);
+ } catch (CascadingException ignore) {
+ if (this.getLogger().isDebugEnabled()) {
+ this.getLogger().debug("Registering self with
scheduler, ignoring exception:", ignore);
+ }
+ }
+ }
+
+ /**
+ * @param conf
+ */
+ private void setupRefreshJobs(final Configuration conf) {
+ if ( conf != null ) {
+ final Configuration[] childs =
conf.getChildren(TAGNAME_TARGET);
+ if ( childs != null ) {
+ for(int i=0; i < childs.length; i++) {
+ try {
+ this.setupSingleRefreshJob(childs[i]);
+ } catch (CascadingException ignore) {
+ if (this.getLogger().isDebugEnabled()) {
+
this.getLogger().debug("Setting up refresh jobs, ignoring exception:", ignore);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @param childs
+ * @param i
+ * @throws ConfigurationException
+ * @throws CascadingException
+ */
+ private void setupSingleRefreshJob(final Configuration conf) throws
ConfigurationException, CascadingException {
+ String uri = URLDecoder.decode(conf.getAttribute(ATTR_URI));
+ int expires = conf.getAttributeAsInteger(ATTR_EXPIRES);
+ String cache = conf.getAttribute(ATTR_CACHE);
+ String key = URLDecoder.decode(conf.getAttribute(ATTR_KEY));
+ SimpleCacheKey cacheKey = new SimpleCacheKey(key, false);
+ TargetConfiguration tc = new TargetConfiguration(cacheKey, uri,
expires, cache);
+ this.entries.put(key, tc);
+ final String name = cacheKey.getKey();
+
+ this.scheduler.addPeriodicJob(name, this.schedulerTarget,
+ expires,
+ true,
+ tc.parameters,
+ tc.map);
+ }
+
+ /**
+ * @return
+ */
+ private Configuration readRefreshJobConfiguration() {
+ SAXConfigurationHandler b = new SAXConfigurationHandler();
+ try {
+ SourceUtil.toSAX(this.manager, this.writeSource,
this.writeSource.getMimeType(), b);
+ } catch (Exception ignore) {
+ this.getLogger().warn("Unable to read configuration from "
+ this.writeSource.getURI());
+ }
+ final Configuration conf = b.getConfiguration();
+ return conf;
+ }
+
+ /**
+ * @param parameters
+ * @throws ParameterException
+ */
+ private void setupRefreshJobSource(Parameters parameters) throws
ParameterException {
+ try {
+ this.writeSource =
this.resolver.resolveURI(parameters.getParameter("write-source"));
+ } catch (IOException ioe) {
+ throw new ParameterException("Error getting write-source.",
ioe);
+ }
+ if (!(this.writeSource instanceof ModifiableSource)) {
+ throw new ParameterException("Write-source is not
modifiable.");
+ }
+ }
+
+ /* (non-Javadoc)
* @see
org.apache.cocoon.components.source.impl.Refresher#refresh(org.apache.cocoon.caching.SimpleCacheKey,
java.lang.String, long, java.lang.String)
*/
public void refresh(SimpleCacheKey cacheKey,
@@ -227,17 +287,7 @@
writer.write("<targets>\n");
final Iterator iter = this.entries.values().iterator();
while ( iter.hasNext() ) {
-
- final TargetConfiguration c =
(TargetConfiguration)iter.next();
- writer.write("<target uri=\"");
-
writer.write(URLEncoder.encode(c.parameters.getParameter("uri", "")));
- writer.write("\" expires=\"");
- writer.write(c.parameters.getParameter("cache-expires",
"0"));
- writer.write("\" cache=\"");
- writer.write(c.parameters.getParameter("cache-role",
""));
- writer.write("\" key=\"");
-
writer.write(URLEncoder.encode(((SimpleCacheKey)c.map.get("cache-key")).getKey()));
- writer.write("\"/>\n");
+ this.writeRefreshJobConfiguration(writer,
(TargetConfiguration) iter.next());
}
writer.write("</targets>\n");
writer.flush();
@@ -248,7 +298,24 @@
}
}
- class TargetConfiguration {
+ /**
+ * @param writer
+ * @param iter
+ * @throws IOException
+ */
+ private void writeRefreshJobConfiguration(Writer writer, final
TargetConfiguration c) throws IOException {
+ writer.write("<"+TAGNAME_TARGET+" "+ATTR_URI+"=\"");
+
writer.write(URLEncoder.encode(c.parameters.getParameter(ATTR_URI, "")));
+ writer.write("\" "+ATTR_EXPIRES+"=\"");
+ writer.write(c.parameters.getParameter(PARAM_CACHE_EXPIRES,
"0"));
+ writer.write("\" "+ATTR_CACHE+"=\"");
+ writer.write(c.parameters.getParameter(PARAM_CACHE_ROLE, ""));
+ writer.write("\" "+ATTR_KEY+"=\"");
+
writer.write(URLEncoder.encode(((SimpleCacheKey)c.map.get(CACHE_KEY)).getKey()));
+ writer.write("\"/>\n");
+ }
+
+ class TargetConfiguration {
public Parameters parameters;
@@ -262,13 +329,13 @@
this.map = new HashMap();
this.update(uri, expires, cacheRole);
- this.map.put("cache-key", cacheKey);
+ this.map.put(CACHE_KEY, cacheKey);
}
public void update(String uri, long expires, String cacheRole) {
- this.parameters.setParameter("uri",uri);
- this.parameters.setParameter("cache-role", cacheRole);
- this.parameters.setParameter("cache-expires",
String.valueOf(expires));
+ this.parameters.setParameter(ATTR_URI,uri);
+ this.parameters.setParameter(PARAM_CACHE_ROLE, cacheRole);
+ this.parameters.setParameter(PARAM_CACHE_EXPIRES,
String.valueOf(expires));
}
}