cziegeler 02/05/29 01:20:26
Modified: . todo.xml
src/documentation cocoon.xconf sitemap.xmap
src/java/org/apache/cocoon/caching PipelineCacheKey.java
src/java/org/apache/cocoon/components/pipeline
AbstractProcessingPipeline.java
src/java/org/apache/cocoon/components/pipeline/impl
CachingProcessingPipeline.java
src/java/org/apache/cocoon/components/treeprocessor/sitemap
PipelineNode.java
src/java/org/apache/cocoon/sitemap ContentAggregator.java
src/webapp sitemap.xmap
Log:
Some Fixes:
- Changed sitemap for documentation build to use processing pipelines
- Fixed NPE in content aggregator
- Fixed hashCode calculation (Reported by Volker Schmitt
[[EMAIL PROTECTED]]
- Moved configuration of Expires into the ProcessingPipeline
Revision Changes Path
1.34 +19 -1 xml-cocoon2/todo.xml
Index: todo.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/todo.xml,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- todo.xml 9 May 2002 05:38:24 -0000 1.33
+++ todo.xml 29 May 2002 08:20:25 -0000 1.34
@@ -3,7 +3,7 @@
<!DOCTYPE todo PUBLIC "-//APACHE//DTD Todo V1.0//EN"
"src/documentation/xdocs/dtd/todo-v10.dtd">
<!--
- $Id: todo.xml,v 1.33 2002/05/09 05:38:24 crossley Exp $
+ $Id: todo.xml,v 1.34 2002/05/29 08:20:25 cziegeler Exp $
-->
@@ -29,6 +29,24 @@
</devs>
<actions priority="high">
+ <action context="code" assigned-to="open">
+ Rewrite the FilesystemStore. The current implementations relies on
+ a correct implementation of the toString() method of the used
+ keys. A correct version should rely on hashCode() and equals().
+ (This is actually an Avalon action as the code is in Excalibur)
+ </action>
+
+ <action context="code" assigned-to="open">
+ Correct the release of internal ProcessingPipelines. If an
+ error/exception occurs, the ProcessingPipeline might not be
+ released correctly.
+ </action>
+
+ <action context="code" assigned-to="open">
+ Implement the smart-caching for the processing pipeline and
+ iron out bugs.
+ </action>
+
<action context="docs" assigned-to="open">
Attend to any high+ issues in the
<link href="plan/todo-doc.html">Documentation To Do List</link>
1.14 +0 -10 xml-cocoon2/src/documentation/cocoon.xconf
Index: cocoon.xconf
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/documentation/cocoon.xconf,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- cocoon.xconf 6 May 2002 12:28:49 -0000 1.13
+++ cocoon.xconf 29 May 2002 08:20:25 -0000 1.14
@@ -91,16 +91,6 @@
<classloader
class="org.apache.cocoon.components.classloader.ClassLoaderManagerImpl"
logger="core.classloader"/>
- <!-- Stream Pipeline -->
- <stream-pipeline
class="org.apache.cocoon.components.pipeline.CachingStreamPipeline"
- logger="core.stream-pipeline"
- pool-max="32" pool-min="8" pool-grow="4"/>
-
- <!-- Event Pipeline -->
- <event-pipeline class="org.apache.cocoon.components.pipeline.CachingEventPipeline"
- logger="core.event-pipeline"
- pool-max="32" pool-min="8" pool-grow="4"/>
-
<!-- Entity resolution catalogs -->
<entity-resolver class="org.apache.cocoon.components.resolver.ResolverImpl"
logger="core.resolver">
1.12 +7 -0 xml-cocoon2/src/documentation/sitemap.xmap
Index: sitemap.xmap
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/documentation/sitemap.xmap,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- sitemap.xmap 22 May 2002 13:02:05 -0000 1.11
+++ sitemap.xmap 29 May 2002 08:20:25 -0000 1.12
@@ -38,6 +38,13 @@
<map:matchers default="wildcard">
<map:matcher name="wildcard"
src="org.apache.cocoon.matching.WildcardURIMatcher"/>
</map:matchers>
+
+ <map:pipelines default="noncaching">
+ <map:pipeline name="noncaching"
src="org.apache.cocoon.components.pipeline.impl.NonCachingProcessingPipeline"
+ logger="core.processing-pipeline" pool-max="32" pool-min="8"
pool-grow="4"/>
+ </map:pipelines>
+
+
</map:components>
<!-- =========================== Views =================================== -->
1.14 +2 -2
xml-cocoon2/src/java/org/apache/cocoon/caching/PipelineCacheKey.java
Index: PipelineCacheKey.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/caching/PipelineCacheKey.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- PipelineCacheKey.java 28 May 2002 13:16:31 -0000 1.13
+++ PipelineCacheKey.java 29 May 2002 08:20:25 -0000 1.14
@@ -58,7 +58,7 @@
* or more {@link ComponentCacheKey}s.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
- * @version CVS $Id: PipelineCacheKey.java,v 1.13 2002/05/28 13:16:31 cziegeler Exp
$
+ * @version CVS $Id: PipelineCacheKey.java,v 1.14 2002/05/29 08:20:25 cziegeler Exp
$
*/
public final class PipelineCacheKey
implements java.io.Serializable {
@@ -128,7 +128,7 @@
// FIXME - this is not very safe
if (this.hashCode == 0) {
for(int i=0; i < this.keys.size(); i++) {
- this.hashCode = this.keys.get(i).hashCode();
+ this.hashCode += this.keys.get(i).hashCode();
}
if (this.keys.size() % 2 == 0) this.hashCode++;
}
1.14 +113 -5
xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java
Index: AbstractProcessingPipeline.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- AbstractProcessingPipeline.java 28 May 2002 14:03:18 -0000 1.13
+++ AbstractProcessingPipeline.java 29 May 2002 08:20:26 -0000 1.14
@@ -58,11 +58,14 @@
import org.apache.avalon.framework.component.ComponentSelector;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.parameters.Parameterizable;
import org.apache.cocoon.ConnectionResetException;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.pipeline.OutputComponentSelector;
import org.apache.cocoon.components.saxconnector.SAXConnector;
import org.apache.cocoon.environment.Environment;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Response;
import org.apache.cocoon.generation.Generator;
import org.apache.cocoon.reading.Reader;
import org.apache.cocoon.serialization.Serializer;
@@ -74,19 +77,18 @@
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;
-import java.util.ArrayList;
-import java.util.Iterator;
+import java.util.*;
/**
* This is the base for all implementations of a <code>ProcessingPipeline</code>.
*
* @since @next-version@
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
- * @version CVS $Id: AbstractProcessingPipeline.java,v 1.13 2002/05/28 14:03:18
cziegeler Exp $
+ * @version CVS $Id: AbstractProcessingPipeline.java,v 1.14 2002/05/29 08:20:26
cziegeler Exp $
*/
public abstract class AbstractProcessingPipeline
extends AbstractLogEnabled
- implements ProcessingPipeline, Recyclable {
+ implements ProcessingPipeline, Parameterizable, Recyclable {
// Generator stuff
protected Generator generator;
@@ -133,9 +135,18 @@
/** the component manager set with compose() and recompose() */
protected ComponentManager newManager;
+ /** The configuration */
+ protected Parameters configuration;
+
/** The parameters */
protected Parameters parameters;
+ /** Expires value */
+ protected long expires;
+
+ /** Configured Expires value */
+ protected long configuredExpires;
+
/**
* Composable Interface
*/
@@ -156,10 +167,26 @@
}
/**
+ * Parameterizable Interface - Configuration
+ */
+ public void parameterize(Parameters params) {
+ this.configuration = params;
+ final String expiresValue = params.getParameter("expires", null);
+ if (expiresValue != null) {
+ this.configuredExpires = this.parseExpires(expiresValue);
+ }
+ }
+
+ /**
* Setup this component
*/
public void setup(Parameters params) {
- this.parameters = params;
+ final String expiresValue = params.getParameter("expires", null);
+ if (expiresValue != null) {
+ this.expires = this.parseExpires(expiresValue);
+ } else {
+ this.expires = this.configuredExpires;
+ }
}
/**
@@ -438,6 +465,14 @@
if ( !checkPipeline() ) {
throw new ProcessingException("Attempted to process incomplete
pipeline.");
}
+
+ // See if we need to set an "Expires:" header
+ if (this.expires != 0) {
+ Response res =
ObjectModelHelper.getResponse(environment.getObjectModel());
+ res.setDateHeader("Expires", expires);
+ environment.getObjectModel().put(ObjectModelHelper.EXPIRES_OBJECT,
+ new Long(expires));
+ }
if ( this.reader != null ) {
this.setupReader( environment );
if (this.checkLastModified( environment )) {
@@ -634,4 +669,77 @@
public SourceValidity[] getValiditiesForEventPipeline() {
return null;
}
+
+ /**
+ * Parse the expires parameter
+ */
+ private long parseExpires(String expire) {
+ StringTokenizer tokens = new StringTokenizer(expire);
+
+ // get <base>
+ String current = tokens.nextToken();
+ if (current.equals("modification")) {
+
+ this.getLogger().warn("the \"modification\" keyword is not yet" +
+
+ " implemented. Assuming \"now\" as the base attribute");
+ current = "now";
+ }
+
+ if (!current.equals("now") && !current.equals("access")) {
+ this.getLogger().error("bad <base> attribute, Expires header will not
be set");
+ return -1;
+ }
+ long number = 0;
+ long modifier = 0;
+ long expires = 0;
+
+ while (tokens.hasMoreTokens()) {
+ current = tokens.nextToken();
+
+ // get rid of the optional <plus> keyword
+ if (current.equals("plus"))
+ current = tokens.nextToken();
+
+ // We're expecting a sequence of <number> and <modification> here
+ // get <number> first
+ try {
+ number = Long.parseLong(current);
+ } catch (NumberFormatException nfe) {
+ this.getLogger().error("state violation: a number was expected
here");
+ return -1;
+ }
+
+ // now get <modifier>
+ try {
+ current = tokens.nextToken();
+ } catch (NoSuchElementException nsee) {
+ this.getLogger().error("state violation: expecting a modifier" +
+ " but no one found: Expires header will not be set");
+ }
+ if (current.equals("years"))
+ modifier = 365L * 24L * 60L * 60L * 1000L;
+ else if (current.equals("months"))
+ modifier = 30L * 24L * 60L * 60L * 1000L;
+ else if (current.equals("weeks"))
+ modifier = 7L * 24L * 60L * 60L * 1000L;
+ else if (current.equals("days"))
+ modifier = 24L * 60L * 60L * 1000L;
+ else if (current.equals("hours"))
+ modifier = 60L * 60L * 1000L;
+ else if (current.equals("minutes"))
+ modifier = 60L * 1000L;
+ else if (current.equals("seconds"))
+ modifier = 1000L;
+ else {
+ this.getLogger().error("bad modifier (" + current +
+ "): ignoring expires configuration");
+ return -1;
+ }
+ expires += number * modifier;
+ }
+
+ return System.currentTimeMillis() + expires;
+ }
+
}
1.20 +49 -34
xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/impl/CachingProcessingPipeline.java
Index: CachingProcessingPipeline.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/impl/CachingProcessingPipeline.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- CachingProcessingPipeline.java 28 May 2002 11:33:57 -0000 1.19
+++ CachingProcessingPipeline.java 29 May 2002 08:20:26 -0000 1.20
@@ -92,7 +92,7 @@
*
* @since @next-version@
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
- * @version CVS $Id: CachingProcessingPipeline.java,v 1.19 2002/05/28 11:33:57
cziegeler Exp $
+ * @version CVS $Id: CachingProcessingPipeline.java,v 1.20 2002/05/29 08:20:26
cziegeler Exp $
*/
public class CachingProcessingPipeline
extends AbstractProcessingPipeline
@@ -133,6 +133,8 @@
protected int firstNotCacheableTransformerIndex;
/** Cache complete response */
protected boolean cacheCompleteResponse;
+ /** Smart caching ? */
+ protected boolean doSmartCaching;
/**
* Composable Interface
@@ -144,6 +146,16 @@
}
/**
+ * Setup this component
+ */
+ public void setup(Parameters params) {
+ super.setup(params);
+ this.doSmartCaching = params.getParameterAsBoolean("smart-caching",
+ this.configuration.getParameterAsBoolean("smart-caching",
true));
+ // FIXME (CZ) - Implement smart caching
+ }
+
+ /**
* Set the generator.
*/
public void setGenerator (String role, String source, Parameters param)
@@ -382,46 +394,49 @@
SourceValidity[] validities = response.getValidityObjects();
int i = 0;
while (responseIsValid && i < validities.length) {
- boolean isValid = validities[i].isValid();
- if ( !isValid ) {
- final SourceValidity validity;
- if (i == 0) {
- // test generator
- if (generatorIsCacheableProcessingComponent) {
- validity =
((CacheableProcessingComponent)super.generator).generateValidity();
+ boolean isValid = false;
+ // FIXME (CZ) WORKAROUND validities[i] should never be null
+ if (validities[i] != null) {
+ isValid = validities[i].isValid();
+ if ( !isValid ) {
+ final SourceValidity validity;
+ if (i == 0) {
+ // test generator
+ if (generatorIsCacheableProcessingComponent) {
+ validity =
((CacheableProcessingComponent)super.generator).generateValidity();
+ } else {
+ validity = new
CacheValidityToSourceValidity(((Cacheable)super.generator).generateValidity());
+ }
+ } else if (i <= this.firstProcessedTransformerIndex) {
+ // test transformer
+ final Transformer trans =
+ (Transformer)super.transformers.get(i-1);
+ if (transformerIsCacheableProcessingComponent[i-1])
{
+ validity =
((CacheableProcessingComponent)trans).generateValidity();
+ } else {
+ validity = new
CacheValidityToSourceValidity(((Cacheable)trans).generateValidity());
+ }
} else {
- validity = new
CacheValidityToSourceValidity(((Cacheable)super.generator).generateValidity());
+ // test serializer
+ if (serializerIsCacheableProcessingComponent) {
+ validity =
((CacheableProcessingComponent)super.serializer).generateValidity();
+ } else {
+ validity = new
CacheValidityToSourceValidity(((Cacheable)super.serializer).generateValidity());
+ }
}
- } else if (i <= this.firstProcessedTransformerIndex) {
- // test transformer
- final Transformer trans =
- (Transformer)super.transformers.get(i-1);
- if (transformerIsCacheableProcessingComponent[i-1]) {
- validity =
((CacheableProcessingComponent)trans).generateValidity();
- } else {
- validity = new
CacheValidityToSourceValidity(((Cacheable)trans).generateValidity());
+ if (validity != null) {
+ isValid = validities[i].isValid( validity );
}
- } else {
- // test serializer
- if (serializerIsCacheableProcessingComponent) {
- validity =
((CacheableProcessingComponent)super.serializer).generateValidity();
- } else {
- validity = new
CacheValidityToSourceValidity(((Cacheable)super.serializer).generateValidity());
+ if ( !isValid ) {
+ responseIsValid = false;
+ // update validity
+ validities[i] = validity;
+ if (validity == null) responseIsUsable = false;
}
}
- if (validity != null) {
- isValid = validities[i].isValid( validity );
- }
- if ( !isValid ) {
- responseIsValid = false;
- // update validity
- validities[i] = validity;
- if (validity == null) responseIsUsable = false;
- }
+ if ( isValid ) i++;
}
- if ( isValid ) i++;
}
-
if ( responseIsValid ) {
// we are valid, ok that's it
cachedValidityObjects = validities;
1.7 +1 -84
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java
Index: PipelineNode.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- PipelineNode.java 27 May 2002 12:43:22 -0000 1.6
+++ PipelineNode.java 29 May 2002 08:20:26 -0000 1.7
@@ -61,8 +61,6 @@
import org.apache.cocoon.ResourceNotFoundException;
import org.apache.cocoon.environment.Environment;
-import org.apache.cocoon.environment.ObjectModelHelper;
-import org.apache.cocoon.environment.Response;
import org.apache.cocoon.components.notification.Notifying;
import org.apache.cocoon.components.notification.NotifyingBuilder;
import org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode;
@@ -79,7 +77,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Gianugo Rabellino</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
- * @version CVS $Id: PipelineNode.java,v 1.6 2002/05/27 12:43:22 cziegeler Exp $
+ * @version CVS $Id: PipelineNode.java,v 1.7 2002/05/29 08:20:26 cziegeler Exp $
*/
public class PipelineNode
extends AbstractParentProcessingNode
@@ -101,8 +99,6 @@
/** Is it the last <pipeline> in the enclosing <pipelines> ? */
private boolean isLast = false;
- private String expires;
-
/** The component name of the processing pipeline */
protected String processingPipeline;
@@ -114,7 +110,6 @@
* and optional parameters for the processing pipeline
*/
public PipelineNode(Configuration config) {
- this.expires = config.getAttribute("expires", null);
this.processingPipeline = config.getAttribute("type", null);
}
@@ -160,16 +155,6 @@
context.inform(this.processingPipeline, this.parameters);
try {
- // See if we need to set an "Expires:" header
- if (expires != null) {
- Response res = ObjectModelHelper.getResponse(
- env.getObjectModel());
- long expiration = this.parseExpires(expires);
- res.setDateHeader("Expires", expiration);
- env.getObjectModel().put(ObjectModelHelper.EXPIRES_OBJECT,
- new Long(expiration));
- }
-
if (invokeNodes(children, env, context)) {
return true;
} else if (this.isLast) {
@@ -243,72 +228,4 @@
}
}
- private long parseExpires(String expire) throws Exception {
- StringTokenizer tokens = new StringTokenizer(expire);
-
- // get <base>
- String current = tokens.nextToken();
- if (current.equals("modification")) {
-
- this.getLogger().warn("the \"modification\" keyword is not yet" +
-
- " implemented. Assuming \"now\" as the base attribute");
- current = "now";
- }
-
- if (!current.equals("now") && !current.equals("access")) {
- this.getLogger().error("bad <base> attribute, Expires header will not
be set");
- return -1;
- }
- long number = 0;
- long modifier = 0;
- long expires = 0;
-
- while (tokens.hasMoreTokens()) {
- current = tokens.nextToken();
-
- // get rid of the optional <plus> keyword
- if (current.equals("plus"))
- current = tokens.nextToken();
-
- // We're expecting a sequence of <number> and <modification> here
- // get <number> first
- try {
- number = Long.parseLong(current);
- } catch (NumberFormatException nfe) {
- this.getLogger().error("state violation: a number was expected
here");
- return -1;
- }
-
- // now get <modifier>
- try {
- current = tokens.nextToken();
- } catch (NoSuchElementException nsee) {
- this.getLogger().error("state violation: expecting a modifier" +
- " but no one found: Expires header will not be set");
- }
- if (current.equals("years"))
- modifier = 365L * 24L * 60L * 60L * 1000L;
- else if (current.equals("months"))
- modifier = 30L * 24L * 60L * 60L * 1000L;
- else if (current.equals("weeks"))
- modifier = 7L * 24L * 60L * 60L * 1000L;
- else if (current.equals("days"))
- modifier = 24L * 60L * 60L * 1000L;
- else if (current.equals("hours"))
- modifier = 60L * 60L * 1000L;
- else if (current.equals("minutes"))
- modifier = 60L * 1000L;
- else if (current.equals("seconds"))
- modifier = 1000L;
- else {
- this.getLogger().error("bad modifier (" + current +
- "): ignoring expires configuration");
- return -1;
- }
- expires += number * modifier;
- }
-
- return System.currentTimeMillis() + expires;
- }
}
1.6 +2 -1
xml-cocoon2/src/java/org/apache/cocoon/sitemap/ContentAggregator.java
Index: ContentAggregator.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/sitemap/ContentAggregator.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ContentAggregator.java 28 May 2002 13:08:13 -0000 1.5
+++ ContentAggregator.java 29 May 2002 08:20:26 -0000 1.6
@@ -78,7 +78,7 @@
*
* @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
- * @version CVS $Id: ContentAggregator.java,v 1.5 2002/05/28 13:08:13 cziegeler Exp
$
+ * @version CVS $Id: ContentAggregator.java,v 1.6 2002/05/29 08:20:26 cziegeler Exp
$
*/
public class ContentAggregator
extends ContentHandlerWrapper
@@ -301,6 +301,7 @@
*/
public void setup(SourceResolver resolver, Map objectModel, String src,
Parameters par)
throws ProcessingException, SAXException, IOException {
+ this.resolver = resolver;
// get the Source for each part
try {
for(int i=0; i<this.parts.size();i++) {
1.59 +1 -2 xml-cocoon2/src/webapp/sitemap.xmap
Index: sitemap.xmap
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/webapp/sitemap.xmap,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- sitemap.xmap 28 May 2002 09:09:33 -0000 1.58
+++ sitemap.xmap 29 May 2002 08:20:26 -0000 1.59
@@ -315,8 +315,7 @@
<!--
The different pipeline implementations
-->
- <map:pipelines default="noncaching">
- <!-- ATTENTION: The caching pipeline is currently not working, use at your own
risk! -->
+ <map:pipelines default="caching">
<map:pipeline name="caching"
src="org.apache.cocoon.components.pipeline.impl.CachingProcessingPipeline"/>
<map:pipeline name="noncaching"
src="org.apache.cocoon.components.pipeline.impl.NonCachingProcessingPipeline"/>
<!-- The following two can be used for profiling:
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]