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 2009/01/15 22:29:52 UTC

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

Author: reinhard
Date: Thu Jan 15 13:29:52 2009
New Revision: 734829

URL: http://svn.apache.org/viewvc?rev=734829&view=rev
Log:
. cleanup code
. create only one reloading listener

Modified:
    cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-webapp-wrapper/src/main/java/org/apache/cocoon/tools/rcl/wrapper/servlet/ReloadingClassloaderManager.java

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=734829&r1=734828&r2=734829&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 Thu Jan 15 13:29:52 2009
@@ -31,71 +31,79 @@
 import org.apache.commons.jci.ReloadingClassLoader;
 import org.apache.commons.jci.monitor.FilesystemAlterationMonitor;
 
-public class ReloadingClassloaderManager {
+public abstract class ReloadingClassloaderManager {
 
     private static final String FILE_PROTOCOL = "file:";
 
     private static ClassLoader reloadingClassloader = null;
 
-    private ReloadingClassloaderManager() {
-        // only allow static usage
-    }
-
     public static synchronized ClassLoader getClassLoader(ServletContext context) {
-        
         // if there is no classloader, create one
         if (ReloadingClassloaderManager.reloadingClassloader == null) {
-
             // create the URL classloader
             final ClassLoader urlClassloader = createURLClassLoader(context);
-            // check, if the reloadking classloader should be used
+
+            // check, if the reloading classloader should be used
             if (isReloadingClassloaderEnabled(context)) {
                 final ReloadingClassLoader classloader = new ReloadingClassLoader(urlClassloader);
                 final FilesystemAlterationMonitor fam = new FilesystemAlterationMonitor();
-
-                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);
-                }
-                for (Iterator linesIt = lines.iterator(); linesIt.hasNext();) {
-                    String line = (String) linesIt.next();
-                    if (!line.startsWith(FILE_PROTOCOL)) {
-                        throw new ReloadingClassloaderCreationException("Only support URLs with file: protocol.");
-                    }
-                    String url = line.substring(FILE_PROTOCOL.length());
-                    // windows paths
-                    if (url.indexOf(2) == ':') {
-                        url = url.substring(1);
-                    }
-                    File directory = new File(url);
-                    org.apache.commons.jci.listeners.ReloadingListener rl = new CocoonReloadingListener();
-                    rl.addReloadNotificationListener(classloader);
-                    fam.addListener(directory, rl);
-                }
+                org.apache.commons.jci.listeners.ReloadingListener rl = new CocoonReloadingListener();
+                rl.addReloadNotificationListener(classloader);
+                addResourcesToFam(fam, rl, getRclConfResourceUrls(context));
                 fam.start();
                 ReloadingClassloaderManager.reloadingClassloader = classloader;
-            } 
-            // otherwise use the URL classloader only
-            else {
+            } else {
+                // otherwise use the URL classloader only
                 ReloadingClassloaderManager.reloadingClassloader = urlClassloader;
             }
         }
+        
         return ReloadingClassloaderManager.reloadingClassloader;
     }
 
+    private static void addResourcesToFam(final FilesystemAlterationMonitor fam,
+            org.apache.commons.jci.listeners.ReloadingListener rl, List<?> resourceUrl) {
+        for (Iterator<?> linesIt = resourceUrl.iterator(); linesIt.hasNext();) {
+            String line = (String) linesIt.next();
+            if (!line.startsWith(FILE_PROTOCOL)) {
+                throw new ReloadingClassloaderCreationException("Only support URLs with file: protocol.");
+            }
+            String url = line.substring(FILE_PROTOCOL.length());
+            // windows paths
+            if (url.indexOf(2) == ':') {
+                url = url.substring(1);
+            }
+
+            // add libraries to the RCL
+            if(url.endsWith(".jar")) {
+                // deactivate reloading of JARs 
+                continue;
+            }
+            fam.addListener(new File(url), rl);
+        }
+    }
+
+    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 urlsList = new ArrayList();
-            List lines = IOUtils.readLines(context.getResourceAsStream(Constants.WEB_INF_RCL_URLCL_CONF));
-            for (Iterator linesIt = lines.iterator(); linesIt.hasNext();) {
+            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 = (URL[]) urlsList.toArray(new URL[urlsList.size()]);
+
+            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:/"
@@ -109,10 +117,10 @@
             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);
+                    + Constants.WEB_INF_RCLWRAPPER_PROPERTIES + " from servlet context.", e);
         }
+
         String reloadingEnabled = rclProps.getProperty(Constants.RELOADING_CLASSLOADER_ENABLED, "true");
         return reloadingEnabled.trim().toLowerCase().equals("true");
     }
-
 }