LoaderManager.java

00001 
00026 package org.objectweb.jonas.server;
00027 
00028 
00029 import java.io.File;
00030 import java.util.Hashtable;
00031 import java.util.Map;
00032 import java.util.StringTokenizer;
00033 
00034 import org.objectweb.jonas.common.JProp;
00035 
00041 public class LoaderManager {
00042 
00046     private static LoaderManager instance = null;
00047 
00051     private static final String COMMONS = "loader.commons";
00052 
00056     private static final String TOOLS   = "loader.tools";
00057 
00061     private static final String APPS    = "loader.apps";
00062 
00066     private static final String CATALINA = "loader.catalina";
00067 
00071     private static final String CATALINA_BOOTSTRAP_JAR = "bin" + File.separator + "bootstrap.jar";
00072 
00076     private static final String MORTBAY_JETTY_JAR = "lib" + File.separator + "org.mortbay.jetty.jar";
00077 
00081     private JProp jp = null;
00082 
00086     private Map loaders = null;
00087 
00091     private static File jonasLib = null;
00092 
00096     private static File catalinaLib = null;
00097 
00101     private static File jettyLib = null;
00102 
00106     private static String jonasBase = null;
00107 
00111     private static String catalinaHome = null;
00112 
00116     private static String jettyHome = null;
00117 
00121     private boolean hasWeb = false;
00122 
00126     private boolean useDefaultClassPath = false;
00127 
00131     private boolean isCatalina = false;
00132 
00136     private File jonasCommonsDir;
00137 
00141     private File jonasToolsDir;
00142 
00146     private File jonasAppsDir;
00147 
00151     private LoaderManager() {
00152         // Get the $JONAS_ROOT/lib directories
00153         String jonasRoot = System.getProperty("install.root");
00154         if (jonasRoot == null) {
00155             System.err.println("JONAS_ROOT is not set");
00156             System.exit(2);
00157         }
00158 
00159         jonasLib = new File(jonasRoot, "lib");
00160         jonasCommonsDir = new File(jonasLib, "commons");
00161         jonasToolsDir = new File(jonasLib, "tools");
00162         jonasAppsDir = new File(jonasLib, "apps");
00163         catalinaLib = new File(jonasLib, "catalina");
00164         jettyLib = new File(jonasLib, "jetty");
00165 
00166         // Init loaders map
00167         loaders = new Hashtable();
00168     }
00169 
00173     public static LoaderManager getInstance() {
00174         if (instance == null) {
00175             instance = new LoaderManager();
00176         }
00177         return instance;
00178     }
00179 
00185     public void init(JProp props) {
00186         jp = props;
00187         // Get $JONAS_BASE
00188         jonasBase = JProp.getJonasBase();
00189 
00190         useDefaultClassPath = jp.getValueAsBoolean("jonas.default.classloader", false);
00191 
00192         // find web services
00193         String[] services = props.getValueAsArray("jonas.services");
00194         if (services != null) {
00195             for (int i = 0; i < services.length; i++) {
00196                 if (services[i].equals("web")) {
00197                     hasWeb = true;
00198                     String classname = props.getValue("jonas.service.web.class");
00199                     if (classname.matches(".*Catalina.*")) {
00200                         isCatalina = true;
00201                     }
00202                 }
00203             }
00204         }
00205 
00206         catalinaHome = System.getProperty("catalina.home");
00207         jettyHome = System.getProperty("jetty.home");
00208 
00209         // Set in all case catalina.home and base to $JONAS_BASE
00210         // if library is found. Useful if a user want to run in
00211         // a same environment JOnAS/Tomcat and Tomcat with different
00212         // versions
00213         if (hasEmbeddedCatalina()) {
00214             System.setProperty("catalina.home", catalinaLib.getPath());
00215             System.setProperty("catalina.base", jonasBase);
00216             catalinaHome = catalinaLib.getPath();
00217         }
00218 
00219         // Set jetty.home to $JONAS_BASE if library is found
00220         // and if jetty.home isn't set.
00221         if (jettyHome == null) {
00222             if (hasEmbeddedJetty()) {
00223                 System.setProperty("jetty.home", jettyLib.getPath());
00224                 jettyHome = jettyLib.getPath();
00225             }
00226         }
00227 
00228     }
00229 
00233     private boolean hasEmbeddedCatalina() {
00234         return new File(catalinaLib, CATALINA_BOOTSTRAP_JAR).exists();
00235     }
00236 
00240     private boolean hasEmbeddedJetty() {
00241         return new File(jettyLib, MORTBAY_JETTY_JAR).exists();
00242     }
00243 
00248     public JClassLoader getCommonsLoader() throws Exception {
00249         JClassLoader commons = getLoader(COMMONS);
00250         if (commons == null) {
00251             commons = createCommonsClassLoader();
00252             setLoader(COMMONS, commons);
00253         }
00254         return commons;
00255     }
00256 
00261     public JClassLoader getToolsLoader() throws Exception {
00262         JClassLoader tools = getLoader(TOOLS);
00263         if (tools == null) {
00264             tools = createToolsClassLoader();
00265             setLoader(TOOLS, tools);
00266         }
00267         return tools;
00268     }
00269 
00274     public JClassLoader getAppsLoader() throws Exception {
00275         JClassLoader apps = getLoader(APPS);
00276         if (apps == null) {
00277             apps = createAppsClassLoader();
00278             setLoader(APPS, apps);
00279         }
00280         return apps;
00281     }
00282 
00287     public JClassLoader getCatalinaLoader() throws Exception {
00288         JClassLoader catalina = getLoader(CATALINA);
00289         if (catalina == null) {
00290             catalina = createCatalinaClassLoader();
00291             setLoader(CATALINA, catalina);
00292         }
00293         return catalina;
00294     }
00295 
00307     private static JURLs getClassPath(boolean xtracp) throws Exception {
00308         String cpprop = "java.class.path";
00309         if (xtracp) {
00310             cpprop = "jonas.classpath";
00311         }
00312         String cpValue = System.getProperty(cpprop);
00313         //System.out.println("classpath=" + cpValue); // DEBUG
00314         String sep = File.pathSeparator;
00315         JURLs jurls = new JURLs();
00316         StringTokenizer tokenizer = new StringTokenizer(cpValue, sep);
00317         while (tokenizer.hasMoreTokens()) {
00318             File file = new File(tokenizer.nextToken());
00319             if (file.isDirectory()) {
00320                 jurls.addDir(file);
00321             } else {
00322                 // TODO check for ${jonas.root}/lib/bootstrap
00323                 // do not re-add bootstrap.jar inside classloader
00324                 if (!file.getName().equals("ow_jonas_bootstrap.jar")) {
00325                     jurls.add(file);
00326                 }
00327             }
00328         }
00329         return jurls;
00330     }
00331 
00339     private JClassLoader getLoader(String name) {
00340         return (JClassLoader) loaders.get(name);
00341     }
00342 
00349     private void setLoader(String name, JClassLoader loader) {
00350         loaders.put(name, loader);
00351     }
00352 
00359     private JClassLoader createCommonsClassLoader() throws Exception {
00360 
00361         JURLs jurls = new JURLs();
00362 
00363         // add classpath in loader
00364         jurls.merge(getClassPath(useDefaultClassPath));
00365 
00366         // Load $JONAS_ROOT/lib/commons/**/*.jar
00367         jurls.add(jonasCommonsDir, ".jar");
00368 
00369         // add jonas.base/lib/ext only if jonas.base != jonas.root
00370         // jonas.base/lib/ext is added before jonas.root/lib/ext
00371         if (!System.getProperty("install.root").toLowerCase().equals(jonasBase.toLowerCase())) {
00372             File jonasBaseLibExt = new File(jonasBase + File.separator + "lib" + File.separator + "ext");
00373             if (jonasBaseLibExt.exists()) {
00374                 jurls.add(jonasBaseLibExt, ".jar");
00375             }
00376         }
00377 
00378         // add jonas.root/lib/ext
00379         jurls.add(new File(jonasLib, "ext"), ".jar");
00380 
00381         if (hasWeb) {
00382             // resources for catalina have been put in apps ClassLoader
00383 
00384             // add resources for jetty if required
00385             if (jettyHome != null && !isCatalina) {
00386                 File jettyLibDir = new File(jettyHome, "lib");
00387                 File jettyExtDir = new File(jettyHome, "ext");
00388                 jurls.add(jettyLibDir, ".jar");
00389                 jurls.add(jettyExtDir, ".jar");
00390                 if (!hasEmbeddedJetty()) {
00391                     // load ${jonas.root}/jetty/lib/ow_jonas_jetty.jar
00392                     File jonasJetty5Glue = new File(new File(jettyLib, "lib"), "ow_jonas_jetty.jar");
00393                     jurls.add(jonasJetty5Glue);
00394                 }
00395             }
00396             // else user has not set the webcontainer HOME var
00397         }
00398 
00399         return new JClassLoader("Commons", jurls.toURLs());
00400     }
00401 
00409     private JClassLoader createToolsClassLoader() throws Exception {
00410         JURLs jurls = new JURLs();
00411 
00412         jurls.add(jonasToolsDir, ".jar");
00413 
00414         return new JClassLoader("Tools", jurls.toURLs(), getCommonsLoader());
00415     }
00416 
00425     private JClassLoader createAppsClassLoader() throws Exception {
00426         JURLs jurls = new JURLs();
00427 
00428         // ${jonas.root}/lib/apps
00429         jurls.add(jonasAppsDir, ".jar");
00430 
00431         if (hasWeb) {
00432             // add resources for catalina if required
00433             if (catalinaHome != null && isCatalina) {
00434                 File catalinaBinDir = new File(catalinaHome, "bin");
00435                 File catalinaCommonLibDir = new File(catalinaHome, "common" + File.separator + "lib");
00436                 File catalinaSharedLibDir = new File(catalinaHome, "shared" + File.separator + "lib");
00437                 jurls.add(new File(catalinaBinDir, "bootstrap.jar"));
00438                 jurls.add(catalinaCommonLibDir, ".jar");
00439                 jurls.add(catalinaSharedLibDir, ".jar");
00440             }
00441         }
00442         return new JClassLoader("Apps", jurls.toURLs(), getCommonsLoader());
00443     }
00444 
00452     private JClassLoader createCatalinaClassLoader() throws Exception {
00453         JURLs jurls = new JURLs();
00454 
00455         // ${catalina.home}/server/lib/*jar
00456         File catalinaServerLibDir = new File(catalinaHome, "server" + File.separator + "lib");
00457         jurls.add(catalinaServerLibDir, ".jar");
00458 
00459         // ${jonas.root}/catalina/server/lib/ow_jonas_tomcat5.jar
00460         if (!hasEmbeddedCatalina()) {
00461             // add ow_jonas_tomcat.jar only if using external Tomcat
00462             File jonasTomcat5Glue = new File(catalinaLib, "server" + File.separator + "lib" + File.separator + "ow_jonas_tomcat5.jar");
00463             if (jonasTomcat5Glue.exists()) {
00464                 jurls.add(jonasTomcat5Glue);
00465             } else {
00466                 System.out.println("WARN : No ow_jonas_tomcat5.jar found in " + catalinaLib + "/server/lib directory.");
00467             }
00468         }
00469         return new JClassLoader("Catalina", jurls.toURLs(), getAppsLoader());
00470     }
00471 }

Generated on Tue Feb 15 15:05:24 2005 for JOnAS by  doxygen 1.3.9.1