Browse Source

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 <import>-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
master
adammurdoch 23 years ago
parent
commit
f5ba55efa1
14 changed files with 257 additions and 181 deletions
  1. +9
    -7
      proposal/myrmidon/src/java/org/apache/myrmidon/components/classloader/DefaultClassLoaderManager.java
  2. +32
    -22
      proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java
  3. +8
    -18
      proposal/myrmidon/src/java/org/apache/myrmidon/components/extensions/DefaultExtensionManager.java
  4. +20
    -3
      proposal/myrmidon/src/java/org/apache/myrmidon/components/service/InstantiatingServiceManager.java
  5. +22
    -21
      proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java
  6. +8
    -32
      proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/ExecManagerFactory.java
  7. +16
    -8
      proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java
  8. +68
    -30
      proposal/myrmidon/src/java/org/apache/myrmidon/frontends/EmbeddedAnt.java
  9. +5
    -3
      proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties
  10. +21
    -18
      proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java
  11. +6
    -6
      proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test/DefaultClassLoaderManagerTestCase.java
  12. +4
    -5
      proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java
  13. +11
    -4
      proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java
  14. +27
    -4
      proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/LifecycleValidator.java

+ 9
- 7
proposal/myrmidon/src/java/org/apache/myrmidon/components/classloader/DefaultClassLoaderManager.java View File

@@ -12,16 +12,19 @@ import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.HashSet;
import java.util.jar.Manifest;
import java.util.jar.JarFile; 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.Extension;
import org.apache.avalon.excalibur.extension.OptionalPackage; import org.apache.avalon.excalibur.extension.OptionalPackage;
import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources; 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.logger.AbstractLogEnabled;
import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager; 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.classloader.ClassLoaderManager;
import org.apache.myrmidon.interfaces.deployer.DeploymentException; import org.apache.myrmidon.interfaces.deployer.DeploymentException;
import org.apache.myrmidon.interfaces.extensions.ExtensionManager; import org.apache.myrmidon.interfaces.extensions.ExtensionManager;
import org.apache.aut.nativelib.PathUtil;


/** /**
* A default implementation of a ClassLoader manager. * A default implementation of a ClassLoader manager.
@@ -40,7 +42,7 @@ import org.apache.aut.nativelib.PathUtil;
*/ */
public class DefaultClassLoaderManager public class DefaultClassLoaderManager
extends AbstractLogEnabled extends AbstractLogEnabled
implements ClassLoaderManager, Serviceable, Initializable
implements ClassLoaderManager, Serviceable, Contextualizable
{ {
private static final Resources REZ = private static final Resources REZ =
ResourceManager.getPackageResources( DefaultClassLoaderManager.class ); ResourceManager.getPackageResources( DefaultClassLoaderManager.class );
@@ -62,11 +64,11 @@ public class DefaultClassLoaderManager
m_commonClassLoader = commonClassLoader; m_commonClassLoader = commonClassLoader;
} }


public void initialize() throws Exception
public void contextualize( final Context context ) throws ContextException
{ {
if( null == m_commonClassLoader ) if( null == m_commonClassLoader )
{ {
m_commonClassLoader = Thread.currentThread().getContextClassLoader();
m_commonClassLoader = (ClassLoader)context.get( "myrmidon.shared.classloader" );
} }
} }




+ 32
- 22
proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java View File

@@ -19,6 +19,9 @@ import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.excalibur.io.ExtensionFileFilter; import org.apache.avalon.excalibur.io.ExtensionFileFilter;
import org.apache.avalon.excalibur.io.FileUtil; import org.apache.avalon.excalibur.io.FileUtil;
import org.apache.avalon.framework.CascadingException; 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.Disposable;
import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.activity.Startable; import org.apache.avalon.framework.activity.Startable;
@@ -62,7 +65,7 @@ import org.apache.myrmidon.components.store.DefaultPropertyStore;
*/ */
public class DefaultEmbeddor public class DefaultEmbeddor
extends AbstractLogEnabled extends AbstractLogEnabled
implements Embeddor, Parameterizable, Initializable, Startable, Disposable
implements Embeddor, Contextualizable, Initializable, Startable, Disposable
{ {
private static final Resources REZ = private static final Resources REZ =
ResourceManager.getPackageResources( DefaultEmbeddor.class ); ResourceManager.getPackageResources( DefaultEmbeddor.class );
@@ -76,17 +79,15 @@ public class DefaultEmbeddor


private List m_components = new ArrayList(); private List m_components = new ArrayList();
private DefaultServiceManager m_serviceManager = new DefaultServiceManager(); private DefaultServiceManager m_serviceManager = new DefaultServiceManager();
private Parameters m_parameters;
private Context m_context;


/** /**
* Setup basic properties of engine. * Setup basic properties of engine.
* Called before init() and can be used to specify alternate components in system. * 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 = final Workspace workspace =
(Workspace)createService( Workspace.class, PREFIX + "workspace.DefaultWorkspace" ); (Workspace)createService( Workspace.class, PREFIX + "workspace.DefaultWorkspace" );
setupObject( workspace, m_workspaceServiceManager, m_parameters );
setupObject( workspace, m_workspaceServiceManager, null );


// Create the property store // Create the property store
final PropertyStore propStore = createBaseStore( properties ); final PropertyStore propStore = createBaseStore( properties );
@@ -185,7 +186,7 @@ public class DefaultEmbeddor
final ServiceManager projServiceManager final ServiceManager projServiceManager
= (ServiceManager)createService( ServiceManager.class, = (ServiceManager)createService( ServiceManager.class,
PREFIX + "service.InstantiatingServiceManager" ); PREFIX + "service.InstantiatingServiceManager" );
setupObject( projServiceManager, m_serviceManager, m_parameters );
setupObject( projServiceManager, m_serviceManager, null );
m_components.add( projServiceManager ); m_components.add( projServiceManager );


// setup a service manager to be used by workspaces // setup a service manager to be used by workspaces
@@ -204,8 +205,8 @@ public class DefaultEmbeddor


// Deploy all type libraries in the lib directory // Deploy all type libraries in the lib directory
final ExtensionFileFilter filter = new ExtensionFileFilter( ".atl" ); 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_components = null;
m_deployer = null; m_deployer = null;
m_serviceManager = 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(); ) for( Iterator iterator = m_components.iterator(); iterator.hasNext(); )
{ {
final Object component = iterator.next(); 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 ) private Object createService( final Class roleType, final String defaultImpl )
throws Exception 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 try
{ {
@@ -341,12 +342,17 @@ public class DefaultEmbeddor
{ {
setupLogger( object ); setupLogger( object );


if(object instanceof Contextualizable )
{
( (Contextualizable)object ).contextualize( m_context );

}
if( object instanceof Serviceable ) if( object instanceof Serviceable )
{ {
( (Serviceable)object ).service( serviceManager ); ( (Serviceable)object ).service( serviceManager );
} }


if( object instanceof Parameterizable )
if( parameters != null && object instanceof Parameterizable )
{ {
( (Parameterizable)object ).parameterize( parameters ); ( (Parameterizable)object ).parameterize( parameters );
} }
@@ -360,16 +366,20 @@ public class DefaultEmbeddor
/** /**
* Deploys all type libraries in a directory. * 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 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 );
}
} }
} }




+ 8
- 18
proposal/myrmidon/src/java/org/apache/myrmidon/components/extensions/DefaultExtensionManager.java View File

@@ -13,14 +13,13 @@ import org.apache.avalon.excalibur.extension.Extension;
import org.apache.avalon.excalibur.extension.OptionalPackage; import org.apache.avalon.excalibur.extension.OptionalPackage;
import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources; 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.Disposable;
import org.apache.avalon.framework.activity.Initializable; 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.LogEnabled;
import org.apache.avalon.framework.logger.Logger; 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; import org.apache.myrmidon.interfaces.extensions.ExtensionManager;


/** /**
@@ -31,7 +30,7 @@ import org.apache.myrmidon.interfaces.extensions.ExtensionManager;
*/ */
public class DefaultExtensionManager public class DefaultExtensionManager
extends DefaultPackageRepository extends DefaultPackageRepository
implements LogEnabled, Parameterizable, Initializable, Disposable, ExtensionManager
implements LogEnabled, Contextualizable, Initializable, Disposable, ExtensionManager
{ {
private static final Resources REZ = private static final Resources REZ =
ResourceManager.getPackageResources( DefaultExtensionManager.class ); ResourceManager.getPackageResources( DefaultExtensionManager.class );
@@ -50,7 +49,7 @@ public class DefaultExtensionManager
File.separator + "lib" + File.separator + "tools.jar"; File.separator + "lib" + File.separator + "tools.jar";


private Logger m_logger; private Logger m_logger;
private String m_path;
private File[] m_path;


public DefaultExtensionManager() public DefaultExtensionManager()
{ {
@@ -67,24 +66,15 @@ public class DefaultExtensionManager
m_logger = logger; 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() public void initialize()
throws Exception 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(); scanPath();


// Add the JVM's tools.jar as an extension // Add the JVM's tools.jar as an extension


+ 20
- 3
proposal/myrmidon/src/java/org/apache/myrmidon/components/service/InstantiatingServiceManager.java View File

@@ -23,6 +23,9 @@ import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable; 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.RoleInfo;
import org.apache.myrmidon.interfaces.role.RoleManager; import org.apache.myrmidon.interfaces.role.RoleManager;
import org.apache.myrmidon.interfaces.service.ServiceFactory; 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: * and running the service instances through the service lifecycle:
* <ul> * <ul>
* <li>log enable * <li>log enable
* <li>contextualise
* <li>service * <li>service
* <li>parameterise * <li>parameterise
* <li>initialise * <li>initialise
* <li>use
* <li>dispose
* </ul> * </ul>
* *
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
@@ -47,7 +53,7 @@ import org.apache.myrmidon.interfaces.type.TypeManager;
*/ */
public class InstantiatingServiceManager public class InstantiatingServiceManager
extends AbstractLogEnabled extends AbstractLogEnabled
implements ServiceManager, Parameterizable, Serviceable, Disposable
implements ServiceManager, Contextualizable, Parameterizable, Serviceable, Disposable
{ {
private static final Resources REZ = private static final Resources REZ =
ResourceManager.getPackageResources( InstantiatingServiceManager.class ); ResourceManager.getPackageResources( InstantiatingServiceManager.class );
@@ -64,8 +70,14 @@ public class InstantiatingServiceManager
private ServiceManager m_serviceManager; private ServiceManager m_serviceManager;
private Parameters m_parameters; private Parameters m_parameters;
private TypeManager m_typeManager; 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; m_parameters = parameters;
} }
@@ -211,12 +223,17 @@ public class InstantiatingServiceManager
{ {
setupLogger( object ); setupLogger( object );


if( m_context != null && object instanceof Contextualizable )
{
( (Contextualizable)object ).contextualize( m_context );
}

if( object instanceof Serviceable ) if( object instanceof Serviceable )
{ {
( (Serviceable)object ).service( m_serviceManager ); ( (Serviceable)object ).service( m_serviceManager );
} }


if( object instanceof Parameterizable )
if( m_parameters != null && object instanceof Parameterizable )
{ {
( (Parameterizable)object ).parameterize( m_parameters ); ( (Parameterizable)object ).parameterize( m_parameters );
} }


+ 22
- 21
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java View File

@@ -12,11 +12,11 @@ import java.util.HashMap;
import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.framework.configuration.Configuration; 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.AbstractLogEnabled;
import org.apache.avalon.framework.logger.Logger; 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.DefaultServiceManager;
import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.ServiceManager;
import org.apache.myrmidon.api.TaskContext; import org.apache.myrmidon.api.TaskContext;
@@ -44,7 +44,7 @@ import org.apache.myrmidon.listeners.ProjectListener;
*/ */
public class DefaultWorkspace public class DefaultWorkspace
extends AbstractLogEnabled extends AbstractLogEnabled
implements Workspace, ExecutionContainer, Parameterizable
implements Workspace, ExecutionContainer, Contextualizable
{ {
private static final Resources REZ = private static final Resources REZ =
ResourceManager.getPackageResources( DefaultWorkspace.class ); ResourceManager.getPackageResources( DefaultWorkspace.class );
@@ -52,10 +52,10 @@ public class DefaultWorkspace
private Executor m_executor; private Executor m_executor;
private ProjectListenerSupport m_listenerSupport = new ProjectListenerSupport(); private ProjectListenerSupport m_listenerSupport = new ProjectListenerSupport();
private ServiceManager m_serviceManager; private ServiceManager m_serviceManager;
private Parameters m_parameters;
private PropertyStore m_baseStore; private PropertyStore m_baseStore;
private TypeManager m_typeManager; private TypeManager m_typeManager;
private Deployer m_deployer; private Deployer m_deployer;
private Context m_context;


/** A map from Project object -> ProjectEntry for that project. */ /** A map from Project object -> ProjectEntry for that project. */
private HashMap m_entries = new HashMap(); private HashMap m_entries = new HashMap();
@@ -92,10 +92,9 @@ public class DefaultWorkspace
m_deployer = (Deployer)m_serviceManager.lookup( Deployer.ROLE ); 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) //workspace specific)
final String name = libraryName.replace( '/', File.separatorChar ) + ".atl"; 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;
}
} }
} }




+ 8
- 32
proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/ExecManagerFactory.java View File

@@ -8,13 +8,10 @@
package org.apache.myrmidon.framework.factories; package org.apache.myrmidon.framework.factories;


import java.io.File; import java.io.File;
import org.apache.aut.nativelib.ExecException;
import org.apache.aut.nativelib.impl.DefaultExecManager; 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.AntServiceException;
import org.apache.myrmidon.interfaces.service.ServiceFactory; import org.apache.myrmidon.interfaces.service.ServiceFactory;


@@ -25,17 +22,13 @@ import org.apache.myrmidon.interfaces.service.ServiceFactory;
* @version $Revision$ $Date$ * @version $Revision$ $Date$
*/ */
public class ExecManagerFactory 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 try
{ {
final File home = getHomeDirectory();
return new DefaultExecManager( home );
return new DefaultExecManager( m_homeDir );
} }
catch( final Exception ee ) catch( final Exception ee )
{ {
throw new AntServiceException( ee.getMessage(), 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 );
}
} }

+ 16
- 8
proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java View File

@@ -51,18 +51,19 @@ public class CLIMain
private static final int VERSION_OPT = 1; private static final int VERSION_OPT = 1;
private static final int LISTENER_OPT = 2; private static final int LISTENER_OPT = 2;
private static final int TASKLIB_DIR_OPT = 5; 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 //incompatable options for info options
private static final int[] INFO_OPT_INCOMPAT = new int[] private static final int[] INFO_OPT_INCOMPAT = new int[]
{ {
HELP_OPT, QUIET_OPT, VERBOSE_OPT, FILE_OPT, HELP_OPT, QUIET_OPT, VERBOSE_OPT, FILE_OPT,
LOG_LEVEL_OPT, BUILDER_PARAM_OPT, NO_PREFIX_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 INCREMENTAL_OPT, HOME_DIR_OPT, DRY_RUN_OPT, TYPE_OPT
}; };


@@ -191,10 +192,14 @@ public class CLIMain
VERSION_OPT, VERSION_OPT,
REZ.getString( "version.opt" ), REZ.getString( "version.opt" ),
INFO_OPT_INCOMPAT ), INFO_OPT_INCOMPAT ),
new CLOptionDescriptor( "task-lib-dir",
new CLOptionDescriptor( "antlib-path",
CLOptionDescriptor.ARGUMENT_REQUIRED, CLOptionDescriptor.ARGUMENT_REQUIRED,
TASKLIB_DIR_OPT, TASKLIB_DIR_OPT,
REZ.getString( "tasklib.opt" ) ), REZ.getString( "tasklib.opt" ) ),
new CLOptionDescriptor( "ext-path",
CLOptionDescriptor.ARGUMENT_REQUIRED,
EXTLIB_DIR_OPT,
REZ.getString( "extlib.opt" ) ),
new CLOptionDescriptor( "incremental", new CLOptionDescriptor( "incremental",
CLOptionDescriptor.ARGUMENT_DISALLOWED, CLOptionDescriptor.ARGUMENT_DISALLOWED,
INCREMENTAL_OPT, INCREMENTAL_OPT,
@@ -257,7 +262,10 @@ public class CLIMain
m_embedded.setEmbeddorProperty( "myrmidon.home", option.getArgument() ); m_embedded.setEmbeddorProperty( "myrmidon.home", option.getArgument() );
break; break;
case TASKLIB_DIR_OPT: 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; break;


case LOG_LEVEL_OPT: case LOG_LEVEL_OPT:


+ 68
- 30
proposal/myrmidon/src/java/org/apache/myrmidon/frontends/EmbeddedAnt.java View File

@@ -14,11 +14,14 @@ import java.util.Map;
import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.excalibur.io.FileUtil; 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.Disposable;
import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.activity.Startable; 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.logger.AbstractLogEnabled;
import org.apache.avalon.framework.parameters.Parameterizable;
import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.parameters.Parameters;
import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.interfaces.embeddor.Embeddor; import org.apache.myrmidon.interfaces.embeddor.Embeddor;
@@ -48,13 +51,14 @@ public class EmbeddedAnt
private static final String DEFAULT_EMBEDDOR_CLASS = private static final String DEFAULT_EMBEDDOR_CLASS =
"org.apache.myrmidon.components.embeddor.DefaultEmbeddor"; "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 String m_projectFile = "build.ant";
private Project m_project; private Project m_project;
private String m_listenerName = "default"; 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 ClassLoader m_sharedClassLoader;
private Embeddor m_embeddor; private Embeddor m_embeddor;
private File m_homeDir; private File m_homeDir;
@@ -63,8 +67,8 @@ public class EmbeddedAnt
/** /**
* Sets the Myrmidon home directory. Default is to use the current * Sets the Myrmidon home directory. Default is to use the current
* directory. * 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). * as the default (which is a dud default).
*/ */
public void setHomeDirectory( final File homeDir ) public void setHomeDirectory( final File homeDir )
@@ -144,8 +148,7 @@ public class EmbeddedAnt
*/ */
public void setEmbeddorProperty( final String name, final Object value ) 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 public void executeTargets( final String[] targets ) throws Exception
{ {
Map embeddorParameters = new HashMap( m_embeddorParameters );
setupPaths( embeddorParameters );

if( m_sharedClassLoader != null ) if( m_sharedClassLoader != null )
{ {
Thread.currentThread().setContextClassLoader( m_sharedClassLoader );
embeddorParameters.put( "myrmidon.shared.classloader", m_sharedClassLoader );
} }


checkHomeDir();

// Prepare the embeddor, and project model // Prepare the embeddor, and project model
final Embeddor embeddor = prepareEmbeddor();
final Embeddor embeddor = prepareEmbeddor( embeddorParameters );
final Project project = prepareProjectModel( embeddor ); final Project project = prepareProjectModel( embeddor );


// Create a new workspace // Create a new workspace
@@ -233,16 +237,16 @@ public class EmbeddedAnt


/** /**
* Make sure myrmidon home directory has been specified, and is a * 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 ) if( m_homeDir == null )
{ {
m_homeDir = new File( "." ).getAbsoluteFile(); m_homeDir = new File( "." ).getAbsoluteFile();
} }
checkDirectory( m_homeDir, "home-dir.name" ); checkDirectory( m_homeDir, "home-dir.name" );
m_embeddorParameters.setParameter( "myrmidon.home", m_homeDir.getAbsolutePath() );
parameters.put( "myrmidon.home", m_homeDir );


if( getLogger().isInfoEnabled() ) if( getLogger().isInfoEnabled() )
{ {
@@ -250,28 +254,36 @@ public class EmbeddedAnt
getLogger().info( message ); 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. * Prepares and returns the embeddor to use.
*/ */
private Embeddor prepareEmbeddor()
private Embeddor prepareEmbeddor( final Map parameters )
throws Exception throws Exception
{ {
if( m_embeddor == null ) if( m_embeddor == null )
{ {
m_embeddor = createEmbeddor(); m_embeddor = createEmbeddor();
setupLogger( m_embeddor ); 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 ) if( m_embeddor instanceof Initializable )
{ {
@@ -310,7 +322,7 @@ public class EmbeddedAnt
final int count = m_listeners.size(); final int count = m_listeners.size();
for( int i = 0; i < count; i++ ) 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 ); workspace.addProjectListener( listener );
} }
} }
@@ -352,12 +364,38 @@ public class EmbeddedAnt
/** /**
* Resolve a directory relative to another base directory. * 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 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() ] );
} }


/** /**


+ 5
- 3
proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties View File

@@ -9,7 +9,8 @@ debug.opt=Equivalent to --log-level=DEBUG.
listener.opt=Specify the listener for log events. listener.opt=Specify the listener for log events.
noprefix.opt=Do not prefix output with the task name. Equivalent to --listener noprefix. noprefix.opt=Do not prefix output with the task name. Equivalent to --listener noprefix.
version.opt=Display version. 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. incremental.opt=Run in incremental mode.
home.opt=Specify Ant home directory. home.opt=Specify Ant home directory.
define.opt=Define a property (ie -Dfoo=var). 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} homedir.notice=Ant Home Directory: {0}
buildfile.notice=Ant Build File: {0} buildfile.notice=Ant Build File: {0}
home-dir.name=Ant home directory 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

+ 21
- 18
proposal/myrmidon/src/test/org/apache/myrmidon/components/AbstractComponentTest.java View File

@@ -7,19 +7,22 @@
*/ */
package org.apache.myrmidon.components; package org.apache.myrmidon.components;


import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.io.File;
import java.util.Map;
import org.apache.aut.converter.Converter; 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.LogEnabled;
import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.service.DefaultServiceManager; import org.apache.avalon.framework.service.DefaultServiceManager;
import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable; 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.AbstractMyrmidonTest;
import org.apache.myrmidon.components.classloader.DefaultClassLoaderManager; import org.apache.myrmidon.components.classloader.DefaultClassLoaderManager;
import org.apache.myrmidon.components.configurer.DefaultConfigurer; 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(); ) for( Iterator iterator = components.iterator(); iterator.hasNext(); )
{ {
Object obj = iterator.next(); 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(); ) for( Iterator iterator = components.iterator(); iterator.hasNext(); )
{ {
Object obj = iterator.next(); 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 * Creates the parameters for the test. Sub-classes can override this
* method to set-up the parameters. * 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; return parameters;
} }




+ 6
- 6
proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test/DefaultClassLoaderManagerTestCase.java View File

@@ -11,12 +11,12 @@ import java.io.File;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.Enumeration; 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.AbstractComponentTest;
import org.apache.myrmidon.components.classloader.DefaultClassLoaderManager; import org.apache.myrmidon.components.classloader.DefaultClassLoaderManager;
import org.apache.myrmidon.interfaces.classloader.ClassLoaderManager;
import org.apache.myrmidon.interfaces.classloader.ClassLoaderException; 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. * Test cases for the DefaultClassLoaderManager.
@@ -87,10 +87,10 @@ public class DefaultClassLoaderManagerTestCase
* Creates the parameters for the test. Sub-classes can override this * Creates the parameters for the test. Sub-classes can override this
* method to set-up the parameters. * 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; return parameters;
} }




+ 4
- 5
proposal/myrmidon/src/test/org/apache/myrmidon/components/embeddor/test/DefaultEmbeddorTest.java View File

@@ -9,7 +9,7 @@ package org.apache.myrmidon.components.embeddor.test;


import java.io.File; import java.io.File;
import java.util.HashMap; 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.avalon.framework.logger.Logger;
import org.apache.myrmidon.AbstractProjectTest; import org.apache.myrmidon.AbstractProjectTest;
import org.apache.myrmidon.LogMessageTracker; import org.apache.myrmidon.LogMessageTracker;
@@ -62,10 +62,9 @@ public class DefaultEmbeddorTest
m_embeddor = new DefaultEmbeddor(); m_embeddor = new DefaultEmbeddor();
m_embeddor.enableLogging( logger ); 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.initialize();
m_embeddor.start(); m_embeddor.start();
} }


+ 11
- 4
proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/InstantiatingServiceManagerTestCase.java View File

@@ -7,10 +7,10 @@
*/ */
package org.apache.myrmidon.components.service.test; 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.excalibur.i18n.Resources;
import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.service.ServiceException; 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.AbstractComponentTest;
import org.apache.myrmidon.components.service.InstantiatingServiceManager; import org.apache.myrmidon.components.service.InstantiatingServiceManager;
import org.apache.myrmidon.interfaces.role.RoleInfo; import org.apache.myrmidon.interfaces.role.RoleInfo;
@@ -31,7 +31,6 @@ public class InstantiatingServiceManagerTestCase
private final static Resources REZ = getResourcesForTested( InstantiatingServiceManagerTestCase.class ); private final static Resources REZ = getResourcesForTested( InstantiatingServiceManagerTestCase.class );


private InstantiatingServiceManager m_serviceManager; private InstantiatingServiceManager m_serviceManager;
private Parameters m_parameters = new Parameters();


public InstantiatingServiceManagerTestCase( final String name ) public InstantiatingServiceManagerTestCase( final String name )
{ {
@@ -47,8 +46,9 @@ public class InstantiatingServiceManagerTestCase
// Set-up the service manager // Set-up the service manager
m_serviceManager = new InstantiatingServiceManager(); m_serviceManager = new InstantiatingServiceManager();
m_serviceManager.enableLogging( getLogger() ); m_serviceManager.enableLogging( getLogger() );
m_serviceManager.contextualize( new DefaultContext() );
m_serviceManager.service( getServiceManager() ); 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 ); assertTrue( service.getClass() == TestServiceImpl2.class );


// Assert the service has been setup correctly // 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();
} }


/** /**


+ 27
- 4
proposal/myrmidon/src/test/org/apache/myrmidon/components/service/test/LifecycleValidator.java View File

@@ -9,6 +9,7 @@ package org.apache.myrmidon.components.service.test;


import junit.framework.Assert; import junit.framework.Assert;
import org.apache.avalon.framework.activity.Initializable; 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.LogEnabled;
import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.parameters.ParameterException; 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.ServiceException;
import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable; 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. * 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 public class LifecycleValidator
extends Assert extends Assert
implements LogEnabled, Serviceable, Parameterizable, Initializable
implements LogEnabled, Contextualizable, Serviceable, Parameterizable, Initializable, Disposable
{ {
private String m_state = STATE_NOT_INIT; 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_LOG_ENABLED = "log-enabled";
private final static String STATE_SERVICED = "serviced"; private final static String STATE_SERVICED = "serviced";
private final static String STATE_PARAMETERISED = "parameterised"; 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 ) public void enableLogging( final Logger logger )
{ {
@@ -42,13 +48,19 @@ public class LifecycleValidator
m_state = STATE_LOG_ENABLED; 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 ); 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; m_state = STATE_SERVICED;
} }


public void parameterize( Parameters parameters ) throws ParameterException
public void parameterize( final Parameters parameters ) throws ParameterException
{ {
assertEquals( STATE_SERVICED, m_state ); assertEquals( STATE_SERVICED, m_state );
m_state = STATE_PARAMETERISED; m_state = STATE_PARAMETERISED;
@@ -60,8 +72,19 @@ public class LifecycleValidator
m_state = STATE_INITIALISED; m_state = STATE_INITIALISED;
} }


public void dispose()
{
assertEquals( STATE_INITIALISED, m_state );
m_state = STATE_DISPOSED;
}

protected void assertSetup() protected void assertSetup()
{ {
assertEquals( STATE_INITIALISED, m_state ); assertEquals( STATE_INITIALISED, m_state );
} }

protected void assertDisposed()
{
assertEquals( STATE_DISPOSED, m_state );
}
} }

Loading…
Cancel
Save