remm        2002/10/24 06:53:22

  Modified:    catalina/src/share/org/apache/catalina/startup
                        Bootstrap.java ClassLoaderFactory.java
  Added:       catalina/src/share/org/apache/catalina/startup
                        catalina.properties CatalinaProperties.java
  Log:
  - Since it didn't get vetoed, I'm going forward with the CL configurability feature.
  - Adds new catalina.properties file which allows to configure the three Catalina
    classloaders. This should allow to embed Tomcat in a more flexible way
    without using the Embedded class.
  - The functionality is far from being done. For example, it would be desirable to
    be able to specify the configuration source (currently hardcoded to
    conf/server.xml) in the properties file.
  
  Revision  Changes    Path
  1.5       +57 -4     
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/Bootstrap.java
  
  Index: Bootstrap.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/Bootstrap.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Bootstrap.java    22 Oct 2002 20:25:29 -0000      1.4
  +++ Bootstrap.java    24 Oct 2002 13:53:22 -0000      1.5
  @@ -71,6 +71,7 @@
   import java.net.MalformedURLException;
   import java.net.URL;
   import java.util.ArrayList;
  +import java.util.StringTokenizer;
   import org.apache.catalina.loader.StandardClassLoader;
   import org.apache.catalina.security.SecurityClassLoad;
   
  @@ -101,6 +102,7 @@
       protected ClassLoader catalinaLoader = null;
       protected ClassLoader sharedLoader = null;
   
  +    protected static final String CATALINA_TOKEN = "${catalina.home}";
       
       public void setDebug( int debug ) {
           this.debug=debug;
  @@ -109,10 +111,15 @@
       public void setArgs(String args[] ) {
           this.args=args;
       }
  +
  +
       // ----------------------------------------------------------- Main Program
   
  +
       public void initClassLoaders() {
           try {
  +
  +            /*
               File unpacked[] = new File[1];
               File packed[] = new File[1];
               File packed2[] = new File[2];
  @@ -142,6 +149,13 @@
               sharedLoader =
                   ClassLoaderFactory.createClassLoader(unpacked, packed,
                                                        commonLoader);
  +            */
  +
  +            ClassLoaderFactory.setDebug(debug);
  +            commonLoader = createClassLoader("common", null);
  +            catalinaLoader = createClassLoader("server", commonLoader);
  +            sharedLoader = createClassLoader("shared", commonLoader);
  +
           } catch (Throwable t) {
   
               log("Class loader creation threw exception", t);
  @@ -149,6 +163,45 @@
   
           }
       }
  +
  +
  +    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();
  +
  +        StringTokenizer tokenizer = new StringTokenizer(value, ",");
  +        while (tokenizer.hasMoreElements()) {
  +            String repository = tokenizer.nextToken();
  +            boolean packed = false;
  +            if (repository.startsWith(CATALINA_TOKEN)) {
  +                repository = getCatalinaHome() 
  +                    + repository.substring(CATALINA_TOKEN.length());
  +            }
  +            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]);
  +
  +        return ClassLoaderFactory.createClassLoader(unpacked, packed, parent);
  +
  +    }
  +
   
       // ----------------------------------------------------------- Main Program
   
  
  
  
  1.2       +7 -6      
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/ClassLoaderFactory.java
  
  Index: ClassLoaderFactory.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/ClassLoaderFactory.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ClassLoaderFactory.java   18 Jul 2002 16:47:48 -0000      1.1
  +++ ClassLoaderFactory.java   24 Oct 2002 13:53:22 -0000      1.2
  @@ -163,10 +163,11 @@
           if (unpacked != null) {
               for (int i = 0; i < unpacked.length; i++)  {
                   File file = unpacked[i];
  -                if (!file.isDirectory() || !file.exists() || !file.canRead())
  +                if (!file.exists() || !file.canRead())
                       continue;
                   if (debug >= 1)
  -                    log("  Including directory " + file.getAbsolutePath());
  +                    log("  Including directory or JAR " 
  +                        + file.getAbsolutePath());
                   URL url = new URL("file", null,
                                     file.getCanonicalPath() + File.separator);
                   list.add(url.toString());
  
  
  
  1.1                  
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/catalina.properties
  
  Index: catalina.properties
  ===================================================================
  #
  # List of comma-separated packages that start with or equal this string
  # will cause a security exception to be thrown when
  # passed to checkPackageAccess unless the
  # corresponding RuntimePermission ("accessClassInPackage."+package) has
  # been granted.
  package.access=sun.
  
  #
  # List of comma-separated packages that start with or equal this string
  # will cause a security exception to be thrown when
  # passed to checkPackageDefinition unless the
  # corresponding RuntimePermission ("defineClassInPackage."+package) has
  # been granted.
  #
  # by default, no packages are restricted for definition, and none of
  # the class loaders supplied with the JDK call checkPackageDefinition.
  #
  #package.definition=
  
  #
  # List of comma-separated paths defining the contents of the "common" 
  # classloader. Prefixes should be used to define what is the repository type.
  # Path may be relative to the CATALINA_HOME path or absolute. If left as blank,
  # the JVM system loader will be used as Catalina's "common" loader.
  # Examples:
  #     "foo": Add this folder as a class repository
  #     "foo/*.jar": Add all the JARs of the specified folder as class 
  #                  repositories
  #     "foo/bar.jar": Add bar.jar as a class repository
  
common.loader=${catalina.home}/common/classes,${catalina.home}/common/endorsed/*.jar,${catalina.home}/common/lib/*.jar
  
  #
  # List of comma-separated paths defining the contents of the "server" 
  # classloader. Prefixes should be used to define what is the repository type.
  # Path may be relative to the CATALINA_HOME path or absolute. If left as blank,
  # the "common" loader will be used as Catalina's "server" loader.
  # Examples:
  #     "foo": Add this folder as a class repository
  #     "foo/*.jar": Add all the JARs of the specified folder as class 
  #                  repositories
  #     "foo/bar.jar": Add bar.jar as a class repository
  server.loader=${catalina.home}/server/classes,${catalina.home}/server/lib/*.jar
  
  #
  # List of comma-separated paths defining the contents of the "shared" 
  # classloader. Prefixes should be used to define what is the repository type.
  # Path may be relative to the CATALINA_BASE path or absolute. If left as blank,
  # the "common" loader will be used as Catalina's "shared" loader.
  # Examples:
  #     "foo": Add this folder as a class repository
  #     "foo/*.jar": Add all the JARs of the specified folder as class 
  #                  repositories
  #     "foo/bar.jar": Add bar.jar as a class repository 
  shared.loader=${catalina.home}/shared/classes,${catalina.home}/shared/lib/*.jar
  
  
  
  1.1                  
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/CatalinaProperties.java
  
  Index: CatalinaProperties.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/CatalinaProperties.java,v
 1.1 2002/10/24 13:53:22 remm Exp $
   * $Revision: 1.1 $
   * $Date: 2002/10/24 13:53:22 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */
  
  
  package org.apache.catalina.startup;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.InputStream;
  import java.net.URL;
  import java.util.Properties;
  
  
  /**
   * Utility class to read the bootstrap Catalina configuration.
   *
   * @author Remy Maucherat
   * @version $Revision: 1.1 $ $Date: 2002/10/24 13:53:22 $
   */
  
  public class CatalinaProperties {
  
  
      // ------------------------------------------------------- Static Variables
  
  
      private static Properties properties = null;
  
  
      static {
  
          loadProperties();
  
      }
  
  
      // --------------------------------------------------------- Public Methods
  
  
      /**
       * Return specified property value.
       */
      public static String getProperty(String name) {
  
          return properties.getProperty(name);
  
      }
  
  
      /**
       * Return specified property value.
       */
      public static String getProperty(String name, String defaultValue) {
  
          return properties.getProperty(name, defaultValue);
  
      }
  
  
      // --------------------------------------------------------- Public Methods
  
  
      /**
       * Load properties.
       */
      private static void loadProperties() {
  
          InputStream is = null;
          Throwable error = null;
  
          try {
              String configUrl = getConfigUrl();
              if (configUrl != null) {
                  is = (new URL(configUrl)).openStream();
              }
          } catch (Throwable t) {
              // Ignore
          }
  
          if (is == null) {
              try {
                  File home = new File(getCatalinaHome());
                  File conf = new File(home, "conf");
                  File properties = new File(conf, "catalina.properties");
                  is = new FileInputStream(properties);
              } catch (Throwable t) {
                  // Ignore
              }
          }
  
          if (is == null) {
              try {
                  is = CatalinaProperties.class.getResourceAsStream
                      ("/org/apache/catalina/startup/catalina.properties");
              } catch (Throwable t) {
                  // Ignore
              }
          }
  
          if (is != null) {
              try {
                  properties = new Properties();
                  properties.load(is);
                  is.close();
              } catch (Throwable t) {
                  error = t;
              }
          }
  
          if ((is == null) || (error != null)) {
              // Do something
              System.out.println("Error");
          }
  
      }
  
  
      /**
       * Get the value of the catalina.home environment variable.
       */
      private static String getCatalinaHome() {
          return System.getProperty("catalina.home",
                                    System.getProperty("user.dir"));
      }
  
  
      /**
       * Get the value of the configuration URL.
       */
      private static String getConfigUrl() {
          return System.getProperty("catalina.config");
      }
  
  
  }
  
  
  

--
To unsubscribe, e-mail:   <mailto:tomcat-dev-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:tomcat-dev-help@;jakarta.apache.org>

Reply via email to