costin      01/08/20 22:35:05

  Modified:    src/share/org/apache/tomcat/startup Main.java
  Log:
  As expected, Main.java is now smaller. The first argument to Main is used
  to load a bean. It'll only set the common class loader, pass args[] and
  class loader informations, and call execute() method on the bean
  ( ant style ).
  
  Note that the bean itself will process the args. Right now we use magic
  to turn args into setXXX() calls ( like we do for server.xml, or like ant
  does with it's tasks ). Single option arguments are equivalent with
  boolean setters.
  
  Revision  Changes    Path
  1.37      +188 -228  jakarta-tomcat/src/share/org/apache/tomcat/startup/Main.java
  
  Index: Main.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/startup/Main.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- Main.java 2001/07/16 01:09:07     1.36
  +++ Main.java 2001/08/21 05:35:05     1.37
  @@ -1,4 +1,4 @@
  -/* $Id: Main.java,v 1.36 2001/07/16 01:09:07 costin Exp $
  +/* $Id: Main.java,v 1.37 2001/08/21 05:35:05 costin Exp $
    * ====================================================================
    *
    * The Apache Software License, Version 1.1
  @@ -70,278 +70,238 @@
   import org.apache.tomcat.util.compat.Jdk11Compat;
   
   // The main idea is to have a starter with minimal class loader deps,
  -// and use it to create the initial environment
  +// and use it to create the initial environment. This class is pretty generic,
  +// deps on tomcat are minimal ( depends only on tomcat.util ).
   
   /**
  -     Starter class for Tomcat.
  -     <p>
  -     This is a replacement/enhancement for the .sh and .bat files - you can
  -     use JDK1.2 "java -jar tomcat.jar", or ( for jdk 1.1 ) you just need to
  -     include a single jar file in the classpath.
  -     <p>
  -     This class creates three class loader instances: 
  -     <ol>
  -     <li>a 'common' loader to be the parent of both the server
  -         container and also webapp loaders.</li>
  -     <li>an 'applications' loader to load classes used by all webapps, but
  -         not the servlet engine.</i>
  -     <li>a 'container' loader exclusively for the tomcat servlet engine.</li>
  -     </ol>
  -     Both the 'apps' loader and 'container' loader have the common loader as
  -     the parent class loader.  The class path for each is assembled like so:
  -     <ul>
  -     <li>common - all elements of the 
  -           <code>org.apache.tomcat.common.classpath</code>
  -           property plus all *.jar files found in ${TOMCAT_HOME}/lib/common/.
  -           </li>
  -     <li>apps - all elements of the 
  -           <code>org.apache.tomcat.apps.classpath</code>
  -           property plus all *.jar files found in ${TOMCAT_HOME}/lib/apps/.
  -           In addition, all classes loaded via the 'common' loader.</i>
  -     <li>container - all jar files found in ${TOMCAT_HOME}/lib/container/ plus 
  -           the class folder ${TOMCAT_HOME}/classes and finally also the utility 
  -           jar file ${JAVA_HOME}/lib/tools.jar.  In addition, all classes loaded
  -           via the common loader.</li>
  -     </ul>
  -     After creating the above class loaders, this class instantiates, initializes
  -     and starts an instance of the class 
<code>org.apache.tomcat.startup.Tomcat</code>.
  -     <p>
  -     @author Costin Manolache
  -     @author Ignacio J. Ortega
  -     @author Mel Martinez [EMAIL PROTECTED]
  -     @version $Revision: 1.36 $ $Date: 2001/07/16 01:09:07 $
  + * Launcher capable of setting class loader and guessing locations.
  + * <p>
  + * This is a replacement/enhancement for the .sh and .bat files - you can
  + * use JDK1.2 "java -jar [PROGRAM].jar", or ( for jdk 1.1 ) you just need to
  + * include a single jar file in the classpath.
  + * <p>
  + * The class will first guess it's own location by looking in each classpath
  + * location. It'll then process the command line parameters and based on
  + * a properties file, locate the actual class that will be started.
  + * <p>
  + * It'll then construct a class loader ( common ) from the content of a
  + * specified directory and/or additionl system property. Based on the first
  + * argument, it'll instantiate a class ( in the created class loader ), set the
  + * parameters, and call it's execute() method.
  + *
  + * @author Costin Manolache
  + * @author Ignacio J. Ortega
  + * @author Mel Martinez [EMAIL PROTECTED]
    */
   public class Main{
  +    public static final String PROPERTY_COMMON_LOADER =
  +     "org.apache.tomcat.common.loader";
   
  -    /**
  -            name of configuration property to set (using the -D option at
  -            startup or via .properties file) to specify the classpath
  -            to be used by the ClassLoader shared amongst all web applications
  -            (but not by the servlet container).  Specify this string as
  -            normal file paths separated by the path.seperator delimiter for
  -            the host platform.  Example (unix):
  -            <pre><code>
  -            * org.apache.tomcat.apps.classpath = /home/mypath/lib/mylib.jar: \
  -            *                                      /home/mypath/classes/
  -            </code></pre>
  -    */
  -    public static final String TOMCAT_APPS_CLASSPATH_PROPERTY =
  -            "org.apache.tomcat.apps.classpath";
  -
  -    /**
  -            the classpath shared among all web apps (in addition to any
  -            jar files placed directly in $TOMCAT_HOME/lib/apps/).
  -    */
  -    public static final String TOMCAT_APPS_CLASSPATH;
  -
  -    /**
  -            name of configuration property to set (using the -D option at
  -            startup or via .properties file) to specify the classpath
  -            to be used by the ClassLoader common to both the servlet engine
  -            and all web applications.  Specify this string as
  -            normal file paths separated by the path.seperator delimiter for
  -            the host platform.  Example (unix):
  -            <pre><code>
  -            * org.apache.tomcat.common.classpath = /home/mypath/lib/mylib.jar: \
  -            *                                      /home/mypath/classes/
  -            </code></pre>
  -    */
  -    public static final String TOMCAT_COMMON_CLASSPATH_PROPERTY =
  -            "org.apache.tomcat.common.classpath";
  -
  -    /**
  -            the classpath common to both the servlet engine and also to
  -            any web applications served by it (in addition to any
  -            jar files placed directly in $TOMCAT_HOME/lib/common/).
  -    */
  -    public static final String TOMCAT_COMMON_CLASSPATH;
  -
  -    static{
  -        String s=null;
  -        s = System.getProperty(TOMCAT_APPS_CLASSPATH_PROPERTY);
  -        if(s==null){
  -            s="";
  -        }
  -        TOMCAT_APPS_CLASSPATH=s;
  -        s=null;
  -        s = System.getProperty(TOMCAT_COMMON_CLASSPATH_PROPERTY);
  -        if(s==null){
  -            s="";
  -        }
  -        TOMCAT_COMMON_CLASSPATH=s;
  -    }
  -
       String installDir;
  -    String libBase;
  +    String libDir;
       String serverBase;
       String commonBase;
       String homeDir;
  -    static final String DEFAULT_CONFIG="conf" + File.separator + "server.xml";
  -    boolean doStop=false;
  -    // if needed
  -    // null means user didn't set one
  -    String configFile;
  -
  +    ClassLoader parentL;
  +    
       public Main() {
       }
   
  +    // -------------------- Properties --------------------
  +
  +    public void setLibDir( String dir ) {
  +     libDir=dir;
  +    }
  +
  +    public void setLoaderProperty( String prop ) {
  +
  +    }
  +
  +    public void setInstallDir( String dir ) {
  +
  +    }
  +
  +    public void setParentLoader( ClassLoader p ) {
  +     parentL=p;
  +    }
  +
  +    // -------------------- Main --------------------
  +    
       public static void main(String args[] ) {
        try {
  -         Main tomcat=new Main();
  -         tomcat.execute( args );
  +         Main m=new Main();
  +         m.processArgs( args );
  +         m.execute();
        } catch(Exception ex ) {
            System.out.println("Fatal error");
            ex.printStackTrace();
        }
       }
  -
  + 
       void log( String s ) {
        System.err.println("TomcatStartup: " + s );
       }
   
       // -------------------- Utils --------------------
   
  -    public String getInstallDir() {
  -     if( installDir==null )
  -         installDir=".";
  -     return installDir;
  +    static final Jdk11Compat jdk11Compat=Jdk11Compat.getJdkCompat();
  +    String args[];
  +    URL commonCP[];
  +    ClassLoader commonCL;
  +    
  +    public void processArgs( String args[] ) {
  +     this.args=args;
       }
   
  -    public String getServerDir() {
  -        if( libBase==null ){
  -         libBase=getInstallDir() + File.separator + "lib" +
  -             File.separator + "container" + File.separator;
  -        }
  -     return libBase;
  +    private void initDirs()
  +     throws Exception
  +    {
  +     if( installDir==null ) {
  +         installDir= IntrospectionUtils.
  +             guessInstall("tomcat.install", "tomcat.home","tomcat.jar");
  +     }
  +     if( installDir==null )
  +         installDir=".";
  +         
  +     if( libDir==null ){
  +         libDir=installDir + File.separator + "lib" + File.separator +
  +             "common";
  +     }
       }
  -
  -    public String getAppsDir() {
  -        if( serverBase==null ){
  -         serverBase=getInstallDir() + File.separator + "lib" +
  -             File.separator + "apps" + File.separator;
  -        }
  -     return serverBase;
  +    
  +    public void initClassLoader() {
  +     if( parentL==null )
  +         parentL=this.getClass().getClassLoader();
  +     commonCL=
  +         jdk11Compat.newClassLoaderInstance(commonCP, parentL);
  +     if( dL > 0 )
  +         IntrospectionUtils.displayClassPath("Main classpath: ", commonCP );
  +    }
  +
  +    /** If "-sandbox" parameter is found ( the first after the action ), we'll
  +     *  load a sandbox with the policy in install/conf/tomcat.policy. This
  +     *  has to happen before loading any class or constructing the loader, or
  +     *  some VMs will have wrong permissions.
  +     *  
  +     *  We do that here, instead of the shell script, in order to support java -jar
  +     *  and to minimize the ammount of platform-dependent code.
  +     *
  +     *  Note that we are not setting a security manager - just adding permissions
  +     *  so that all "system" classes have permissions.
  +     */
  +    public void initSecurityFile() {
  +//   if( args.length > 1 &&
  +//       "-sandbox".equals( args[1] ) ) {
  +//       if( null == System.getProperty("java.security.policy")) {
  +//           File f=null;
  +//           String policyFile=installDir + File.separator + "conf" +
  +//               File.separator + "tomcat.policy";
  +             
  +//           debug("Setting policy file to " + policyFile + " tomcat.home= " +
  +//               System.getProperty( "tomcat.home") );
  +//           System.setProperty( "tomcat.home", installDir );
  +//           System.setProperty("java.security.policy",  policyFile);
  +//           java.security.Policy.getPolicy().refresh();
  +//       }
  +//   }
  +    }
  +    
  +    // -------------------- Tasks --------------------
  +    
  +    static Hashtable tasks=new Hashtable();
  +    static {
  +     tasks.put("stop", "org.apache.tomcat.startup.StopTomcat");
  +     tasks.put("enableAdmin", "org.apache.tomcat.startup.EnableAdmin");
  +     tasks.put("start", "org.apache.tomcat.startup.EmbededTomcat");
  +     tasks.put("run", "org.apache.tomcat.startup.EmbededTomcat");
  +     tasks.put("jspc", "org.apache.tomcat.startup.Jspc");
  +     tasks.put("estart", "org.apache.tomcat.startup.EmbededTomcat");
  +     tasks.put("", "org.apache.tomcat.startup.EmbededTomcat");
  +    }
  +
  +    String task;
  +
  +    public void setTask( String s ) {
  +     task=s;
  +    }
  +    
  +    String findTask( String args[] ) {
  +     // XXX We should display a help with all actions !
  +     if( args.length == 0 ) return null;
  +     String arg=args[0];
  +     if( arg.startsWith( "-" ) )
  +         arg="";
  +     if( tasks.get( arg ) == null ) {
  +         return null;
  +     }
  +     if( dL>0)
  +         debug("Task: " + arg + " " + tasks.get( arg ));
  +     return arg;
  +    }
  +
  +    public void printUsage() {
  +     PrintStream out=System.out;
  +     out.println( "Usage: java " + this.getClass().getName() +
  +                  " [task] [options]");
  +     out.println();
  +     out.println("Tasks: " );
  +     Enumeration keys=tasks.keys();
  +     while( keys.hasMoreElements() ) {
  +         String t=(String)keys.nextElement();
  +         String classN=(String)tasks.get(t);
  +         out.println("    " + t );
  +         printOptions( classN );
  +     }
  +     out.println();
       }
   
  -    public String getCommonDir() {
  -        if( commonBase==null ){
  -         commonBase=getInstallDir() + File.separator + "lib" +
  -             File.separator+ "common" + File.separator;
  -                     
  -        }
  -     return commonBase;
  +    private void printOptions( String classN ) {
       }
  +    
  +    // -------------------- Execute --------------------
  +    
  +    public void execute() throws Exception {
   
  -
  -    static final Jdk11Compat jdk11Compat=Jdk11Compat.getJdkCompat();
  -
  -    protected void execute( String args[] ) throws Exception {
  -
           try {
  -            installDir=IntrospectionUtils.guessInstall("tomcat.install",
  -                                "tomcat.home", "tomcat.jar");
  -
  -            homeDir = System.getProperty("tomcat.home");
  -
  -            ClassLoader parentL=this.getClass().getClassLoader();
  -
  -            // the server classloader loads from classes dir too and
  -         // from tools.jar
  -
  -         // Create the common class loader --------------------
  -         Vector commonJars = new Vector();
  -         IntrospectionUtils.addToClassPath( commonJars,
  -                                            getCommonDir());
  -         IntrospectionUtils.addJarsFromClassPath(commonJars,
  -                                                 TOMCAT_COMMON_CLASSPATH);
  -            addToTomcatClasspathSysProp(commonJars);
  -
  -            URL[] commonClassPath=IntrospectionUtils.getClassPath(commonJars);
  -         //            displayClassPath( "common ", commonClassPath );
  -         ClassLoader commonCl=
  -                    jdk11Compat.newClassLoaderInstance(commonClassPath ,
  -                                                    parentL);
  -
  -
  -         // Create the container class loader --------------------
  -            Vector serverJars=new Vector();
  -         IntrospectionUtils.addToClassPath( serverJars, getServerDir());
  -         IntrospectionUtils.addToolsJar( serverJars );
  -
  -
  -         URL[] serverClassPath=IntrospectionUtils.getClassPath(serverJars);
  -         //displayClassPath( "server ", serverClassPath );
  -            ClassLoader serverCl=
  -                    jdk11Compat.newClassLoaderInstance(serverClassPath ,
  -                                                    commonCl);
  -         jdk11Compat.setContextClassLoader( serverCl );
  -
  -         // Create the webapps class loader --------------------
  -            Vector appsJars = new Vector();
  -         IntrospectionUtils.addToClassPath(appsJars, getAppsDir());
  -         IntrospectionUtils.addJarsFromClassPath( appsJars, 
  -                                                  TOMCAT_APPS_CLASSPATH);
  -            addToTomcatClasspathSysProp(appsJars);
  -
  -            URL[] appsClassPath=IntrospectionUtils.getClassPath(appsJars);
  -            ClassLoader appsCl=
  -             jdk11Compat.newClassLoaderInstance(appsClassPath ,
  -                                                    commonCl);
  +         if( task==null )
  +             task=findTask( args );
  +         if(  null == task) {
  +             printUsage();
  +             return;
  +         }
  +
  +         initDirs();
  +         commonCP=
  +             IntrospectionUtils.getClassPath( libDir, null,
  +                                              PROPERTY_COMMON_LOADER,
  +                                              false);
  +         initSecurityFile();
  +         initClassLoader();
   
  -         // Instantiate tomcat ( using container class loader )
  -            Class cls=serverCl.loadClass("org.apache.tomcat.startup.Tomcat");
  +            Class cls=commonCL.loadClass((String)tasks.get(task));
  +         
               Object proxy=cls.newInstance();
   
  -            IntrospectionUtils.setAttribute(proxy,"args", args );
  -            IntrospectionUtils.setAttribute(proxy,"home", homeDir );
               IntrospectionUtils.setAttribute(proxy,"install", installDir );
  -            IntrospectionUtils.setAttribute(proxy,"parentClassLoader",appsCl);
  +
  +         IntrospectionUtils.setAttribute(proxy,"parentClassLoader",parentL);
  +         IntrospectionUtils.setAttribute(proxy,"commonClassPath",
  +                                         commonCP);
            IntrospectionUtils.setAttribute(proxy,"commonClassLoader",
  -                                         commonCl);
  -         IntrospectionUtils.setAttribute(proxy,"containerClassLoader",
  -                                         serverCl);
  -         IntrospectionUtils.setAttribute(proxy,"appsClassLoader",
  -                                         appsCl);
  +                                         commonCL);
  +            IntrospectionUtils.setAttribute(proxy,"args", args );
  +
               IntrospectionUtils.execute(  proxy, "execute" );
  -            return;
           } catch( Exception ex ) {
  -            System.out.println("Guessed home=" + homeDir);
  +            System.out.println("Guessed home=" + installDir);
               ex.printStackTrace();
           }
       }
  -
  -    public void displayClassPath( String msg, URL[] cp ) {
  -     System.out.println(msg);
  -     for( int i=0; i<cp.length; i++ ) {
  -         System.out.println( cp[i].getFile() );
  -     }
  -    }
  -
  -    /**
  -     * Adds classpath entries from a vector of URL's to the
  -     * "tc_path_add" System property.  This System property lists
  -     * the classpath entries common to web applications. This System
  -     * property is currently used by Jasper when its JSP servlet
  -     * compiles the Java file for a JSP.
  -    */
  -
  -    private void addToTomcatClasspathSysProp(Vector v)
  -    {
  -        String sep = System.getProperty("path.separator");
  -        String cp = System.getProperty("tc_path_add");
   
  -        Enumeration e = v.elements();
  -        while( e.hasMoreElements() ) {
  -            URL url = (URL)e.nextElement();
  -            if( cp != null)
  -                cp += sep + url.getFile();
  -            else
  -                cp = url.getFile();
  -        }
  -        if( cp != null)
  -            System.getProperties().put("tc_path_add",cp);
  +    private static int dL=0;
  +    private void debug( String s ) {
  +     System.out.println("Main: " +s );
       }
  -
   }
   
   
  
  
  

Reply via email to