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
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
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
00188 jonasBase = JProp.getJonasBase();
00189
00190 useDefaultClassPath = jp.getValueAsBoolean("jonas.default.classloader", false);
00191
00192
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
00210
00211
00212
00213 if (hasEmbeddedCatalina()) {
00214 System.setProperty("catalina.home", catalinaLib.getPath());
00215 System.setProperty("catalina.base", jonasBase);
00216 catalinaHome = catalinaLib.getPath();
00217 }
00218
00219
00220
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
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
00323
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
00364 jurls.merge(getClassPath(useDefaultClassPath));
00365
00366
00367 jurls.add(jonasCommonsDir, ".jar");
00368
00369
00370
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
00379 jurls.add(new File(jonasLib, "ext"), ".jar");
00380
00381 if (hasWeb) {
00382
00383
00384
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
00392 File jonasJetty5Glue = new File(new File(jettyLib, "lib"), "ow_jonas_jetty.jar");
00393 jurls.add(jonasJetty5Glue);
00394 }
00395 }
00396
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
00429 jurls.add(jonasAppsDir, ".jar");
00430
00431 if (hasWeb) {
00432
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
00456 File catalinaServerLibDir = new File(catalinaHome, "server" + File.separator + "lib");
00457 jurls.add(catalinaServerLibDir, ".jar");
00458
00459
00460 if (!hasEmbeddedCatalina()) {
00461
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 }