Author: remm
Date: Wed Apr 12 03:54:41 2006
New Revision: 393433

URL: http://svn.apache.org/viewcvs?rev=393433&view=rev
Log:
- Improve the algorithm used when constructing classloaders, in particular to 
respect order.
- Submitted by Rainer Jung.

Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/Bootstrap.java
    
tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ClassLoaderFactory.java

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/Bootstrap.java
URL: 
http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/Bootstrap.java?rev=393433&r1=393432&r2=393433&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/Bootstrap.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/Bootstrap.java Wed 
Apr 12 03:54:41 2006
@@ -1,498 +1,517 @@
-/*
- * Copyright 1999,2004 The Apache Software Foundation.
- * 
- * Licensed 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.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package org.apache.catalina.startup;
-
-
-import java.io.File;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.StringTokenizer;
-
-import javax.management.MBeanServer;
-import javax.management.MBeanServerFactory;
-import javax.management.ObjectName;
-
-import org.apache.catalina.security.SecurityClassLoad;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-
-/**
- * Boostrap loader for Catalina.  This application constructs a class loader
- * for use in loading the Catalina internal classes (by accumulating all of the
- * JAR files found in the "server" directory under "catalina.home"), and
- * starts the regular execution of the container.  The purpose of this
- * roundabout approach is to keep the Catalina internal classes (and any
- * other classes they depend on, such as an XML parser) out of the system
- * class path and therefore not visible to application level classes.
- *
- * @author Craig R. McClanahan
- * @author Remy Maucherat
- * @version $Revision: 304108 $ $Date: 2005-09-29 07:55:15 +0200 (jeu., 29 
sept. 2005) $
- */
-
-public final class Bootstrap {
-
-    private static Log log = LogFactory.getLog(Bootstrap.class);
-    
-    // -------------------------------------------------------------- Constants
-
-
-    protected static final String CATALINA_HOME_TOKEN = "${catalina.home}";
-    protected static final String CATALINA_BASE_TOKEN = "${catalina.base}";
-
-
-    // ------------------------------------------------------- Static Variables
-
-
-    private static final String JMX_ERROR_MESSAGE =
-        "This release of Apache Tomcat was packaged to run on J2SE 5.0 \n"
-        + "or later. It can be run on earlier JVMs by downloading and \n"
-        + "installing a compatibility package from the Apache Tomcat \n"
-        + "binary download page.";
-
-
-    /**
-     * Daemon object used by main.
-     */
-    private static Bootstrap daemon = null;
-
-
-    // -------------------------------------------------------------- Variables
-
-
-    /**
-     * Daemon reference.
-     */
-    private Object catalinaDaemon = null;
-
-
-    protected ClassLoader commonLoader = null;
-    protected ClassLoader catalinaLoader = null;
-    protected ClassLoader sharedLoader = null;
-
-
-    // -------------------------------------------------------- Private Methods
-
-
-    private void initClassLoaders() {
-        try {
-            commonLoader = createClassLoader("common", null);
-            if( commonLoader == null ) {
-                // no config file, default to this loader - we might be in a 
'single' env.
-                commonLoader=this.getClass().getClassLoader();
-            }
-            catalinaLoader = createClassLoader("server", commonLoader);
-            sharedLoader = createClassLoader("shared", commonLoader);
-        } catch (Throwable t) {
-            log.error("Class loader creation threw exception", t);
-            System.exit(1);
-        }
-    }
-
-
-    private ClassLoader createClassLoader(String name, ClassLoader parent)
-        throws Exception {
-
-        String value = CatalinaProperties.getProperty(name + ".loader");
-        if ((value == null) || (value.equals("")))
-            return parent;
-
-        ArrayList unpackedList = new ArrayList();
-        ArrayList packedList = new ArrayList();
-        ArrayList urlList = new ArrayList();
-
-        StringTokenizer tokenizer = new StringTokenizer(value, ",");
-        while (tokenizer.hasMoreElements()) {
-            String repository = tokenizer.nextToken();
-
-            // Local repository
-            boolean packed = false;
-            if (repository.startsWith(CATALINA_HOME_TOKEN)) {
-                repository = getCatalinaHome()
-                    + repository.substring(CATALINA_HOME_TOKEN.length());
-            } else if (repository.startsWith(CATALINA_BASE_TOKEN)) {
-                repository = getCatalinaBase()
-                    + repository.substring(CATALINA_BASE_TOKEN.length());
-            }
-
-            // Check for a JAR URL repository
-            try {
-                urlList.add(new URL(repository));
-                continue;
-            } catch (MalformedURLException e) {
-                // Ignore
-            }
-
-            if (repository.endsWith("*.jar")) {
-                packed = true;
-                repository = repository.substring
-                    (0, repository.length() - "*.jar".length());
-            }
-            if (packed) {
-                packedList.add(new File(repository));
-            } else {
-                unpackedList.add(new File(repository));
-            }
-        }
-
-        File[] unpacked = (File[]) unpackedList.toArray(new File[0]);
-        File[] packed = (File[]) packedList.toArray(new File[0]);
-        URL[] urls = (URL[]) urlList.toArray(new URL[0]);
-
-        ClassLoader classLoader = ClassLoaderFactory.createClassLoader
-            (unpacked, packed, urls, parent);
-
-        // Retrieving MBean server
-        MBeanServer mBeanServer = null;
-        if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
-            mBeanServer =
-                (MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
-        } else {
-            mBeanServer = MBeanServerFactory.createMBeanServer();
-        }
-
-        // Register the server classloader
-        ObjectName objectName =
-            new ObjectName("Catalina:type=ServerClassLoader,name=" + name);
-        mBeanServer.registerMBean(classLoader, objectName);
-
-        return classLoader;
-
-    }
-
-
-    /**
-     * Initialize daemon.
-     */
-    public void init()
-        throws Exception
-    {
-
-        // Set Catalina path
-        setCatalinaHome();
-        setCatalinaBase();
-
-        initClassLoaders();
-
-        Thread.currentThread().setContextClassLoader(catalinaLoader);
-
-        SecurityClassLoad.securityClassLoad(catalinaLoader);
-
-        // Load our startup class and call its process() method
-        if (log.isDebugEnabled())
-            log.debug("Loading startup class");
-        Class startupClass =
-            catalinaLoader.loadClass
-            ("org.apache.catalina.startup.Catalina");
-        Object startupInstance = startupClass.newInstance();
-
-        // Set the shared extensions class loader
-        if (log.isDebugEnabled())
-            log.debug("Setting startup class properties");
-        String methodName = "setParentClassLoader";
-        Class paramTypes[] = new Class[1];
-        paramTypes[0] = Class.forName("java.lang.ClassLoader");
-        Object paramValues[] = new Object[1];
-        paramValues[0] = sharedLoader;
-        Method method =
-            startupInstance.getClass().getMethod(methodName, paramTypes);
-        method.invoke(startupInstance, paramValues);
-
-        catalinaDaemon = startupInstance;
-
-    }
-
-
-    /**
-     * Load daemon.
-     */
-    private void load(String[] arguments)
-        throws Exception {
-
-        // Call the load() method
-        String methodName = "load";
-        Object param[];
-        Class paramTypes[];
-        if (arguments==null || arguments.length==0) {
-            paramTypes = null;
-            param = null;
-        } else {
-            paramTypes = new Class[1];
-            paramTypes[0] = arguments.getClass();
-            param = new Object[1];
-            param[0] = arguments;
-        }
-        Method method = 
-            catalinaDaemon.getClass().getMethod(methodName, paramTypes);
-        if (log.isDebugEnabled())
-            log.debug("Calling startup class " + method);
-        method.invoke(catalinaDaemon, param);
-
-    }
-
-
-    // ----------------------------------------------------------- Main Program
-
-
-    /**
-     * Load the Catalina daemon.
-     */
-    public void init(String[] arguments)
-        throws Exception {
-
-        init();
-        load(arguments);
-
-    }
-
-
-    /**
-     * Start the Catalina daemon.
-     */
-    public void start()
-        throws Exception {
-        if( catalinaDaemon==null ) init();
-
-        Method method = catalinaDaemon.getClass().getMethod("start", (Class [] 
)null);
-        method.invoke(catalinaDaemon, (Object [])null);
-
-    }
-
-
-    /**
-     * Stop the Catalina Daemon.
-     */
-    public void stop()
-        throws Exception {
-
-        Method method = catalinaDaemon.getClass().getMethod("stop", (Class [] 
) null);
-        method.invoke(catalinaDaemon, (Object [] ) null);
-
-    }
-
-
-    /**
-     * Stop the standlone server.
-     */
-    public void stopServer()
-        throws Exception {
-
-        Method method = 
-            catalinaDaemon.getClass().getMethod("stopServer", (Class []) null);
-        method.invoke(catalinaDaemon, (Object []) null);
-
-    }
-
-
-   /**
-     * Stop the standlone server.
-     */
-    public void stopServer(String[] arguments)
-        throws Exception {
-
-        Object param[];
-        Class paramTypes[];
-        if (arguments==null || arguments.length==0) {
-            paramTypes = null;
-            param = null;
-        } else {
-            paramTypes = new Class[1];
-            paramTypes[0] = arguments.getClass();
-            param = new Object[1];
-            param[0] = arguments;
-        }
-        Method method = 
-            catalinaDaemon.getClass().getMethod("stopServer", paramTypes);
-        method.invoke(catalinaDaemon, param);
-
-    }
-
-
-    /**
-     * Set flag.
-     */
-    public void setAwait(boolean await)
-        throws Exception {
-
-        Class paramTypes[] = new Class[1];
-        paramTypes[0] = Boolean.TYPE;
-        Object paramValues[] = new Object[1];
-        paramValues[0] = new Boolean(await);
-        Method method = 
-            catalinaDaemon.getClass().getMethod("setAwait", paramTypes);
-        method.invoke(catalinaDaemon, paramValues);
-
-    }
-
-    public boolean getAwait()
-        throws Exception
-    {
-        Class paramTypes[] = new Class[0];
-        Object paramValues[] = new Object[0];
-        Method method =
-            catalinaDaemon.getClass().getMethod("getAwait", paramTypes);
-        Boolean b=(Boolean)method.invoke(catalinaDaemon, paramValues);
-        return b.booleanValue();
-    }
-
-
-    /**
-     * Destroy the Catalina Daemon.
-     */
-    public void destroy() {
-
-        // FIXME
-
-    }
-
-
-    /**
-     * Main method, used for testing only.
-     *
-     * @param args Command line arguments to be processed
-     */
-    public static void main(String args[]) {
-
-        try {
-            // Attempt to load JMX class
-            new ObjectName("test:foo=bar");
-        } catch (Throwable t) {
-            System.out.println(JMX_ERROR_MESSAGE);
-            try {
-                // Give users some time to read the message before exiting
-                Thread.sleep(5000);
-            } catch (Exception ex) {
-            }
-            return;
-        }
-
-        if (daemon == null) {
-            daemon = new Bootstrap();
-            try {
-                daemon.init();
-            } catch (Throwable t) {
-                t.printStackTrace();
-                return;
-            }
-        }
-
-        try {
-            String command = "start";
-            if (args.length > 0) {
-                command = args[args.length - 1];
-            }
-
-            if (command.equals("startd")) {
-                args[0] = "start";
-                daemon.load(args);
-                daemon.start();
-            } else if (command.equals("stopd")) {
-                args[0] = "stop";
-                daemon.stop();
-            } else if (command.equals("start")) {
-                daemon.setAwait(true);
-                daemon.load(args);
-                daemon.start();
-            } else if (command.equals("stop")) {
-                daemon.stopServer(args);
-            } else {
-                log.warn("Bootsrap: command \"" + command + "\" does not 
exist.");
-            }
-        } catch (Throwable t) {
-            t.printStackTrace();
-        }
-
-    }
-
-    public void setCatalinaHome(String s) {
-        System.setProperty( "catalina.home", s );
-    }
-
-    public void setCatalinaBase(String s) {
-        System.setProperty( "catalina.base", s );
-    }
-
-
-    /**
-     * Set the <code>catalina.base</code> System property to the current
-     * working directory if it has not been set.
-     */
-    private void setCatalinaBase() {
-
-        if (System.getProperty("catalina.base") != null)
-            return;
-        if (System.getProperty("catalina.home") != null)
-            System.setProperty("catalina.base",
-                               System.getProperty("catalina.home"));
-        else
-            System.setProperty("catalina.base",
-                               System.getProperty("user.dir"));
-
-    }
-
-
-    /**
-     * Set the <code>catalina.home</code> System property to the current
-     * working directory if it has not been set.
-     */
-    private void setCatalinaHome() {
-
-        if (System.getProperty("catalina.home") != null)
-            return;
-        File bootstrapJar = 
-            new File(System.getProperty("user.dir"), "bootstrap.jar");
-        if (bootstrapJar.exists()) {
-            try {
-                System.setProperty
-                    ("catalina.home", 
-                     (new File(System.getProperty("user.dir"), ".."))
-                     .getCanonicalPath());
-            } catch (Exception e) {
-                // Ignore
-                System.setProperty("catalina.home",
-                                   System.getProperty("user.dir"));
-            }
-        } else {
-            System.setProperty("catalina.home",
-                               System.getProperty("user.dir"));
-        }
-
-    }
-
-
-    /**
-     * Get the value of the catalina.home environment variable.
-     */
-    public static String getCatalinaHome() {
-        return System.getProperty("catalina.home",
-                                  System.getProperty("user.dir"));
-    }
-
-
-    /**
-     * Get the value of the catalina.base environment variable.
-     */
-    public static String getCatalinaBase() {
-        return System.getProperty("catalina.base", getCatalinaHome());
-    }
-
-
-}
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.catalina.startup;
+
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+import javax.management.MBeanServer;
+import javax.management.MBeanServerFactory;
+import javax.management.ObjectName;
+
+import org.apache.catalina.security.SecurityClassLoad;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+/**
+ * Boostrap loader for Catalina.  This application constructs a class loader
+ * for use in loading the Catalina internal classes (by accumulating all of the
+ * JAR files found in the "server" directory under "catalina.home"), and
+ * starts the regular execution of the container.  The purpose of this
+ * roundabout approach is to keep the Catalina internal classes (and any
+ * other classes they depend on, such as an XML parser) out of the system
+ * class path and therefore not visible to application level classes.
+ *
+ * @author Craig R. McClanahan
+ * @author Remy Maucherat
+ * @version $Revision: 304108 $ $Date: 2005-09-29 07:55:15 +0200 (jeu., 29 
sept. 2005) $
+ */
+
+public final class Bootstrap {
+
+    private static Log log = LogFactory.getLog(Bootstrap.class);
+    
+    // -------------------------------------------------------------- Constants
+
+
+    protected static final String CATALINA_HOME_TOKEN = "${catalina.home}";
+    protected static final String CATALINA_BASE_TOKEN = "${catalina.base}";
+
+
+    // ------------------------------------------------------- Static Variables
+
+
+    private static final String JMX_ERROR_MESSAGE =
+        "This release of Apache Tomcat was packaged to run on J2SE 5.0 \n"
+        + "or later. It can be run on earlier JVMs by downloading and \n"
+        + "installing a compatibility package from the Apache Tomcat \n"
+        + "binary download page.";
+
+
+    /**
+     * Daemon object used by main.
+     */
+    private static Bootstrap daemon = null;
+
+
+    // -------------------------------------------------------------- Variables
+
+
+    /**
+     * Daemon reference.
+     */
+    private Object catalinaDaemon = null;
+
+
+    protected ClassLoader commonLoader = null;
+    protected ClassLoader catalinaLoader = null;
+    protected ClassLoader sharedLoader = null;
+
+
+    // -------------------------------------------------------- Private Methods
+
+
+    private void initClassLoaders() {
+        try {
+            commonLoader = createClassLoader("common", null);
+            if( commonLoader == null ) {
+                // no config file, default to this loader - we might be in a 
'single' env.
+                commonLoader=this.getClass().getClassLoader();
+            }
+            catalinaLoader = createClassLoader("server", commonLoader);
+            sharedLoader = createClassLoader("shared", commonLoader);
+        } catch (Throwable t) {
+            log.error("Class loader creation threw exception", t);
+            System.exit(1);
+        }
+    }
+
+
+    private ClassLoader createClassLoader(String name, ClassLoader parent)
+        throws Exception {
+
+        String value = CatalinaProperties.getProperty(name + ".loader");
+        if ((value == null) || (value.equals("")))
+            return parent;
+
+        ArrayList repositoryLocations = new ArrayList();
+        ArrayList repositoryTypes = new ArrayList();
+        int i;
+ 
+        StringTokenizer tokenizer = new StringTokenizer(value, ",");
+        while (tokenizer.hasMoreElements()) {
+            String repository = tokenizer.nextToken();
+
+            // Local repository
+            boolean replace = false;
+            String before = repository;
+            while ((i=repository.indexOf(CATALINA_HOME_TOKEN))>=0) {
+                replace=true;
+                if (i>0) {
+                repository = repository.substring(0,i) + getCatalinaHome() 
+                    + repository.substring(i+CATALINA_HOME_TOKEN.length());
+                } else {
+                    repository = getCatalinaHome() 
+                        + repository.substring(CATALINA_HOME_TOKEN.length());
+                }
+            }
+            while ((i=repository.indexOf(CATALINA_BASE_TOKEN))>=0) {
+                replace=true;
+                if (i>0) {
+                repository = repository.substring(0,i) + getCatalinaBase() 
+                    + repository.substring(i+CATALINA_BASE_TOKEN.length());
+                } else {
+                    repository = getCatalinaBase() 
+                        + repository.substring(CATALINA_BASE_TOKEN.length());
+                }
+            }
+            if (replace && log.isDebugEnabled())
+                log.debug("Expanded " + before + " to " + replace);
+
+            // Check for a JAR URL repository
+            try {
+                URL url=new URL(repository);
+                repositoryLocations.add(repository);
+                repositoryTypes.add(ClassLoaderFactory.IS_URL);
+                continue;
+            } catch (MalformedURLException e) {
+                // Ignore
+            }
+
+            if (repository.endsWith("*.jar")) {
+                repository = repository.substring
+                    (0, repository.length() - "*.jar".length());
+                repositoryLocations.add(repository);
+                repositoryTypes.add(ClassLoaderFactory.IS_GLOB);
+            } else if (repository.endsWith(".jar")) {
+                repositoryLocations.add(repository);
+                repositoryTypes.add(ClassLoaderFactory.IS_JAR);
+            } else {
+                repositoryLocations.add(repository);
+                repositoryTypes.add(ClassLoaderFactory.IS_DIR);
+            }
+        }
+
+        String[] locations = (String[]) repositoryLocations.toArray(new 
String[0]);
+        Integer[] types = (Integer[]) repositoryTypes.toArray(new Integer[0]);
+ 
+        ClassLoader classLoader = ClassLoaderFactory.createClassLoader
+            (locations, types, parent);
+
+        // Retrieving MBean server
+        MBeanServer mBeanServer = null;
+        if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
+            mBeanServer =
+                (MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
+        } else {
+            mBeanServer = MBeanServerFactory.createMBeanServer();
+        }
+
+        // Register the server classloader
+        ObjectName objectName =
+            new ObjectName("Catalina:type=ServerClassLoader,name=" + name);
+        mBeanServer.registerMBean(classLoader, objectName);
+
+        return classLoader;
+
+    }
+
+
+    /**
+     * Initialize daemon.
+     */
+    public void init()
+        throws Exception
+    {
+
+        // Set Catalina path
+        setCatalinaHome();
+        setCatalinaBase();
+
+        initClassLoaders();
+
+        Thread.currentThread().setContextClassLoader(catalinaLoader);
+
+        SecurityClassLoad.securityClassLoad(catalinaLoader);
+
+        // Load our startup class and call its process() method
+        if (log.isDebugEnabled())
+            log.debug("Loading startup class");
+        Class startupClass =
+            catalinaLoader.loadClass
+            ("org.apache.catalina.startup.Catalina");
+        Object startupInstance = startupClass.newInstance();
+
+        // Set the shared extensions class loader
+        if (log.isDebugEnabled())
+            log.debug("Setting startup class properties");
+        String methodName = "setParentClassLoader";
+        Class paramTypes[] = new Class[1];
+        paramTypes[0] = Class.forName("java.lang.ClassLoader");
+        Object paramValues[] = new Object[1];
+        paramValues[0] = sharedLoader;
+        Method method =
+            startupInstance.getClass().getMethod(methodName, paramTypes);
+        method.invoke(startupInstance, paramValues);
+
+        catalinaDaemon = startupInstance;
+
+    }
+
+
+    /**
+     * Load daemon.
+     */
+    private void load(String[] arguments)
+        throws Exception {
+
+        // Call the load() method
+        String methodName = "load";
+        Object param[];
+        Class paramTypes[];
+        if (arguments==null || arguments.length==0) {
+            paramTypes = null;
+            param = null;
+        } else {
+            paramTypes = new Class[1];
+            paramTypes[0] = arguments.getClass();
+            param = new Object[1];
+            param[0] = arguments;
+        }
+        Method method = 
+            catalinaDaemon.getClass().getMethod(methodName, paramTypes);
+        if (log.isDebugEnabled())
+            log.debug("Calling startup class " + method);
+        method.invoke(catalinaDaemon, param);
+
+    }
+
+
+    // ----------------------------------------------------------- Main Program
+
+
+    /**
+     * Load the Catalina daemon.
+     */
+    public void init(String[] arguments)
+        throws Exception {
+
+        init();
+        load(arguments);
+
+    }
+
+
+    /**
+     * Start the Catalina daemon.
+     */
+    public void start()
+        throws Exception {
+        if( catalinaDaemon==null ) init();
+
+        Method method = catalinaDaemon.getClass().getMethod("start", (Class [] 
)null);
+        method.invoke(catalinaDaemon, (Object [])null);
+
+    }
+
+
+    /**
+     * Stop the Catalina Daemon.
+     */
+    public void stop()
+        throws Exception {
+
+        Method method = catalinaDaemon.getClass().getMethod("stop", (Class [] 
) null);
+        method.invoke(catalinaDaemon, (Object [] ) null);
+
+    }
+
+
+    /**
+     * Stop the standlone server.
+     */
+    public void stopServer()
+        throws Exception {
+
+        Method method = 
+            catalinaDaemon.getClass().getMethod("stopServer", (Class []) null);
+        method.invoke(catalinaDaemon, (Object []) null);
+
+    }
+
+
+   /**
+     * Stop the standlone server.
+     */
+    public void stopServer(String[] arguments)
+        throws Exception {
+
+        Object param[];
+        Class paramTypes[];
+        if (arguments==null || arguments.length==0) {
+            paramTypes = null;
+            param = null;
+        } else {
+            paramTypes = new Class[1];
+            paramTypes[0] = arguments.getClass();
+            param = new Object[1];
+            param[0] = arguments;
+        }
+        Method method = 
+            catalinaDaemon.getClass().getMethod("stopServer", paramTypes);
+        method.invoke(catalinaDaemon, param);
+
+    }
+
+
+    /**
+     * Set flag.
+     */
+    public void setAwait(boolean await)
+        throws Exception {
+
+        Class paramTypes[] = new Class[1];
+        paramTypes[0] = Boolean.TYPE;
+        Object paramValues[] = new Object[1];
+        paramValues[0] = new Boolean(await);
+        Method method = 
+            catalinaDaemon.getClass().getMethod("setAwait", paramTypes);
+        method.invoke(catalinaDaemon, paramValues);
+
+    }
+
+    public boolean getAwait()
+        throws Exception
+    {
+        Class paramTypes[] = new Class[0];
+        Object paramValues[] = new Object[0];
+        Method method =
+            catalinaDaemon.getClass().getMethod("getAwait", paramTypes);
+        Boolean b=(Boolean)method.invoke(catalinaDaemon, paramValues);
+        return b.booleanValue();
+    }
+
+
+    /**
+     * Destroy the Catalina Daemon.
+     */
+    public void destroy() {
+
+        // FIXME
+
+    }
+
+
+    /**
+     * Main method, used for testing only.
+     *
+     * @param args Command line arguments to be processed
+     */
+    public static void main(String args[]) {
+
+        try {
+            // Attempt to load JMX class
+            new ObjectName("test:foo=bar");
+        } catch (Throwable t) {
+            System.out.println(JMX_ERROR_MESSAGE);
+            try {
+                // Give users some time to read the message before exiting
+                Thread.sleep(5000);
+            } catch (Exception ex) {
+            }
+            return;
+        }
+
+        if (daemon == null) {
+            daemon = new Bootstrap();
+            try {
+                daemon.init();
+            } catch (Throwable t) {
+                t.printStackTrace();
+                return;
+            }
+        }
+
+        try {
+            String command = "start";
+            if (args.length > 0) {
+                command = args[args.length - 1];
+            }
+
+            if (command.equals("startd")) {
+                args[0] = "start";
+                daemon.load(args);
+                daemon.start();
+            } else if (command.equals("stopd")) {
+                args[0] = "stop";
+                daemon.stop();
+            } else if (command.equals("start")) {
+                daemon.setAwait(true);
+                daemon.load(args);
+                daemon.start();
+            } else if (command.equals("stop")) {
+                daemon.stopServer(args);
+            } else {
+                log.warn("Bootstrap: command \"" + command + "\" does not 
exist.");
+            }
+        } catch (Throwable t) {
+            t.printStackTrace();
+        }
+
+    }
+
+    public void setCatalinaHome(String s) {
+        System.setProperty( "catalina.home", s );
+    }
+
+    public void setCatalinaBase(String s) {
+        System.setProperty( "catalina.base", s );
+    }
+
+
+    /**
+     * Set the <code>catalina.base</code> System property to the current
+     * working directory if it has not been set.
+     */
+    private void setCatalinaBase() {
+
+        if (System.getProperty("catalina.base") != null)
+            return;
+        if (System.getProperty("catalina.home") != null)
+            System.setProperty("catalina.base",
+                               System.getProperty("catalina.home"));
+        else
+            System.setProperty("catalina.base",
+                               System.getProperty("user.dir"));
+
+    }
+
+
+    /**
+     * Set the <code>catalina.home</code> System property to the current
+     * working directory if it has not been set.
+     */
+    private void setCatalinaHome() {
+
+        if (System.getProperty("catalina.home") != null)
+            return;
+        File bootstrapJar = 
+            new File(System.getProperty("user.dir"), "bootstrap.jar");
+        if (bootstrapJar.exists()) {
+            try {
+                System.setProperty
+                    ("catalina.home", 
+                     (new File(System.getProperty("user.dir"), ".."))
+                     .getCanonicalPath());
+            } catch (Exception e) {
+                // Ignore
+                System.setProperty("catalina.home",
+                                   System.getProperty("user.dir"));
+            }
+        } else {
+            System.setProperty("catalina.home",
+                               System.getProperty("user.dir"));
+        }
+
+    }
+
+
+    /**
+     * Get the value of the catalina.home environment variable.
+     */
+    public static String getCatalinaHome() {
+        return System.getProperty("catalina.home",
+                                  System.getProperty("user.dir"));
+    }
+
+
+    /**
+     * Get the value of the catalina.base environment variable.
+     */
+    public static String getCatalinaBase() {
+        return System.getProperty("catalina.base", getCatalinaHome());
+    }
+
+
+}

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ClassLoaderFactory.java
URL: 
http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ClassLoaderFactory.java?rev=393433&r1=393432&r2=393433&view=diff
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ClassLoaderFactory.java 
(original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ClassLoaderFactory.java 
Wed Apr 12 03:54:41 2006
@@ -1,167 +1,259 @@
-/*
- * Copyright 1999,2004 The Apache Software Foundation.
- * 
- * Licensed 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.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package org.apache.catalina.startup;
-
-
-import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-
-import org.apache.catalina.loader.StandardClassLoader;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-
-/**
- * <p>Utility class for building class loaders for Catalina.  The factory
- * method requires the following parameters in order to build a new class
- * loader (with suitable defaults in all cases):</p>
- * <ul>
- * <li>A set of directories containing unpacked classes (and resources)
- *     that should be included in the class loader's
- *     repositories.</li>
- * <li>A set of directories containing classes and resources in JAR files.
- *     Each readable JAR file discovered in these directories will be
- *     added to the class loader's repositories.</li>
- * <li><code>ClassLoader</code> instance that should become the parent of
- *     the new class loader.</li>
- * </ul>
- *
- * @author Craig R. McClanahan
- * @version $Revision: 303210 $ $Date: 2004-09-08 01:13:01 +0200 (mer., 08 
sept. 2004) $
- */
-
-public final class ClassLoaderFactory {
-
-
-    private static Log log = LogFactory.getLog(ClassLoaderFactory.class);
-
-    // --------------------------------------------------------- Public Methods
-
-
-    /**
-     * Create and return a new class loader, based on the configuration
-     * defaults and the specified directory paths:
-     *
-     * @param unpacked Array of pathnames to unpacked directories that should
-     *  be added to the repositories of the class loader, or <code>null</code> 
-     * for no unpacked directories to be considered
-     * @param packed Array of pathnames to directories containing JAR files
-     *  that should be added to the repositories of the class loader, 
-     * or <code>null</code> for no directories of JAR files to be considered
-     * @param parent Parent class loader for the new class loader, or
-     *  <code>null</code> for the system class loader.
-     *
-     * @exception Exception if an error occurs constructing the class loader
-     */
-    public static ClassLoader createClassLoader(File unpacked[],
-                                                File packed[],
-                                                ClassLoader parent)
-        throws Exception {
-        return createClassLoader(unpacked, packed, null, parent);
-    }
-
-
-    /**
-     * Create and return a new class loader, based on the configuration
-     * defaults and the specified directory paths:
-     *
-     * @param unpacked Array of pathnames to unpacked directories that should
-     *  be added to the repositories of the class loader, or <code>null</code> 
-     * for no unpacked directories to be considered
-     * @param packed Array of pathnames to directories containing JAR files
-     *  that should be added to the repositories of the class loader, 
-     * or <code>null</code> for no directories of JAR files to be considered
-     * @param urls Array of URLs to remote repositories, designing either JAR 
-     *  resources or uncompressed directories that should be added to 
-     *  the repositories of the class loader, or <code>null</code> for no 
-     *  directories of JAR files to be considered
-     * @param parent Parent class loader for the new class loader, or
-     *  <code>null</code> for the system class loader.
-     *
-     * @exception Exception if an error occurs constructing the class loader
-     */
-    public static ClassLoader createClassLoader(File unpacked[],
-                                                File packed[],
-                                                URL urls[],
-                                                ClassLoader parent)
-        throws Exception {
-
-        if (log.isDebugEnabled())
-            log.debug("Creating new class loader");
-
-        // Construct the "class path" for this class loader
-        ArrayList list = new ArrayList();
-
-        // Add unpacked directories
-        if (unpacked != null) {
-            for (int i = 0; i < unpacked.length; i++)  {
-                File file = unpacked[i];
-                if (!file.exists() || !file.canRead())
-                    continue;
-                file = new File(file.getCanonicalPath() + File.separator);
-                URL url = file.toURL();
-                if (log.isDebugEnabled())
-                    log.debug("  Including directory " + url);
-                list.add(url);
-            }
-        }
-
-        // Add packed directory JAR files
-        if (packed != null) {
-            for (int i = 0; i < packed.length; i++) {
-                File directory = packed[i];
-                if (!directory.isDirectory() || !directory.exists() ||
-                    !directory.canRead())
-                    continue;
-                String filenames[] = directory.list();
-                for (int j = 0; j < filenames.length; j++) {
-                    String filename = filenames[j].toLowerCase();
-                    if (!filename.endsWith(".jar"))
-                        continue;
-                    File file = new File(directory, filenames[j]);
-                    if (log.isDebugEnabled())
-                        log.debug("  Including jar file " + 
file.getAbsolutePath());
-                    URL url = file.toURL();
-                    list.add(url);
-                }
-            }
-        }
-
-        // Add URLs
-        if (urls != null) {
-            for (int i = 0; i < urls.length; i++) {
-                if (log.isDebugEnabled())
-                    log.debug("  Including URL " + urls[i]);
-                list.add(urls[i]);
-            }
-        }
-
-        // Construct the class loader itself
-        URL[] array = (URL[]) list.toArray(new URL[list.size()]);
-        StandardClassLoader classLoader = null;
-        if (parent == null)
-            classLoader = new StandardClassLoader(array);
-        else
-            classLoader = new StandardClassLoader(array, parent);
-        return (classLoader);
-
-    }
-
-
-}
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.catalina.startup;
+
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+
+import org.apache.catalina.loader.StandardClassLoader;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+/**
+ * <p>Utility class for building class loaders for Catalina.  The factory
+ * method requires the following parameters in order to build a new class
+ * loader (with suitable defaults in all cases):</p>
+ * <ul>
+ * <li>A set of directories containing unpacked classes (and resources)
+ *     that should be included in the class loader's
+ *     repositories.</li>
+ * <li>A set of directories containing classes and resources in JAR files.
+ *     Each readable JAR file discovered in these directories will be
+ *     added to the class loader's repositories.</li>
+ * <li><code>ClassLoader</code> instance that should become the parent of
+ *     the new class loader.</li>
+ * </ul>
+ *
+ * @author Craig R. McClanahan
+ * @version $Revision: 303210 $ $Date: 2004-09-08 01:13:01 +0200 (mer., 08 
sept. 2004) $
+ */
+
+public final class ClassLoaderFactory {
+
+
+    private static Log log = LogFactory.getLog(ClassLoaderFactory.class);
+
+    protected static final Integer IS_DIR = new Integer(0);
+    protected static final Integer IS_JAR = new Integer(1);
+    protected static final Integer IS_GLOB = new Integer(2);
+    protected static final Integer IS_URL = new Integer(3);
+
+    // --------------------------------------------------------- Public Methods
+
+
+    /**
+     * Create and return a new class loader, based on the configuration
+     * defaults and the specified directory paths:
+     *
+     * @param unpacked Array of pathnames to unpacked directories that should
+     *  be added to the repositories of the class loader, or <code>null</code> 
+     * for no unpacked directories to be considered
+     * @param packed Array of pathnames to directories containing JAR files
+     *  that should be added to the repositories of the class loader, 
+     * or <code>null</code> for no directories of JAR files to be considered
+     * @param parent Parent class loader for the new class loader, or
+     *  <code>null</code> for the system class loader.
+     *
+     * @exception Exception if an error occurs constructing the class loader
+     */
+    public static ClassLoader createClassLoader(File unpacked[],
+                                                File packed[],
+                                                ClassLoader parent)
+        throws Exception {
+        return createClassLoader(unpacked, packed, null, parent);
+    }
+
+
+    /**
+     * Create and return a new class loader, based on the configuration
+     * defaults and the specified directory paths:
+     *
+     * @param unpacked Array of pathnames to unpacked directories that should
+     *  be added to the repositories of the class loader, or <code>null</code> 
+     * for no unpacked directories to be considered
+     * @param packed Array of pathnames to directories containing JAR files
+     *  that should be added to the repositories of the class loader, 
+     * or <code>null</code> for no directories of JAR files to be considered
+     * @param urls Array of URLs to remote repositories, designing either JAR 
+     *  resources or uncompressed directories that should be added to 
+     *  the repositories of the class loader, or <code>null</code> for no 
+     *  directories of JAR files to be considered
+     * @param parent Parent class loader for the new class loader, or
+     *  <code>null</code> for the system class loader.
+     *
+     * @exception Exception if an error occurs constructing the class loader
+     */
+    public static ClassLoader createClassLoader(File unpacked[],
+                                                File packed[],
+                                                URL urls[],
+                                                ClassLoader parent)
+        throws Exception {
+
+        if (log.isDebugEnabled())
+            log.debug("Creating new class loader");
+
+        // Construct the "class path" for this class loader
+        ArrayList list = new ArrayList();
+
+        // Add unpacked directories
+        if (unpacked != null) {
+            for (int i = 0; i < unpacked.length; i++)  {
+                File file = unpacked[i];
+                if (!file.exists() || !file.canRead())
+                    continue;
+                file = new File(file.getCanonicalPath() + File.separator);
+                URL url = file.toURL();
+                if (log.isDebugEnabled())
+                    log.debug("  Including directory " + url);
+                list.add(url);
+            }
+        }
+
+        // Add packed directory JAR files
+        if (packed != null) {
+            for (int i = 0; i < packed.length; i++) {
+                File directory = packed[i];
+                if (!directory.isDirectory() || !directory.exists() ||
+                    !directory.canRead())
+                    continue;
+                String filenames[] = directory.list();
+                for (int j = 0; j < filenames.length; j++) {
+                    String filename = filenames[j].toLowerCase();
+                    if (!filename.endsWith(".jar"))
+                        continue;
+                    File file = new File(directory, filenames[j]);
+                    if (log.isDebugEnabled())
+                        log.debug("  Including jar file " + 
file.getAbsolutePath());
+                    URL url = file.toURL();
+                    list.add(url);
+                }
+            }
+        }
+
+        // Construct the class loader itself
+        URL[] array = (URL[]) list.toArray(new URL[list.size()]);
+        StandardClassLoader classLoader = null;
+        if (parent == null)
+            classLoader = new StandardClassLoader(array);
+        else
+            classLoader = new StandardClassLoader(array, parent);
+        return (classLoader);
+
+    }
+
+
+    /**
+     * Create and return a new class loader, based on the configuration
+     * defaults and the specified directory paths:
+     *
+     * @param locations Array of strings containing class directories, jar 
files,
+     *  jar directories or URLS that should be added to the repositories of
+     *  the class loader. The type is given by the member of param types.
+     * @param types Array of types for the members of param locations.
+     *  Possible values are IS_DIR (class directory), IS_JAR (single jar file),
+     *  IS_GLOB (directory of jar files) and IS_URL (URL).
+     * @param parent Parent class loader for the new class loader, or
+     *  <code>null</code> for the system class loader.
+     *
+     * @exception Exception if an error occurs constructing the class loader
+     */
+    public static ClassLoader createClassLoader(String locations[],
+                                                Integer types[],
+                                                ClassLoader parent)
+        throws Exception {
+
+        if (log.isDebugEnabled())
+            log.debug("Creating new class loader");
+
+        // Construct the "class path" for this class loader
+        ArrayList list = new ArrayList();
+
+        if (locations != null && types != null && locations.length == 
types.length) {
+            for (int i = 0; i < locations.length; i++)  {
+                String location = locations[i];
+                if ( types[i] == IS_URL ) {
+                    URL url = new URL(location);
+                    if (log.isDebugEnabled())
+                        log.debug("  Including URL " + url);
+                    list.add(url);
+                } else if ( types[i] == IS_DIR ) {
+                    File directory = new File(location);
+                    directory = new File(directory.getCanonicalPath());
+                    if (!directory.exists() || !directory.isDirectory() ||
+                        !directory.canRead())
+                         continue;
+                    URL url = directory.toURL();
+                    if (log.isDebugEnabled())
+                        log.debug("  Including directory " + url);
+                    list.add(url);
+                } else if ( types[i] == IS_JAR ) {
+                    File file=new File(location);
+                    file = new File(file.getCanonicalPath());
+                    if (!file.exists() || !file.canRead())
+                        continue;
+                    URL url = file.toURL();
+                    if (log.isDebugEnabled())
+                        log.debug("  Including jar file " + url);
+                    list.add(url);
+                } else if ( types[i] == IS_GLOB ) {
+                    File directory=new File(location);
+                    if (!directory.exists() || !directory.isDirectory() ||
+                        !directory.canRead())
+                        continue;
+                    if (log.isDebugEnabled())
+                        log.debug("  Including directory glob "
+                            + directory.getAbsolutePath());
+                    String filenames[] = directory.list();
+                    for (int j = 0; j < filenames.length; j++) {
+                        String filename = filenames[j].toLowerCase();
+                        if (!filename.endsWith(".jar"))
+                            continue;
+                        File file = new File(directory, filenames[j]);
+                        file = new File(file.getCanonicalPath());
+                        if (!file.exists() || !file.canRead())
+                            continue;
+                        if (log.isDebugEnabled())
+                            log.debug("    Including glob jar file "
+                                + file.getAbsolutePath());
+                        URL url = file.toURL();
+                        list.add(url);
+                    }
+                }
+            }
+        }
+
+        // Construct the class loader itself
+        URL[] array = (URL[]) list.toArray(new URL[list.size()]);
+        if (log.isDebugEnabled())
+            for (int i = 0; i < array.length; i++) {
+                log.debug("  location " + i + " is " + array[i]);
+            }
+        StandardClassLoader classLoader = null;
+        if (parent == null)
+            classLoader = new StandardClassLoader(array);
+        else
+            classLoader = new StandardClassLoader(array, parent);
+        return (classLoader);
+
+    }
+
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to