From f5ba55efa18fa862c2a4f5762198c2a9481f287e Mon Sep 17 00:00:00 2001 From: adammurdoch Date: Tue, 9 Apr 2002 07:21:13 +0000 Subject: [PATCH] Changed container config from Parameters to Context, to allow Objects to be used in the config: * All services that used to implement Parameterizable now implement Contextualizable. * Changed 'myrmidon.home' to a File, and the paths to File[]. * DefaultEmbeddor now deploys Antlibs from all directories in 'myrmidon.lib.path', rather than just a single dir. Can't specify alternative service implementations (temporarily broken). * Added 'myrmidon.antlib.path', which DefaultWorkspace uses to search for -ed antlibs. * Replaced --task-lib-dir with --antlib-path, which appends directories to 'myrmidon.antlib.path' * Added --ext-path, which appends directories to 'myrmidon.ext.path'. * DefaultClassLoaderManager now uses the container config to locate the shared classloader, rather than using the context classloader. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272306 13f79535-47bb-0310-9956-ffa450edef68 --- .../DefaultClassLoaderManager.java | 16 +-- .../components/embeddor/DefaultEmbeddor.java | 54 +++++----- .../extensions/DefaultExtensionManager.java | 26 ++--- .../service/InstantiatingServiceManager.java | 23 ++++- .../workspace/DefaultWorkspace.java | 43 ++++---- .../factories/ExecManagerFactory.java | 40 ++------ .../apache/myrmidon/frontends/CLIMain.java | 24 +++-- .../myrmidon/frontends/EmbeddedAnt.java | 98 +++++++++++++------ .../myrmidon/frontends/Resources.properties | 8 +- .../components/AbstractComponentTest.java | 39 ++++---- .../DefaultClassLoaderManagerTestCase.java | 12 +-- .../embeddor/test/DefaultEmbeddorTest.java | 9 +- .../InstantiatingServiceManagerTestCase.java | 15 ++- .../service/test/LifecycleValidator.java | 31 +++++- 14 files changed, 257 insertions(+), 181 deletions(-) diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/classloader/DefaultClassLoaderManager.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/classloader/DefaultClassLoaderManager.java index 26442332b..fed8d2f53 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/classloader/DefaultClassLoaderManager.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/classloader/DefaultClassLoaderManager.java @@ -12,16 +12,19 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.HashSet; -import java.util.jar.Manifest; import java.util.jar.JarFile; +import java.util.jar.Manifest; +import org.apache.aut.nativelib.PathUtil; import org.apache.avalon.excalibur.extension.Extension; import org.apache.avalon.excalibur.extension.OptionalPackage; import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.avalon.framework.activity.Initializable; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; +import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; @@ -30,7 +33,6 @@ import org.apache.myrmidon.interfaces.classloader.ClassLoaderException; import org.apache.myrmidon.interfaces.classloader.ClassLoaderManager; import org.apache.myrmidon.interfaces.deployer.DeploymentException; import org.apache.myrmidon.interfaces.extensions.ExtensionManager; -import org.apache.aut.nativelib.PathUtil; /** * A default implementation of a ClassLoader manager. @@ -40,7 +42,7 @@ import org.apache.aut.nativelib.PathUtil; */ public class DefaultClassLoaderManager extends AbstractLogEnabled - implements ClassLoaderManager, Serviceable, Initializable + implements ClassLoaderManager, Serviceable, Contextualizable { private static final Resources REZ = ResourceManager.getPackageResources( DefaultClassLoaderManager.class ); @@ -62,11 +64,11 @@ public class DefaultClassLoaderManager m_commonClassLoader = commonClassLoader; } - public void initialize() throws Exception + public void contextualize( final Context context ) throws ContextException { if( null == m_commonClassLoader ) { - m_commonClassLoader = Thread.currentThread().getContextClassLoader(); + m_commonClassLoader = (ClassLoader)context.get( "myrmidon.shared.classloader" ); } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java index 400e6e7f7..40a5b1c10 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java @@ -19,6 +19,9 @@ import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.excalibur.io.ExtensionFileFilter; import org.apache.avalon.excalibur.io.FileUtil; import org.apache.avalon.framework.CascadingException; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.activity.Startable; @@ -62,7 +65,7 @@ import org.apache.myrmidon.components.store.DefaultPropertyStore; */ public class DefaultEmbeddor extends AbstractLogEnabled - implements Embeddor, Parameterizable, Initializable, Startable, Disposable + implements Embeddor, Contextualizable, Initializable, Startable, Disposable { private static final Resources REZ = ResourceManager.getPackageResources( DefaultEmbeddor.class ); @@ -76,17 +79,15 @@ public class DefaultEmbeddor private List m_components = new ArrayList(); private DefaultServiceManager m_serviceManager = new DefaultServiceManager(); - private Parameters m_parameters; + private Context m_context; /** * Setup basic properties of engine. * Called before init() and can be used to specify alternate components in system. - * - * @param parameters the parameters. */ - public void parameterize( final Parameters parameters ) + public void contextualize( final Context context ) throws ContextException { - m_parameters = parameters; + m_context = context; } /** @@ -137,7 +138,7 @@ public class DefaultEmbeddor { final Workspace workspace = (Workspace)createService( Workspace.class, PREFIX + "workspace.DefaultWorkspace" ); - setupObject( workspace, m_workspaceServiceManager, m_parameters ); + setupObject( workspace, m_workspaceServiceManager, null ); // Create the property store final PropertyStore propStore = createBaseStore( properties ); @@ -185,7 +186,7 @@ public class DefaultEmbeddor final ServiceManager projServiceManager = (ServiceManager)createService( ServiceManager.class, PREFIX + "service.InstantiatingServiceManager" ); - setupObject( projServiceManager, m_serviceManager, m_parameters ); + setupObject( projServiceManager, m_serviceManager, null ); m_components.add( projServiceManager ); // setup a service manager to be used by workspaces @@ -204,8 +205,8 @@ public class DefaultEmbeddor // Deploy all type libraries in the lib directory final ExtensionFileFilter filter = new ExtensionFileFilter( ".atl" ); - final File taskLibDir = new File( m_parameters.getParameter( "myrmidon.lib.path" ) ); - deployFromDirectory( m_deployer, taskLibDir, filter ); + final File[] taskLibDirs = (File[])m_context.get( "myrmidon.lib.path" ); + deployFromDirectories( m_deployer, taskLibDirs, filter ); } /** @@ -236,7 +237,7 @@ public class DefaultEmbeddor m_components = null; m_deployer = null; m_serviceManager = null; - m_parameters = null; + m_context = null; } /** @@ -266,7 +267,7 @@ public class DefaultEmbeddor for( Iterator iterator = m_components.iterator(); iterator.hasNext(); ) { final Object component = iterator.next(); - setupObject( component, m_serviceManager, m_parameters ); + setupObject( component, m_serviceManager, null ); } } @@ -294,8 +295,8 @@ public class DefaultEmbeddor private Object createService( final Class roleType, final String defaultImpl ) throws Exception { - final String role = roleType.getName(); - final String className = m_parameters.getParameter( role, defaultImpl ); + // TODO - need to be able to provide different implementations + final String className = defaultImpl; try { @@ -341,12 +342,17 @@ public class DefaultEmbeddor { setupLogger( object ); + if(object instanceof Contextualizable ) + { + ( (Contextualizable)object ).contextualize( m_context ); + + } if( object instanceof Serviceable ) { ( (Serviceable)object ).service( serviceManager ); } - if( object instanceof Parameterizable ) + if( parameters != null && object instanceof Parameterizable ) { ( (Parameterizable)object ).parameterize( parameters ); } @@ -360,16 +366,20 @@ public class DefaultEmbeddor /** * Deploys all type libraries in a directory. */ - private void deployFromDirectory( final Deployer deployer, - final File directory, - final FilenameFilter filter ) + private void deployFromDirectories( final Deployer deployer, + final File[] directories, + final FilenameFilter filter ) throws DeploymentException { - final File[] files = directory.listFiles( filter ); - - if( null != files ) + for( int i = 0; i < directories.length; i++ ) { - deployFiles( deployer, files ); + File directory = directories[i ]; + final File[] files = directory.listFiles( filter ); + + if( null != files ) + { + deployFiles( deployer, files ); + } } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/extensions/DefaultExtensionManager.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/extensions/DefaultExtensionManager.java index 11e1a598f..10ec18f49 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/extensions/DefaultExtensionManager.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/extensions/DefaultExtensionManager.java @@ -13,14 +13,13 @@ import org.apache.avalon.excalibur.extension.Extension; import org.apache.avalon.excalibur.extension.OptionalPackage; import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.avalon.excalibur.util.StringUtil; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.activity.Initializable; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; +import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.logger.LogEnabled; import org.apache.avalon.framework.logger.Logger; -import org.apache.avalon.framework.parameters.ParameterException; -import org.apache.avalon.framework.parameters.Parameterizable; -import org.apache.avalon.framework.parameters.Parameters; import org.apache.myrmidon.interfaces.extensions.ExtensionManager; /** @@ -31,7 +30,7 @@ import org.apache.myrmidon.interfaces.extensions.ExtensionManager; */ public class DefaultExtensionManager extends DefaultPackageRepository - implements LogEnabled, Parameterizable, Initializable, Disposable, ExtensionManager + implements LogEnabled, Contextualizable, Initializable, Disposable, ExtensionManager { private static final Resources REZ = ResourceManager.getPackageResources( DefaultExtensionManager.class ); @@ -50,7 +49,7 @@ public class DefaultExtensionManager File.separator + "lib" + File.separator + "tools.jar"; private Logger m_logger; - private String m_path; + private File[] m_path; public DefaultExtensionManager() { @@ -67,24 +66,15 @@ public class DefaultExtensionManager m_logger = logger; } - public void parameterize( final Parameters parameters ) - throws ParameterException + public void contextualize( final Context context ) throws ContextException { - m_path = parameters.getParameter( "myrmidon.ext.path" ); + m_path = (File[])context.get( "myrmidon.ext.path" ); } public void initialize() throws Exception { - final String[] pathElements = StringUtil.split( m_path, File.pathSeparator ); - final File[] dirs = new File[ pathElements.length ]; - for( int i = 0; i < dirs.length; i++ ) - { - dirs[ i ] = new File( pathElements[ i ] ); - } - - setPath( dirs ); - + setPath( m_path ); scanPath(); // Add the JVM's tools.jar as an extension diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/service/InstantiatingServiceManager.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/service/InstantiatingServiceManager.java index daf3ed7c7..f55994b06 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/service/InstantiatingServiceManager.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/service/InstantiatingServiceManager.java @@ -23,6 +23,9 @@ import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; import org.apache.myrmidon.interfaces.role.RoleInfo; import org.apache.myrmidon.interfaces.role.RoleManager; import org.apache.myrmidon.interfaces.service.ServiceFactory; @@ -37,9 +40,12 @@ import org.apache.myrmidon.interfaces.type.TypeManager; * and running the service instances through the service lifecycle: * * * @author Adam Murdoch @@ -47,7 +53,7 @@ import org.apache.myrmidon.interfaces.type.TypeManager; */ public class InstantiatingServiceManager extends AbstractLogEnabled - implements ServiceManager, Parameterizable, Serviceable, Disposable + implements ServiceManager, Contextualizable, Parameterizable, Serviceable, Disposable { private static final Resources REZ = ResourceManager.getPackageResources( InstantiatingServiceManager.class ); @@ -64,8 +70,14 @@ public class InstantiatingServiceManager private ServiceManager m_serviceManager; private Parameters m_parameters; private TypeManager m_typeManager; + private Context m_context; - public void parameterize( Parameters parameters ) throws ParameterException + public void contextualize( final Context context ) throws ContextException + { + m_context = context; + } + + public void parameterize( final Parameters parameters ) throws ParameterException { m_parameters = parameters; } @@ -211,12 +223,17 @@ public class InstantiatingServiceManager { setupLogger( object ); + if( m_context != null && object instanceof Contextualizable ) + { + ( (Contextualizable)object ).contextualize( m_context ); + } + if( object instanceof Serviceable ) { ( (Serviceable)object ).service( m_serviceManager ); } - if( object instanceof Parameterizable ) + if( m_parameters != null && object instanceof Parameterizable ) { ( (Parameterizable)object ).parameterize( m_parameters ); } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java index 9c252f551..e13027c84 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java @@ -12,11 +12,11 @@ import java.util.HashMap; import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; +import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.logger.Logger; -import org.apache.avalon.framework.parameters.ParameterException; -import org.apache.avalon.framework.parameters.Parameterizable; -import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.service.DefaultServiceManager; import org.apache.avalon.framework.service.ServiceManager; import org.apache.myrmidon.api.TaskContext; @@ -44,7 +44,7 @@ import org.apache.myrmidon.listeners.ProjectListener; */ public class DefaultWorkspace extends AbstractLogEnabled - implements Workspace, ExecutionContainer, Parameterizable + implements Workspace, ExecutionContainer, Contextualizable { private static final Resources REZ = ResourceManager.getPackageResources( DefaultWorkspace.class ); @@ -52,10 +52,10 @@ public class DefaultWorkspace private Executor m_executor; private ProjectListenerSupport m_listenerSupport = new ProjectListenerSupport(); private ServiceManager m_serviceManager; - private Parameters m_parameters; private PropertyStore m_baseStore; private TypeManager m_typeManager; private Deployer m_deployer; + private Context m_context; /** A map from Project object -> ProjectEntry for that project. */ private HashMap m_entries = new HashMap(); @@ -92,10 +92,9 @@ public class DefaultWorkspace m_deployer = (Deployer)m_serviceManager.lookup( Deployer.ROLE ); } - public void parameterize( final Parameters parameters ) - throws ParameterException + public void contextualize( final Context context ) throws ContextException { - m_parameters = parameters; + m_context = context; } /** @@ -127,21 +126,23 @@ public class DefaultWorkspace //workspace specific) final String name = libraryName.replace( '/', File.separatorChar ) + ".atl"; - final String home = m_parameters.getParameter( "myrmidon.home" ); - final File homeDir = new File( home + File.separatorChar + "ext" ); - - final File library = new File( homeDir, name ); - - if( library.exists() ) + final File[] extPath = (File[])m_context.get( "myrmidon.antlib.path" ); + for( int i = 0; i < extPath.length; i++ ) { - if( !library.canRead() ) - { - final String message = REZ.getString( "no-read.error", library ); - throw new TaskException( message ); - } - else + final File extDir = extPath[ i ]; + final File library = new File( extDir, name ); + + if( library.exists() ) { - return library; + if( !library.canRead() ) + { + final String message = REZ.getString( "no-read.error", library ); + throw new TaskException( message ); + } + else + { + return library; + } } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/ExecManagerFactory.java b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/ExecManagerFactory.java index 3eb383907..1cefdb8d0 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/ExecManagerFactory.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/ExecManagerFactory.java @@ -8,13 +8,10 @@ package org.apache.myrmidon.framework.factories; import java.io.File; -import org.apache.aut.nativelib.ExecException; 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.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; +import org.apache.avalon.framework.context.Contextualizable; import org.apache.myrmidon.interfaces.service.AntServiceException; import org.apache.myrmidon.interfaces.service.ServiceFactory; @@ -25,17 +22,13 @@ import org.apache.myrmidon.interfaces.service.ServiceFactory; * @version $Revision$ $Date$ */ public class ExecManagerFactory - implements ServiceFactory, Parameterizable + implements ServiceFactory, Contextualizable { - private static final Resources REZ = - ResourceManager.getPackageResources( ExecManagerFactory.class ); + private File m_homeDir; - private Parameters m_parameters; - - public void parameterize( final Parameters parameters ) - throws ParameterException + public void contextualize( final Context context ) throws ContextException { - m_parameters = parameters; + m_homeDir = (File)context.get( "myrmidon.home" ); } /** @@ -46,28 +39,11 @@ public class ExecManagerFactory { try { - final File home = getHomeDirectory(); - return new DefaultExecManager( home ); + return new DefaultExecManager( m_homeDir ); } catch( final Exception ee ) { throw new AntServiceException( ee.getMessage(), ee ); } } - - /** - * Utility method to retrieve home directory. - */ - private File getHomeDirectory() - throws Exception - { - final String home = m_parameters.getParameter( "myrmidon.home" ); - if( null == home ) - { - final String message = REZ.getString( "missing-home-dir.error" ); - throw new AntServiceException( message ); - } - - return new File( home ); - } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java index 4d7702708..7488e2719 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java @@ -51,18 +51,19 @@ public class CLIMain private static final int VERSION_OPT = 1; private static final int LISTENER_OPT = 2; private static final int TASKLIB_DIR_OPT = 5; - private static final int INCREMENTAL_OPT = 6; - private static final int HOME_DIR_OPT = 7; - private static final int DRY_RUN_OPT = 8; - private static final int DEBUG_OPT = 9; - private static final int TYPE_OPT = 10; + private static final int EXTLIB_DIR_OPT = 6; + private static final int INCREMENTAL_OPT = 7; + private static final int HOME_DIR_OPT = 8; + private static final int DRY_RUN_OPT = 9; + private static final int DEBUG_OPT = 10; + private static final int TYPE_OPT = 11; //incompatable options for info options private static final int[] INFO_OPT_INCOMPAT = new int[] { HELP_OPT, QUIET_OPT, VERBOSE_OPT, FILE_OPT, LOG_LEVEL_OPT, BUILDER_PARAM_OPT, NO_PREFIX_OPT, - VERSION_OPT, LISTENER_OPT, TASKLIB_DIR_OPT, + VERSION_OPT, LISTENER_OPT, TASKLIB_DIR_OPT, EXTLIB_DIR_OPT, INCREMENTAL_OPT, HOME_DIR_OPT, DRY_RUN_OPT, TYPE_OPT }; @@ -191,10 +192,14 @@ public class CLIMain VERSION_OPT, REZ.getString( "version.opt" ), INFO_OPT_INCOMPAT ), - new CLOptionDescriptor( "task-lib-dir", + new CLOptionDescriptor( "antlib-path", CLOptionDescriptor.ARGUMENT_REQUIRED, TASKLIB_DIR_OPT, REZ.getString( "tasklib.opt" ) ), + new CLOptionDescriptor( "ext-path", + CLOptionDescriptor.ARGUMENT_REQUIRED, + EXTLIB_DIR_OPT, + REZ.getString( "extlib.opt" ) ), new CLOptionDescriptor( "incremental", CLOptionDescriptor.ARGUMENT_DISALLOWED, INCREMENTAL_OPT, @@ -257,7 +262,10 @@ public class CLIMain m_embedded.setEmbeddorProperty( "myrmidon.home", option.getArgument() ); break; case TASKLIB_DIR_OPT: - m_embedded.setEmbeddorProperty( "myrmidon.lib.path", option.getArgument() ); + m_embedded.setEmbeddorProperty( "myrmidon.antlib.path", option.getArgument() ); + break; + case EXTLIB_DIR_OPT: + m_embedded.setEmbeddorProperty( "myrmidon.ext.path", option.getArgument() ); break; case LOG_LEVEL_OPT: diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/EmbeddedAnt.java b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/EmbeddedAnt.java index ab4036e91..b7957b2c6 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/EmbeddedAnt.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/EmbeddedAnt.java @@ -14,11 +14,14 @@ import java.util.Map; import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.excalibur.io.FileUtil; +import org.apache.avalon.excalibur.util.StringUtil; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.activity.Startable; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.context.DefaultContext; import org.apache.avalon.framework.logger.AbstractLogEnabled; -import org.apache.avalon.framework.parameters.Parameterizable; import org.apache.avalon.framework.parameters.Parameters; import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.interfaces.embeddor.Embeddor; @@ -48,13 +51,14 @@ public class EmbeddedAnt private static final String DEFAULT_EMBEDDOR_CLASS = "org.apache.myrmidon.components.embeddor.DefaultEmbeddor"; + private final ArrayList m_listeners = new ArrayList(); + private final Parameters m_builderProps = new Parameters(); + private final Map m_embeddorParameters = new HashMap(); + private final Map m_workspaceProperties = new HashMap(); + private String m_projectFile = "build.ant"; private Project m_project; private String m_listenerName = "default"; - private ArrayList m_listeners = new ArrayList(); - private Parameters m_builderProps = new Parameters(); - private Parameters m_embeddorParameters = new Parameters(); - private Map m_workspaceProperties = new HashMap(); private ClassLoader m_sharedClassLoader; private Embeddor m_embeddor; private File m_homeDir; @@ -63,8 +67,8 @@ public class EmbeddedAnt /** * Sets the Myrmidon home directory. Default is to use the current * directory. - * - * @todo Autodetect myrmidon home, rather than using current directory + * + * @todo Autodetect myrmidon home, rather than using current directory * as the default (which is a dud default). */ public void setHomeDirectory( final File homeDir ) @@ -144,8 +148,7 @@ public class EmbeddedAnt */ public void setEmbeddorProperty( final String name, final Object value ) { - // TODO - Make properties Objects, not Strings - m_embeddorParameters.setParameter( name, value.toString() ); + m_embeddorParameters.put( name, value.toString() ); } /** @@ -163,15 +166,16 @@ public class EmbeddedAnt */ public void executeTargets( final String[] targets ) throws Exception { + Map embeddorParameters = new HashMap( m_embeddorParameters ); + setupPaths( embeddorParameters ); + if( m_sharedClassLoader != null ) { - Thread.currentThread().setContextClassLoader( m_sharedClassLoader ); + embeddorParameters.put( "myrmidon.shared.classloader", m_sharedClassLoader ); } - checkHomeDir(); - // Prepare the embeddor, and project model - final Embeddor embeddor = prepareEmbeddor(); + final Embeddor embeddor = prepareEmbeddor( embeddorParameters ); final Project project = prepareProjectModel( embeddor ); // Create a new workspace @@ -233,16 +237,16 @@ public class EmbeddedAnt /** * Make sure myrmidon home directory has been specified, and is a - * directory. + * directory. Set the paths that the embeddor expects. */ - private void checkHomeDir() throws Exception + private void setupPaths( Map parameters ) throws Exception { if( m_homeDir == null ) { m_homeDir = new File( "." ).getAbsoluteFile(); } checkDirectory( m_homeDir, "home-dir.name" ); - m_embeddorParameters.setParameter( "myrmidon.home", m_homeDir.getAbsolutePath() ); + parameters.put( "myrmidon.home", m_homeDir ); if( getLogger().isInfoEnabled() ) { @@ -250,28 +254,36 @@ public class EmbeddedAnt getLogger().info( message ); } - String path = m_embeddorParameters.getParameter( "myrmidon.lib.path", "lib" ); - File dir = resolveDirectory( m_homeDir, path, "task-lib-dir.name" ); - m_embeddorParameters.setParameter( "myrmidon.lib.path", dir.getAbsolutePath() ); + // Build the lib path + String path = (String)parameters.get( "myrmidon.lib.path" ); + File[] dirs = buildPath( m_homeDir, path, "lib", "lib-dir.name" ); + parameters.put( "myrmidon.lib.path", dirs ); + + // Build the antlib search path + path = (String)parameters.get( "myrmidon.antlib.path" ); + dirs = buildPath( m_homeDir, path, "ext", "task-lib-dir.name" ); + parameters.put( "myrmidon.antlib.path", dirs ); - path = m_embeddorParameters.getParameter( "myrmidon.ext.path", "ext" ); - dir = resolveDirectory( m_homeDir, path, "ext-dir.name" ); - m_embeddorParameters.setParameter( "myrmidon.ext.path", dir.getAbsolutePath() ); + // Build the extension search path + path = (String)parameters.get( "myrmidon.ext.path" ); + dirs = buildPath( m_homeDir, path, "ext", "ext-dir.name" ); + parameters.put( "myrmidon.ext.path", dirs ); } /** * Prepares and returns the embeddor to use. */ - private Embeddor prepareEmbeddor() + private Embeddor prepareEmbeddor( final Map parameters ) throws Exception { if( m_embeddor == null ) { m_embeddor = createEmbeddor(); setupLogger( m_embeddor ); - if( m_embeddor instanceof Parameterizable ) + if( m_embeddor instanceof Contextualizable ) { - ( (Parameterizable)m_embeddor ).parameterize( m_embeddorParameters ); + final Context context = new DefaultContext( parameters ); + ( (Contextualizable)m_embeddor ).contextualize( context ); } if( m_embeddor instanceof Initializable ) { @@ -310,7 +322,7 @@ public class EmbeddedAnt final int count = m_listeners.size(); for( int i = 0; i < count; i++ ) { - final ProjectListener listener = (ProjectListener)m_listeners.get(i ); + final ProjectListener listener = (ProjectListener)m_listeners.get( i ); workspace.addProjectListener( listener ); } } @@ -352,12 +364,38 @@ public class EmbeddedAnt /** * Resolve a directory relative to another base directory. */ - private File resolveDirectory( final File baseDir, final String dir, final String name ) + private File[] buildPath( final File baseDir, + final String path, + final String defaultPath, + final String name ) throws Exception { - final File file = FileUtil.resolveFile( baseDir, dir ); - checkDirectory( file, name ); - return file; + // Build the canonical list of files + final ArrayList files = new ArrayList(); + + // Add the default path + files.add( FileUtil.resolveFile( baseDir, defaultPath ) ); + + // Add the additional path + if( path != null ) + { + final String[] split = StringUtil.split( path, File.pathSeparator ); + for( int i = 0; i < split.length; i++ ) + { + final String s = split[ i ]; + final File file = new File( s ).getAbsoluteFile(); + files.add( file ); + } + } + + // Check each one + for( int i = 0; i < files.size(); i++ ) + { + File file = (File)files.get( i ); + checkDirectory( file, name ); + } + + return (File[])files.toArray( new File[ files.size() ] ); } /** diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties index 2757c97fa..5b85ac443 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties @@ -9,7 +9,8 @@ debug.opt=Equivalent to --log-level=DEBUG. listener.opt=Specify the listener for log events. noprefix.opt=Do not prefix output with the task name. Equivalent to --listener noprefix. version.opt=Display version. -tasklib.opt=Specify the task lib directory to scan for .atl files. +tasklib.opt=Specify the path to use to search for antlib libraries. +extlib.opt=Specify the path to use to search for optional packages. incremental.opt=Run in incremental mode. home.opt=Specify Ant home directory. define.opt=Define a property (ie -Dfoo=var). @@ -29,5 +30,6 @@ repeat.notice=Continue ? (Enter no to stop) homedir.notice=Ant Home Directory: {0} buildfile.notice=Ant Build File: {0} home-dir.name=Ant home directory -task-lib-dir.name=Task library directory -ext-dir.name=Extension library directory +lib-dir.name=Library directory +task-lib-dir.name=Antlib directory +ext-dir.name=Extension directory diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java index 231f1a76a..625b8481f 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java @@ -7,19 +7,22 @@ */ package org.apache.myrmidon.components; +import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.io.File; +import java.util.Map; import org.apache.aut.converter.Converter; +import org.apache.avalon.framework.activity.Initializable; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.context.DefaultContext; import org.apache.avalon.framework.logger.LogEnabled; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.service.DefaultServiceManager; import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; -import org.apache.avalon.framework.parameters.Parameters; -import org.apache.avalon.framework.parameters.Parameterizable; -import org.apache.avalon.framework.activity.Initializable; import org.apache.myrmidon.AbstractMyrmidonTest; import org.apache.myrmidon.components.classloader.DefaultClassLoaderManager; import org.apache.myrmidon.components.configurer.DefaultConfigurer; @@ -124,26 +127,26 @@ public abstract class AbstractComponentTest } } - // Compose the components + // Contextualise the components + final Context context = new DefaultContext( getParameters() ); for( Iterator iterator = components.iterator(); iterator.hasNext(); ) { Object obj = iterator.next(); - if( obj instanceof Serviceable ) + if( obj instanceof Contextualizable ) { - final Serviceable serviceable = (Serviceable)obj; - serviceable.service( m_serviceManager ); + final Contextualizable contextualizable = (Contextualizable)obj; + contextualizable.contextualize( context ); } } - // Parameterise the components - final Parameters parameters = getParameters(); + // Compose the components for( Iterator iterator = components.iterator(); iterator.hasNext(); ) { Object obj = iterator.next(); - if( obj instanceof Parameterizable ) + if( obj instanceof Serviceable ) { - final Parameterizable parameterizable = (Parameterizable)obj; - parameterizable.parameterize( parameters ); + final Serviceable serviceable = (Serviceable)obj; + serviceable.service( m_serviceManager ); } } @@ -173,12 +176,12 @@ public abstract class AbstractComponentTest * Creates the parameters for the test. Sub-classes can override this * method to set-up the parameters. */ - protected Parameters getParameters() + protected Map getParameters() { - final Parameters parameters = new Parameters(); - final String homeDir = getInstallDirectory().getAbsolutePath(); - parameters.setParameter( "myrmidon.home", homeDir ); - parameters.setParameter( "myrmidon.ext.path", homeDir + File.separatorChar + "ext" ); + final Map parameters = new HashMap(); + final File homeDir = getInstallDirectory(); + parameters.put( "myrmidon.home", homeDir ); + parameters.put( "myrmidon.ext.path", new File[] { new File ( homeDir, "ext" ) } ); return parameters; } diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test/DefaultClassLoaderManagerTestCase.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test/DefaultClassLoaderManagerTestCase.java index 0cb96c077..009e3fa9f 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test/DefaultClassLoaderManagerTestCase.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test/DefaultClassLoaderManagerTestCase.java @@ -11,12 +11,12 @@ import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; +import java.util.Map; +import org.apache.avalon.excalibur.i18n.Resources; import org.apache.myrmidon.components.AbstractComponentTest; import org.apache.myrmidon.components.classloader.DefaultClassLoaderManager; -import org.apache.myrmidon.interfaces.classloader.ClassLoaderManager; import org.apache.myrmidon.interfaces.classloader.ClassLoaderException; -import org.apache.avalon.framework.parameters.Parameters; -import org.apache.avalon.excalibur.i18n.Resources; +import org.apache.myrmidon.interfaces.classloader.ClassLoaderManager; /** * Test cases for the DefaultClassLoaderManager. @@ -87,10 +87,10 @@ public class DefaultClassLoaderManagerTestCase * Creates the parameters for the test. Sub-classes can override this * method to set-up the parameters. */ - protected Parameters getParameters() + protected Map getParameters() { - final Parameters parameters = super.getParameters(); - parameters.setParameter( "myrmidon.ext.path", getTestDirectory( "ext" ).getAbsolutePath() ); + final Map parameters = super.getParameters(); + parameters.put( "myrmidon.ext.path", new File[] { getTestDirectory( "ext" ) } ); return parameters; } diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java index 480429154..f32422edf 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java @@ -9,7 +9,7 @@ package org.apache.myrmidon.components.embeddor.test; import java.io.File; import java.util.HashMap; -import org.apache.avalon.framework.parameters.Parameters; +import org.apache.avalon.framework.context.DefaultContext; import org.apache.avalon.framework.logger.Logger; import org.apache.myrmidon.AbstractProjectTest; import org.apache.myrmidon.LogMessageTracker; @@ -62,10 +62,9 @@ public class DefaultEmbeddorTest m_embeddor = new DefaultEmbeddor(); m_embeddor.enableLogging( logger ); - final Parameters params = new Parameters(); - final File instDir = getInstallDirectory(); - params.setParameter( "myrmidon.home", instDir.getAbsolutePath() ); - m_embeddor.parameterize( params ); + final DefaultContext context = new DefaultContext(); + context.put( "myrmidon.home", getInstallDirectory() ); + m_embeddor.contextualize( context ); m_embeddor.initialize(); m_embeddor.start(); } diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java index 932978376..e453a838b 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java @@ -7,10 +7,10 @@ */ package org.apache.myrmidon.components.service.test; -import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.service.ServiceException; +import org.apache.avalon.framework.context.DefaultContext; import org.apache.myrmidon.components.AbstractComponentTest; import org.apache.myrmidon.components.service.InstantiatingServiceManager; import org.apache.myrmidon.interfaces.role.RoleInfo; @@ -31,7 +31,6 @@ public class InstantiatingServiceManagerTestCase private final static Resources REZ = getResourcesForTested( InstantiatingServiceManagerTestCase.class ); private InstantiatingServiceManager m_serviceManager; - private Parameters m_parameters = new Parameters(); public InstantiatingServiceManagerTestCase( final String name ) { @@ -47,8 +46,9 @@ public class InstantiatingServiceManagerTestCase // Set-up the service manager m_serviceManager = new InstantiatingServiceManager(); m_serviceManager.enableLogging( getLogger() ); + m_serviceManager.contextualize( new DefaultContext() ); m_serviceManager.service( getServiceManager() ); - m_serviceManager.parameterize( m_parameters ); + m_serviceManager.parameterize( new Parameters() ); } /** @@ -101,7 +101,14 @@ public class InstantiatingServiceManagerTestCase assertTrue( service.getClass() == TestServiceImpl2.class ); // Assert the service has been setup correctly - service.doWork(); + LifecycleValidator validate = (LifecycleValidator)service; + validate.assertSetup(); + + // Cleanup + m_serviceManager.dispose(); + + // Assert the service has been shutdown correctly + validate.assertDisposed(); } /** diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/LifecycleValidator.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/LifecycleValidator.java index b95ac5ffe..8da938889 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/LifecycleValidator.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/LifecycleValidator.java @@ -9,6 +9,7 @@ package org.apache.myrmidon.components.service.test; import junit.framework.Assert; import org.apache.avalon.framework.activity.Initializable; +import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.logger.LogEnabled; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.parameters.ParameterException; @@ -17,6 +18,9 @@ import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; /** * A basic class that asserts that the object is correctly set-up. @@ -26,7 +30,7 @@ import org.apache.avalon.framework.service.Serviceable; */ public class LifecycleValidator extends Assert - implements LogEnabled, Serviceable, Parameterizable, Initializable + implements LogEnabled, Contextualizable, Serviceable, Parameterizable, Initializable, Disposable { private String m_state = STATE_NOT_INIT; @@ -34,7 +38,9 @@ public class LifecycleValidator private final static String STATE_LOG_ENABLED = "log-enabled"; private final static String STATE_SERVICED = "serviced"; private final static String STATE_PARAMETERISED = "parameterised"; - protected final static String STATE_INITIALISED = "initialised"; + private final static String STATE_INITIALISED = "initialised"; + private final static String STATE_CONTEXTUALISED = "contextualised"; + private final static String STATE_DISPOSED = "disposed"; public void enableLogging( final Logger logger ) { @@ -42,13 +48,19 @@ public class LifecycleValidator m_state = STATE_LOG_ENABLED; } - public void service( final ServiceManager serviceManager ) throws ServiceException + public void contextualize( final Context context ) throws ContextException { assertEquals( STATE_LOG_ENABLED, m_state ); + m_state = STATE_CONTEXTUALISED; + } + + public void service( final ServiceManager serviceManager ) throws ServiceException + { + assertEquals( STATE_CONTEXTUALISED, m_state ); m_state = STATE_SERVICED; } - public void parameterize( Parameters parameters ) throws ParameterException + public void parameterize( final Parameters parameters ) throws ParameterException { assertEquals( STATE_SERVICED, m_state ); m_state = STATE_PARAMETERISED; @@ -60,8 +72,19 @@ public class LifecycleValidator m_state = STATE_INITIALISED; } + public void dispose() + { + assertEquals( STATE_INITIALISED, m_state ); + m_state = STATE_DISPOSED; + } + protected void assertSetup() { assertEquals( STATE_INITIALISED, m_state ); } + + protected void assertDisposed() + { + assertEquals( STATE_DISPOSED, m_state ); + } }