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]