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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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
* [EMAIL PROTECTED] #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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>