ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From adammurd...@apache.org
Subject cvs commit: jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/launcher Main.java
Date Sat, 23 Mar 2002 10:16:35 GMT
adammurdoch    02/03/23 02:16:35

  Modified:    proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor
                        DefaultEmbeddor.java
               proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace
                        DefaultWorkspace.java
               proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories
                        ExecManagerFactory.java
               proposal/myrmidon/src/java/org/apache/myrmidon/frontends
                        CLIMain.java
               proposal/myrmidon/src/java/org/apache/myrmidon/launcher
                        Main.java
  Added:       proposal/myrmidon/src/java/org/apache/myrmidon/frontends
                        EmbeddedAnt.java
  Log:
  * Use the shared classloader as the parent of antlib classloaders, rather
    than using the container classloader.
  
  * DefaultWorkspace and ExecManagerFactory figure out myrmidon.home using
    their parameters, rather than using system properties.
  
  * Split embeddor/workspace/project handling code out of CLIMain into a new
    EmbeddedAnt helper class.  CLIMain is now responsible for setting up the
    logger, and command-line option handling.  EmbeddedAnt is responsible for
    starting the embeddor, building the project, and executing targets (and
    cleaning-up).  Should make it considerably simpler to embed myrmidon.
  
  Revision  Changes    Path
  1.37      +7 -3      jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java
  
  Index: DefaultEmbeddor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- DefaultEmbeddor.java	23 Mar 2002 09:06:58 -0000	1.36
  +++ DefaultEmbeddor.java	23 Mar 2002 10:16:35 -0000	1.37
  @@ -51,7 +51,7 @@
    * Instantiate this to embed inside other applications.
    *
    * @author <a href="mailto:peter@apache.org">Peter Donald</a>
  - * @version $Revision: 1.36 $ $Date: 2002/03/23 09:06:58 $
  + * @version $Revision: 1.37 $ $Date: 2002/03/23 10:16:35 $
    */
   public class DefaultEmbeddor
       extends AbstractLogEnabled
  @@ -74,6 +74,7 @@
   
       private File m_homeDir;
       private File m_taskLibDir;
  +    private static final String MYRMIDON_HOME = "myrmidon.home";
   
       /**
        * Setup basic properties of engine.
  @@ -133,6 +134,9 @@
       {
           final Workspace workspace =
               (Workspace)createService( Workspace.class, PREFIX + "workspace.DefaultWorkspace"
);
  +        // TODO - don't do this; need some way to pass separate sets of defines and config
  +        // to the workspace
  +        parameters.setParameter( MYRMIDON_HOME, m_parameters.getParameter( MYRMIDON_HOME
) );
           setupObject( workspace, m_workspaceServiceManager, parameters );
           return workspace;
       }
  @@ -186,7 +190,7 @@
           throws Exception
       {
           // Deploy all type libraries found in the classpath
  -        final ClassLoader libClassloader = Thread.currentThread().getContextClassLoader();
  +        final ClassLoader libClassloader = getClass().getClassLoader();
           final TypeDeployer typeDeployer = m_deployer.createDeployer( libClassloader );
           typeDeployer.deployAll();
   
  @@ -297,7 +301,7 @@
       {
           String filepath = null;
   
  -        filepath = getParameter( "myrmidon.home" );
  +        filepath = getParameter( MYRMIDON_HOME );
           m_homeDir = ( new File( filepath ) ).getAbsoluteFile();
           checkDirectory( m_homeDir, "home-dir.name" );
   
  
  
  
  1.35      +5 -5      jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java
  
  Index: DefaultWorkspace.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- DefaultWorkspace.java	18 Mar 2002 11:49:46 -0000	1.34
  +++ DefaultWorkspace.java	23 Mar 2002 10:16:35 -0000	1.35
  @@ -43,7 +43,7 @@
    * This is the default implementation of Workspace.
    *
    * @author <a href="mailto:peter@apache.org">Peter Donald</a>
  - * @version $Revision: 1.34 $ $Date: 2002/03/18 11:49:46 $
  + * @version $Revision: 1.35 $ $Date: 2002/03/23 10:16:35 $
    */
   public class DefaultWorkspace
       extends AbstractLogEnabled
  @@ -147,7 +147,7 @@
       }
   
       private File findTypeLib( final String libraryName )
  -        throws TaskException
  +        throws Exception
       {
           //TODO: In future this will be expanded to allow
           //users to specify search path or automagically
  @@ -155,7 +155,7 @@
           //workspace specific)
           final String name = libraryName.replace( '/', File.separatorChar ) + ".atl";
   
  -        final String home = System.getProperty( "myrmidon.home" );
  +        final String home = m_parameters.getParameter( "myrmidon.home" );
           final File homeDir = new File( home + File.separatorChar + "ext" );
   
           final File library = new File( homeDir, name );
  @@ -178,7 +178,7 @@
       }
   
       private void deployTypeLib( final Deployer deployer, final Project project )
  -        throws TaskException
  +        throws Exception
       {
           final TypeLib[] typeLibs = project.getTypeLibs();
   
  @@ -213,7 +213,7 @@
        * Creates an execution frame for a project.
        */
       private ExecutionFrame createExecutionFrame( final Project project )
  -        throws TaskException, ServiceException
  +        throws Exception
       {
           //Create per frame ComponentManager
           final DefaultServiceManager serviceManager =
  
  
  
  1.2       +18 -7     jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/ExecManagerFactory.java
  
  Index: ExecManagerFactory.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/ExecManagerFactory.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ExecManagerFactory.java	25 Feb 2002 10:42:44 -0000	1.1
  +++ ExecManagerFactory.java	23 Mar 2002 10:16:35 -0000	1.2
  @@ -12,6 +12,9 @@
   import org.apache.aut.nativelib.impl.DefaultExecManager;
   import org.apache.avalon.excalibur.i18n.ResourceManager;
   import org.apache.avalon.excalibur.i18n.Resources;
  +import org.apache.avalon.framework.parameters.Parameterizable;
  +import org.apache.avalon.framework.parameters.Parameters;
  +import org.apache.avalon.framework.parameters.ParameterException;
   import org.apache.myrmidon.interfaces.service.AntServiceException;
   import org.apache.myrmidon.interfaces.service.ServiceFactory;
   
  @@ -19,26 +22,34 @@
    * A Factory responsible for creating the ExecManager service.
    *
    * @author <a href="mailto:peter@apache.org">Peter Donald</a>
  - * @version $Revision: 1.1 $ $Date: 2002/02/25 10:42:44 $
  + * @version $Revision: 1.2 $ $Date: 2002/03/23 10:16:35 $
    */
   public class ExecManagerFactory
  -    implements ServiceFactory
  +    implements ServiceFactory, Parameterizable
   {
       private final static Resources REZ =
           ResourceManager.getPackageResources( ExecManagerFactory.class );
   
  +    private Parameters m_parameters;
  +
  +    public void parameterize( final Parameters parameters )
  +        throws ParameterException
  +    {
  +        m_parameters = parameters;
  +    }
  +
       /**
        * Create the ExecManager Service.
        */
       public Object createService()
           throws AntServiceException
       {
  -        final File home = getHomeDirectory();
           try
           {
  +            final File home = getHomeDirectory();
               return new DefaultExecManager( home );
           }
  -        catch( final ExecException ee )
  +        catch( final Exception ee )
           {
               throw new AntServiceException( ee.getMessage(), ee );
           }
  @@ -47,10 +58,10 @@
       /**
        * Utility method to retrieve home directory.
        */
  -    private static File getHomeDirectory()
  -        throws AntServiceException
  +    private File getHomeDirectory()
  +        throws Exception
       {
  -        final String home = System.getProperty( "myrmidon.home" );
  +        final String home = m_parameters.getParameter( "myrmidon.home" );
           if( null == home )
           {
               final String message = REZ.getString( "missing-home-dir.error" );
  
  
  
  1.32      +65 -203   jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java
  
  Index: CLIMain.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- CLIMain.java	23 Mar 2002 03:08:29 -0000	1.31
  +++ CLIMain.java	23 Mar 2002 10:16:35 -0000	1.32
  @@ -8,10 +8,12 @@
   package org.apache.myrmidon.frontends;
   
   import java.io.BufferedReader;
  -import java.io.File;
   import java.io.InputStreamReader;
  +import java.io.File;
   import java.util.ArrayList;
   import java.util.List;
  +import java.util.Map;
  +import java.util.HashMap;
   import org.apache.avalon.excalibur.cli.CLArgsParser;
   import org.apache.avalon.excalibur.cli.CLOption;
   import org.apache.avalon.excalibur.cli.CLOptionDescriptor;
  @@ -20,15 +22,9 @@
   import org.apache.avalon.excalibur.i18n.Resources;
   import org.apache.avalon.framework.CascadingException;
   import org.apache.avalon.framework.ExceptionUtil;
  -import org.apache.avalon.framework.logger.AbstractLogEnabled;
  -import org.apache.avalon.framework.parameters.Parameters;
   import org.apache.myrmidon.Constants;
   import org.apache.myrmidon.api.TaskException;
  -import org.apache.myrmidon.interfaces.embeddor.Embeddor;
   import org.apache.myrmidon.interfaces.executor.Executor;
  -import org.apache.myrmidon.interfaces.model.Project;
  -import org.apache.myrmidon.interfaces.workspace.Workspace;
  -import org.apache.myrmidon.listeners.ProjectListener;
   
   /**
    * The class to kick the tires and light the fires.
  @@ -36,17 +32,13 @@
    * to run project.
    *
    * @author <a href="mailto:peter@apache.org">Peter Donald</a>
  - * @version $Revision: 1.31 $ $Date: 2002/03/23 03:08:29 $
  + * @version $Revision: 1.32 $ $Date: 2002/03/23 10:16:35 $
    */
   public class CLIMain
  -    extends AbstractLogEnabled
   {
       private final static Resources REZ =
           ResourceManager.getPackageResources( CLIMain.class );
   
  -    private static final String DEFAULT_EMBEDDOR_CLASS =
  -        "org.apache.myrmidon.components.embeddor.DefaultEmbeddor";
  -
       //defines for the Command Line options
       private final static int HELP_OPT = 'h';
       private final static int QUIET_OPT = 'q';
  @@ -84,23 +76,19 @@
           LISTENER_OPT, NO_PREFIX_OPT
       };
   
  -    ///Parameters for run of myrmidon
  -    private Parameters m_parameters = new Parameters();
  -
       ///List of targets supplied on command line to execute
       private ArrayList m_targets = new ArrayList();
   
  -    ///List of user supplied defines
  -    private Parameters m_defines = new Parameters();
  -
  -    ///List of user supplied parameters for builder
  -    private Parameters m_builderParameters = new Parameters();
  -
       ///Determine whether tasks are actually executed
       private boolean m_dryRun = false;
   
  +    ///Enables incremental mode
  +    private boolean m_incremental;
  +
  +    ///The launcher
  +    private EmbeddedAnt m_embedded = new EmbeddedAnt();
  +
       ///Log level to use
  -    //private static Priority m_priority = Priority.WARN;
       private static int m_priority = BasicLogger.LEVEL_WARN;
   
       /**
  @@ -110,11 +98,23 @@
        */
       public static void main( final String[] args )
       {
  +        final Map properties = new HashMap();
  +        properties.put( "myrmidon.home", new File( "." ) );
  +        main( properties, args );
  +    }
  +
  +    /**
  +     * Main entry point called to run standard Myrmidon.
  +     *
  +     * @param args the args
  +     */
  +    public static void main( final Map properties, final String[] args )
  +    {
           int exitCode = 0;
           final CLIMain main = new CLIMain();
           try
           {
  -            main.execute( args );
  +            main.execute( properties, args );
           }
           catch( final Throwable throwable )
           {
  @@ -243,10 +243,10 @@
                       return false;
   
                   case HOME_DIR_OPT:
  -                    m_parameters.setParameter( "myrmidon.home", option.getArgument() );
  +                    m_embedded.setEmbeddorProperty( "myrmidon.home", option.getArgument()
);
                       break;
                   case TASKLIB_DIR_OPT:
  -                    m_parameters.setParameter( "myrmidon.lib.path", option.getArgument()
);
  +                    m_embedded.setEmbeddorProperty( "myrmidon.lib.path", option.getArgument()
);
                       break;
   
                   case LOG_LEVEL_OPT:
  @@ -260,26 +260,26 @@
                       break;
   
                   case INCREMENTAL_OPT:
  -                    m_parameters.setParameter( "incremental", "true" );
  +                    m_incremental = true;
                       break;
   
                   case FILE_OPT:
  -                    m_parameters.setParameter( "filename", option.getArgument() );
  +                    m_embedded.setProjectFile( option.getArgument() );
                       break;
   
                   case LISTENER_OPT:
  -                    m_parameters.setParameter( "listener", option.getArgument() );
  +                    m_embedded.setListener( option.getArgument() );
                       break;
                   case NO_PREFIX_OPT:
  -                    m_parameters.setParameter( "listener", "noprefix" );
  +                    m_embedded.setListener( "noprefix" );
                       break;
   
                   case DEFINE_OPT:
  -                    m_defines.setParameter( option.getArgument( 0 ), option.getArgument(
1 ) );
  +                    m_embedded.setWorkspaceProperty( option.getArgument( 0 ), option.getArgument(
1 ) );
                       break;
   
                   case BUILDER_PARAM_OPT:
  -                    m_builderParameters.setParameter( option.getArgument( 0 ), option.getArgument(
1 ) );
  +                    m_embedded.setBuilderProperty( option.getArgument( 0 ), option.getArgument(
1 ) );
                       break;
   
                   case DRY_RUN_OPT:
  @@ -295,61 +295,42 @@
           return true;
       }
   
  -    private void setupDefaultParameters()
  -    {
  -        //System property set up by launcher
  -        m_parameters.setParameter( "myrmidon.home", System.getProperty( "myrmidon.home",
"." ) );
  -
  -        m_parameters.setParameter( "filename", "build.ant" );
  -        m_parameters.setParameter( "log.level", "WARN" );
  -        m_parameters.setParameter( "listener", "default" );
  -        m_parameters.setParameter( "incremental", "false" );
  -    }
  -
  -    private void execute( final String[] args )
  +    private void execute( final Map properties, final String[] args )
           throws Exception
       {
  -        setupDefaultParameters();
  -
  -        if( !parseCommandLineOptions( args ) )
  +        try
           {
  -            return;
  -        }
  -
  -        prepareLogging();
  -
  -        checkHomeDir();
  -        final File buildFile = getBuildFile();
  -
  -        //getLogger().debug( "Ant Bin Directory: " + m_binDir );
  -        //getLogger().debug( "Ant Lib Directory: " + m_libDir );
  -        //getLogger().debug( "Ant Task Lib Directory: " + m_taskLibDir );
  +            // Set system properties set up by launcher
  +            m_embedded.setEmbeddorProperty( "myrmidon.home", properties.get( "myrmidon.home"
) );
   
  -        if( m_dryRun )
  -        {
  -            m_parameters.setParameter( Executor.ROLE,
  -                                       "org.apache.myrmidon.components.executor.PrintingExecutor"
);
  -        }
  +            // Command line
  +            if( !parseCommandLineOptions( args ) )
  +            {
  +                return;
  +            }
   
  -        final Embeddor embeddor = prepareEmbeddor();
  +            // Setup logging
  +            final BasicLogger logger = new BasicLogger( "[myrmidon] ", m_priority );
  +            m_embedded.setLogger( logger );
   
  -        try
  -        {
  -            final ProjectListener listener = prepareListener( embeddor );
  +            if( m_dryRun )
  +            {
  +                m_embedded.setEmbeddorProperty( Executor.ROLE,
  +                                                "org.apache.myrmidon.components.executor.PrintingExecutor"
);
  +            }
   
  -            //create the project
  -            final Project project =
  -                embeddor.createProject( buildFile.toString(), null, m_builderParameters
);
  +            // Set the common classloader
  +            final ClassLoader sharedClassLoader = (ClassLoader)properties.get( "myrmidon.shared.classloader"
);
  +            m_embedded.setSharedClassLoader( sharedClassLoader );
   
               //loop over build if we are in incremental mode..
  -            final boolean incremental = m_parameters.getParameterAsBoolean( "incremental",
false );
  -            if( !incremental )
  +            if( !m_incremental )
               {
  -                executeBuild( embeddor, project, listener );
  +                executeBuild();
               }
               else
               {
  -                executeIncrementalBuild( embeddor, project, listener );
  +                executeIncrementalBuild();
               }
           }
           catch( final Exception e )
  @@ -359,13 +340,11 @@
           }
           finally
           {
  -            shutdownEmbeddor( embeddor );
  +            m_embedded.stop();
           }
       }
   
  -    private void executeIncrementalBuild( final Embeddor embeddor,
  -                                          final Project project,
  -                                          final ProjectListener listener )
  +    private void executeIncrementalBuild()
           throws Exception
       {
           BufferedReader reader = null;
  @@ -374,7 +353,7 @@
           {
               try
               {
  -                executeBuild( embeddor, project, listener );
  +                executeBuild();
               }
               catch( final TaskException te )
               {
  @@ -398,6 +377,13 @@
           }
       }
   
  +    private void executeBuild() throws Exception
  +    {
  +        //actually do the build ...
  +        final String[] targets = (String[])m_targets.toArray( new String[m_targets.size()
] );
  +        m_embedded.executeTargets( targets );
  +    }
  +
       /**
        * Builds the error message for an exception
        */
  @@ -426,131 +412,7 @@
           }
   
           // Write the message out
  -        if( getLogger() == null )
  -        {
  -            System.err.println( message );
  -        }
  -        else
  -        {
  -            getLogger().error( message );
  -        }
  -    }
  -
  -    private void executeBuild( final Embeddor embeddor,
  -                               final Project project,
  -                               final ProjectListener listener )
  -        throws Exception
  -    {
  -        //actually do the build ...
  -        final Workspace workspace = embeddor.createWorkspace( m_defines );
  -        workspace.addProjectListener( listener );
  -
  -        doBuild( workspace, project, m_targets );
  -    }
  -
  -    private File getBuildFile() throws Exception
  -    {
  -        final String filename = m_parameters.getParameter( "filename", null );
  -        final File buildFile = ( new File( filename ) ).getCanonicalFile();
  -        if( !buildFile.isFile() )
  -        {
  -            final String message = REZ.getString( "bad-file.error", buildFile );
  -            throw new Exception( message );
  -        }
  -
  -        if( getLogger().isInfoEnabled() )
  -        {
  -            final String message = REZ.getString( "buildfile.notice", buildFile );
  -            getLogger().info( message );
  -        }
  -
  -        return buildFile;
  -    }
  -
  -    private void checkHomeDir() throws Exception
  -    {
  -        final String home = m_parameters.getParameter( "myrmidon.home" );
  -        final File homeDir = ( new File( home ) ).getAbsoluteFile();
  -        if( !homeDir.isDirectory() )
  -        {
  -            final String message = REZ.getString( "home-not-dir.error", homeDir );
  -            throw new Exception( message );
  -        }
  -
  -        if( getLogger().isInfoEnabled() )
  -        {
  -            final String message = REZ.getString( "homedir.notice", homeDir );
  -            getLogger().info( message );
  -        }
  -    }
  -
  -    private void prepareLogging() throws Exception
  -    {
  -        //handle logging...
  -        final BasicLogger logger = new BasicLogger( "[myrmidon] ", m_priority );
  -        enableLogging( logger );
  -    }
  -
  -    private void shutdownEmbeddor( final Embeddor embeddor )
  -        throws Exception
  -    {
  -        embeddor.stop();
  -        embeddor.dispose();
  -    }
  -
  -    private ProjectListener prepareListener( final Embeddor embeddor )
  -        throws Exception
  -    {
  -        //create the listener
  -        final String listenerName = m_parameters.getParameter( "listener", null );
  -        final ProjectListener listener = embeddor.createListener( listenerName );
  -        return listener;
  -    }
  -
  -    private Embeddor prepareEmbeddor()
  -        throws Exception
  -    {
  -        final Embeddor embeddor = createEmbeddor();
  -        setupLogger( embeddor );
  -        embeddor.parameterize( m_parameters );
  -        embeddor.initialize();
  -        embeddor.start();
  -        return embeddor;
  -    }
  -
  -    private Embeddor createEmbeddor()
  -        throws Exception
  -    {
  -        final Class clazz = Class.forName( DEFAULT_EMBEDDOR_CLASS );
  -        return (Embeddor)clazz.newInstance();
  -    }
  -
  -    /**
  -     * Actually do the build.
  -     *
  -     * @param workspace the workspace
  -     * @param project the project
  -     * @param targets the targets to build as passed by CLI
  -     */
  -    private void doBuild( final Workspace workspace,
  -                          final Project project,
  -                          final ArrayList targets )
  -        throws TaskException
  -    {
  -        final int targetCount = targets.size();
  -
  -        //if we didn't specify a target on CLI then choose default
  -        if( 0 == targetCount )
  -        {
  -            workspace.executeProject( project, project.getDefaultTargetName() );
  -        }
  -        else
  -        {
  -            for( int i = 0; i < targetCount; i++ )
  -            {
  -                workspace.executeProject( project, (String)targets.get( i ) );
  -            }
  -        }
  +        System.err.println( message );
       }
   
       /**
  
  
  
  1.1                  jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/EmbeddedAnt.java
  
  Index: EmbeddedAnt.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.myrmidon.frontends;
  
  import java.io.File;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.framework.logger.Logger;
  import org.apache.avalon.framework.parameters.Parameters;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.interfaces.embeddor.Embeddor;
  import org.apache.myrmidon.interfaces.model.Project;
  import org.apache.myrmidon.interfaces.workspace.Workspace;
  import org.apache.myrmidon.listeners.ProjectListener;
  
  /**
   * A utility class, that takes care of launching Myrmidon, and building and
   * executing a project.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/03/23 10:16:35 $
   */
  public class EmbeddedAnt
      extends AbstractLogEnabled
  {
      private final static Resources REZ
          = ResourceManager.getPackageResources( EmbeddedAnt.class );
  
      private static final String DEFAULT_EMBEDDOR_CLASS =
          "org.apache.myrmidon.components.embeddor.DefaultEmbeddor";
  
      private String m_projectFile = "build.ant";
      private Project m_project;
      private String m_listenerName = "default";
      private ProjectListener m_listener;
      private Parameters m_workspaceProps = new Parameters();
      private Parameters m_builderProps = new Parameters();
      private Parameters m_embeddorProps = new Parameters();
      private ClassLoader m_sharedClassLoader;
      private Embeddor m_embeddor;
  
      /**
       * Sets the logger to use.
       */
      public void setLogger( final Logger logger )
      {
          enableLogging( logger );
      }
  
      /**
       * Sets the project file to execute.  Default is 'build.ant'.
       */
      public void setProjectFile( final String projectFile )
      {
          m_projectFile = projectFile;
          m_project = null;
      }
  
      /**
       * Sets the project to execute.  This method can be used instead of
       * {@link #setProjectFile}, for projects models that are built
       * programmatically.
       */
      public void setProject( final Project project )
      {
          m_projectFile = null;
          m_project = project;
      }
  
      /**
       * Sets the name of the project listener to use.
       */
      public void setListener( final String listener )
      {
          m_listenerName = listener;
          m_listener = null;
      }
  
      /**
       * Sets the project listener to use.
       */
      public void setListener( final ProjectListener listener )
      {
          m_listenerName = null;
          m_listener = listener;
      }
  
      /**
       * Sets a workspace property.  These are inherited by all projects executed
       * by this embeddor.
       */
      public void setWorkspaceProperty( final String name, final Object value )
      {
          // TODO - Make properties Objects, not Strings
          m_workspaceProps.setParameter( name, (String)value );
      }
  
      /**
       * Sets a project builder property.  These are used by the project builder
       * when it is parsing the project file.
       */
      public void setBuilderProperty( final String name, final Object value )
      {
          // TODO - Make properties Objects, not Strings
          m_builderProps.setParameter( name, (String)value );
      }
  
      /**
       * Sets a task engine property.  These are used to configure the task engine.
       */
      public void setEmbeddorProperty( final String name, final Object value )
      {
          // TODO - Make properties Objects, not Strings
          m_embeddorProps.setParameter( name, (String)value );
      }
  
      /**
       * Sets the shared classloader, which is used as the parent classloader
       * for all antlibs.  Default is to use the context classloader.
       */
      public void setSharedClassLoader( final ClassLoader classLoader )
      {
          m_sharedClassLoader = classLoader;
      }
  
      /**
       * Executes a set of targets in the project.  This method may be called
       * multiple times.
       */
      public void executeTargets( final String[] targets ) throws Exception
      {
          if( m_sharedClassLoader != null )
          {
              Thread.currentThread().setContextClassLoader( m_sharedClassLoader );
          }
  
          checkHomeDir();
  
          // Prepare the embeddor, project listener and project model
          final Embeddor embeddor = prepareEmbeddor();
          final ProjectListener listener = prepareListener( embeddor );
          final Project project = prepareProjectModel( embeddor );
  
          // Create a new workspace
          final Workspace workspace = embeddor.createWorkspace( m_workspaceProps );
          workspace.addProjectListener( listener );
  
          //execute the project
          executeTargets( workspace, project, targets );
      }
  
      /**
       * Shuts down the task engine, after the project has been executed.
       */
      public void stop() throws Exception
      {
          try
          {
              if( m_embeddor != null )
              {
                  m_embeddor.stop();
                  m_embeddor.dispose();
              }
          }
          finally
          {
              m_embeddor = null;
              m_project = null;
              m_listener = null;
          }
      }
  
      /**
       * Actually do the build.
       */
      private void executeTargets( final Workspace workspace,
                                   final Project project,
                                   final String[] targets )
          throws TaskException
      {
          //if we didn't specify a target, then choose default
          if( targets == null || targets.length == 0 )
          {
              workspace.executeProject( project, project.getDefaultTargetName() );
          }
          else
          {
              for( int i = 0; i < targets.length; i++ )
              {
                  workspace.executeProject( project, targets[ i ] );
              }
          }
      }
  
      /**
       * Make sure myrmidon home directory has been specified, and is a
       * directory.
       */
      private void checkHomeDir() throws Exception
      {
          final String home = m_embeddorProps.getParameter( "myrmidon.home" );
          final File homeDir = ( new File( home ) ).getAbsoluteFile();
          if( !homeDir.isDirectory() )
          {
              final String message = REZ.getString( "home-not-dir.error", homeDir );
              throw new Exception( message );
          }
  
          if( getLogger().isInfoEnabled() )
          {
              final String message = REZ.getString( "homedir.notice", homeDir );
              getLogger().info( message );
          }
      }
  
      /**
       * Prepares and returns the embeddor to use.
       */
      private Embeddor prepareEmbeddor()
          throws Exception
      {
          if( m_embeddor == null )
          {
              m_embeddor = createEmbeddor();
              setupLogger( m_embeddor );
              m_embeddor.parameterize( m_embeddorProps );
              m_embeddor.initialize();
              m_embeddor.start();
          }
          return m_embeddor;
      }
  
      /**
       * Creates the embeddor.
       */
      private Embeddor createEmbeddor()
          throws Exception
      {
          final Class clazz = Class.forName( DEFAULT_EMBEDDOR_CLASS );
          return (Embeddor)clazz.newInstance();
      }
  
      /**
       * Prepares and returns the project listener to use.
       */
      private ProjectListener prepareListener( final Embeddor embeddor )
          throws Exception
      {
          if( m_listener == null )
          {
              m_listener = embeddor.createListener( m_listenerName );
          }
          return m_listener;
      }
  
      /**
       * Prepares and returns the project model.
       */
      private Project prepareProjectModel( final Embeddor embeddor ) throws Exception
      {
          if( m_project == null )
          {
              final File buildFile = getProjectFile();
              m_project = embeddor.createProject( buildFile.toString(), null, m_builderProps
);
          }
          return m_project;
      }
  
      /**
       * Locates the project file
       */
      private File getProjectFile() throws Exception
      {
          final File projectFile = ( new File( m_projectFile ) ).getCanonicalFile();
          if( !projectFile.isFile() )
          {
              final String message = REZ.getString( "bad-file.error", projectFile );
              throw new Exception( message );
          }
  
          if( getLogger().isInfoEnabled() )
          {
              final String message = REZ.getString( "buildfile.notice", projectFile );
              getLogger().info( message );
          }
  
          return projectFile;
      }
  }
  
  
  
  1.16      +44 -30    jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java
  
  Index: Main.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/launcher/Main.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- Main.java	4 Mar 2002 02:44:15 -0000	1.15
  +++ Main.java	23 Mar 2002 10:16:35 -0000	1.16
  @@ -14,12 +14,14 @@
   import java.net.URLClassLoader;
   import java.util.ArrayList;
   import java.util.StringTokenizer;
  +import java.util.Map;
  +import java.util.HashMap;
   
   /**
    * Basic Loader that is responsible for all the hackery to get classloader to work.
    *
    * @author <a href="mailto:peter@apache.org">Peter Donald</a>
  - * @version $Revision: 1.15 $ $Date: 2002/03/04 02:44:15 $
  + * @version $Revision: 1.16 $ $Date: 2002/03/23 10:16:35 $
    */
   public final class Main
   {
  @@ -34,16 +36,26 @@
       {
           try
           {
  -            //actually try to discover the install directory based on where
  -            // the myrmidon.jar is
  +            final Map properties = new HashMap();
  +
  +            // Try to discover the install directory based on where the
  +            // launcher Jar is
               final File installDirectory = findInstallDir();
  -            System.setProperty( "myrmidon.home", installDirectory.toString() );
  +            properties.put( "myrmidon.home", installDirectory );
   
  -            final URLClassLoader sharedClassLoader = createSharedClassLoader( installDirectory
);
  -            final URLClassLoader classLoader =
  -                createContainerClassLoader( installDirectory, sharedClassLoader );
  +            // Build the shared classloader
  +            final URL[] sharedClassPath = getSharedClassPath( installDirectory );
  +            properties.put( "myrmidon.shared.classpath", sharedClassPath );
  +            final URLClassLoader sharedClassLoader = new URLClassLoader( sharedClassPath
);
  +            properties.put( "myrmidon.shared.classloader", sharedClassLoader );
  +
  +            // Build the container classloader
  +            final URL[] containerClassPath = getContainerClassPath( installDirectory );
  +            properties.put( "myrmidon.container.classpath", containerClassPath );
  +            final URLClassLoader containerClassLoader = new URLClassLoader( containerClassPath,
sharedClassLoader );
  +            properties.put( "myrmidon.container.classloader", containerClassLoader );
   
  -            execMainClass( classLoader, args );
  +            execMainClass( containerClassLoader, properties, args );
           }
           catch( final InvocationTargetException ite )
           {
  @@ -57,38 +69,42 @@
           }
       }
   
  -    private static void execMainClass( final URLClassLoader classLoader, final String[]
args )
  +    /**
  +     * Executes the main class.
  +     */
  +    private static void execMainClass( final ClassLoader classLoader,
  +                                       final Map properties,
  +                                       final String[] args )
           throws Exception
       {
           //load class and retrieve appropriate main method.
           final Class clazz = classLoader.loadClass( "org.apache.myrmidon.frontends.CLIMain"
);
  -        final Method method = clazz.getMethod( "main", new Class[]{args.getClass()} );
  -
  -        Thread.currentThread().setContextClassLoader( classLoader );
  +        final Method method = clazz.getMethod( "main", new Class[]{Map.class, args.getClass()}
);
   
           //kick the tires and light the fires....
  -        method.invoke( null, new Object[]{args} );
  +        method.invoke( null, new Object[]{properties, args} );
       }
   
  -    private static URLClassLoader createContainerClassLoader( final File installDirectory,
  -                                                              final URLClassLoader sharedClassLoader
)
  +    /**
  +     * Builds the classpath for the container classloader.
  +     */
  +    private static URL[] getContainerClassPath( final File installDirectory )
           throws Exception
       {
  +        // Include everything from the bin/lib/ directory
           final File containerLibDir = new File( installDirectory, "bin" + File.separator
+ "lib" );
  -        final URL[] containerLibUrls = buildURLList( containerLibDir );
  -        final URLClassLoader classLoader =
  -            new URLClassLoader( containerLibUrls, sharedClassLoader );
  -        return classLoader;
  +        return buildURLList( containerLibDir );
       }
   
  -    private static URLClassLoader createSharedClassLoader( final File installDirectory
)
  +    /**
  +     * Builds the classpath for the shared classloader.
  +     */
  +    private static URL[] getSharedClassPath( final File installDirectory )
           throws Exception
       {
  -        //setup classloader appropriately for myrmidon jar
  +        // Include everything from the lib/ directory
           final File libDir = new File( installDirectory, "lib" );
  -        final URL[] libUrls = buildURLList( libDir );
  -        final URLClassLoader libClassLoader = new URLClassLoader( libUrls );
  -        return libClassLoader;
  +        return buildURLList( libDir );
       }
   
       private static final URL[] buildURLList( final File dir )
  @@ -137,25 +153,23 @@
           final String classpath = System.getProperty( "java.class.path" );
           final String pathSeparator = System.getProperty( "path.separator" );
           final StringTokenizer tokenizer = new StringTokenizer( classpath, pathSeparator
);
  +        final String jarName = "myrmidon-launcher.jar";
   
           while( tokenizer.hasMoreTokens() )
           {
               final String element = tokenizer.nextToken();
  -
  -            if( element.endsWith( "myrmidon-launcher.jar" ) )
  +            File file = ( new File( element ) ).getAbsoluteFile();
  +            if( file.isFile() && file.getName().equals( jarName ) )
               {
  -                File file = ( new File( element ) ).getAbsoluteFile();
                   file = file.getParentFile();
  -
                   if( null != file )
                   {
                       file = file.getParentFile();
                   }
  -
                   return file;
               }
           }
   
  -        throw new Exception( "Unable to locate ant.jar in classpath" );
  +        throw new Exception( "Unable to locate " + jarName + " in classpath." );
       }
   }
  
  
  

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


Mime
View raw message