explicitly deploy a type. These replace the multi-arg deployX() methods. * ConverterDef now sub-classes AbstractTypeDef. * Changed AbstractTypeDef to use TypeDefinition objects, and to configure them using the configurer. Removed all setX() methods from AbstractTypeDef and sub-classes. * Added some units tests for DefaultDeployer. * Moved component set-up from DefaultConfigurerTest -> super class. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271072 13f79535-47bb-0310-9956-ffa450edef68master
@@ -480,7 +480,7 @@ Legal: | |||
</zip> | |||
<junit printsummary="on" | |||
fork="false"> | |||
fork="true"> | |||
<formatter type="brief" usefile="false"/> | |||
<classpath refid="project.class.path"/> | |||
<classpath location="${test.classes}"/> | |||
@@ -492,7 +492,9 @@ Legal: | |||
<sysproperty key="test.ftp.uri" value="ftp://${vfs.user}:${vfs.password}@${vfs.host}/home/${vfs.user}/vfs"/> | |||
<batchtest> | |||
<fileset dir="${test.classes}" includes="**/*Test.class"> | |||
<fileset dir="${test.classes}"> | |||
<include name="**/*Test.class" unless="single.test"/> | |||
<include name="**/${single.test}Test.class" if="single.test"/> | |||
<exclude name="**/SmbFileSystemTest.class" unless="test.smb"/> | |||
<exclude name="**/FtpFileSystemTest.class" unless="test.ftp"/> | |||
</fileset> | |||
@@ -7,13 +7,9 @@ | |||
*/ | |||
package org.apache.antlib.runtime; | |||
import java.io.File; | |||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
import org.apache.avalon.excalibur.i18n.Resources; | |||
import org.apache.myrmidon.api.AbstractTask; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
import org.apache.myrmidon.interfaces.deployer.TypeDeployer; | |||
import org.apache.myrmidon.framework.AbstractTypeDef; | |||
import org.apache.myrmidon.interfaces.deployer.ConverterDefinition; | |||
import org.apache.myrmidon.interfaces.deployer.TypeDefinition; | |||
/** | |||
* Task to define a converter. | |||
@@ -21,71 +17,11 @@ import org.apache.myrmidon.interfaces.deployer.TypeDeployer; | |||
* @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
*/ | |||
public class ConverterDef | |||
extends AbstractTask | |||
extends AbstractTypeDef | |||
{ | |||
private final static Resources REZ = | |||
ResourceManager.getPackageResources( ConverterDef.class ); | |||
private String m_sourceType; | |||
private String m_destinationType; | |||
private File m_lib; | |||
private String m_classname; | |||
public void setLib( final File lib ) | |||
{ | |||
m_lib = lib; | |||
} | |||
public void setClassname( final String classname ) | |||
{ | |||
m_classname = classname; | |||
} | |||
public void setSourceType( final String sourceType ) | |||
protected TypeDefinition createTypeDefinition() | |||
{ | |||
m_sourceType = sourceType; | |||
} | |||
public void setDestinationType( final String destinationType ) | |||
{ | |||
m_destinationType = destinationType; | |||
} | |||
public void execute() | |||
throws TaskException | |||
{ | |||
if( null == m_classname ) | |||
{ | |||
final String message = REZ.getString( "converterdef.no-classname.error" ); | |||
throw new TaskException( message ); | |||
} | |||
else if( null == m_sourceType ) | |||
{ | |||
final String message = REZ.getString( "converterdef.no-source.error" ); | |||
throw new TaskException( message ); | |||
} | |||
else if( null == m_destinationType ) | |||
{ | |||
final String message = REZ.getString( "converterdef.no-destination.error" ); | |||
throw new TaskException( message ); | |||
} | |||
else if( null == m_lib ) | |||
{ | |||
final String message = REZ.getString( "converterdef.no-lib.error" ); | |||
throw new TaskException( message ); | |||
} | |||
try | |||
{ | |||
// Locate the deployer, then deploy the converter | |||
final Deployer deployer = (Deployer)getService( Deployer.class ); | |||
final TypeDeployer typeDeployer = deployer.createDeployer( m_lib ); | |||
typeDeployer.deployConverter( m_classname, m_sourceType, m_destinationType ); | |||
} | |||
catch( final Exception e ) | |||
{ | |||
final String message = REZ.getString( "converterdef.no-register.error", m_classname ); | |||
throw new TaskException( message, e ); | |||
} | |||
return new ConverterDefinition(); | |||
} | |||
} |
@@ -1,9 +1,3 @@ | |||
converterdef.no-classname.error=Must specify classname parameter. | |||
converterdef.no-source.error=Must specify the source-type parameter. | |||
converterdef.no-destination.error=Must specify the destination-type parameter. | |||
converterdef.no-lib.error=Must specify the lib parameter. | |||
converterdef.no-register.error=Failed to register converter {0}. | |||
facility.no-create.error=Failed to create aspect handler of type {0}. | |||
facility.multi-element.error=Expected one sub-element to configure facility. | |||
facility.no-namespace.error=Must specify namespace parameter. | |||
@@ -8,6 +8,8 @@ | |||
package org.apache.antlib.runtime; | |||
import org.apache.myrmidon.framework.AbstractTypeDef; | |||
import org.apache.myrmidon.interfaces.deployer.GeneralTypeDefinition; | |||
import org.apache.myrmidon.interfaces.deployer.TypeDefinition; | |||
/** | |||
* Task to define a type. | |||
@@ -17,15 +19,9 @@ import org.apache.myrmidon.framework.AbstractTypeDef; | |||
public class TypeDef | |||
extends AbstractTypeDef | |||
{ | |||
private String m_type; | |||
public void setType( final String type ) | |||
protected TypeDefinition createTypeDefinition() | |||
{ | |||
m_type = type; | |||
} | |||
protected String getRoleShorthand() | |||
{ | |||
return m_type; | |||
return new GeneralTypeDefinition(); | |||
} | |||
} |
@@ -110,7 +110,7 @@ public class DefaultDeployer | |||
} | |||
catch( Exception e ) | |||
{ | |||
final String message = REZ.getString( "deploy-from-classloader.error" ); | |||
final String message = REZ.getString( "deploy-from-classloader.error", loader ); | |||
throw new DeploymentException( message, e ); | |||
} | |||
} | |||
@@ -27,7 +27,9 @@ import org.apache.avalon.framework.configuration.SAXConfigurationHandler; | |||
import org.apache.avalon.framework.logger.AbstractLogEnabled; | |||
import org.apache.myrmidon.converter.Converter; | |||
import org.apache.myrmidon.interfaces.converter.ConverterRegistry; | |||
import org.apache.myrmidon.interfaces.deployer.ConverterDefinition; | |||
import org.apache.myrmidon.interfaces.deployer.DeploymentException; | |||
import org.apache.myrmidon.interfaces.deployer.TypeDefinition; | |||
import org.apache.myrmidon.interfaces.deployer.TypeDeployer; | |||
import org.apache.myrmidon.interfaces.role.RoleManager; | |||
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; | |||
@@ -178,44 +180,62 @@ class Deployment | |||
/** | |||
* Deploys a single type from the type library. | |||
*/ | |||
public void deployType( String roleShorthand, String typeName, String className ) | |||
public void deployType( final TypeDefinition typeDef ) | |||
throws DeploymentException | |||
{ | |||
try | |||
{ | |||
handleType( roleShorthand, typeName, className ); | |||
} | |||
catch( Exception e ) | |||
final String typeName = typeDef.getName(); | |||
final String roleShorthand = typeDef.getRoleShorthand(); | |||
final String className = typeDef.getClassname(); | |||
if( null == className ) | |||
{ | |||
final String message = REZ.getString( "deploy-type.error", roleShorthand, typeName ); | |||
throw new DeploymentException( message, e ); | |||
final String message = REZ.getString( "typedef.no-classname.error" ); | |||
throw new DeploymentException( message ); | |||
} | |||
} | |||
/** | |||
* Deploys a converter from the type library. The converter definition | |||
* is read from the type library descriptor. | |||
*/ | |||
public void deployConverter( String className ) | |||
throws DeploymentException | |||
{ | |||
// TODO - implement this | |||
throw new DeploymentException( "Not implemented." ); | |||
} | |||
/** | |||
* Deploys a converter from the type library. | |||
*/ | |||
public void deployConverter( String className, String srcClass, String destClass ) | |||
throws DeploymentException | |||
{ | |||
try | |||
{ | |||
handleConverter( className, srcClass, destClass ); | |||
if( typeDef instanceof ConverterDefinition ) | |||
{ | |||
// Validate the definition | |||
final ConverterDefinition converterDef = (ConverterDefinition)typeDef; | |||
final String srcClass = converterDef.getSourceType(); | |||
final String destClass = converterDef.getDestinationType(); | |||
if( null == srcClass ) | |||
{ | |||
final String message = REZ.getString( "converterdef.no-source.error" ); | |||
throw new DeploymentException( message ); | |||
} | |||
if( null == destClass ) | |||
{ | |||
final String message = REZ.getString( "converterdef.no-destination.error" ); | |||
throw new DeploymentException( message ); | |||
} | |||
// Deploy the converter | |||
handleConverter( className, srcClass, destClass ); | |||
} | |||
else | |||
{ | |||
// Validate the definition | |||
if( null == roleShorthand ) | |||
{ | |||
final String message = REZ.getString( "typedef.no-role.error" ); | |||
throw new DeploymentException( message ); | |||
} | |||
else if( null == typeName ) | |||
{ | |||
final String message = REZ.getString( "typedef.no-name.error" ); | |||
throw new DeploymentException( message ); | |||
} | |||
// Deploy general-purpose type | |||
handleType( roleShorthand, typeName, className ); | |||
} | |||
} | |||
catch( Exception e ) | |||
{ | |||
final String message = REZ.getString( "deploy-converter.error", srcClass, destClass ); | |||
final String message = REZ.getString( "deploy-type.error", roleShorthand, typeName ); | |||
throw new DeploymentException( message, e ); | |||
} | |||
} | |||
@@ -1,4 +1,4 @@ | |||
register-converter.notice=Registered converter that converts from {1} to {2}. | |||
register-converter.notice=Registered converter that converts from {0} to {1}. | |||
register-type.notice=Registered type {0}/{1}. | |||
register-role.notice=Registered role {0} with shorthand name {1}. | |||
url-deploy-types.notice=Registering types from "{0}". | |||
@@ -12,6 +12,11 @@ deploy-type.error=Could not register type {0}/{1}. | |||
unknown-role4name.error=Unknown role "{0}". | |||
no-file.error=Could not find type library "{0}". | |||
file-is-dir.error=Type library "{0}" is a directory. | |||
typedef.no-classname.error=Must specify the classname parameter. | |||
typedef.no-name.error=Must specify name parameter. | |||
typedef.no-role.error=Must specify type parameter. | |||
converterdef.no-source.error=Must specify the source-type parameter. | |||
converterdef.no-destination.error=Must specify the destination-type parameter. | |||
available-extensions.notice=The list of available extensions for type library includes; {0} | |||
required-extensions.notice=The list of required extensions for type library includes; {0} | |||
@@ -10,10 +10,13 @@ package org.apache.myrmidon.framework; | |||
import java.io.File; | |||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
import org.apache.avalon.excalibur.i18n.Resources; | |||
import org.apache.myrmidon.api.AbstractTask; | |||
import org.apache.avalon.framework.configuration.Configurable; | |||
import org.apache.avalon.framework.configuration.Configuration; | |||
import org.apache.avalon.framework.configuration.ConfigurationException; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
import org.apache.myrmidon.interfaces.deployer.DeploymentException; | |||
import org.apache.myrmidon.interfaces.deployer.TypeDefinition; | |||
import org.apache.myrmidon.interfaces.deployer.TypeDeployer; | |||
/** | |||
@@ -24,53 +27,66 @@ import org.apache.myrmidon.interfaces.deployer.TypeDeployer; | |||
* @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
*/ | |||
public abstract class AbstractTypeDef | |||
extends AbstractTask | |||
extends AbstractContainerTask | |||
implements Configurable | |||
{ | |||
private final static Resources REZ = | |||
ResourceManager.getPackageResources( AbstractTypeDef.class ); | |||
// TODO - replace lib with class-path | |||
private File m_lib; | |||
private String m_name; | |||
private String m_className; | |||
private TypeDefinition m_typeDef; | |||
public void setLib( final File lib ) | |||
/** | |||
* Configures this task. | |||
*/ | |||
public void configure( Configuration configuration ) throws ConfigurationException | |||
{ | |||
//In the future this would be replaced by ClassPath sub-element | |||
m_lib = lib; | |||
} | |||
m_typeDef = createTypeDefinition(); | |||
public void setName( final String name ) | |||
{ | |||
m_name = name; | |||
} | |||
// Configure attributes | |||
final String[] attrs = configuration.getAttributeNames(); | |||
for( int i = 0; i < attrs.length; i++ ) | |||
{ | |||
final String name = attrs[ i ]; | |||
final String value = configuration.getAttribute( name ); | |||
if( name.equalsIgnoreCase( "lib" ) ) | |||
{ | |||
m_lib = (File)convert( File.class, value ); | |||
} | |||
else | |||
{ | |||
configure( m_typeDef, name, value ); | |||
} | |||
} | |||
public void setClassname( final String className ) | |||
{ | |||
m_className = className; | |||
// Configure nested elements | |||
final Configuration[] elements = configuration.getChildren(); | |||
for( int i = 0; i < elements.length; i++ ) | |||
{ | |||
Configuration element = elements[ i ]; | |||
configure( m_typeDef, element ); | |||
} | |||
} | |||
/** | |||
* Executes the task. | |||
*/ | |||
public void execute() | |||
throws TaskException | |||
{ | |||
if( null == m_name ) | |||
{ | |||
final String message = REZ.getString( "typedef.no-name.error" ); | |||
throw new TaskException( message ); | |||
} | |||
else if( null == m_className ) | |||
if( null == m_lib ) | |||
{ | |||
final String message = REZ.getString( "typedef.no-classname.error" ); | |||
final String message = REZ.getString( "typedef.no-lib.error" ); | |||
throw new TaskException( message ); | |||
} | |||
final String shorthand = getRoleShorthand(); | |||
try | |||
{ | |||
// Locate the deployer, and use it to deploy the type | |||
final Deployer deployer = (Deployer)getService( Deployer.class ); | |||
final TypeDeployer typeDeployer = deployer.createDeployer( m_lib ); | |||
typeDeployer.deployType( shorthand, m_name, m_className ); | |||
typeDeployer.deployType( m_typeDef ); | |||
} | |||
catch( DeploymentException e ) | |||
{ | |||
@@ -78,5 +94,8 @@ public abstract class AbstractTypeDef | |||
} | |||
} | |||
protected abstract String getRoleShorthand(); | |||
/** | |||
* Creates the definition for the type to be deployed. | |||
*/ | |||
protected abstract TypeDefinition createTypeDefinition(); | |||
} |
@@ -3,10 +3,7 @@ container.bad-resolve.error=Error resolving value ({0}). | |||
container.bad-config.error=Error converting value. | |||
container.no-factory.error=Could not locate the type factory for type "{0}". | |||
typedef.no-name.error=Must specify name parameter. | |||
typedef.no-classname.error=Must specify classname parameter. | |||
typedef.no-register.error=Failed to register type. | |||
typedef.bad-classloader.error=Failed to build classLoader due to: {0}. | |||
typedef.no-lib.error=Must specify the lib parameter. | |||
condition.no-resolve.error=Error resolving {0}. | |||
@@ -338,7 +338,7 @@ public class CLIMain | |||
if( getLogger().isInfoEnabled() ) | |||
{ | |||
final String message = REZ.getString( "buildfile.notice", buildFile ); | |||
getLogger().warn( message ); | |||
getLogger().info( message ); | |||
} | |||
if( getLogger().isInfoEnabled() ) | |||
@@ -0,0 +1,68 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.interfaces.deployer; | |||
/** | |||
* A converter definition. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class ConverterDefinition | |||
extends TypeDefinition | |||
{ | |||
private String m_sourceType; | |||
private String m_destinationType; | |||
/** | |||
* Returns the type's role. | |||
*/ | |||
public String getRoleShorthand() | |||
{ | |||
return "converter"; | |||
} | |||
/** | |||
* Returns the type's name. | |||
*/ | |||
public String getName() | |||
{ | |||
return getClassname(); | |||
} | |||
/** | |||
* Returns the converter's source type. | |||
*/ | |||
public String getSourceType() | |||
{ | |||
return m_sourceType; | |||
} | |||
/** | |||
* Sets the converter's source type. | |||
*/ | |||
public void setSourceType( final String sourceType ) | |||
{ | |||
m_sourceType = sourceType; | |||
} | |||
/** | |||
* Returns the converter's destination type. | |||
*/ | |||
public String getDestinationType() | |||
{ | |||
return m_destinationType; | |||
} | |||
/** | |||
* Sets the converter's destination type. | |||
*/ | |||
public void setDestinationType( final String destinationType ) | |||
{ | |||
m_destinationType = destinationType; | |||
} | |||
} |
@@ -0,0 +1,52 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.interfaces.deployer; | |||
/** | |||
* A general-purpose type definition. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class GeneralTypeDefinition | |||
extends TypeDefinition | |||
{ | |||
private String m_name; | |||
private String m_roleShorthand; | |||
/** | |||
* Returns the type's role. | |||
*/ | |||
public String getRoleShorthand() | |||
{ | |||
return m_roleShorthand; | |||
} | |||
/** | |||
* Sets the type's role. | |||
*/ | |||
public void setType( String roleShorthand ) | |||
{ | |||
m_roleShorthand = roleShorthand; | |||
} | |||
/** | |||
* Returns the type's name. | |||
*/ | |||
public String getName() | |||
{ | |||
return m_name; | |||
} | |||
/** | |||
* Sets the type's name. | |||
*/ | |||
public void setName( String name ) | |||
{ | |||
m_name = name; | |||
} | |||
} |
@@ -0,0 +1,45 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.interfaces.deployer; | |||
/** | |||
* A basic type definition. This class is used to build a type definition, | |||
* from a typelib descriptor, or via introspection. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public abstract class TypeDefinition | |||
{ | |||
private String m_className; | |||
/** | |||
* Returns the type's name. | |||
*/ | |||
public abstract String getName(); | |||
/** | |||
* Returns the type's role. | |||
*/ | |||
public abstract String getRoleShorthand(); | |||
/** | |||
* Returns the type's implementation class name. | |||
*/ | |||
public String getClassname() | |||
{ | |||
return m_className; | |||
} | |||
/** | |||
* Sets the type's implementation class name. | |||
*/ | |||
public void setClassname( final String className ) | |||
{ | |||
m_className = className; | |||
} | |||
} |
@@ -11,7 +11,7 @@ package org.apache.myrmidon.interfaces.deployer; | |||
* A deployer for a type library. Allows individual elements from a type | |||
* library to be deployed. | |||
* | |||
* @author Adam Murdoch | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public interface TypeDeployer | |||
{ | |||
@@ -26,29 +26,23 @@ public interface TypeDeployer | |||
* read from the type library descriptor. | |||
* | |||
* @param roleShorthand | |||
* The <em>shorthand</em> for the role. | |||
* The shorthand name for the role. | |||
* | |||
* @param typeName | |||
* The type name. | |||
* The type name. | |||
* | |||
* @throws DeploymentException | |||
* If the type cannot be deployed. | |||
*/ | |||
void deployType( String roleShorthand, String typeName ) | |||
throws DeploymentException; | |||
/** | |||
* Deploys a single type from the type library. | |||
* | |||
* @param typeDef | |||
* The type definition. | |||
*/ | |||
void deployType( String roleShorthand, String typeName, String className ) | |||
throws DeploymentException; | |||
/** | |||
* Deploys a converter from the type library. The converter definition | |||
* is read from the type library descriptor. | |||
*/ | |||
void deployConverter( String className ) | |||
throws DeploymentException; | |||
/** | |||
* Deploys a converter from the type library. | |||
*/ | |||
void deployConverter( String className, String srcClass, String destClass ) | |||
void deployType( TypeDefinition typeDef ) | |||
throws DeploymentException; | |||
} |
@@ -0,0 +1,173 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import junit.framework.TestCase; | |||
import org.apache.avalon.framework.component.Component; | |||
import org.apache.avalon.framework.component.ComponentException; | |||
import org.apache.avalon.framework.component.ComponentManager; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.avalon.framework.component.DefaultComponentManager; | |||
import org.apache.avalon.framework.logger.LogEnabled; | |||
import org.apache.avalon.framework.logger.LogKitLogger; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.log.Hierarchy; | |||
import org.apache.log.LogTarget; | |||
import org.apache.log.Priority; | |||
import org.apache.log.format.PatternFormatter; | |||
import org.apache.log.output.io.StreamTarget; | |||
import org.apache.myrmidon.components.configurer.DefaultConfigurer; | |||
import org.apache.myrmidon.components.converter.DefaultConverterRegistry; | |||
import org.apache.myrmidon.components.converter.DefaultMasterConverter; | |||
import org.apache.myrmidon.components.deployer.DefaultDeployer; | |||
import org.apache.myrmidon.components.extensions.DefaultExtensionManager; | |||
import org.apache.myrmidon.components.role.DefaultRoleManager; | |||
import org.apache.myrmidon.components.type.DefaultTypeManager; | |||
import org.apache.myrmidon.interfaces.configurer.Configurer; | |||
import org.apache.myrmidon.interfaces.converter.ConverterRegistry; | |||
import org.apache.myrmidon.interfaces.converter.MasterConverter; | |||
import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
import org.apache.myrmidon.interfaces.extensions.ExtensionManager; | |||
import org.apache.myrmidon.interfaces.role.RoleManager; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
/** | |||
* A base class for tests for the default components. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class ComponentTestBase extends TestCase | |||
{ | |||
private DefaultComponentManager m_componentManager; | |||
private Logger m_logger; | |||
private final static String PATTERN = "[%8.8{category}] %{message}\\n%{throwable}"; | |||
public ComponentTestBase( String s ) | |||
{ | |||
super( s ); | |||
} | |||
/** | |||
* Returns the component manager containing the components to test. | |||
*/ | |||
protected ComponentManager getComponentManager() | |||
{ | |||
return m_componentManager; | |||
} | |||
/** | |||
* Returns the type manager. | |||
*/ | |||
protected TypeManager getTypeManager() throws ComponentException | |||
{ | |||
return (TypeManager)getComponentManager().lookup( TypeManager.ROLE ); | |||
} | |||
/** | |||
* Setup the test case - prepares the set of components. | |||
*/ | |||
protected void setUp() throws Exception | |||
{ | |||
// Setup a logger | |||
final Priority priority = Priority.DEBUG; | |||
final org.apache.log.Logger targetLogger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" ); | |||
final PatternFormatter formatter = new PatternFormatter( PATTERN ); | |||
final StreamTarget target = new StreamTarget( System.out, formatter ); | |||
targetLogger.setLogTargets( new LogTarget[]{target} ); | |||
targetLogger.setPriority( priority ); | |||
m_logger = new LogKitLogger( targetLogger ); | |||
// Create the components | |||
m_componentManager = new DefaultComponentManager(); | |||
List components = new ArrayList(); | |||
Component component = new DefaultMasterConverter(); | |||
m_componentManager.put( MasterConverter.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultConverterRegistry(); | |||
m_componentManager.put( ConverterRegistry.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultTypeManager(); | |||
m_componentManager.put( TypeManager.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultConfigurer(); | |||
m_componentManager.put( Configurer.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultDeployer(); | |||
m_componentManager.put( Deployer.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultExtensionManager(); | |||
m_componentManager.put( ExtensionManager.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultRoleManager(); | |||
m_componentManager.put( RoleManager.ROLE, component ); | |||
components.add( component ); | |||
// Log enable the components | |||
for( Iterator iterator = components.iterator(); iterator.hasNext(); ) | |||
{ | |||
Object obj = iterator.next(); | |||
if( obj instanceof LogEnabled ) | |||
{ | |||
final LogEnabled logEnabled = (LogEnabled)obj; | |||
logEnabled.enableLogging( m_logger ); | |||
} | |||
} | |||
// Compose the components | |||
for( Iterator iterator = components.iterator(); iterator.hasNext(); ) | |||
{ | |||
Object obj = iterator.next(); | |||
if( obj instanceof Composable ) | |||
{ | |||
final Composable composable = (Composable)obj; | |||
composable.compose( m_componentManager ); | |||
} | |||
} | |||
} | |||
/** | |||
* Asserts that an exception contains the expected message. | |||
* | |||
* TODO - should take the expected exception, rather than the message, | |||
* to check the entire cause chain. | |||
*/ | |||
protected void assertSameMessage( final String msg, final Throwable exc ) | |||
{ | |||
assertEquals( msg, exc.getMessage() ); | |||
} | |||
/** | |||
* Compares 2 objects for equality, nulls are equal. Used by the test | |||
* classes' equals() methods. | |||
*/ | |||
public static boolean equals( final Object o1, final Object o2 ) | |||
{ | |||
if( o1 == null && o2 == null ) | |||
{ | |||
return true; | |||
} | |||
if( o1 == null || o2 == null ) | |||
{ | |||
return false; | |||
} | |||
return o1.equals( o2 ); | |||
} | |||
} |
@@ -8,36 +8,16 @@ | |||
package org.apache.myrmidon.components.configurer; | |||
import java.io.File; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import junit.framework.AssertionFailedError; | |||
import junit.framework.TestCase; | |||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
import org.apache.avalon.excalibur.i18n.Resources; | |||
import org.apache.avalon.framework.component.Component; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.avalon.framework.component.DefaultComponentManager; | |||
import org.apache.avalon.framework.configuration.ConfigurationException; | |||
import org.apache.avalon.framework.configuration.DefaultConfiguration; | |||
import org.apache.avalon.framework.logger.LogEnabled; | |||
import org.apache.avalon.framework.logger.LogKitLogger; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.log.Hierarchy; | |||
import org.apache.log.LogTarget; | |||
import org.apache.log.Priority; | |||
import org.apache.log.format.PatternFormatter; | |||
import org.apache.log.output.io.StreamTarget; | |||
import org.apache.myrmidon.api.TaskContext; | |||
import org.apache.myrmidon.components.converter.DefaultConverterRegistry; | |||
import org.apache.myrmidon.components.converter.DefaultMasterConverter; | |||
import org.apache.myrmidon.components.type.DefaultTypeManager; | |||
import org.apache.myrmidon.components.ComponentTestBase; | |||
import org.apache.myrmidon.components.workspace.DefaultTaskContext; | |||
import org.apache.myrmidon.interfaces.configurer.Configurer; | |||
import org.apache.myrmidon.interfaces.converter.ConverterRegistry; | |||
import org.apache.myrmidon.interfaces.converter.MasterConverter; | |||
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
/** | |||
* Test cases for the default configurer and related classes. | |||
@@ -45,19 +25,14 @@ import org.apache.myrmidon.interfaces.type.TypeManager; | |||
* @author Adam Murdoch | |||
*/ | |||
public class DefaultConfigurerTest | |||
extends TestCase | |||
extends ComponentTestBase | |||
{ | |||
private final static Resources REZ = | |||
ResourceManager.getPackageResources( DefaultConfigurerTest.class ); | |||
private DefaultComponentManager m_componentManager; | |||
private Configurer m_configurer; | |||
private TypeManager m_typeManager; | |||
private Logger m_logger; | |||
private DefaultTaskContext m_context; | |||
private final static String PATTERN = "[%8.8{category}] %{message}\\n%{throwable}"; | |||
public DefaultConfigurerTest( String name ) | |||
{ | |||
super( name ); | |||
@@ -66,78 +41,18 @@ public class DefaultConfigurerTest | |||
/** | |||
* Setup the test case - prepares a set of components, including the | |||
* configurer. | |||
* | |||
* TODO - refactor to a sub-class, so this setup can be reused. | |||
*/ | |||
protected void setUp() throws Exception | |||
{ | |||
final Priority priority = Priority.DEBUG; | |||
final org.apache.log.Logger targetLogger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" ); | |||
final PatternFormatter formatter = new PatternFormatter( PATTERN ); | |||
final StreamTarget target = new StreamTarget( System.out, formatter ); | |||
targetLogger.setLogTargets( new LogTarget[]{target} ); | |||
targetLogger.setPriority( priority ); | |||
// Create the logger | |||
m_logger = new LogKitLogger( targetLogger ); | |||
// Create the components | |||
m_componentManager = new DefaultComponentManager(); | |||
List components = new ArrayList(); | |||
super.setUp(); | |||
Component component = new DefaultMasterConverter(); | |||
m_componentManager.put( MasterConverter.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultConverterRegistry(); | |||
m_componentManager.put( ConverterRegistry.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultTypeManager(); | |||
m_componentManager.put( TypeManager.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultConfigurer(); | |||
m_componentManager.put( Configurer.ROLE, component ); | |||
components.add( component ); | |||
// Find the configurer | |||
m_configurer = (Configurer)getComponentManager().lookup( Configurer.ROLE ); | |||
// Setup a context | |||
m_context = new DefaultTaskContext(); | |||
components.add( m_context ); | |||
// Log enable the components | |||
for( Iterator iterator = components.iterator(); iterator.hasNext(); ) | |||
{ | |||
Object obj = iterator.next(); | |||
if( obj instanceof LogEnabled ) | |||
{ | |||
final LogEnabled logEnabled = (LogEnabled)obj; | |||
logEnabled.enableLogging( m_logger ); | |||
} | |||
} | |||
// Compose the components | |||
for( Iterator iterator = components.iterator(); iterator.hasNext(); ) | |||
{ | |||
Object obj = iterator.next(); | |||
if( obj instanceof Composable ) | |||
{ | |||
final Composable composable = (Composable)obj; | |||
composable.compose( m_componentManager ); | |||
} | |||
} | |||
// Configure the context | |||
m_context = new DefaultTaskContext( getComponentManager() ); | |||
final File baseDir = new File( "." ).getAbsoluteFile(); | |||
m_context.setProperty( TaskContext.BASE_DIRECTORY, baseDir ); | |||
// Find the configurer | |||
m_configurer = (Configurer)m_componentManager.lookup( Configurer.ROLE ); | |||
// Find the typeManager | |||
m_typeManager = (TypeManager)m_componentManager.lookup( TypeManager.ROLE ); | |||
} | |||
/** | |||
@@ -366,7 +281,8 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests reference resolution via a nested element. | |||
* Tests whether an object with a non-iterface typed adder causes an | |||
* exception. | |||
*/ | |||
public void testNonInterfaceTypedAdder() | |||
throws Exception | |||
@@ -380,6 +296,7 @@ public class DefaultConfigurerTest | |||
{ | |||
// Configure the object | |||
m_configurer.configure( test, config, m_context ); | |||
fail(); | |||
} | |||
catch( final ConfigurationException ce ) | |||
{ | |||
@@ -391,7 +308,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests whether a object with multiple typed adders causes an exception. | |||
* Tests whether an object with multiple typed adders causes an exception. | |||
*/ | |||
public void testMultipleTypedAdder() | |||
throws Exception | |||
@@ -405,6 +322,7 @@ public class DefaultConfigurerTest | |||
{ | |||
// Configure the object | |||
m_configurer.configure( test, config, m_context ); | |||
fail(); | |||
} | |||
catch( final ConfigurationException ce ) | |||
{ | |||
@@ -415,7 +333,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests to see if typed adder works. | |||
* Tests to see if typed adder works, with iterface types. | |||
*/ | |||
public void testTypedAdder() | |||
throws Exception | |||
@@ -431,8 +349,8 @@ public class DefaultConfigurerTest | |||
final DefaultTypeFactory factory = new DefaultTypeFactory( loader ); | |||
factory.addNameClassMapping( "my-type1", MyType1.class.getName() ); | |||
factory.addNameClassMapping( "my-type2", MyType2.class.getName() ); | |||
m_typeManager.registerType( MyRole1.class, "my-type1", factory ); | |||
m_typeManager.registerType( MyRole1.class, "my-type2", factory ); | |||
getTypeManager().registerType( MyRole1.class, "my-type1", factory ); | |||
getTypeManager().registerType( MyRole1.class, "my-type2", factory ); | |||
final ConfigTest6 test = new ConfigTest6(); | |||
@@ -446,7 +364,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests to see if typed adder works. | |||
* Tests to see if typed adder works, with Configuration type. | |||
*/ | |||
public void testTypedConfigAdder() | |||
throws Exception | |||
@@ -470,7 +388,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests to see if typed adder works. | |||
* Tests to see if typed adder works, with Configuration objects. | |||
*/ | |||
public void testConfigAdder() | |||
throws Exception | |||
@@ -494,7 +412,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests to see if typed adder works. | |||
* Tests to check that Configurable is handled properly. | |||
*/ | |||
public void testConfigable() | |||
throws Exception | |||
@@ -648,32 +566,4 @@ public class DefaultConfigurerTest | |||
expected.addProp3( new ConfigTest1() ); | |||
assertEquals( expected, test ); | |||
} | |||
/** | |||
* Asserts that an exception contains the expected message. | |||
* | |||
* TODO - should take the expected exception, rather than the message, | |||
* to check the entire cause chain. | |||
*/ | |||
protected void assertSameMessage( final String msg, final Throwable exc ) | |||
{ | |||
assertEquals( msg, exc.getMessage() ); | |||
} | |||
/** | |||
* Compares 2 objects for equality, nulls are equal. Used by the test | |||
* classes' equals() methods. | |||
*/ | |||
public static boolean equals( final Object o1, final Object o2 ) | |||
{ | |||
if( o1 == null && o2 == null ) | |||
{ | |||
return true; | |||
} | |||
if( o1 == null || o2 == null ) | |||
{ | |||
return false; | |||
} | |||
return o1.equals( o2 ); | |||
} | |||
} |
@@ -0,0 +1,96 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components.deployer; | |||
import org.apache.myrmidon.components.ComponentTestBase; | |||
import org.apache.myrmidon.framework.DataType; | |||
import org.apache.myrmidon.interfaces.converter.MasterConverter; | |||
import org.apache.myrmidon.interfaces.deployer.ConverterDefinition; | |||
import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
import org.apache.myrmidon.interfaces.deployer.GeneralTypeDefinition; | |||
import org.apache.myrmidon.interfaces.deployer.TypeDeployer; | |||
import org.apache.myrmidon.interfaces.role.RoleManager; | |||
import org.apache.myrmidon.interfaces.type.TypeFactory; | |||
/** | |||
* Test cases for the default deployer. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class DefaultDeployerTest | |||
extends ComponentTestBase | |||
{ | |||
private Deployer m_deployer; | |||
public DefaultDeployerTest( String s ) | |||
{ | |||
super( s ); | |||
} | |||
/** | |||
* Setup the test case - prepares the set of components, including the | |||
* deployer. | |||
*/ | |||
protected void setUp() throws Exception | |||
{ | |||
super.setUp(); | |||
m_deployer = (Deployer)getComponentManager().lookup( Deployer.ROLE ); | |||
} | |||
/** | |||
* Tests deployment of a single type from a ClassLoader. | |||
*/ | |||
public void testSingleType() throws Exception | |||
{ | |||
// Determine the shorthand for the DataType role | |||
final RoleManager roleManager = (RoleManager)getComponentManager().lookup( RoleManager.ROLE ); | |||
roleManager.addNameRoleMapping( "data-type", DataType.ROLE ); | |||
// Create the type definition | |||
final GeneralTypeDefinition typeDef = new GeneralTypeDefinition(); | |||
typeDef.setType( "data-type" ); | |||
typeDef.setName( "test-type1" ); | |||
typeDef.setClassname( TestType1.class.getName() ); | |||
// Deploy the type | |||
final ClassLoader classLoader = getClass().getClassLoader(); | |||
final TypeDeployer typeDeployer = m_deployer.createDeployer( classLoader ); | |||
typeDeployer.deployType( typeDef ); | |||
// Create an instance | |||
final TypeFactory typeFactory = getTypeManager().getFactory( DataType.class ); | |||
Object obj = typeFactory.create( "test-type1" ); | |||
// Check the type | |||
assertTrue( obj instanceof TestType1 ); | |||
} | |||
/** | |||
* Tests deployment of a single converter from a ClassLoader. | |||
*/ | |||
public void testSingleConverter() throws Exception | |||
{ | |||
// Create the type definition | |||
final ConverterDefinition typeDef = new ConverterDefinition(); | |||
typeDef.setClassname( TestConverter1.class.getName() ); | |||
typeDef.setSourceType( "java.lang.String" ); | |||
typeDef.setDestinationType( TestType1.class.getName() ); | |||
// Deploy the type | |||
final ClassLoader classLoader = getClass().getClassLoader(); | |||
final TypeDeployer typeDeployer = m_deployer.createDeployer( classLoader ); | |||
typeDeployer.deployType( typeDef ); | |||
// Try to convert from string to test type | |||
final MasterConverter converter = (MasterConverter)getComponentManager().lookup( MasterConverter.ROLE ); | |||
Object obj = converter.convert( TestType1.class, "some-string", null ); | |||
// Check the type | |||
assertTrue( obj instanceof TestType1 ); | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components.deployer; | |||
import org.apache.myrmidon.converter.Converter; | |||
import org.apache.myrmidon.converter.ConverterException; | |||
import org.apache.avalon.framework.context.Context; | |||
/** | |||
* A test converter. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class TestConverter1 | |||
implements Converter | |||
{ | |||
/** | |||
* Convert original to destination type. | |||
*/ | |||
public Object convert( Class destination, Object original, Context context ) | |||
throws ConverterException | |||
{ | |||
return new TestType1(); | |||
} | |||
} |
@@ -0,0 +1,20 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components.deployer; | |||
import org.apache.myrmidon.framework.DataType; | |||
/** | |||
* A test data-type. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class TestType1 | |||
implements DataType | |||
{ | |||
} |
@@ -0,0 +1,173 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import junit.framework.TestCase; | |||
import org.apache.avalon.framework.component.Component; | |||
import org.apache.avalon.framework.component.ComponentException; | |||
import org.apache.avalon.framework.component.ComponentManager; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.avalon.framework.component.DefaultComponentManager; | |||
import org.apache.avalon.framework.logger.LogEnabled; | |||
import org.apache.avalon.framework.logger.LogKitLogger; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.log.Hierarchy; | |||
import org.apache.log.LogTarget; | |||
import org.apache.log.Priority; | |||
import org.apache.log.format.PatternFormatter; | |||
import org.apache.log.output.io.StreamTarget; | |||
import org.apache.myrmidon.components.configurer.DefaultConfigurer; | |||
import org.apache.myrmidon.components.converter.DefaultConverterRegistry; | |||
import org.apache.myrmidon.components.converter.DefaultMasterConverter; | |||
import org.apache.myrmidon.components.deployer.DefaultDeployer; | |||
import org.apache.myrmidon.components.extensions.DefaultExtensionManager; | |||
import org.apache.myrmidon.components.role.DefaultRoleManager; | |||
import org.apache.myrmidon.components.type.DefaultTypeManager; | |||
import org.apache.myrmidon.interfaces.configurer.Configurer; | |||
import org.apache.myrmidon.interfaces.converter.ConverterRegistry; | |||
import org.apache.myrmidon.interfaces.converter.MasterConverter; | |||
import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
import org.apache.myrmidon.interfaces.extensions.ExtensionManager; | |||
import org.apache.myrmidon.interfaces.role.RoleManager; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
/** | |||
* A base class for tests for the default components. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class ComponentTestBase extends TestCase | |||
{ | |||
private DefaultComponentManager m_componentManager; | |||
private Logger m_logger; | |||
private final static String PATTERN = "[%8.8{category}] %{message}\\n%{throwable}"; | |||
public ComponentTestBase( String s ) | |||
{ | |||
super( s ); | |||
} | |||
/** | |||
* Returns the component manager containing the components to test. | |||
*/ | |||
protected ComponentManager getComponentManager() | |||
{ | |||
return m_componentManager; | |||
} | |||
/** | |||
* Returns the type manager. | |||
*/ | |||
protected TypeManager getTypeManager() throws ComponentException | |||
{ | |||
return (TypeManager)getComponentManager().lookup( TypeManager.ROLE ); | |||
} | |||
/** | |||
* Setup the test case - prepares the set of components. | |||
*/ | |||
protected void setUp() throws Exception | |||
{ | |||
// Setup a logger | |||
final Priority priority = Priority.DEBUG; | |||
final org.apache.log.Logger targetLogger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" ); | |||
final PatternFormatter formatter = new PatternFormatter( PATTERN ); | |||
final StreamTarget target = new StreamTarget( System.out, formatter ); | |||
targetLogger.setLogTargets( new LogTarget[]{target} ); | |||
targetLogger.setPriority( priority ); | |||
m_logger = new LogKitLogger( targetLogger ); | |||
// Create the components | |||
m_componentManager = new DefaultComponentManager(); | |||
List components = new ArrayList(); | |||
Component component = new DefaultMasterConverter(); | |||
m_componentManager.put( MasterConverter.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultConverterRegistry(); | |||
m_componentManager.put( ConverterRegistry.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultTypeManager(); | |||
m_componentManager.put( TypeManager.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultConfigurer(); | |||
m_componentManager.put( Configurer.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultDeployer(); | |||
m_componentManager.put( Deployer.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultExtensionManager(); | |||
m_componentManager.put( ExtensionManager.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultRoleManager(); | |||
m_componentManager.put( RoleManager.ROLE, component ); | |||
components.add( component ); | |||
// Log enable the components | |||
for( Iterator iterator = components.iterator(); iterator.hasNext(); ) | |||
{ | |||
Object obj = iterator.next(); | |||
if( obj instanceof LogEnabled ) | |||
{ | |||
final LogEnabled logEnabled = (LogEnabled)obj; | |||
logEnabled.enableLogging( m_logger ); | |||
} | |||
} | |||
// Compose the components | |||
for( Iterator iterator = components.iterator(); iterator.hasNext(); ) | |||
{ | |||
Object obj = iterator.next(); | |||
if( obj instanceof Composable ) | |||
{ | |||
final Composable composable = (Composable)obj; | |||
composable.compose( m_componentManager ); | |||
} | |||
} | |||
} | |||
/** | |||
* Asserts that an exception contains the expected message. | |||
* | |||
* TODO - should take the expected exception, rather than the message, | |||
* to check the entire cause chain. | |||
*/ | |||
protected void assertSameMessage( final String msg, final Throwable exc ) | |||
{ | |||
assertEquals( msg, exc.getMessage() ); | |||
} | |||
/** | |||
* Compares 2 objects for equality, nulls are equal. Used by the test | |||
* classes' equals() methods. | |||
*/ | |||
public static boolean equals( final Object o1, final Object o2 ) | |||
{ | |||
if( o1 == null && o2 == null ) | |||
{ | |||
return true; | |||
} | |||
if( o1 == null || o2 == null ) | |||
{ | |||
return false; | |||
} | |||
return o1.equals( o2 ); | |||
} | |||
} |
@@ -8,36 +8,16 @@ | |||
package org.apache.myrmidon.components.configurer; | |||
import java.io.File; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import junit.framework.AssertionFailedError; | |||
import junit.framework.TestCase; | |||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
import org.apache.avalon.excalibur.i18n.Resources; | |||
import org.apache.avalon.framework.component.Component; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.avalon.framework.component.DefaultComponentManager; | |||
import org.apache.avalon.framework.configuration.ConfigurationException; | |||
import org.apache.avalon.framework.configuration.DefaultConfiguration; | |||
import org.apache.avalon.framework.logger.LogEnabled; | |||
import org.apache.avalon.framework.logger.LogKitLogger; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.log.Hierarchy; | |||
import org.apache.log.LogTarget; | |||
import org.apache.log.Priority; | |||
import org.apache.log.format.PatternFormatter; | |||
import org.apache.log.output.io.StreamTarget; | |||
import org.apache.myrmidon.api.TaskContext; | |||
import org.apache.myrmidon.components.converter.DefaultConverterRegistry; | |||
import org.apache.myrmidon.components.converter.DefaultMasterConverter; | |||
import org.apache.myrmidon.components.type.DefaultTypeManager; | |||
import org.apache.myrmidon.components.ComponentTestBase; | |||
import org.apache.myrmidon.components.workspace.DefaultTaskContext; | |||
import org.apache.myrmidon.interfaces.configurer.Configurer; | |||
import org.apache.myrmidon.interfaces.converter.ConverterRegistry; | |||
import org.apache.myrmidon.interfaces.converter.MasterConverter; | |||
import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
/** | |||
* Test cases for the default configurer and related classes. | |||
@@ -45,19 +25,14 @@ import org.apache.myrmidon.interfaces.type.TypeManager; | |||
* @author Adam Murdoch | |||
*/ | |||
public class DefaultConfigurerTest | |||
extends TestCase | |||
extends ComponentTestBase | |||
{ | |||
private final static Resources REZ = | |||
ResourceManager.getPackageResources( DefaultConfigurerTest.class ); | |||
private DefaultComponentManager m_componentManager; | |||
private Configurer m_configurer; | |||
private TypeManager m_typeManager; | |||
private Logger m_logger; | |||
private DefaultTaskContext m_context; | |||
private final static String PATTERN = "[%8.8{category}] %{message}\\n%{throwable}"; | |||
public DefaultConfigurerTest( String name ) | |||
{ | |||
super( name ); | |||
@@ -66,78 +41,18 @@ public class DefaultConfigurerTest | |||
/** | |||
* Setup the test case - prepares a set of components, including the | |||
* configurer. | |||
* | |||
* TODO - refactor to a sub-class, so this setup can be reused. | |||
*/ | |||
protected void setUp() throws Exception | |||
{ | |||
final Priority priority = Priority.DEBUG; | |||
final org.apache.log.Logger targetLogger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" ); | |||
final PatternFormatter formatter = new PatternFormatter( PATTERN ); | |||
final StreamTarget target = new StreamTarget( System.out, formatter ); | |||
targetLogger.setLogTargets( new LogTarget[]{target} ); | |||
targetLogger.setPriority( priority ); | |||
// Create the logger | |||
m_logger = new LogKitLogger( targetLogger ); | |||
// Create the components | |||
m_componentManager = new DefaultComponentManager(); | |||
List components = new ArrayList(); | |||
super.setUp(); | |||
Component component = new DefaultMasterConverter(); | |||
m_componentManager.put( MasterConverter.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultConverterRegistry(); | |||
m_componentManager.put( ConverterRegistry.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultTypeManager(); | |||
m_componentManager.put( TypeManager.ROLE, component ); | |||
components.add( component ); | |||
component = new DefaultConfigurer(); | |||
m_componentManager.put( Configurer.ROLE, component ); | |||
components.add( component ); | |||
// Find the configurer | |||
m_configurer = (Configurer)getComponentManager().lookup( Configurer.ROLE ); | |||
// Setup a context | |||
m_context = new DefaultTaskContext(); | |||
components.add( m_context ); | |||
// Log enable the components | |||
for( Iterator iterator = components.iterator(); iterator.hasNext(); ) | |||
{ | |||
Object obj = iterator.next(); | |||
if( obj instanceof LogEnabled ) | |||
{ | |||
final LogEnabled logEnabled = (LogEnabled)obj; | |||
logEnabled.enableLogging( m_logger ); | |||
} | |||
} | |||
// Compose the components | |||
for( Iterator iterator = components.iterator(); iterator.hasNext(); ) | |||
{ | |||
Object obj = iterator.next(); | |||
if( obj instanceof Composable ) | |||
{ | |||
final Composable composable = (Composable)obj; | |||
composable.compose( m_componentManager ); | |||
} | |||
} | |||
// Configure the context | |||
m_context = new DefaultTaskContext( getComponentManager() ); | |||
final File baseDir = new File( "." ).getAbsoluteFile(); | |||
m_context.setProperty( TaskContext.BASE_DIRECTORY, baseDir ); | |||
// Find the configurer | |||
m_configurer = (Configurer)m_componentManager.lookup( Configurer.ROLE ); | |||
// Find the typeManager | |||
m_typeManager = (TypeManager)m_componentManager.lookup( TypeManager.ROLE ); | |||
} | |||
/** | |||
@@ -366,7 +281,8 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests reference resolution via a nested element. | |||
* Tests whether an object with a non-iterface typed adder causes an | |||
* exception. | |||
*/ | |||
public void testNonInterfaceTypedAdder() | |||
throws Exception | |||
@@ -380,6 +296,7 @@ public class DefaultConfigurerTest | |||
{ | |||
// Configure the object | |||
m_configurer.configure( test, config, m_context ); | |||
fail(); | |||
} | |||
catch( final ConfigurationException ce ) | |||
{ | |||
@@ -391,7 +308,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests whether a object with multiple typed adders causes an exception. | |||
* Tests whether an object with multiple typed adders causes an exception. | |||
*/ | |||
public void testMultipleTypedAdder() | |||
throws Exception | |||
@@ -405,6 +322,7 @@ public class DefaultConfigurerTest | |||
{ | |||
// Configure the object | |||
m_configurer.configure( test, config, m_context ); | |||
fail(); | |||
} | |||
catch( final ConfigurationException ce ) | |||
{ | |||
@@ -415,7 +333,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests to see if typed adder works. | |||
* Tests to see if typed adder works, with iterface types. | |||
*/ | |||
public void testTypedAdder() | |||
throws Exception | |||
@@ -431,8 +349,8 @@ public class DefaultConfigurerTest | |||
final DefaultTypeFactory factory = new DefaultTypeFactory( loader ); | |||
factory.addNameClassMapping( "my-type1", MyType1.class.getName() ); | |||
factory.addNameClassMapping( "my-type2", MyType2.class.getName() ); | |||
m_typeManager.registerType( MyRole1.class, "my-type1", factory ); | |||
m_typeManager.registerType( MyRole1.class, "my-type2", factory ); | |||
getTypeManager().registerType( MyRole1.class, "my-type1", factory ); | |||
getTypeManager().registerType( MyRole1.class, "my-type2", factory ); | |||
final ConfigTest6 test = new ConfigTest6(); | |||
@@ -446,7 +364,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests to see if typed adder works. | |||
* Tests to see if typed adder works, with Configuration type. | |||
*/ | |||
public void testTypedConfigAdder() | |||
throws Exception | |||
@@ -470,7 +388,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests to see if typed adder works. | |||
* Tests to see if typed adder works, with Configuration objects. | |||
*/ | |||
public void testConfigAdder() | |||
throws Exception | |||
@@ -494,7 +412,7 @@ public class DefaultConfigurerTest | |||
} | |||
/** | |||
* Tests to see if typed adder works. | |||
* Tests to check that Configurable is handled properly. | |||
*/ | |||
public void testConfigable() | |||
throws Exception | |||
@@ -648,32 +566,4 @@ public class DefaultConfigurerTest | |||
expected.addProp3( new ConfigTest1() ); | |||
assertEquals( expected, test ); | |||
} | |||
/** | |||
* Asserts that an exception contains the expected message. | |||
* | |||
* TODO - should take the expected exception, rather than the message, | |||
* to check the entire cause chain. | |||
*/ | |||
protected void assertSameMessage( final String msg, final Throwable exc ) | |||
{ | |||
assertEquals( msg, exc.getMessage() ); | |||
} | |||
/** | |||
* Compares 2 objects for equality, nulls are equal. Used by the test | |||
* classes' equals() methods. | |||
*/ | |||
public static boolean equals( final Object o1, final Object o2 ) | |||
{ | |||
if( o1 == null && o2 == null ) | |||
{ | |||
return true; | |||
} | |||
if( o1 == null || o2 == null ) | |||
{ | |||
return false; | |||
} | |||
return o1.equals( o2 ); | |||
} | |||
} |
@@ -0,0 +1,96 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components.deployer; | |||
import org.apache.myrmidon.components.ComponentTestBase; | |||
import org.apache.myrmidon.framework.DataType; | |||
import org.apache.myrmidon.interfaces.converter.MasterConverter; | |||
import org.apache.myrmidon.interfaces.deployer.ConverterDefinition; | |||
import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
import org.apache.myrmidon.interfaces.deployer.GeneralTypeDefinition; | |||
import org.apache.myrmidon.interfaces.deployer.TypeDeployer; | |||
import org.apache.myrmidon.interfaces.role.RoleManager; | |||
import org.apache.myrmidon.interfaces.type.TypeFactory; | |||
/** | |||
* Test cases for the default deployer. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class DefaultDeployerTest | |||
extends ComponentTestBase | |||
{ | |||
private Deployer m_deployer; | |||
public DefaultDeployerTest( String s ) | |||
{ | |||
super( s ); | |||
} | |||
/** | |||
* Setup the test case - prepares the set of components, including the | |||
* deployer. | |||
*/ | |||
protected void setUp() throws Exception | |||
{ | |||
super.setUp(); | |||
m_deployer = (Deployer)getComponentManager().lookup( Deployer.ROLE ); | |||
} | |||
/** | |||
* Tests deployment of a single type from a ClassLoader. | |||
*/ | |||
public void testSingleType() throws Exception | |||
{ | |||
// Determine the shorthand for the DataType role | |||
final RoleManager roleManager = (RoleManager)getComponentManager().lookup( RoleManager.ROLE ); | |||
roleManager.addNameRoleMapping( "data-type", DataType.ROLE ); | |||
// Create the type definition | |||
final GeneralTypeDefinition typeDef = new GeneralTypeDefinition(); | |||
typeDef.setType( "data-type" ); | |||
typeDef.setName( "test-type1" ); | |||
typeDef.setClassname( TestType1.class.getName() ); | |||
// Deploy the type | |||
final ClassLoader classLoader = getClass().getClassLoader(); | |||
final TypeDeployer typeDeployer = m_deployer.createDeployer( classLoader ); | |||
typeDeployer.deployType( typeDef ); | |||
// Create an instance | |||
final TypeFactory typeFactory = getTypeManager().getFactory( DataType.class ); | |||
Object obj = typeFactory.create( "test-type1" ); | |||
// Check the type | |||
assertTrue( obj instanceof TestType1 ); | |||
} | |||
/** | |||
* Tests deployment of a single converter from a ClassLoader. | |||
*/ | |||
public void testSingleConverter() throws Exception | |||
{ | |||
// Create the type definition | |||
final ConverterDefinition typeDef = new ConverterDefinition(); | |||
typeDef.setClassname( TestConverter1.class.getName() ); | |||
typeDef.setSourceType( "java.lang.String" ); | |||
typeDef.setDestinationType( TestType1.class.getName() ); | |||
// Deploy the type | |||
final ClassLoader classLoader = getClass().getClassLoader(); | |||
final TypeDeployer typeDeployer = m_deployer.createDeployer( classLoader ); | |||
typeDeployer.deployType( typeDef ); | |||
// Try to convert from string to test type | |||
final MasterConverter converter = (MasterConverter)getComponentManager().lookup( MasterConverter.ROLE ); | |||
Object obj = converter.convert( TestType1.class, "some-string", null ); | |||
// Check the type | |||
assertTrue( obj instanceof TestType1 ); | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components.deployer; | |||
import org.apache.myrmidon.converter.Converter; | |||
import org.apache.myrmidon.converter.ConverterException; | |||
import org.apache.avalon.framework.context.Context; | |||
/** | |||
* A test converter. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class TestConverter1 | |||
implements Converter | |||
{ | |||
/** | |||
* Convert original to destination type. | |||
*/ | |||
public Object convert( Class destination, Object original, Context context ) | |||
throws ConverterException | |||
{ | |||
return new TestType1(); | |||
} | |||
} |
@@ -0,0 +1,20 @@ | |||
/* | |||
* Copyright (C) The Apache Software Foundation. All rights reserved. | |||
* | |||
* This software is published under the terms of the Apache Software License | |||
* version 1.1, a copy of which has been included with this distribution in | |||
* the LICENSE.txt file. | |||
*/ | |||
package org.apache.myrmidon.components.deployer; | |||
import org.apache.myrmidon.framework.DataType; | |||
/** | |||
* A test data-type. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
*/ | |||
public class TestType1 | |||
implements DataType | |||
{ | |||
} |