Author: cziegeler
Date: Mon Mar 21 10:01:50 2005
New Revision: 158492

URL: http://svn.apache.org/viewcvs?view=rev&rev=158492
Log:
Invoke listeners

Modified:
    
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.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=158491&r2=158492
==============================================================================
--- 
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 10:01:50 2005
@@ -36,7 +36,12 @@
 import org.apache.cocoon.environment.internal.ForwardEnvironmentWrapper;
 import org.apache.cocoon.environment.wrapper.MutableEnvironmentFacade;
 import org.apache.cocoon.sitemap.ComponentLocator;
+import org.apache.cocoon.sitemap.EnterSitemapEvent;
+import org.apache.cocoon.sitemap.EnterSitemapEventListener;
+import org.apache.cocoon.sitemap.LeaveSitemapEvent;
+import org.apache.cocoon.sitemap.LeaveSitemapEventListener;
 import org.apache.cocoon.sitemap.SitemapExecutor;
+import org.apache.cocoon.sitemap.SitemapListener;
 
 /**
  * The concrete implementation of [EMAIL PROTECTED] Processor}, containing the 
evaluation tree and associated
@@ -226,6 +231,16 @@
         currentThread.setContextClassLoader(this.classloader);
 
         try {
+            // invoke listeners
+            if ( this.enterSitemapEventListeners.size() > 0 ) {
+                final EnterSitemapEvent enterEvent = new 
EnterSitemapEvent(this, environment);
+                final Iterator enterSEI = 
this.enterSitemapEventListeners.iterator();
+                while ( enterSEI.hasNext() ) {
+                    final TreeBuilder.EventComponent current = 
(TreeBuilder.EventComponent)enterSEI.next();
+                    
((EnterSitemapEventListener)current.component).enteredSitemap(enterEvent);
+                }
+            }
+
             // and now process
             EnvironmentHelper.enterProcessor(this, this.manager, environment);
             final Redirector oldRedirector = context.getRedirector();
@@ -247,6 +262,16 @@
             }
 
         } finally {
+            // invoke listeners
+            if ( this.leaveSitemapEventListeners.size() > 0 ) {
+                final LeaveSitemapEvent leaveEvent = new 
LeaveSitemapEvent(this, environment);
+                final Iterator leaveSEI = 
this.leaveSitemapEventListeners.iterator();
+                while ( leaveSEI.hasNext() ) {
+                    final TreeBuilder.EventComponent current = 
(TreeBuilder.EventComponent)leaveSEI.next();
+                    
((LeaveSitemapEventListener)current.component).leftSitemap(leaveEvent);
+                }
+            }
+
             // Restore classloader
             currentThread.setContextClassLoader(oldClassLoader);
 
@@ -330,8 +355,10 @@
         this.disposeListeners(this.enterSitemapEventListeners);
         this.disposeListeners(this.leaveSitemapEventListeners);
 
-        // dispose component locator
-        ContainerUtil.dispose(this.applicationContainer);
+        // dispose component locator - if it is a SitemapListener it is 
already disposed!
+        if ( !(this.applicationContainer instanceof SitemapListener) ) {
+            ContainerUtil.dispose(this.applicationContainer);
+        }
         this.applicationContainer = null;
     }
 

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=158491&r2=158492
==============================================================================
--- 
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 10:01:50 2005
@@ -44,7 +44,10 @@
 import org.apache.cocoon.generation.Generator;
 import org.apache.cocoon.serialization.Serializer;
 import org.apache.cocoon.sitemap.ComponentLocator;
+import org.apache.cocoon.sitemap.EnterSitemapEventListener;
+import org.apache.cocoon.sitemap.LeaveSitemapEventListener;
 import org.apache.cocoon.sitemap.PatternException;
+import org.apache.cocoon.sitemap.SitemapListener;
 import org.apache.cocoon.sitemap.impl.ComponentManager;
 import org.apache.cocoon.util.ClassUtils;
 import org.apache.cocoon.util.StringUtils;
@@ -138,20 +141,20 @@
             }
 
             // and finally the listeners
+            if ( this.applicationContainer instanceof SitemapListener ) {
+                this.addListener(new 
TreeBuilder.EventComponent(this.applicationContainer, false));
+            }
+
             final Configuration listenersWrapper = 
config.getChild("listeners", false);
             if ( listenersWrapper != null ) {
-                final Configuration[] listeners = 
listenersWrapper.getChildren("listener");
+                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.");
+                    final TreeBuilder.EventComponent listener = 
this.createListener(newManager, context, current);
+                    if ( !(listener.component instanceof SitemapListener) ) {
+                        throw new ConfigurationException("Listener must 
implement the SitemapListener interface.");
                     }
+                    this.addListener(listener);
                 }
             }
         } finally {
@@ -164,7 +167,7 @@
     /**
      * Create a listener
      */
-    protected Object createListener(ServiceManager manager, Context context, 
Configuration config) 
+    protected TreeBuilder.EventComponent createListener(ServiceManager 
manager, Context context, Configuration config) 
     throws Exception {
         // role or class?
         final String role = config.getAttribute("role", null);
@@ -177,6 +180,17 @@
             LifecycleHelper.setupComponent(component, this.getLogger(), 
context, manager, config);
 
             return new TreeBuilder.EventComponent(component, false);
+        }
+    }
+
+    /**
+     * Add a listener
+     */
+    protected void addListener(TreeBuilder.EventComponent listener) {
+        if ( listener.component instanceof EnterSitemapEventListener ) {
+            this.enterSitemapEventListeners.add(listener);
+        } else if ( listener.component instanceof LeaveSitemapEventListener ) {
+            this.leaveSitemapEventListeners.add(listener);
         }
     }
 


Reply via email to