cziegeler 2003/01/10 02:44:43
Modified: src/java/org/apache/cocoon/components/pipeline
ProcessingPipeline.java
AbstractProcessingPipeline.java
src/java/org/apache/cocoon/components/pipeline/impl
NewAbstractCachingProcessingPipeline.java
Log:
This should work real soon now
Revision Changes Path
1.14 +5 -1
xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/ProcessingPipeline.java
Index: ProcessingPipeline.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/ProcessingPipeline.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- ProcessingPipeline.java 9 Jan 2003 11:27:59 -0000 1.13
+++ ProcessingPipeline.java 10 Jan 2003 10:44:43 -0000 1.14
@@ -182,4 +182,8 @@
* Otherwise return <code>null</code>
*/
SourceValidity[] getValiditiesForEventPipeline();
+
+ boolean isInternalPipelineCacheable();
+
+ SourceValidity getValidityForInternalPipeline(int index);
}
1.28 +9 -1
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.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- AbstractProcessingPipeline.java 9 Jan 2003 11:31:09 -0000 1.27
+++ AbstractProcessingPipeline.java 10 Jan 2003 10:44:43 -0000 1.28
@@ -756,4 +756,12 @@
return System.currentTimeMillis() + expires;
}
+ public boolean isInternalPipelineCacheable() {
+ return false;
+ }
+
+ public SourceValidity getValidityForInternalPipeline(int index) {
+ return null;
+ }
+
}
1.2 +106 -95
xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/impl/NewAbstractCachingProcessingPipeline.java
Index: NewAbstractCachingProcessingPipeline.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/pipeline/impl/NewAbstractCachingProcessingPipeline.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- NewAbstractCachingProcessingPipeline.java 10 Jan 2003 07:42:11 -0000 1.1
+++ NewAbstractCachingProcessingPipeline.java 10 Jan 2003 10:44:43 -0000 1.2
@@ -115,8 +115,9 @@
protected PipelineCacheKey fromCacheKey;
/** This key indicates the response that will get into the cache */
protected PipelineCacheKey toCacheKey;
- /** The validity objects of the generated response */
- protected SourceValidity[] toCacheValidityObjects;
+ /** The source validities used for caching */
+ protected SourceValidity[] toCacheSourceValidities;
+
/** The index indicating to the first transformer which is not cacheable */
protected int firstNotCacheableTransformerIndex;
/** Cache complete response */
@@ -128,7 +129,9 @@
/** Smart caching ? */
protected boolean doSmartCaching;
-
+ /** Default setting for smart caching */
+ protected boolean configuredDoSmartCaching;
+
/**
* Abstract methods defined in subclasses
*/
@@ -146,12 +149,20 @@
}
/**
+ * Parameterizable Interface - Configuration
+ */
+ public void parameterize(Parameters params) {
+ super.parameterize(params);
+ this.configuredDoSmartCaching =
params.getParameterAsBoolean("smart-caching", true);
+ }
+
+ /**
* Setup this component
*/
public void setup(Parameters params) {
super.setup(params);
this.doSmartCaching = params.getParameterAsBoolean("smart-caching",
-
this.configuration.getParameterAsBoolean("smart-caching", true));
+
this.configuredDoSmartCaching);
}
/**
@@ -383,7 +394,7 @@
*/
protected void validatePipeline(Environment environment)
throws ProcessingException {
- this.cacheCompleteResponse = this.completeResponseIsCached;
+ this.completeResponseIsCached = this.cacheCompleteResponse;
this.fromCacheKey = this.toCacheKey.copy();
this.firstProcessedTransformerIndex =
this.firstNotCacheableTransformerIndex;
@@ -392,7 +403,7 @@
while (this.fromCacheKey != null && !finished) {
finished = true;
- CachedResponse response = this.cache.get( this.fromCacheKey );
+ final CachedResponse response = this.cache.get( this.fromCacheKey );
// now test validity
if (response != null) {
@@ -405,42 +416,21 @@
boolean responseIsValid = true;
boolean responseIsUsable = true;
-
- this.toCacheValidityObjects = response.getValidityObjects();
+ SourceValidity[] fromCacheValidityObjects =
response.getValidityObjects();
+
int i = 0;
- while (responseIsValid && i < this.toCacheValidityObjects.length) {
+ while (responseIsValid && i < fromCacheValidityObjects.length) {
boolean isValid = false;
// BH check if validities[i] is null, may happen
// if exception was thrown due to malformed content
- SourceValidity validity = this.toCacheValidityObjects[i];
+ SourceValidity validity = fromCacheValidityObjects[i];
int valid = validity != null ? validity.isValid() : -1;
if ( valid == 0) { // don't know if valid, make second test
- if (i == 0) {
- // test generator
- if (this.generatorIsCacheableProcessingComponent) {
- validity =
((CacheableProcessingComponent)super.generator).generateValidity();
- } else {
- validity =
CacheValidityToSourceValidity.createValidity(((Cacheable)super.generator).generateValidity());
- }
- } else if (i <= this.firstProcessedTransformerIndex) {
- // test transformer
- final Transformer trans =
- (Transformer)super.transformers.get(i-1);
- if
(this.transformerIsCacheableProcessingComponent[i-1]) {
- validity =
((CacheableProcessingComponent)trans).generateValidity();
- } else {
- validity =
CacheValidityToSourceValidity.createValidity(((Cacheable)trans).generateValidity());
- }
- } else {
- // test serializer
- if (this.serializerIsCacheableProcessingComponent) {
- validity =
((CacheableProcessingComponent)super.serializer).generateValidity();
- } else {
- validity =
CacheValidityToSourceValidity.createValidity(((Cacheable)super.serializer).generateValidity());
- }
- }
+
+ validity = this.getValidityForInternalPipeline(i);
+
if (validity != null) {
- isValid = this.toCacheValidityObjects[i].isValid(
validity );
+ isValid = fromCacheValidityObjects[i].isValid( validity
);
}
} else {
isValid = (valid == 1);
@@ -448,10 +438,9 @@
if ( !isValid ) {
responseIsValid = false;
// update validity
- this.toCacheValidityObjects[i] = validity;
if (validity == null)
responseIsUsable = false;
- } else {
+ } else {
i++;
}
}
@@ -466,6 +455,17 @@
this.getLogger().debug("Cached content is invalid for '" +
environment.getURI() + "'.");
}
// we are not valid!
+
+ // try a shorter key
+ if (i > 0) {
+ this.fromCacheKey.removeLastKey();
+ if (!this.completeResponseIsCached) {
+ this.firstProcessedTransformerIndex--;
+ }
+ } else {
+ this.fromCacheKey = null;
+ }
+
this.completeResponseIsCached = false;
finished = false;
@@ -473,7 +473,7 @@
// we could not compare, because we got no
// validity object, so shorten pipeline key
if (i > 0) {
- int deleteCount = this.toCacheValidityObjects.length -
i;
+ int deleteCount = fromCacheValidityObjects.length - i;
if (i > 0 && i <= firstNotCacheableTransformerIndex +
1) {
this.firstNotCacheableTransformerIndex = i-1;
}
@@ -489,13 +489,6 @@
// the entry is invalid, remove it
this.cache.remove( this.fromCacheKey );
}
- // try a shorter key
- if (i > 0) {
- this.fromCacheKey.removeLastKey();
- this.firstProcessedTransformerIndex--;
- } else {
- this.fromCacheKey = null;
- }
}
} else {
@@ -506,6 +499,7 @@
"' using key: " + this.fromCacheKey
);
}
+
if (!this.doSmartCaching) {
// try a shorter key
if (this.fromCacheKey.size() > 1) {
@@ -516,15 +510,12 @@
finished = false;
} else {
this.fromCacheKey = null;
- finished = true;
}
- this.completeResponseIsCached = false;
} else {
// stop on longest key for smart caching
- finished = true;
- this.completeResponseIsCached = false;
this.fromCacheKey = null;
}
+ this.completeResponseIsCached = false;
}
}
@@ -555,61 +546,36 @@
if (this.fromCacheKey == null
|| this.fromCacheKey.size() < this.toCacheKey.size()) {
- this.toCacheValidityObjects = new
SourceValidity[this.toCacheKey.size()];
- int start = 0;
- if (this.fromCacheKey != null) {
- start = this.fromCacheKey.size();
- for(int i=0; i<start;i++) {
- // THIS CAN BE NULL, RIGHT??
- //this.pipelineValidityObjects[i] =
cachedValidityObjects[i];
- }
- }
- int len = this.toCacheValidityObjects.length;
- int i = start;
+ this.toCacheSourceValidities = new
SourceValidity[this.toCacheKey.size()];
+ int len = this.toCacheSourceValidities.length;
+ int i = 0;
while (i < len) {
- final SourceValidity validity;
- if (i == 0) {
- // test generator
- if (generatorIsCacheableProcessingComponent) {
- validity =
((CacheableProcessingComponent)super.generator).generateValidity();
- } else {
- validity =
CacheValidityToSourceValidity.createValidity(((Cacheable)super.generator).generateValidity());
- }
- } else if (i <= firstNotCacheableTransformerIndex) {
- // test transformer
- final Transformer trans =
- (Transformer)super.transformers.get(i-1);
- if (transformerIsCacheableProcessingComponent[i-1]) {
- validity =
((CacheableProcessingComponent)trans).generateValidity();
- } else {
- validity =
CacheValidityToSourceValidity.createValidity(((Cacheable)trans).generateValidity());
- }
- } else {
- // test serializer
- if (serializerIsCacheableProcessingComponent) {
- validity =
((CacheableProcessingComponent)super.serializer).generateValidity();
- } else {
- validity =
CacheValidityToSourceValidity.createValidity(((Cacheable)super.serializer).generateValidity());
- }
- }
+ final SourceValidity validity =
this.getValidityForInternalPipeline(i);
+
if (validity == null) {
if (i > 0 && i > this.fromCacheKey.size()) {
// shorten key
- for(int m=i; m < this.toCacheValidityObjects.length;
m++) {
+ for(int m=i; m < this.toCacheSourceValidities.length;
m++) {
this.toCacheKey.removeLastKey();
+ if (!this.cacheCompleteResponse) {
+ this.firstNotCacheableTransformerIndex--;
+ }
+ this.cacheCompleteResponse = false;
}
SourceValidity[] copy = new SourceValidity[i];
- System.arraycopy(this.toCacheValidityObjects, 0,
+ System.arraycopy(this.toCacheSourceValidities, 0,
copy, 0, copy.length);
- this.toCacheValidityObjects = copy;
- len = this.toCacheValidityObjects.length;
+ this.toCacheSourceValidities = copy;
+ len = this.toCacheSourceValidities.length;
} else {
+ // caching is not possible!
this.toCacheKey = null;
- this.toCacheValidityObjects = null;
+ this.toCacheSourceValidities = null;
+ this.cacheCompleteResponse = false;
len = 0;
}
} else {
- this.toCacheValidityObjects[i] = validity;
+ this.toCacheSourceValidities[i] = validity;
}
i++;
}
@@ -796,12 +762,56 @@
public SourceValidity[] getValiditiesForEventPipeline() {
if (!this.completeResponseIsCached
&& this.firstNotCacheableTransformerIndex ==
super.transformers.size()) {
- return this.toCacheValidityObjects;
+ return null;
}
return null;
}
/**
+ *
+ * @see
org.apache.cocoon.components.pipeline.ProcessingPipeline#isInternalPipelineCacheable()
+ */
+ public boolean isInternalPipelineCacheable() {
+ if (!this.completeResponseIsCached
+ && this.firstNotCacheableTransformerIndex ==
super.transformers.size()) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @see
org.apache.cocoon.components.pipeline.ProcessingPipeline#getValidityForInternalPipeline(int)
+ */
+ public SourceValidity getValidityForInternalPipeline(int index) {
+ final SourceValidity validity;
+ if (index == 0) {
+ // test generator
+ if (this.generatorIsCacheableProcessingComponent) {
+ validity =
((CacheableProcessingComponent)super.generator).generateValidity();
+ } else {
+ validity =
CacheValidityToSourceValidity.createValidity(((Cacheable)super.generator).generateValidity());
+ }
+ } else if (index <= firstNotCacheableTransformerIndex) {
+ // test transformer
+ final Transformer trans = (Transformer)super.transformers.get(index-1);
+ if (this.transformerIsCacheableProcessingComponent[index-1]) {
+ validity = ((CacheableProcessingComponent)trans).generateValidity();
+ } else {
+ validity =
CacheValidityToSourceValidity.createValidity(((Cacheable)trans).generateValidity());
+ }
+ } else {
+ // test serializer
+ if (this.serializerIsCacheableProcessingComponent) {
+ validity =
((CacheableProcessingComponent)super.serializer).generateValidity();
+ } else {
+ validity =
CacheValidityToSourceValidity.createValidity(((Cacheable)super.serializer).generateValidity());
+ }
+ }
+ return validity;
+ }
+
+ /**
* Recyclable Interface
*/
public void recycle() {
@@ -819,7 +829,6 @@
this.readerRole = null;
this.toCacheKey = null;
- this.toCacheValidityObjects = null;
this.cachedResponse = null;
this.transformerIsCacheableProcessingComponent = null;
@@ -830,7 +839,9 @@
* Disposable Interface
*/
public void dispose() {
- this.manager.release(this.cache);
+ if ( null != this.manager ) {
+ this.manager.release(this.cache);
+ }
this.cache = null;
this.manager = null;
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]