stephan     2002/08/21 08:35:47

  Modified:    src/scratchpad/src/org/apache/cocoon/generation
                        SourceDescriptionGenerator.java
  Log:
  Reduce Source lookup's.
  
  Revision  Changes    Path
  1.13      +46 -25    
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/generation/SourceDescriptionGenerator.java
  
  Index: SourceDescriptionGenerator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/generation/SourceDescriptionGenerator.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- SourceDescriptionGenerator.java   20 Aug 2002 16:25:34 -0000      1.12
  +++ SourceDescriptionGenerator.java   21 Aug 2002 15:35:47 -0000      1.13
  @@ -89,8 +89,8 @@
   import java.net.MalformedURLException;
   import java.util.Enumeration;
   import java.util.Date;
  +import java.util.Hashtable;
   import java.util.Map;
  -import java.util.Stack;
   
   /**
    * Generates a description from a source of a repository.
  @@ -101,7 +101,7 @@
    * @version CVS $Id$
    */
   public class SourceDescriptionGenerator extends ComposerGenerator 
  -        implements CacheableProcessingComponent{
  +        implements CacheableProcessingComponent, Recyclable {
   
       /** Namespace of the source description. */
       private static final String SOURCE_NS = 
"http://xml.apache.org/cocoon/source/2.0";;
  @@ -164,6 +164,9 @@
       /** How deep the generator traverse the source */ 
       private int deep = 1;
   
  +    /** Traversed source for the keys and validities */
  +    private Hashtable cachedsources = null;
  +
       /**
        * Set the <code>SourceResolver</code>, objectModel <code>Map</code>,
        * the source and sitemap <code>Parameters</code> used to process the request.
  @@ -176,6 +179,9 @@
           this.permissions = parameters.getParameterAsBoolean("permissions", true);
           this.locks = parameters.getParameterAsBoolean("locks", true);
           this.version = parameters.getParameterAsBoolean("version", true);
  +
  +        this.cachedsources = new Hashtable();
  +        collectSources(this.cachedsources, this.source, this.deep);
       }
   
       /**
  @@ -187,16 +193,16 @@
       public Serializable generateKey() {
           StringBuffer key = new StringBuffer();
           key.append("SDG(");
  -        Stack sources = new Stack();
  -        collectSources(sources, this.source, this.deep);
  +
           Source source;
  -        while (!sources.empty()) {
  -            source = (Source)sources.pop();
  +        for (Enumeration e = cachedsources.elements(); e.hasMoreElements();) {
  +            source = (Source)e.nextElement();
  +
               key.append(source.getSystemId());
  -            if (!sources.empty())
  +            if (e.hasMoreElements())
                   key.append(";");
  -            this.resolver.release(source);
           }
  +
           key.append(")");
           return key.toString();
       }
  @@ -209,21 +215,21 @@
        */
       public SourceValidity generateValidity() {
           AggregatedValidity validity = new AggregatedValidity();
  -        Stack sources = new Stack();
  -        collectSources(sources, this.source, this.deep);
  +
           Source source;
  -        while (!sources.empty()) {
  -            source = (Source)sources.pop();
  +        for (Enumeration e = cachedsources.elements(); e.hasMoreElements();) {
  +            source = (Source)e.nextElement();
  +
               validity.add(source.getValidity());
  -            this.resolver.release(source);
           }
  +
           return validity;
       }
   
       /**
        * Traverse the source tree and retrieve all sources.
        */
  -    private void collectSources(Stack sources, String uri, int deep) {
  +    private void collectSources(Hashtable sources, String uri, int deep) {
           Source source = null;
           try {
               source = this.resolver.resolveURI(uri);
  @@ -232,7 +238,7 @@
               return;
           }
   
  -        sources.push(source);
  +        sources.put(uri, source);
   
           if (source instanceof TraversableSource) {
               TraversableSource traversablesource = (TraversableSource)source;
  @@ -270,12 +276,7 @@
       private void pushSourceDescription(String systemid, int deep) 
           throws SAXException, SourceException, ProcessingException, IOException {
   
  -        Source source = null;
  -        try { 
  -            source = this.resolver.resolveURI(systemid);
  -        } catch (MalformedURLException urle) {
  -            throw new ProcessingException("Could not retrieve a source", urle);
  -        }
  +        Source source = (Source)this.cachedsources.get(systemid);
   
           try {
               AttributesImpl attributes = new AttributesImpl();
  @@ -374,9 +375,7 @@
   
           } catch (SAXException saxe) {
               throw saxe;
  -        } finally {
  -            this.resolver.release(source);
  -        }
  +        } 
       }
   
       private void pushLiveSourceProperties(InspectableSource source) throws 
SAXException, SourceException {
  @@ -489,6 +488,28 @@
   
               this.contentHandler.endElement(SOURCE_NS, LOCKS_NODE_NAME, 
LOCKS_NODE_QNAME);
           }
  +    }
  +
  +    /**
  +     * Recycle this component.
  +     * All instance variables are set to <code>null</code>.
  +     */
  +    public void recycle() {
  +        if (cachedsources!=null) {
  +            for (Enumeration e = cachedsources.elements(); e.hasMoreElements();) {
  +                this.resolver.release((Source)e.nextElement());
  +            }
  +            cachedsources = null;
  +        }
  +    }
  +
  +    /**
  +     * Release all resources.
  +     */
  +    public void dispose() {
  +        recycle();
  +
  +        super.dispose();
       }
   }
   
  
  
  

----------------------------------------------------------------------
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