You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by re...@apache.org on 2011/01/17 18:13:44 UTC

svn commit: r1059998 - /cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/

Author: reinhard
Date: Mon Jan 17 17:13:44 2011
New Revision: 1059998

URL: http://svn.apache.org/viewvc?rev=1059998&view=rev
Log:
cleanups & formatting

Modified:
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/CocoonReloadingListener.java
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/Constants.java
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderCreationException.java
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderManager.java
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingListener.java
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingNotificationSubscriber.java
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServlet.java
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServletFilter.java
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingSpringFilter.java

Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/CocoonReloadingListener.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/CocoonReloadingListener.java?rev=1059998&r1=1059997&r2=1059998&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/CocoonReloadingListener.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/CocoonReloadingListener.java Mon Jan 17 17:13:44 2011
@@ -34,21 +34,40 @@ public class CocoonReloadingListener ext
         super();
     }
 
+    public static void enableConsoleOutput() {
+        CocoonReloadingListener.consoleOutput = true;
+    }
+
+    public static synchronized boolean isReload() {
+        if (reload == true) {
+            reload = false;
+            return true;
+        }
+
+        return reload;
+    }
+
+    @Override
     public void onFileChange(File file) {
         super.onFileChange(file);
-        // after the first change/deletion of a file is detected, log to the console
-        changeDetected(file, "update");
-    }
 
-    public void onFileDelete(File file) {
-        super.onFileDelete(file);
         // after the first change/deletion of a file is detected, log to the console
-        changeDetected(file, "delete");
+        this.changeDetected(file, "update");
     }
 
+    @Override
     public void onFileCreate(File file) {
         super.onFileCreate(file);
-        changeDetected(file, "create");
+
+        this.changeDetected(file, "create");
+    }
+
+    @Override
+    public void onFileDelete(File file) {
+        super.onFileDelete(file);
+
+        // after the first change/deletion of a file is detected, log to the console
+        this.changeDetected(file, "delete");
     }
 
     protected void changeDetected(File changedFile, String operation) {
@@ -62,27 +81,16 @@ public class CocoonReloadingListener ext
                 changedFilePath.endsWith(".class") ||                               // Java class file change
                 changedFilePath.endsWith(".jar") ||                                 // JAR file change
                 changedFileParentPath.endsWith("config/spring")                     // local Spring bean configurations
-           ) {
-            log.debug("Configuration or .class file change detected [" + operation + "]: " + changedFile);
+        ) {
+            this.log.debug("Configuration or .class file change detected [" + operation + "]: " + changedFile);
+
             if (CocoonReloadingListener.consoleOutput) {
                 System.out.println("RCL [" + operation + "]: " + changedFile);
             }
+
             reload = true;
         } else {
-            log.debug("Other file change detected, no reload [" + operation + "]: " + changedFile);  // any other file change
+            this.log.debug("Other file change detected, no reload [" + operation + "]: " + changedFile);  // any other file change
         }
     }
-
-    public static void enableConsoleOutput() {
-        CocoonReloadingListener.consoleOutput = true;
-    }
-
-    public static synchronized boolean isReload() {
-        if (reload == true) {
-            reload = false;
-            return true;
-        }
-        return reload;
-    }
-
 }
\ No newline at end of file

Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/Constants.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/Constants.java?rev=1059998&r1=1059997&r2=1059998&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/Constants.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/Constants.java Mon Jan 17 17:13:44 2011
@@ -27,5 +27,4 @@ public interface Constants {
     String RELOADING_SPRING_ENABLED = "reloading.spring.enabled";
 
     String RELOADING_CLASSLOADER_ENABLED = "reloading.classloader.enabled";
-
 }

Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderCreationException.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderCreationException.java?rev=1059998&r1=1059997&r2=1059998&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderCreationException.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderCreationException.java Mon Jan 17 17:13:44 2011
@@ -17,7 +17,9 @@
 package org.apache.cocoon.tools.rcl.wrapper.servlet;
 
 public class ReloadingClassloaderCreationException extends RuntimeException {
-    
+
+    private static final long serialVersionUID = 1L;
+
     public ReloadingClassloaderCreationException(String msg) {
         super(msg);
     }
@@ -25,5 +27,4 @@ public class ReloadingClassloaderCreatio
     public ReloadingClassloaderCreationException(String msg, Exception e) {
         super(msg, e);
     }
-
 }

Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderManager.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderManager.java?rev=1059998&r1=1059997&r2=1059998&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderManager.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderManager.java Mon Jan 17 17:13:44 2011
@@ -47,20 +47,56 @@ public abstract class ReloadingClassload
             if (isReloadingClassloaderEnabled(context)) {
                 final ReloadingClassLoader classloader = new ReloadingClassLoader(urlClassloader);
                 final FilesystemAlterationMonitor fam = new FilesystemAlterationMonitor();
+
                 org.apache.commons.jci.listeners.ReloadingListener rl = new CocoonReloadingListener();
                 rl.addReloadNotificationListener(classloader);
+
                 addResourcesToFam(fam, rl, getRclConfResourceUrls(context));
                 fam.start();
+
                 ReloadingClassloaderManager.reloadingClassloader = classloader;
             } else {
                 // otherwise use the URL classloader only
                 ReloadingClassloaderManager.reloadingClassloader = urlClassloader;
             }
         }
-        
+
         return ReloadingClassloaderManager.reloadingClassloader;
     }
 
+    protected static ClassLoader createURLClassLoader(ServletContext context) {
+        try {
+            List<URL> urlsList = new ArrayList<URL>();
+            List<?> lines = IOUtils.readLines(context.getResourceAsStream(Constants.WEB_INF_RCL_URLCL_CONF));
+
+            for (Iterator<?> linesIt = lines.iterator(); linesIt.hasNext();) {
+                String line = (String) linesIt.next();
+                urlsList.add(new URL(line));
+            }
+
+            URL[] urls = urlsList.toArray(new URL[urlsList.size()]);
+
+            return new URLClassLoader(urls, ReloadingClassloaderManager.class.getClassLoader());
+        } catch (Exception e) {
+            throw new ReloadingClassloaderCreationException("Error while creating the URLClassLoader from context:/"
+                    + Constants.WEB_INF_RCL_URLCL_CONF, e);
+        }
+    }
+
+    protected static boolean isReloadingClassloaderEnabled(ServletContext servletContext) {
+        Properties rclProps = new Properties();
+
+        try {
+            rclProps.load(servletContext.getResourceAsStream(Constants.WEB_INF_RCLWRAPPER_PROPERTIES));
+        } catch (IOException e) {
+            throw new ReloadingClassloaderCreationException("Error while reading "
+                    + Constants.WEB_INF_RCLWRAPPER_PROPERTIES + " from servlet context.", e);
+        }
+
+        String reloadingEnabled = rclProps.getProperty(Constants.RELOADING_CLASSLOADER_ENABLED, "true");
+        return reloadingEnabled.trim().toLowerCase().equals("true");
+    }
+
     private static void addResourcesToFam(final FilesystemAlterationMonitor fam,
             org.apache.commons.jci.listeners.ReloadingListener rl, List<?> resourceUrl) {
         for (Iterator<?> linesIt = resourceUrl.iterator(); linesIt.hasNext();) {
@@ -76,7 +112,8 @@ public abstract class ReloadingClassload
 
             // add libraries to the RCL
             if(url.endsWith(".jar")) {
-                // deactivate reloading of JARs 
+                // deactivate reloading of JARs since it isn't supported the JCI:
+                // see https://issues.apache.org/jira/browse/JCI-60
                 continue;
             }
             fam.addListener(new File(url), rl);
@@ -85,42 +122,14 @@ public abstract class ReloadingClassload
 
     private static List<?> getRclConfResourceUrls(ServletContext context) {
         List<?> lines = null;
+
         try {
             lines = IOUtils.readLines(context.getResourceAsStream(Constants.WEB_INF_RCLWRAPPER_RCL_CONF));
         } catch (IOException ioe) {
             throw new ReloadingClassloaderCreationException("Error while creating the URLClassLoader from context:/"
                     + Constants.WEB_INF_RCLWRAPPER_RCL_CONF, ioe);
         }
-        return lines;
-    }
-
-    protected static ClassLoader createURLClassLoader(ServletContext context) {
-        try {
-            List<URL> urlsList = new ArrayList<URL>();
-            List<?> lines = IOUtils.readLines(context.getResourceAsStream(Constants.WEB_INF_RCL_URLCL_CONF));
-            for (Iterator<?> linesIt = lines.iterator(); linesIt.hasNext();) {
-                String line = (String) linesIt.next();
-                urlsList.add(new URL(line));
-            }
-
-            URL[] urls = urlsList.toArray(new URL[urlsList.size()]);
-            return new URLClassLoader(urls, ReloadingClassloaderManager.class.getClassLoader());
-        } catch (Exception e) {
-            throw new ReloadingClassloaderCreationException("Error while creating the URLClassLoader from context:/"
-                    + Constants.WEB_INF_RCL_URLCL_CONF, e);
-        }
-    }
 
-    protected static boolean isReloadingClassloaderEnabled(ServletContext servletContext) {
-        Properties rclProps = new Properties();
-        try {
-            rclProps.load(servletContext.getResourceAsStream(Constants.WEB_INF_RCLWRAPPER_PROPERTIES));
-        } catch (IOException e) {
-            throw new ReloadingClassloaderCreationException("Error while reading "
-                    + Constants.WEB_INF_RCLWRAPPER_PROPERTIES + " from servlet context.", e);
-        }
-
-        String reloadingEnabled = rclProps.getProperty(Constants.RELOADING_CLASSLOADER_ENABLED, "true");
-        return reloadingEnabled.trim().toLowerCase().equals("true");
+        return lines;
     }
 }

Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingListener.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingListener.java?rev=1059998&r1=1059997&r2=1059998&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingListener.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingListener.java Mon Jan 17 17:13:44 2011
@@ -36,19 +36,12 @@ import javax.servlet.http.HttpSessionEve
 import javax.servlet.http.HttpSessionListener;
 
 /**
- * This listener can be used as a wrapper around "real" listeners to
- * support the reloading class loader.
- *
+ * This listener can be used as a wrapper around "real" listeners to support the reloading class loader.
+ * 
  * @version $Id$
  */
-public class ReloadingListener
-    implements HttpSessionListener,
-               ServletContextListener,
-               HttpSessionActivationListener,
-               HttpSessionAttributeListener,
-               HttpSessionBindingListener,
-               ServletContextAttributeListener,
-               ServletRequestListener {
+public class ReloadingListener implements HttpSessionListener, ServletContextListener, HttpSessionActivationListener,
+HttpSessionAttributeListener, HttpSessionBindingListener, ServletContextAttributeListener, ServletRequestListener {
 
     private static final String SERVLET_CONTEXT_CREATED = "CLC";
 
@@ -98,168 +91,91 @@ public class ReloadingListener
 
     protected ServletContext context;
 
-    protected void init(ServletContext context) {
-        this.context = context;
-        // Create the listeners
-        final ClassLoader old = Thread.currentThread().getContextClassLoader();
-        try {
-            Thread.currentThread().setContextClassLoader(ReloadingClassloaderManager.getClassLoader(this.context));
-            final String listenersConfig = context.getInitParameter(ReloadingListener.class.getName());
-            if ( listenersConfig != null ) {
-                final StringTokenizer st = new StringTokenizer(listenersConfig, " \t\r\n\f;,", false);
-                while ( st.hasMoreTokens() ) {
-                    final String className = st.nextToken();
-                    try {
-                        ClassLoader cl = ReloadingClassloaderManager.getClassLoader(this.context);
-                        Class listenerClass = cl.loadClass(className);
-                        final Object listener = listenerClass.newInstance();
-                        if ( listener instanceof HttpSessionListener ) {
-                            this.httpSessionListeners.add(listener);
-                        }
-                        if ( listener instanceof ServletContextListener ) {
-                            this.servletContextListeners.add(listener);
-                        }
-                        if ( listener instanceof HttpSessionActivationListener ) {
-                            this.httpSessionActivationListeners.add(listener);
-                        }
-                        if ( listener instanceof HttpSessionAttributeListener ) {
-                            this.httpSessionAttributeListeners.add(listener);
-                        }
-                        if ( listener instanceof HttpSessionBindingListener ) {
-                            this.httpSessionBindingListeners.add(listener);
-                        }
-                        if ( listener instanceof ServletContextAttributeListener ) {
-                            this.servletContextAttributeListeners.add(listener);
-                        }
-                        if ( listener instanceof ServletRequestListener ) {
-                            this.servletRequestListeners.add(listener);
-                        }
-                    } catch (Exception e) {
-                        throw new RuntimeException("Cannot load listener " + className, e);
-                    }
-                }
-            }
-        } finally {
-            Thread.currentThread().setContextClassLoader(old);
-        }
+    /**
+     * @see javax.servlet.http.HttpSessionAttributeListener#attributeAdded(javax.servlet.http.HttpSessionBindingEvent)
+     */
+    public void attributeAdded(HttpSessionBindingEvent event) {
+        this.invoke(this.httpSessionAttributeListeners, ReloadingListener.ATTR_ADDED, event);
     }
 
-    protected void invoke(List listeners, String identifier, Object event) {
-        if ( ReloadingClassloaderManager.getClassLoader(this.context) != null ) {
-            final ClassLoader old = Thread.currentThread().getContextClassLoader();
-            try {
-                Thread.currentThread().setContextClassLoader(ReloadingClassloaderManager.getClassLoader(this.context));
-                final Iterator i = listeners.iterator();
-                while ( i.hasNext() ) {
-                    final Object listener = i.next();
-                    try {
-                        if ( ReloadingListener.SERVLET_CONTEXT_CREATED.equals(identifier) ) {
-                            ((ServletContextListener)listener).contextInitialized((ServletContextEvent)event);
-                        } else if ( ReloadingListener.SERVLET_CONTEXT_DESTROYED.equals(identifier) ) {
-                            ((ServletContextListener)listener).contextDestroyed((ServletContextEvent)event);
-                        } else if ( ReloadingListener.SESSION_CREATED.equals(identifier) ) {
-                            ((HttpSessionListener)listener).sessionCreated((HttpSessionEvent)event);
-                        } else if ( ReloadingListener.SESSION_DESTROYED.equals(identifier) ) {
-                            ((HttpSessionListener)listener).sessionDestroyed((HttpSessionEvent)event);
-                        } else if ( ReloadingListener.VALUE_BOUND.equals(identifier) ) {
-                            ((HttpSessionBindingListener)listener).valueBound((HttpSessionBindingEvent)event);
-                        } else if ( ReloadingListener.VALUE_UNBOUND.equals(identifier) ) {
-                            ((HttpSessionBindingListener)listener).valueUnbound((HttpSessionBindingEvent)event);
-                        } else if ( ReloadingListener.ATTR_ADDED.equals(identifier) ) {
-                            ((HttpSessionAttributeListener)listener).attributeAdded((HttpSessionBindingEvent)event);
-                        } else if ( ReloadingListener.ATTR_REMOVED.equals(identifier) ) {
-                            ((HttpSessionAttributeListener)listener).attributeRemoved((HttpSessionBindingEvent)event);
-                        } else if ( ReloadingListener.ATTR_REPLACED.equals(identifier) ) {
-                            ((HttpSessionAttributeListener)listener).attributeReplaced((HttpSessionBindingEvent)event);
-                        } else if ( ReloadingListener.CONTEXT_ATTR_ADDED.equals(identifier) ) {
-                            ((ServletContextAttributeListener)listener).attributeAdded((ServletContextAttributeEvent)event);
-                        } else if ( ReloadingListener.CONTEXT_ATTR_REMOVED.equals(identifier) ) {
-                            ((ServletContextAttributeListener)listener).attributeRemoved((ServletContextAttributeEvent)event);
-                        } else if ( ReloadingListener.CONTEXT_ATTR_REPLACED.equals(identifier) ) {
-                            ((ServletContextAttributeListener)listener).attributeReplaced((ServletContextAttributeEvent)event);
-                        } else if ( ReloadingListener.SESSION_ACTIVATED.equals(identifier) ) {
-                            ((HttpSessionActivationListener)listener).sessionDidActivate((HttpSessionEvent)event);
-                        } else if ( ReloadingListener.SESSION_PASSIVATE.equals(identifier) ) {
-                            ((HttpSessionActivationListener)listener).sessionWillPassivate((HttpSessionEvent)event);
-                        } else if ( ReloadingListener.REQUEST_DESTROYED.equals(identifier) ) {
-                            ((ServletRequestListener)listener).requestDestroyed((ServletRequestEvent)event);
-                        } else if ( ReloadingListener.REQUEST_INITIALIZED.equals(identifier) ) {
-                            ((ServletRequestListener)listener).requestInitialized((ServletRequestEvent)event);
-                        }
-                    } catch (Exception e) {
-                        throw new RuntimeException("Cannot invoke listener " + listener, e);
-                    }
-                }
-            } finally {
-                Thread.currentThread().setContextClassLoader(old);
-            }
-        }
+    /**
+     * @see javax.servlet.ServletContextAttributeListener#attributeAdded(javax.servlet.ServletContextAttributeEvent)
+     */
+    public void attributeAdded(ServletContextAttributeEvent event) {
+        this.invoke(this.servletContextAttributeListeners, ReloadingListener.CONTEXT_ATTR_ADDED, event);
     }
 
     /**
-     * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
+     * @see javax.servlet.http.HttpSessionAttributeListener#attributeRemoved(javax.servlet.http.HttpSessionBindingEvent)
      */
-    public void contextDestroyed(ServletContextEvent contextEvent) {
-        this.invoke(this.servletContextListeners, ReloadingListener.SERVLET_CONTEXT_DESTROYED, contextEvent);
+    public void attributeRemoved(HttpSessionBindingEvent event) {
+        this.invoke(this.httpSessionAttributeListeners, ReloadingListener.ATTR_REMOVED, event);
     }
 
     /**
-     * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
+     * @see javax.servlet.ServletContextAttributeListener#attributeRemoved(javax.servlet.ServletContextAttributeEvent)
      */
-    public void contextInitialized(ServletContextEvent contextEvent) {
-        final ServletContext context = contextEvent.getServletContext();
-        this.init(context);
+    public void attributeRemoved(ServletContextAttributeEvent event) {
+        this.invoke(this.servletContextAttributeListeners, ReloadingListener.CONTEXT_ATTR_REMOVED, event);
+    }
 
-        this.invoke(this.servletContextListeners, ReloadingListener.SERVLET_CONTEXT_CREATED, contextEvent);
+    /**
+     * @see javax.servlet.http.HttpSessionAttributeListener#attributeReplaced(javax.servlet.http.HttpSessionBindingEvent)
+     */
+    public void attributeReplaced(HttpSessionBindingEvent event) {
+        this.invoke(this.httpSessionAttributeListeners, ReloadingListener.ATTR_REPLACED, event);
     }
 
     /**
-     * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
+     * @see javax.servlet.ServletContextAttributeListener#attributeReplaced(javax.servlet.ServletContextAttributeEvent)
      */
-    public void sessionCreated(HttpSessionEvent event) {
-        this.invoke(this.httpSessionListeners, ReloadingListener.SESSION_CREATED, event);
+    public void attributeReplaced(ServletContextAttributeEvent event) {
+        this.invoke(this.servletContextAttributeListeners, ReloadingListener.CONTEXT_ATTR_REPLACED, event);
     }
 
     /**
-     * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
+     * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
      */
-    public void sessionDestroyed(HttpSessionEvent event) {
-        this.invoke(this.httpSessionListeners, ReloadingListener.SESSION_DESTROYED, event);
+    public void contextDestroyed(ServletContextEvent contextEvent) {
+        this.invoke(this.servletContextListeners, ReloadingListener.SERVLET_CONTEXT_DESTROYED, contextEvent);
     }
 
     /**
-     * @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
+     * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
      */
-    public void valueBound(HttpSessionBindingEvent event) {
-        this.invoke(this.httpSessionBindingListeners, ReloadingListener.VALUE_BOUND, event);
+    public void contextInitialized(ServletContextEvent contextEvent) {
+        final ServletContext context = contextEvent.getServletContext();
+        this.init(context);
+
+        this.invoke(this.servletContextListeners, ReloadingListener.SERVLET_CONTEXT_CREATED, contextEvent);
     }
 
     /**
-     * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
+     * @see javax.servlet.ServletRequestListener#requestDestroyed(javax.servlet.ServletRequestEvent)
      */
-    public void valueUnbound(HttpSessionBindingEvent event) {
-        this.invoke(this.httpSessionBindingListeners, ReloadingListener.VALUE_UNBOUND, event);
+    public void requestDestroyed(ServletRequestEvent event) {
+        this.invoke(this.servletRequestListeners, ReloadingListener.REQUEST_DESTROYED, event);
     }
 
     /**
-     * @see javax.servlet.http.HttpSessionAttributeListener#attributeAdded(javax.servlet.http.HttpSessionBindingEvent)
+     * @see javax.servlet.ServletRequestListener#requestInitialized(javax.servlet.ServletRequestEvent)
      */
-    public void attributeAdded(HttpSessionBindingEvent event) {
-        this.invoke(this.httpSessionAttributeListeners, ReloadingListener.ATTR_ADDED, event);
+    public void requestInitialized(ServletRequestEvent event) {
+        this.invoke(this.servletRequestListeners, ReloadingListener.REQUEST_INITIALIZED, event);
     }
 
     /**
-     * @see javax.servlet.http.HttpSessionAttributeListener#attributeRemoved(javax.servlet.http.HttpSessionBindingEvent)
+     * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
      */
-    public void attributeRemoved(HttpSessionBindingEvent event) {
-        this.invoke(this.httpSessionAttributeListeners, ReloadingListener.ATTR_REMOVED, event);
+    public void sessionCreated(HttpSessionEvent event) {
+        this.invoke(this.httpSessionListeners, ReloadingListener.SESSION_CREATED, event);
     }
 
     /**
-     * @see javax.servlet.http.HttpSessionAttributeListener#attributeReplaced(javax.servlet.http.HttpSessionBindingEvent)
+     * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
      */
-    public void attributeReplaced(HttpSessionBindingEvent event) {
-        this.invoke(this.httpSessionAttributeListeners, ReloadingListener.ATTR_REPLACED, event);
+    public void sessionDestroyed(HttpSessionEvent event) {
+        this.invoke(this.httpSessionListeners, ReloadingListener.SESSION_DESTROYED, event);
     }
 
     /**
@@ -277,37 +193,114 @@ public class ReloadingListener
     }
 
     /**
-     * @see javax.servlet.ServletContextAttributeListener#attributeAdded(javax.servlet.ServletContextAttributeEvent)
-     */
-    public void attributeAdded(ServletContextAttributeEvent event) {
-        this.invoke(this.servletContextAttributeListeners, ReloadingListener.CONTEXT_ATTR_ADDED, event);
-    }
-
-    /**
-     * @see javax.servlet.ServletContextAttributeListener#attributeRemoved(javax.servlet.ServletContextAttributeEvent)
+     * @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
      */
-    public void attributeRemoved(ServletContextAttributeEvent event) {
-        this.invoke(this.servletContextAttributeListeners, ReloadingListener.CONTEXT_ATTR_REMOVED, event);
+    public void valueBound(HttpSessionBindingEvent event) {
+        this.invoke(this.httpSessionBindingListeners, ReloadingListener.VALUE_BOUND, event);
     }
 
     /**
-     * @see javax.servlet.ServletContextAttributeListener#attributeReplaced(javax.servlet.ServletContextAttributeEvent)
+     * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
      */
-    public void attributeReplaced(ServletContextAttributeEvent event) {
-        this.invoke(this.servletContextAttributeListeners, ReloadingListener.CONTEXT_ATTR_REPLACED, event);
+    public void valueUnbound(HttpSessionBindingEvent event) {
+        this.invoke(this.httpSessionBindingListeners, ReloadingListener.VALUE_UNBOUND, event);
     }
 
-    /**
-     * @see javax.servlet.ServletRequestListener#requestDestroyed(javax.servlet.ServletRequestEvent)
-     */
-    public void requestDestroyed(ServletRequestEvent event) {
-        this.invoke(this.servletRequestListeners, ReloadingListener.REQUEST_DESTROYED, event);
+    protected void init(ServletContext context) {
+        this.context = context;
+        // Create the listeners
+        final ClassLoader old = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(ReloadingClassloaderManager.getClassLoader(this.context));
+            final String listenersConfig = context.getInitParameter(ReloadingListener.class.getName());
+            if (listenersConfig != null) {
+                final StringTokenizer st = new StringTokenizer(listenersConfig, " \t\r\n\f;,", false);
+                while (st.hasMoreTokens()) {
+                    final String className = st.nextToken();
+                    try {
+                        ClassLoader cl = ReloadingClassloaderManager.getClassLoader(this.context);
+                        Class listenerClass = cl.loadClass(className);
+                        final Object listener = listenerClass.newInstance();
+                        if (listener instanceof HttpSessionListener) {
+                            this.httpSessionListeners.add(listener);
+                        }
+                        if (listener instanceof ServletContextListener) {
+                            this.servletContextListeners.add(listener);
+                        }
+                        if (listener instanceof HttpSessionActivationListener) {
+                            this.httpSessionActivationListeners.add(listener);
+                        }
+                        if (listener instanceof HttpSessionAttributeListener) {
+                            this.httpSessionAttributeListeners.add(listener);
+                        }
+                        if (listener instanceof HttpSessionBindingListener) {
+                            this.httpSessionBindingListeners.add(listener);
+                        }
+                        if (listener instanceof ServletContextAttributeListener) {
+                            this.servletContextAttributeListeners.add(listener);
+                        }
+                        if (listener instanceof ServletRequestListener) {
+                            this.servletRequestListeners.add(listener);
+                        }
+                    } catch (Exception e) {
+                        throw new RuntimeException("Cannot load listener " + className, e);
+                    }
+                }
+            }
+        } finally {
+            Thread.currentThread().setContextClassLoader(old);
+        }
     }
 
-    /**
-     * @see javax.servlet.ServletRequestListener#requestInitialized(javax.servlet.ServletRequestEvent)
-     */
-    public void requestInitialized(ServletRequestEvent event) {
-        this.invoke(this.servletRequestListeners, ReloadingListener.REQUEST_INITIALIZED, event);
+    protected void invoke(List listeners, String identifier, Object event) {
+        if (ReloadingClassloaderManager.getClassLoader(this.context) != null) {
+            final ClassLoader old = Thread.currentThread().getContextClassLoader();
+            try {
+                Thread.currentThread().setContextClassLoader(ReloadingClassloaderManager.getClassLoader(this.context));
+                final Iterator i = listeners.iterator();
+                while (i.hasNext()) {
+                    final Object listener = i.next();
+                    try {
+                        if (ReloadingListener.SERVLET_CONTEXT_CREATED.equals(identifier)) {
+                            ((ServletContextListener) listener).contextInitialized((ServletContextEvent) event);
+                        } else if (ReloadingListener.SERVLET_CONTEXT_DESTROYED.equals(identifier)) {
+                            ((ServletContextListener) listener).contextDestroyed((ServletContextEvent) event);
+                        } else if (ReloadingListener.SESSION_CREATED.equals(identifier)) {
+                            ((HttpSessionListener) listener).sessionCreated((HttpSessionEvent) event);
+                        } else if (ReloadingListener.SESSION_DESTROYED.equals(identifier)) {
+                            ((HttpSessionListener) listener).sessionDestroyed((HttpSessionEvent) event);
+                        } else if (ReloadingListener.VALUE_BOUND.equals(identifier)) {
+                            ((HttpSessionBindingListener) listener).valueBound((HttpSessionBindingEvent) event);
+                        } else if (ReloadingListener.VALUE_UNBOUND.equals(identifier)) {
+                            ((HttpSessionBindingListener) listener).valueUnbound((HttpSessionBindingEvent) event);
+                        } else if (ReloadingListener.ATTR_ADDED.equals(identifier)) {
+                            ((HttpSessionAttributeListener) listener).attributeAdded((HttpSessionBindingEvent) event);
+                        } else if (ReloadingListener.ATTR_REMOVED.equals(identifier)) {
+                            ((HttpSessionAttributeListener) listener).attributeRemoved((HttpSessionBindingEvent) event);
+                        } else if (ReloadingListener.ATTR_REPLACED.equals(identifier)) {
+                            ((HttpSessionAttributeListener) listener).attributeReplaced((HttpSessionBindingEvent) event);
+                        } else if (ReloadingListener.CONTEXT_ATTR_ADDED.equals(identifier)) {
+                            ((ServletContextAttributeListener) listener).attributeAdded((ServletContextAttributeEvent) event);
+                        } else if (ReloadingListener.CONTEXT_ATTR_REMOVED.equals(identifier)) {
+                            ((ServletContextAttributeListener) listener).attributeRemoved((ServletContextAttributeEvent) event);
+                        } else if (ReloadingListener.CONTEXT_ATTR_REPLACED.equals(identifier)) {
+                            ((ServletContextAttributeListener) listener).attributeReplaced((ServletContextAttributeEvent) event);
+                        } else if (ReloadingListener.SESSION_ACTIVATED.equals(identifier)) {
+                            ((HttpSessionActivationListener) listener).sessionDidActivate((HttpSessionEvent) event);
+                        } else if (ReloadingListener.SESSION_PASSIVATE.equals(identifier)) {
+                            ((HttpSessionActivationListener) listener).sessionWillPassivate((HttpSessionEvent) event);
+                        } else if (ReloadingListener.REQUEST_DESTROYED.equals(identifier)) {
+                            ((ServletRequestListener) listener).requestDestroyed((ServletRequestEvent) event);
+                        } else if (ReloadingListener.REQUEST_INITIALIZED.equals(identifier)) {
+                            ((ServletRequestListener) listener).requestInitialized((ServletRequestEvent) event);
+                        }
+                    } catch (Exception e) {
+                        throw new RuntimeException("Cannot invoke listener " + listener, e);
+                    }
+                }
+            } finally {
+                Thread.currentThread().setContextClassLoader(old);
+            }
+        }
     }
 }

Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingNotificationSubscriber.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingNotificationSubscriber.java?rev=1059998&r1=1059997&r2=1059998&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingNotificationSubscriber.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingNotificationSubscriber.java Mon Jan 17 17:13:44 2011
@@ -5,9 +5,9 @@
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -19,5 +19,4 @@ package org.apache.cocoon.tools.rcl.wrap
 public interface ReloadingNotificationSubscriber {
 
     void handleNotification();
-    
 }

Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServlet.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServlet.java?rev=1059998&r1=1059997&r2=1059998&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServlet.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServlet.java Mon Jan 17 17:13:44 2011
@@ -26,26 +26,48 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServlet;
 
 /**
- * This servlet builds a classloading sandbox and runs another servlet inside
- * that sandbox. The purpose is to use the reloading classloader to load the
- *
+ * This servlet builds a classloading sandbox and runs another servlet inside that sandbox. The purpose is to use the
+ * reloading classloader.
+ * 
  * <p>
- * This servlet propagates all initialisation parameters to the sandboxed
- * servlet, and requires the parameter <code>servlet-class</code>.
+ * This servlet propagates all initialisation parameters to the sandboxed servlet, and requires the parameter
+ * <code>servlet-class</code>.
  * <ul>
  * <li><code>servlet-class</code> defines the sandboxed servlet class.</li>
  * </ul>
- *
+ * 
  * @version $Id$
  */
 public class ReloadingServlet extends HttpServlet {
 
+    private static final long serialVersionUID = 1L;
+
     protected Servlet servlet;
     protected ServletConfig config;
 
     /**
+     * Destroy the actual servlet
+     */
+    @Override
+    public void destroy() {
+        if (this.servlet != null) {
+            final ClassLoader old = Thread.currentThread().getContextClassLoader();
+
+            try {
+                Thread.currentThread().setContextClassLoader(ReloadingClassloaderManager.getClassLoader(this.config.getServletContext()));
+                this.servlet.destroy();
+            } finally {
+                Thread.currentThread().setContextClassLoader(old);
+            }
+        }
+
+        super.destroy();
+    }
+
+    /**
      * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
      */
+    @Override
     public void init(ServletConfig config) throws ServletException {
         super.init(config);
         this.config = config;
@@ -82,12 +104,14 @@ public class ReloadingServlet extends Ht
     /**
      * Service the request by delegating the call to the real servlet
      */
+    @Override
     public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
         final ClassLoader old = Thread.currentThread().getContextClassLoader();
         try {
             Thread.currentThread().setContextClassLoader(ReloadingClassloaderManager.getClassLoader(this.config.getServletContext()));
 
             CocoonReloadingListener.enableConsoleOutput();
+
             this.servlet.service(request, response);
         } catch(Throwable t) {
             t.printStackTrace();
@@ -96,20 +120,4 @@ public class ReloadingServlet extends Ht
             Thread.currentThread().setContextClassLoader(old);
         }
     }
-
-    /**
-     * Destroy the actual servlet
-     */
-    public void destroy() {
-        if (this.servlet != null) {
-            final ClassLoader old = Thread.currentThread().getContextClassLoader();
-            try {
-                Thread.currentThread().setContextClassLoader(ReloadingClassloaderManager.getClassLoader(this.config.getServletContext()));
-                this.servlet.destroy();
-            } finally {
-                Thread.currentThread().setContextClassLoader(old);
-            }
-        }
-        super.destroy();
-    }
 }

Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServletFilter.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServletFilter.java?rev=1059998&r1=1059997&r2=1059998&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServletFilter.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingServletFilter.java Mon Jan 17 17:13:44 2011
@@ -38,6 +38,21 @@ public class ReloadingServletFilter impl
     protected ServletContext context;
 
     /**
+     * @see javax.servlet.Filter#destroy()
+     */
+    public void destroy() {
+        if (this.filter != null) {
+            final ClassLoader old = Thread.currentThread().getContextClassLoader();
+            try {
+                Thread.currentThread().setContextClassLoader(ReloadingClassloaderManager.getClassLoader(this.context));
+                this.filter.destroy();
+            } finally {
+                Thread.currentThread().setContextClassLoader(old);
+            }
+        }
+    }
+
+    /**
      * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
      */
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
@@ -67,7 +82,6 @@ public class ReloadingServletFilter impl
 
         // Create the filter
         try {
-
             Class filterClass = ReloadingClassloaderManager.getClassLoader(this.context).loadClass(filterName);
             this.filter = (Filter) filterClass.newInstance();
 
@@ -85,19 +99,4 @@ public class ReloadingServletFilter impl
             Thread.currentThread().setContextClassLoader(old);
         }
     }
-
-    /**
-     * @see javax.servlet.Filter#destroy()
-     */
-    public void destroy() {
-        if (this.filter != null) {
-            final ClassLoader old = Thread.currentThread().getContextClassLoader();
-            try {
-                Thread.currentThread().setContextClassLoader(ReloadingClassloaderManager.getClassLoader(this.context));
-                this.filter.destroy();
-            } finally {
-                Thread.currentThread().setContextClassLoader(old);
-            }
-        }
-    }
 }

Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingSpringFilter.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingSpringFilter.java?rev=1059998&r1=1059997&r2=1059998&view=diff
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingSpringFilter.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingSpringFilter.java Mon Jan 17 17:13:44 2011
@@ -45,19 +45,23 @@ public class ReloadingSpringFilter imple
 
     private FilterConfig config;
 
+    public void destroy() {
+        // do nothing
+    }
+
     public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException,
-            ServletException {
+    ServletException {
 
-        if(isReloadingEnabled() && CocoonReloadingListener.isReload()) {
+        if(this.isReloadingEnabled() && CocoonReloadingListener.isReload()) {
             synchronized (this) {
-                log.info("Performing a reload of the Spring application context.");
+                this.log.info("Performing a reload of the Spring application context.");
                 // load the spring context loader from the reloading classloader
-                ClassLoader cl = ReloadingClassloaderManager.getClassLoader(config.getServletContext());
+                ClassLoader cl = ReloadingClassloaderManager.getClassLoader(this.config.getServletContext());
                 Object reloader = null;
                 try {
                     reloader = cl.loadClass("org.apache.cocoon.tools.rcl.springreloader.SpringReloader").newInstance();
                     Method reloadMethod = reloader.getClass().getMethod("reload", new Class[]{ServletContext.class} );
-                    reloadMethod.invoke(reloader, new Object[]{config.getServletContext()});
+                    reloadMethod.invoke(reloader, new Object[]{this.config.getServletContext()});
                 } catch (Exception e) {
                     throw new ServletException("Can't use SpringReloader.", e);
                 }
@@ -67,9 +71,6 @@ public class ReloadingSpringFilter imple
         filterChain.doFilter(req, res);
     }
 
-    public void destroy() {
-    }
-
     public void init(FilterConfig filterConfig) throws ServletException {
         this.config = filterConfig;
     }
@@ -80,5 +81,4 @@ public class ReloadingSpringFilter imple
         String reloadingEnabled = rclProps.getProperty(Constants.RELOADING_SPRING_ENABLED, "true");
         return reloadingEnabled.trim().toLowerCase().equals("true");
     }
-
 }
\ No newline at end of file