Author: vgritsenko Date: Wed Nov 17 10:09:44 2004 New Revision: 76154 Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java Log: What's this.wrappingProcessor.parent.concreteProcessor.sitemapExecutor anyway?
Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java Wed Nov 17 10:09:44 2004 @@ -15,15 +15,10 @@ */ package org.apache.cocoon.components.treeprocessor; -import java.io.IOException; -import java.util.List; - -import org.apache.avalon.framework.CascadingRuntimeException; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.logger.AbstractLogEnabled; -import org.apache.avalon.framework.service.ServiceException; -import org.apache.avalon.framework.service.ServiceManager; + import org.apache.cocoon.ProcessingException; import org.apache.cocoon.Processor; import org.apache.cocoon.components.source.impl.SitemapSourceInfo; @@ -35,7 +30,9 @@ import org.apache.cocoon.environment.internal.ForwardEnvironmentWrapper; import org.apache.cocoon.environment.wrapper.MutableEnvironmentFacade; import org.apache.cocoon.sitemap.SitemapExecutor; -import org.apache.cocoon.sitemap.impl.DefaultExecutor; + +import java.io.IOException; +import java.util.List; /** * The concrete implementation of [EMAIL PROTECTED] Processor}, containing the evaluation tree and associated @@ -65,61 +62,20 @@ /** The sitemap executor */ private SitemapExecutor sitemapExecutor; - /** Release the executor */ - private boolean releaseSitemapExecutor; - /** * Builds a concrete processig, given the wrapping processor */ - public ConcreteTreeProcessor(TreeProcessor wrappingProcessor) { + public ConcreteTreeProcessor(TreeProcessor wrappingProcessor, + SitemapExecutor sitemapExecutor, + ProcessorComponentInfo componentInfo) { // Store our wrapping processor this.wrappingProcessor = wrappingProcessor; // Initialize component info - if (this.wrappingProcessor.parent == null) { - // top-level processor - this.componentInfo = new ProcessorComponentInfo(null); - } else { - // chain to the parent processor - this.componentInfo = new ProcessorComponentInfo( - this.wrappingProcessor.parent.concreteProcessor.getComponentInfo()); - } - - // get the sitemap executor - we use the same executor for each sitemap - this.releaseSitemapExecutor = false; - if (this.wrappingProcessor.parent == null) { - final ServiceManager manager = this.wrappingProcessor.parentServiceManager; - - // FIXME(SW): do we really need to check hasService()? If a default class is defined - // in cocoon.roles, the lookup is always successful. - if (manager.hasService(SitemapExecutor.ROLE)) { - try { - this.sitemapExecutor = (SitemapExecutor) manager.lookup(SitemapExecutor.ROLE); - this.releaseSitemapExecutor = true; - } catch (ServiceException e) { - // this should not happen as we called hasComponent first - // but we ignore it - getLogger().error("Unable to lookup sitemap executor.", e); - } - } + this.componentInfo = new ProcessorComponentInfo(componentInfo); - if (this.sitemapExecutor == null) { - try { - // FIXME: VG: Why not new DefaultExecutor() which will use getClass().getClassLoader() anyway - this.sitemapExecutor = (SitemapExecutor) getClass().getClassLoader() - .loadClass(DefaultExecutor.class.getName()) - .newInstance(); - } catch (InstantiationException e) { - throw new CascadingRuntimeException("Unable to create default sitemap executor.", e); - } catch (IllegalAccessException e) { - throw new CascadingRuntimeException("Unable to create default sitemap executor.", e); - } catch (ClassNotFoundException e) { - throw new CascadingRuntimeException("Unable to create default sitemap executor.", e); - } - } - } else { - this.sitemapExecutor = this.wrappingProcessor.parent.concreteProcessor.sitemapExecutor; - } + // Get the sitemap executor - we use the same executor for each sitemap + this.sitemapExecutor = sitemapExecutor; } /** Set the processor data, result of the treebuilder job */ @@ -339,10 +295,7 @@ // Ensure it won't be used anymore this.rootNode = null; - if (this.releaseSitemapExecutor) { - this.componentInfo.getServiceManager().release(this.sitemapExecutor); - this.sitemapExecutor = null; - } + this.sitemapExecutor = null; } private class TreeProcessorRedirector extends ForwardRedirector { Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java Wed Nov 17 10:09:44 2004 @@ -31,12 +31,16 @@ import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; import org.apache.avalon.framework.thread.ThreadSafe; + import org.apache.cocoon.Processor; import org.apache.cocoon.components.ContextHelper; import org.apache.cocoon.components.source.SourceUtil; import org.apache.cocoon.components.source.impl.DelayedRefreshSourceWrapper; import org.apache.cocoon.environment.Environment; import org.apache.cocoon.environment.internal.EnvironmentHelper; +import org.apache.cocoon.sitemap.SitemapExecutor; +import org.apache.cocoon.sitemap.impl.DefaultExecutor; + import org.apache.excalibur.source.Source; import org.apache.excalibur.source.SourceResolver; import org.apache.regexp.RE; @@ -85,8 +89,14 @@ /** The environment helper */ private EnvironmentHelper environmentHelper; - /** The actual processor (package-private as needs to be accessed by ConcreteTreeProcessor) */ - ConcreteTreeProcessor concreteProcessor; + /** The actual sitemap executor */ + private SitemapExecutor sitemapExecutor; + + /** Indicates whether this is our component or not */ + private boolean releaseSitemapExecutor; + + /** The actual processor */ + protected ConcreteTreeProcessor concreteProcessor; /** The tree builder configuration */ private Configuration treeBuilderConfiguration; @@ -125,6 +135,7 @@ ContainerUtil.enableLogging(this.environmentHelper, this.getLogger()); ContainerUtil.service(this.environmentHelper, this.parentServiceManager); this.environmentHelper.changeContext(sitemapSource, prefix); + this.sitemapExecutor = parent.sitemapExecutor; } /** @@ -163,7 +174,19 @@ (String) this.context.get(ContextHelper.CONTEXT_ROOT_URL)); } ContainerUtil.enableLogging(this.environmentHelper, getLogger()); - ContainerUtil.service(this.environmentHelper, parentServiceManager); + ContainerUtil.service(this.environmentHelper, this.parentServiceManager); + + // Create sitemap executor + if (this.parent == null) { + try { + this.sitemapExecutor = (SitemapExecutor) this.parentServiceManager.lookup(SitemapExecutor.ROLE); + this.releaseSitemapExecutor = true; + } catch (ServiceException e) { + this.sitemapExecutor = new DefaultExecutor(); + } + } else { + this.sitemapExecutor = this.parent.sitemapExecutor; + } } /** @@ -293,7 +316,6 @@ * @throws ConfigurationException if a suitable role could not be found */ private TreeBuilder getTreeBuilder(Configuration sitemapProgram) throws ConfigurationException { - String ns = sitemapProgram.getNamespace(); RE re = new RE("http://apache.org/cocoon/sitemap/(\\d\\.\\d)"); @@ -365,8 +387,7 @@ Configuration sitemapProgram = handler.getConfiguration(); newLastModified = this.source.getLastModified(); - newProcessor = new ConcreteTreeProcessor(this); - setupLogger(newProcessor); + newProcessor = createConcreteTreeProcessor(); // Get the treebuilder that can handle this version of the sitemap. TreeBuilder treeBuilder = getTreeBuilder(sitemapProgram); @@ -399,6 +420,16 @@ } } + private ConcreteTreeProcessor createConcreteTreeProcessor() { + ProcessorComponentInfo componentInfo = this.parent == null? + null : this.parent.concreteProcessor.getComponentInfo(); + ConcreteTreeProcessor processor = new ConcreteTreeProcessor(this, + this.sitemapExecutor, + componentInfo); + setupLogger(processor); + return processor; + } + /* (non-Javadoc) * @see org.apache.avalon.framework.activity.Disposable#dispose() */ @@ -407,6 +438,11 @@ // are none when a TreeProcessor is disposed. ContainerUtil.dispose(this.concreteProcessor); this.concreteProcessor = null; + + if (this.releaseSitemapExecutor) { + this.parentServiceManager.release(this.sitemapExecutor); + this.sitemapExecutor = null; + } if (this.parentServiceManager != null) { if (this.source != null) {