You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2004/11/17 19:09:45 UTC

svn commit: rev 76154 - cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor

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 {@link 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) {