Author: cziegeler
Date: Mon Mar 21 08:06:51 2005
New Revision: 158476

URL: http://svn.apache.org/viewcvs?view=rev&rev=158476
Log:
Create and destroy listeners

Modified:
    
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java
    
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/TreeBuilder.java
    
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java

Modified: 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java
URL: 
http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java?view=diff&r1=158475&r2=158476
==============================================================================
--- 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java
 (original)
+++ 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java
 Mon Mar 21 08:06:51 2005
@@ -16,6 +16,8 @@
 package org.apache.cocoon.components.treeprocessor;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import org.apache.avalon.framework.activity.Disposable;
@@ -71,6 +73,12 @@
     /** Optional application container */
     private ComponentLocator applicationContainer;
 
+    /** Optional event listeners for the enter sitemap event */
+    private List enterSitemapEventListeners = new ArrayList();
+
+    /** Optional event listeners for the leave sitemap event */
+    private List leaveSitemapEventListeners = new ArrayList();
+
     /**
      * Builds a concrete processig, given the wrapping processor
      */
@@ -99,6 +107,8 @@
         this.classloader = classloader;
         this.rootNode = rootNode;
         this.disposableNodes = disposableNodes;
+        this.enterSitemapEventListeners = enterSitemapEventListeners;
+        this.leaveSitemapEventListeners = leaveSitemapEventListeners;
     }
 
     /** Set the sitemap component configurations (called as part of the tree 
building process) */
@@ -315,8 +325,27 @@
         // Ensure it won't be used anymore
         this.rootNode = null;
         this.sitemapExecutor = null;
+
+        // dispose listeners
+        this.disposeListeners(this.enterSitemapEventListeners);
+        this.disposeListeners(this.leaveSitemapEventListeners);
+
+        // dispose component locator
         ContainerUtil.dispose(this.applicationContainer);
         this.applicationContainer = null;
+    }
+
+    protected void disposeListeners(List l) {
+        Iterator i = l.iterator();
+        while ( i.hasNext() ) {
+            final TreeBuilder.EventComponent current = 
(TreeBuilder.EventComponent)i.next();
+            if ( current.releaseUsingManager ) {
+                this.manager.release(current.component);
+            } else {
+                ContainerUtil.dispose(current.component);
+            }
+        }
+        l.clear();        
     }
 
     private class TreeProcessorRedirector extends ForwardRedirector {

Modified: 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/TreeBuilder.java
URL: 
http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/TreeBuilder.java?view=diff&r1=158475&r2=158476
==============================================================================
--- 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/TreeBuilder.java
 (original)
+++ 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/TreeBuilder.java
 Mon Mar 21 08:06:51 2005
@@ -31,6 +31,16 @@
 
     String ROLE = TreeBuilder.class.getName();
 
+    public static class EventComponent {
+        
+        public final Object component;
+        public final boolean releaseUsingManager;
+        
+        public EventComponent(Object c, boolean releaseUsingManager) {
+            this.component = c;
+            this.releaseUsingManager = releaseUsingManager;
+        }
+    }
 
     void setParentProcessorManager(ServiceManager manager);
     
@@ -114,13 +124,16 @@
     /**
      * Return all event listers that are registered for the
      * [EMAIL PROTECTED] org.apache.cocoon.sitemap.EnterSitemapEvent}.
+     * @return A list of [EMAIL PROTECTED] EventComponent}s.
      */
     List getEnterSitemapEventListeners();
     
     /**
      * Return all event listers that are registered for the
      * [EMAIL PROTECTED] org.apache.cocoon.sitemap.LeaveSitemapEvent}.
+     * @return A list of [EMAIL PROTECTED] EventComponent}s.
      */
     List getLeaveSitemapEventListeners();
     
+
 }

Modified: 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
URL: 
http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java?view=diff&r1=158475&r2=158476
==============================================================================
--- 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
 (original)
+++ 
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
 Mon Mar 21 08:06:51 2005
@@ -32,11 +32,13 @@
 import org.apache.avalon.framework.context.DefaultContext;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.cocoon.Constants;
+import org.apache.cocoon.components.LifecycleHelper;
 import org.apache.cocoon.components.classloader.ClassLoaderFactory;
 import org.apache.cocoon.components.container.CocoonServiceManager;
 import org.apache.cocoon.components.treeprocessor.CategoryNode;
 import org.apache.cocoon.components.treeprocessor.CategoryNodeBuilder;
 import org.apache.cocoon.components.treeprocessor.DefaultTreeBuilder;
+import org.apache.cocoon.components.treeprocessor.TreeBuilder;
 import org.apache.cocoon.environment.Environment;
 import org.apache.cocoon.environment.internal.EnvironmentHelper;
 import org.apache.cocoon.generation.Generator;
@@ -64,7 +66,8 @@
      * Build a component manager with the contents of the 
<map:components> element of
      * the tree.
      */
-    protected ServiceManager createServiceManager(Context context, 
Configuration tree) throws Exception {
+    protected ServiceManager createServiceManager(Context context, 
Configuration tree)
+    throws Exception {
 
         // Get the map:component node
         // Don't check namespace here : this will be done by node builders
@@ -121,21 +124,36 @@
             ContainerUtil.initialize(newManager);
 
             // check for an application specific container
-            Configuration appContainer = 
config.getChild("application-container", false);
+            final Configuration appContainer = 
config.getChild("application-container", false);
             if ( appContainer != null ) {
                 final String clazzName = appContainer.getAttribute("class");
 
-                ComponentLocator cl = 
(ComponentLocator)ClassUtils.newInstance(clazzName); 
+                final ComponentLocator cl = 
(ComponentLocator)ClassUtils.newInstance(clazzName); 
                 // Go through the component lifecycle
-                ContainerUtil.enableLogging(cl, this.getLogger());
-                ContainerUtil.contextualize(cl, context);
-                ContainerUtil.service(cl, newManager);
-                ContainerUtil.configure(cl, appContainer);
-                ContainerUtil.initialize(cl);
+                LifecycleHelper.setupComponent(cl, this.getLogger(), context, 
newManager, config);
+
                 this.applicationContainer = cl;
 
                 newManager = new ComponentManager(newManager, cl);
             }
+
+            // and finally the listeners
+            final Configuration listenersWrapper = 
config.getChild("listeners", false);
+            if ( listenersWrapper != null ) {
+                final Configuration[] listeners = 
listenersWrapper.getChildren("listener");
+                for(int i = 0; i < listeners.length; i++) {
+                    final Configuration current = listeners[i];
+                    // TODO - we could use a string tokenizer and allow 
several invoke keys
+                    final String invoke = current.getAttribute("invoke");
+                    if ( "on-enter".equals(invoke) ) {
+                        
this.enterSitemapEventListeners.add(this.createListener(newManager, context, 
current));
+                    } else if ( "on-leave".equals(invoke) ) {
+                        
this.leaveSitemapEventListeners.add(this.createListener(newManager, context, 
current));                        
+                    } else {
+                        throw new ConfigurationException("Unknown invokation 
key '" + invoke + "' for sitemap listener.");
+                    }
+                }
+            }
         } finally {
             currentThread.setContextClassLoader(oldClassLoader);
         }
@@ -143,6 +161,28 @@
         return newManager;
     }
 
+    /**
+     * Create a listener
+     */
+    protected Object createListener(ServiceManager manager, Context context, 
Configuration config) 
+    throws Exception {
+        // role or class?
+        final String role = config.getAttribute("role", null);
+        if ( role != null ) {
+            return new TreeBuilder.EventComponent(manager.lookup(role), true);
+        } else {
+            final String className = config.getAttribute("class");
+            final Object component = ClassUtils.newInstance(className);
+
+            LifecycleHelper.setupComponent(component, this.getLogger(), 
context, manager, config);
+
+            return new TreeBuilder.EventComponent(component, false);
+        }
+    }
+
+    /**
+     * @see 
org.apache.cocoon.components.treeprocessor.DefaultTreeBuilder#createContext(org.apache.avalon.framework.configuration.Configuration)
+     */
     protected Context createContext(Configuration tree) throws Exception {
         // Create sub-context for this sitemap
         DefaultContext newContext = new 
DefaultContext(super.createContext(tree));


Reply via email to