All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.objectweb.jonas.server.LoaderManager Maven / Gradle / Ivy

The newest version!
/**
 * JOnAS: Java(TM) Open Application Server
 * Copyright (C) 1999-2007 Bull S.A.
 * Contact: [email protected]
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
 * USA
 *
 * --------------------------------------------------------------------------
 * $Id: LoaderManager.java 10822 2007-07-04 08:26:06Z durieuxp $
 * --------------------------------------------------------------------------
 */

package org.objectweb.jonas.server;


import java.io.File;
import java.net.URL;
import java.util.Hashtable;
import java.util.Map;
import java.util.StringTokenizer;

import org.objectweb.jonas.common.JProp;

/**
 * This class create all the ClassLoader necessary for JOnAS.
 *
 * 
 *      system ($CLASSPATH)
 *         |
 *      commons
 *        /\
 *       /  \
 *      /    \
 *    apps   tools
 *      \
 *    catalina
 * 
 *
 * @author Guillaume Sauthier
 */
public final class LoaderManager {

    /**
     * Singleton instance of LoaderManager.
     */
    private static LoaderManager instance = null;

    /**
     * ClassLoader name for Commons libs.
     */
    private static final String COMMONS = "loader.commons";

    /**
     * ClassLoader name for Tools libs.
     */
    private static final String TOOLS   = "loader.tools";

    /**
     * ClassLoader name for Applications.
     */
    private static final String APPS    = "loader.apps";

    /**
     * ClassLoader name for Catalina.
     */
    private static final String CATALINA = "loader.catalina";

    /**
     * Catalina Bootstrap.jar (used to know if we're using external revision of Tomcat).
     */
    private static final String CATALINA_BOOTSTRAP_JAR = "bin" + File.separator + "bootstrap.jar";

    /**
     * JProp instance.
     */
    private JProp jp = null;

    /**
     * ClassLoaders.
     */
    private Map loaders = null;

    /**
     * $JONAS_ROOT/lib.
     */
    private static File jonasLib = null;

    /**
     * $JONAS_ROOT/lib/catalina.
     */
    private static File catalinaLib = null;

    /**
     * $JONAS_ROOT/lib/tomcat6.
     */
    private static File tomcat6Lib = null;

    /**
     * $JONAS_ROOT/lib/jetty6.
     */
    private static File jetty6Lib = null;

    /**
     * $JONAS_ROOT.
     */
    private static String jonasRoot = null;

    /**
     * $JONAS_BASE.
     */
    private static String jonasBase = null;

    /**
     * $CATALINA_HOME.
     */
    private static String catalinaHome = null;

    /**
     * true if JOnAS is launched with web container.
     */
    private boolean hasWeb = false;

    /**
     * Use the default Classpath ?
     */
    private boolean useDefaultClassPath = false;

    /**
     * is the web container provided by Catalina.
     */
    private boolean isCatalina = false;

    /**
     * is the web container provided by Tomcat6.
     */
    private boolean isTomcat6 = false;

    /**
     * ${jonas.root}/lib/commons.
     */
    private File jonasCommonsDir;

    /**
     * ${jonas.root}/lib/tools.
     */
    private File jonasToolsDir;

    /**
     * ${jonas.root}/lib/apps.
     */
    private File jonasAppsDir;

    /**
     * Create a LoaderManager instance.
     */
    private LoaderManager() {
        // Get the $JONAS_ROOT/lib directories
        jonasRoot = System.getProperty("install.root");
        if (jonasRoot == null) {
            System.err.println("JONAS_ROOT is not set");
            System.exit(2);
        }

        jonasLib = new File(jonasRoot, "lib");
        jonasCommonsDir = new File(jonasLib, "commons");
        jonasToolsDir = new File(jonasLib, "tools");
        jonasAppsDir = new File(jonasLib, "apps");
        catalinaLib = new File(jonasLib, "catalina");
        jetty6Lib = new File(jonasLib, "jetty6");
        tomcat6Lib = new File(jonasLib, "tomcat6");

        // Init loaders map
        loaders = new Hashtable();
    }

    /**
     * @return Returns the unique instance of LoaderManager.
     */
    public static LoaderManager getInstance() {
        if (instance == null) {
            instance = new LoaderManager();
        }
        return instance;
    }

    /**
     * Initialize the LoaderManager with a JProp instance.
     *
     * @param props JProp used to configure JOnAS
     */
    public void init(final JProp props) {
        jp = props;
        // Get $JONAS_BASE
        jonasBase = JProp.getJonasBase();

        useDefaultClassPath = jp.getValueAsBoolean("jonas.default.classloader", false);

        // find web services
        String[] services = props.getValueAsArray("jonas.services");
        if (services != null) {
            for (int i = 0; i < services.length; i++) {
                if (services[i].equals("web")) {
                    hasWeb = true;
                    String classname = props.getValue("jonas.service.web.class");
                    if (classname.matches(".*Catalina.*") || classname.matches(".*Tomcat6.*")) {
                        isCatalina = true;
                    }
                    if (classname.matches(".*Tomcat6.*")) {
                        isTomcat6 = true;
                    }
                    break;
                }
            }
        }

        catalinaHome = System.getProperty("catalina.home");

        // Set in all case catalina.home and base to $JONAS_BASE
        // if library is found. Useful if a user want to run in
        // a same environment JOnAS/Tomcat and Tomcat with different
        // versions
        if (hasEmbeddedCatalina5() && !isTomcat6) {
            System.setProperty("catalina.home", catalinaLib.getPath());
            System.setProperty("catalina.base", jonasBase);
            catalinaHome = catalinaLib.getPath();
        }
        if (isTomcat6) {
            System.setProperty("catalina.home", jonasRoot);
            System.setProperty("catalina.base", jonasBase);
            catalinaHome = jonasRoot;
        }
    }

    /**
     * @return Returns true if using embedded catalina classes.
     */
    private boolean hasEmbeddedCatalina5() {
        return new File(catalinaLib, CATALINA_BOOTSTRAP_JAR).exists();
    }

    /**
     * @return Returns the Commons ClassLoader
     * @throws Exception When ClassLoader cannot be created.
     */
    public JClassLoader getCommonsLoader() throws Exception {
        JClassLoader commons = getLoader(COMMONS);
        if (commons == null) {
            commons = createCommonsClassLoader();
            setLoader(COMMONS, commons);
        }
        return commons;
    }

    /**
     * @return returns the Tools ClassLoader
     * @throws Exception When ClassLoader cannot be created
     */
    public JClassLoader getToolsLoader() throws Exception {
        JClassLoader tools = getLoader(TOOLS);
        if (tools == null) {
            tools = createToolsClassLoader();
            setLoader(TOOLS, tools);
        }
        return tools;
    }

    /**
     * @return Returns the Application ClassLoader
     * @throws Exception When ClassLoader cannot be created
     */
    public JClassLoader getAppsLoader() throws Exception {
        JClassLoader apps = getLoader(APPS);
        if (apps == null) {
            apps = createAppsClassLoader();
            setLoader(APPS, apps);
        }
        return apps;
    }

    /**
     * @return Returns the Catalina ClassLoader
     * @throws Exception When ClassLoader cannot be created.
     */
    public JClassLoader getCatalinaLoader() throws Exception {
        JClassLoader catalina = getLoader(CATALINA);
        if (catalina == null) {
            catalina = createCatalinaClassLoader();
            setLoader(CATALINA, catalina);
        }
        return catalina;
    }

    /**
     * Return an array containing all the resources declared in the classpath
     * environment variable.
     *
     * @param xtracp XTRA classpath
     *
     * @return a list containing all the resources declared in the classpath
     * environment variable.
     *
     * @throws Exception if a resource cannot be found.
     */
    private static JURLs getClassPath(final boolean xtracp) throws Exception {
        String cpprop = "java.class.path";
        if (xtracp) {
            cpprop = "jonas.classpath";
        }
        String cpValue = System.getProperty(cpprop);
        //System.out.println("classpath=" + cpValue); // DEBUG
        String sep = File.pathSeparator;
        JURLs jurls = new JURLs();
        StringTokenizer tokenizer = new StringTokenizer(cpValue, sep);
        while (tokenizer.hasMoreTokens()) {
            File file = new File(tokenizer.nextToken());
            if (file.isDirectory()) {
                jurls.addDir(file);
            } else {
                // TODO check for ${jonas.root}/lib/bootstrap
                // do not re-add bootstrap.jar inside classloader
                if (!file.getName().equals("ow_jonas_bootstrap.jar")) {
                    jurls.add(file);
                }
            }
        }
        return jurls;
    }

    /**
     * Returns a JClassLoader.
     *
     * @param name name of the loader
     *
     * @return Returns the JClassLoader
     */
    private JClassLoader getLoader(final String name) {
        return (JClassLoader) loaders.get(name);
    }

    /**
     * Add a couple (name, ClassLoader).
     *
     * @param name ClassLoader name
     * @param loader the ClassLoader
     */
    private void setLoader(final String name, final JClassLoader loader) {
        loaders.put(name, loader);
    }

    /**
     * Constructs the Commons ClassLoader.
     *
     * @return Returns the Commons ClassLoader.
     * @throws Exception When ClassLoader cannot be created from CLASSPATH or resources cannot be added to URLs List.
     */
    private JClassLoader createCommonsClassLoader() throws Exception {

        JURLs jurls = new JURLs();

        // add classpath in loader
        jurls.merge(getClassPath(useDefaultClassPath));

        // Load $JONAS_ROOT/lib/commons/**/*.jar
        jurls.add(jonasCommonsDir, ".jar");

        // Load $JONAS_BASE/lib/commons
        File jonasBaseLibCommons = new File(jonasBase, "lib" + File.separator + "commons");
        if (jonasBaseLibCommons.exists()) {
            jurls.add(jonasBaseLibCommons, ".jar");
        }

        // add jonas.base/lib/ext only if jonas.base != jonas.root
        // jonas.base/lib/ext is added before jonas.root/lib/ext
        if (!System.getProperty("install.root").toLowerCase().equals(jonasBase.toLowerCase())) {
            File jonasBaseLibExt = new File(jonasBase + File.separator + "lib" + File.separator + "ext");
            if (jonasBaseLibExt.exists()) {
                jurls.add(jonasBaseLibExt, ".jar");
            }
        }

        // add jonas.root/lib/ext
        jurls.add(new File(jonasLib, "ext"), ".jar");

        if (hasWeb) {
            // resources for catalina have been put in apps ClassLoader

            // add resources for jetty if required
            if (!isCatalina) {
                jurls.add(jetty6Lib, ".jar");
            }

            // Resources for Tomcat 6
            if (isTomcat6) {
                jurls.add(tomcat6Lib, ".jar");
            }
        }

        return new JClassLoader("Commons", jurls.toURLs());
    }

    /**
     * Constructs the Tools ClassLoader using Commons ClassLoader as parent.
     *
     * @return Returns the Tools ClassLoader
     *
     * @throws Exception When resources cannot be added to URL list.
     */
    private JClassLoader createToolsClassLoader() throws Exception {
        JURLs jurls = new JURLs();

        jurls.add(jonasToolsDir, ".jar");

        // Load $JONAS_BASE/lib/toolds
        File jonasBaseLibTools = new File(jonasBase, "lib" + File.separator + "tools");
        if (jonasBaseLibTools.exists()) {
            jurls.add(jonasBaseLibTools, ".jar");
        }

        return new JClassLoader("Tools", jurls.toURLs(), getCommonsLoader());
    }

    /**
     * Constructs the Application ClassLoader with Commons ClassLoader as parent.
     * At this time, this is an empty ClassLoader
     *
     * @return the Application ClassLoader
     *
     * @throws Exception When resources cannot be added to URL list.
     */
    private JClassLoader createAppsClassLoader() throws Exception {
        JURLs jurls = new JURLs();

        // ${jonas.root}/lib/apps
        jurls.add(jonasAppsDir, ".jar");

        // Load $JONAS_BASE/lib/apps
        File jonasBaseLibApps = new File(jonasBase, "lib" + File.separator + "apps");
        if (jonasBaseLibApps.exists()) {
            jurls.add(jonasBaseLibApps, ".jar");
        }

        if (hasWeb) {
            // add resources for catalina if required
            if (catalinaHome != null && isCatalina  && !isTomcat6) {
                File catalinaBinDir = new File(catalinaHome, "bin");
                File catalinaCommonLibDir = new File(catalinaHome, "common" + File.separator + "lib");
                File catalinaSharedLibDir = new File(catalinaHome, "shared" + File.separator + "lib");
                jurls.add(new File(catalinaBinDir, "bootstrap.jar"));
                jurls.add(catalinaCommonLibDir, ".jar");
                jurls.add(catalinaSharedLibDir, ".jar");
            }
        }
        return new JClassLoader("Apps", jurls.toURLs(), getCommonsLoader());
    }

    /**
     * Constructs the Catalina ClassLoader with Applications ClassLoader as parent.
     *
     * @return the Catalina ClassLoader
     *
     * @throws Exception When resources cannot be added to URL list.
     */
    private JClassLoader createCatalinaClassLoader() throws Exception {
        JURLs jurls = new JURLs();

        // Nothing to add, all is already added.
        if (isTomcat6) {
            return new JClassLoader("Tomcat6", new URL[0], getAppsLoader());
        }


        // ${jonas.root}/catalina/server/lib/ow_jonas_tomcat5.jar
        if (!hasEmbeddedCatalina5()) {
            // add ow_jonas_tomcat.jar only if using external Tomcat
            File jonasTomcat5Glue = new File(catalinaLib, "server" + File.separator + "lib" + File.separator
                    + "ow_jonas_tomcat5.jar");
            File jonasTomcat55Glue = new File(catalinaLib, "server" + File.separator + "lib" + File.separator
                    + "ow_jonas_tomcat55.jar");
            if (jonasTomcat5Glue.exists()) {
                jurls.add(jonasTomcat5Glue);
            } else if (jonasTomcat55Glue.exists()) {
                jurls.add(jonasTomcat55Glue);
            } else {
                System.out.println("WARN : No ow_jonas_tomcat5.jar found in " + catalinaLib + "/server/lib directory.");
            }
        }

        // ${catalina.home}/server/lib/*jar
        File catalinaServerLibDir = new File(catalinaHome, "server" + File.separator + "lib");
        jurls.add(catalinaServerLibDir, ".jar");


        return new JClassLoader("Catalina", jurls.toURLs(), getAppsLoader());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy