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>
    * &lt;map:match pattern="file"&gt;<br>
    *        &lt;map:generate src="file.xml"/&gt;<br>
  - *         &lt;map:transform type="translate"&gt;<br>
  - *                &lt;parameter name="default_lang" value="fi"/&gt;<br>
  - *                &lt;parameter name="available_lang_1" value="fi"/&gt;<br>
  - *                &lt;parameter name="available_lang_2" value="en"/&gt;<br>
  - *                &lt;parameter name="available_lang_3" value="sv"/&gt;<br>
  - *                &lt;parameter name="src"<br>
  - *                        value="translations/file_trans.xml"/&gt;<br>
  + *         &lt;map:transform type="translate"<br>
  + *                src"translations/file_trans.xml"&gt;<br>
    *        &lt;/map:transform&gt;<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]

Reply via email to