giacomo 01/05/04 06:38:36
Modified: src/org/apache/cocoon/generation Tag: xml-cocoon2
AbstractServerPage.java ServerPagesGenerator.java
src/org/apache/cocoon/serialization Tag: xml-cocoon2
SVGSerializer.java
src/org/apache/cocoon/transformation Tag: xml-cocoon2
I18nTransformer.java
Log:
Made additional components cachable.
A sample how to make an XSP page caching aware follows soon.
Revision Changes Path
No revision
No revision
1.1.2.9 +26 -2
xml-cocoon/src/org/apache/cocoon/generation/Attic/AbstractServerPage.java
Index: AbstractServerPage.java
===================================================================
RCS file:
/home/cvs/xml-cocoon/src/org/apache/cocoon/generation/Attic/AbstractServerPage.java,v
retrieving revision 1.1.2.8
retrieving revision 1.1.2.9
diff -u -r1.1.2.8 -r1.1.2.9
--- AbstractServerPage.java 2001/04/25 17:07:35 1.1.2.8
+++ AbstractServerPage.java 2001/05/04 13:37:58 1.1.2.9
@@ -8,6 +8,8 @@
package org.apache.cocoon.generation;
import java.io.File;
+import org.apache.cocoon.caching.Cacheable;
+import org.apache.cocoon.caching.CacheValidity;
import org.apache.cocoon.components.language.generator.CompiledComponent;
import org.apache.cocoon.environment.Request;
import org.xml.sax.SAXException;
@@ -18,10 +20,10 @@
* declares variables that must be explicitly initialized by code generators.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Ricardo Rocha</a>
- * @version CVS $Revision: 1.1.2.8 $ $Date: 2001/04/25 17:07:35 $
+ * @version CVS $Revision: 1.1.2.9 $ $Date: 2001/05/04 13:37:58 $
*/
public abstract class AbstractServerPage
- extends ServletGenerator implements CompiledComponent
+ extends ServletGenerator implements CompiledComponent, Cacheable
{
/**
* Code generators should produce a static
@@ -74,6 +76,28 @@
*/
public boolean hasContentChanged(Request request) {
return true;
+ }
+
+ /**
+ * Generates the unique key.
+ * This key must be unique inside the space of this component.
+ * Users may override this method to take
+ * advantage of SAX event cacheing
+ *
+ * @return A long representing the cache key (defaults to not cachable)
+ */
+ public long generateKey() {
+ return 0;
+ }
+
+ /**
+ * Generate the validity object.
+ *
+ * @return The generated validity object or <code>null</code> if the
+ * component is currently not cachable.
+ */
+ public CacheValidity generateValidity() {
+ return null;
}
// FIXME: Add more methods!
1.1.2.28 +65 -17
xml-cocoon/src/org/apache/cocoon/generation/Attic/ServerPagesGenerator.java
Index: ServerPagesGenerator.java
===================================================================
RCS file:
/home/cvs/xml-cocoon/src/org/apache/cocoon/generation/Attic/ServerPagesGenerator.java,v
retrieving revision 1.1.2.27
retrieving revision 1.1.2.28
diff -u -r1.1.2.27 -r1.1.2.28
--- ServerPagesGenerator.java 2001/04/30 14:17:24 1.1.2.27
+++ ServerPagesGenerator.java 2001/05/04 13:38:03 1.1.2.28
@@ -12,17 +12,25 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedList;
+import java.util.HashMap;
+import java.util.Map;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.Composable;
+import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.ResourceNotFoundException;
import org.apache.cocoon.Roles;
+import org.apache.cocoon.caching.Cacheable;
+import org.apache.cocoon.caching.CacheValidity;
+import org.apache.cocoon.caching.ParametersCacheValidity;
+import org.apache.cocoon.caching.CompositeCacheValidity;
import org.apache.cocoon.components.language.generator.CompiledComponent;
import org.apache.cocoon.components.language.generator.ProgramGenerator;
import org.apache.cocoon.components.language.markup.xsp.XSPGenerator;
import org.apache.cocoon.components.url.URLFactory;
+import org.apache.cocoon.util.HashUtil;
import org.apache.avalon.excalibur.pool.Poolable;
import org.apache.avalon.excalibur.pool.Recyclable;
import org.xml.sax.Attributes;
@@ -38,11 +46,11 @@
* delegating actual SAX event generation.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Ricardo Rocha</a>
- * @version CVS $Revision: 1.1.2.27 $ $Date: 2001/04/30 14:17:24 $
+ * @version CVS $Revision: 1.1.2.28 $ $Date: 2001/05/04 13:38:03 $
*/
public class ServerPagesGenerator
extends ServletGenerator
- implements ContentHandler, LexicalHandler, Recyclable, Disposable
+ implements ContentHandler, LexicalHandler, Recyclable, Disposable,
Cacheable
{
/**
* The sitemap-defined server pages program generator
@@ -51,6 +59,8 @@
protected static URLFactory factory = null;
+ protected XSPGenerator generator = null;
+
/**
* Set the global component manager. This method sets the sitemap-defined
* program generator
@@ -73,6 +83,32 @@
}
/**
+ * Generates the unique key.
+ * This key must be unique inside the space of this component.
+ * Users may override this method to take
+ * advantage of SAX event cacheing
+ *
+ * @return A long representing the cache key (defaults to not cachable)
+ */
+ public long generateKey() {
+ return HashUtil.hash(this.source + generator.generateKey());
+ }
+
+ /**
+ * Generate the validity object.
+ *
+ * @return The generated validity object or <code>null</code> if the
+ * component is currently not cachable.
+ */
+ public CacheValidity generateValidity() {
+ CacheValidity genValidity = generator.generateValidity();
+ HashMap map = new HashMap (1);
+ map.put("source", this.source);
+ ParametersCacheValidity pcv = new ParametersCacheValidity(map);
+ return new CompositeCacheValidity(genValidity, pcv);
+ }
+
+ /**
* The loaded generator's <code>MarkupLanguage</code>
*/
protected String markupLanguage;
@@ -92,19 +128,11 @@
*/
public final static String DEFAULT_PROGRAMMING_LANGUAGE = "java";
+ public void setup(EntityResolver resolver, Map objectModel, String src,
Parameters par)
+ throws ProcessingException, SAXException, IOException {
- /**
- * Generate XML data. This method loads a server pages generator associated
- * with its (file) input source and delegates SAX event generator to it
- * taking care of "closing" any event left open by the loaded generator as
a
- * result of its possible "premature" return (a common situation in server
- * pages)
- *
- * @exception IOException IO Error
- * @exception SAXException SAX event generation error
- * @exception ProcessingException Error during load/execution
- */
- public void generate() throws IOException, SAXException,
ProcessingException {
+ super.setup(resolver, objectModel, src, par);
+
InputSource inputSource = this.resolver.resolveEntity(null, this.source);
String systemId = inputSource.getSystemId();
@@ -130,8 +158,6 @@
);
}
- XSPGenerator generator = null;
-
try {
generator = (XSPGenerator)
programGenerator.load(file, this.markupLanguage,
this.programmingLanguage, this.resolver);
@@ -139,10 +165,24 @@
getLogger().warn("ServerPagesGenerator.generate()", e);
throw new ResourceNotFoundException(e.getMessage(), e);
}
+ generator.setup(this.resolver, this.objectModel, this.source,
this.parameters);
+ }
+
+ /**
+ * Generate XML data. This method loads a server pages generator associated
+ * with its (file) input source and delegates SAX event generator to it
+ * taking care of "closing" any event left open by the loaded generator as
a
+ * result of its possible "premature" return (a common situation in server
+ * pages)
+ *
+ * @exception IOException IO Error
+ * @exception SAXException SAX event generation error
+ * @exception ProcessingException Error during load/execution
+ */
+ public void generate() throws IOException, SAXException,
ProcessingException {
generator.setContentHandler(this);
generator.setLexicalHandler(this);
- generator.setup(this.resolver, this.objectModel, this.source,
this.parameters);
// log exception and ensure that generator is released.
try {
@@ -404,6 +444,14 @@
protected String getSystemId() { return this.systemId; }
protected String getName() { return this.name; }
}
+
+ /**
+ * Recycle the generator by removing references
+ */
+ public void recycle() {
+ super.recycle();
+ this.generator = null;
+ }
/**
* dispose
No revision
No revision
1.1.2.39 +2 -7
xml-cocoon/src/org/apache/cocoon/serialization/Attic/SVGSerializer.java
Index: SVGSerializer.java
===================================================================
RCS file:
/home/cvs/xml-cocoon/src/org/apache/cocoon/serialization/Attic/SVGSerializer.java,v
retrieving revision 1.1.2.38
retrieving revision 1.1.2.39
diff -u -r1.1.2.38 -r1.1.2.39
--- SVGSerializer.java 2001/05/04 00:31:28 1.1.2.38
+++ SVGSerializer.java 2001/05/04 13:38:18 1.1.2.39
@@ -10,16 +10,13 @@
import java.awt.Color;
import java.io.BufferedOutputStream;
-import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
-import java.util.Map;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.avalon.framework.parameters.Parameters;
import org.apache.batik.transcoder.Transcoder;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
@@ -30,7 +27,6 @@
import org.apache.cocoon.components.transcoder.ExtendableTranscoderFactory;
import org.apache.cocoon.components.transcoder.TranscoderFactory;
import org.apache.cocoon.environment.Environment;
-import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.util.ClassUtils;
import org.apache.cocoon.xml.XMLConsumer;
import org.apache.cocoon.xml.dom.SVGBuilder;
@@ -38,7 +34,6 @@
import org.apache.log.Logger;
import org.w3c.dom.Document;
import org.xml.sax.ContentHandler;
-import org.xml.sax.EntityResolver;
import org.xml.sax.SAXException;
import org.xml.sax.ext.LexicalHandler;
@@ -47,7 +42,7 @@
*
* @author <a href="mailto:[EMAIL PROTECTED]">Davanum Srinivas</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Ross Burton</a>
- * @version CVS $Revision: 1.1.2.38 $ $Date: 2001/05/04 00:31:28 $
+ * @version CVS $Revision: 1.1.2.39 $ $Date: 2001/05/04 13:38:18 $
*/
public class SVGSerializer extends SVGBuilder
implements Composable, Serializer, Configurable, Poolable, Cacheable
{
@@ -213,7 +208,7 @@
TranscoderInput transInput = new TranscoderInput(doc);
TranscoderOutput transOutput = new TranscoderOutput(this.output);
transcoder.transcode(transInput, transOutput);
- this.output.flush();
+ //this.output.flush();
} catch (Exception ex) {
log.error("SVGSerializer: Exception writing image", ex);
throw new SAXException("Exception writing image ", ex);
No revision
No revision
1.1.2.17 +56 -11
xml-cocoon/src/org/apache/cocoon/transformation/Attic/I18nTransformer.java
Index: I18nTransformer.java
===================================================================
RCS file:
/home/cvs/xml-cocoon/src/org/apache/cocoon/transformation/Attic/I18nTransformer.java,v
retrieving revision 1.1.2.16
retrieving revision 1.1.2.17
diff -u -r1.1.2.16 -r1.1.2.17
--- I18nTransformer.java 2001/04/30 14:17:45 1.1.2.16
+++ I18nTransformer.java 2001/05/04 13:38:30 1.1.2.17
@@ -9,6 +9,7 @@
import java.io.BufferedInputStream;
import java.io.BufferedReader;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
@@ -25,9 +26,13 @@
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.Roles;
import org.apache.cocoon.acting.LangSelect;
+import org.apache.cocoon.caching.CacheValidity;
+import org.apache.cocoon.caching.Cacheable;
+import org.apache.cocoon.caching.TimeStampCacheValidity;
import org.apache.cocoon.components.parser.Parser;
import org.apache.cocoon.components.url.URLFactory;
-import org.apache.avalon.excalibur.pool.Poolable;
+import org.apache.cocoon.util.HashUtil;
+import org.apache.avalon.excalibur.pool.Recyclable;
import org.xml.sax.Attributes;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
@@ -48,13 +53,8 @@
* <p>
* <map:match pattern="file"><br>
* <map:generate src="file.xml"/><br>
- * <map:transform type="translate"><br>
- * <parameter name="default_lang" value="fi"/><br>
- * <parameter name="available_lang_1" value="fi"/><br>
- * <parameter name="available_lang_2" value="en"/><br>
- * <parameter name="available_lang_3" value="sv"/><br>
- * <parameter name="src"<br>
- * value="translations/file_trans.xml"/><br>
+ * <map:transform type="translate"<br>
+ * src"translations/file_trans.xml"><br>
* </map:transform><br>
* </p>
* <p>
@@ -99,7 +99,7 @@
*
* @author <a href="mailto:[EMAIL PROTECTED]">Lassi Immonen</a>
*/
-public class I18nTransformer extends AbstractTransformer implements
Composable, Poolable {
+public class I18nTransformer extends AbstractTransformer implements
Composable, Recyclable, Cacheable {
protected ComponentManager manager;
@@ -123,6 +123,11 @@
protected boolean translate = false;
protected boolean is_element = false;
protected String lang;
+ protected String source;
+ /** The input source */
+ private InputSource inputSource;
+ /** The system ID of the input source */
+ private String systemID;
/**
* Uses <code>org.apache.cocoon.acting.LangSelect.getLang()</code>
@@ -134,18 +139,21 @@
Parameters parameters)
throws ProcessingException, SAXException, IOException {
+ this.inputSource = resolver.resolveEntity(null, source);
+ this.systemID = this.inputSource.getSystemId();
+
lang = (String)(objectModel.get("lang"));
if (lang == null) {
lang = LangSelect.getLang(objectModel, parameters);
}
- String translations_file = parameters.getParameter("src", null);
+ this.source = source;
URL tr = null;
URLFactory urlFactory = null;
try {
urlFactory = (URLFactory) this.manager.lookup(Roles.URL_FACTORY);
- tr = urlFactory.getURL(resolver.resolveEntity(null,
translations_file).getSystemId());
+ tr = urlFactory.getURL(this.systemID);
} catch (Exception e) {
getLogger().error("cannot obtain the URLFactory", e);
throw new SAXException("cannot obtain the URLFactory", e);
@@ -155,7 +163,34 @@
initialiseDictionary(tr);
}
+ /**
+ * Generate the unique key.
+ * This key must be unique inside the space of this component.
+ *
+ * @return The generated key hashes the src
+ */
+ public long generateKey() {
+ if (this.systemID.startsWith("file:") == true) {
+ return HashUtil.hash(this.source);
+ }
+ return 0;
+ }
+ /**
+ * Generate the validity object.
+ *
+ * @return The generated validity object or <code>null</code> if the
+ * component is currently not cacheable.
+ */
+ public CacheValidity generateValidity() {
+ if (this.systemID.startsWith("file:") == true) {
+ File xmlFile = new
File(this.systemID.substring("file:".length()));
+ return new TimeStampCacheValidity(xmlFile.lastModified());
+ }
+ return null;
+ }
+
+
public void compose(ComponentManager manager) {
this.manager = manager;
}
@@ -340,5 +375,15 @@
} finally {
if(parser != null) this.manager.release((Component) parser);
}
+ }
+
+ /**
+ * Recycle this component.
+ * All instance variables are set to <code>null</code>.
+ */
+ public void recycle() {
+ super.recycle();
+ this.inputSource = null;
+ this.systemID = null;
}
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]