From 87ceed8170a6359ac2c4714b6ad22c55d2b1f571 Mon Sep 17 00:00:00 2001 From: adammurdoch Date: Sat, 2 Feb 2002 12:51:59 +0000 Subject: [PATCH] * Added TypeDefinition and sub-classes, which are passed to TypeDeployer to 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-ffa450edef68 --- proposal/myrmidon/build.xml | 6 +- .../apache/antlib/runtime/ConverterDef.java | 76 +------- .../antlib/runtime/Resources.properties | 6 - .../org/apache/antlib/runtime/TypeDef.java | 12 +- .../components/deployer/DefaultDeployer.java | 2 +- .../components/deployer/Deployment.java | 76 +++++--- .../components/deployer/Resources.properties | 7 +- .../myrmidon/framework/AbstractTypeDef.java | 71 ++++--- .../myrmidon/framework/Resources.properties | 5 +- .../apache/myrmidon/frontends/CLIMain.java | 2 +- .../deployer/ConverterDefinition.java | 68 +++++++ .../deployer/GeneralTypeDefinition.java | 52 ++++++ .../interfaces/deployer/TypeDefinition.java | 45 +++++ .../interfaces/deployer/TypeDeployer.java | 28 ++- .../components/ComponentTestBase.java | 173 ++++++++++++++++++ .../configurer/DefaultConfigurerTest.java | 144 ++------------- .../deployer/DefaultDeployerTest.java | 96 ++++++++++ .../components/deployer/TestConverter1.java | 30 +++ .../components/deployer/TestType1.java | 20 ++ .../components/ComponentTestBase.java | 173 ++++++++++++++++++ .../configurer/DefaultConfigurerTest.java | 144 ++------------- .../deployer/DefaultDeployerTest.java | 96 ++++++++++ .../components/deployer/TestConverter1.java | 30 +++ .../components/deployer/TestType1.java | 20 ++ 24 files changed, 964 insertions(+), 418 deletions(-) create mode 100644 proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/ConverterDefinition.java create mode 100644 proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/GeneralTypeDefinition.java create mode 100644 proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/TypeDefinition.java create mode 100644 proposal/myrmidon/src/test/org/apache/myrmidon/components/ComponentTestBase.java create mode 100644 proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/DefaultDeployerTest.java create mode 100644 proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/TestConverter1.java create mode 100644 proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/TestType1.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/ComponentTestBase.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/DefaultDeployerTest.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/TestConverter1.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/TestType1.java diff --git a/proposal/myrmidon/build.xml b/proposal/myrmidon/build.xml index d9867d6d1..4626c2931 100644 --- a/proposal/myrmidon/build.xml +++ b/proposal/myrmidon/build.xml @@ -480,7 +480,7 @@ Legal: + fork="true"> @@ -492,7 +492,9 @@ Legal: - + + + diff --git a/proposal/myrmidon/src/java/org/apache/antlib/runtime/ConverterDef.java b/proposal/myrmidon/src/java/org/apache/antlib/runtime/ConverterDef.java index 4df17b7bc..4a22657dd 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/runtime/ConverterDef.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/runtime/ConverterDef.java @@ -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 Peter Donald */ 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(); } } diff --git a/proposal/myrmidon/src/java/org/apache/antlib/runtime/Resources.properties b/proposal/myrmidon/src/java/org/apache/antlib/runtime/Resources.properties index 4bc1233e9..a97ccadbb 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/runtime/Resources.properties +++ b/proposal/myrmidon/src/java/org/apache/antlib/runtime/Resources.properties @@ -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. diff --git a/proposal/myrmidon/src/java/org/apache/antlib/runtime/TypeDef.java b/proposal/myrmidon/src/java/org/apache/antlib/runtime/TypeDef.java index 843030d3e..30d6ebf6d 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/runtime/TypeDef.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/runtime/TypeDef.java @@ -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(); } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultDeployer.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultDeployer.java index f04216905..f5a236e3b 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultDeployer.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultDeployer.java @@ -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 ); } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Deployment.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Deployment.java index a4c0029b8..973e74058 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Deployment.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Deployment.java @@ -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 ); } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Resources.properties b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Resources.properties index a6908d198..b9d73e61a 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Resources.properties +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/Resources.properties @@ -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} diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java index 13409beea..859b92721 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java @@ -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 Peter Donald */ 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(); } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties index a596a25e0..f7ea1d837 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties @@ -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}. diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java index e458c79b2..fef668d11 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java @@ -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() ) diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/ConverterDefinition.java b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/ConverterDefinition.java new file mode 100644 index 000000000..c31a2f963 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/ConverterDefinition.java @@ -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 Adam Murdoch + */ +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; + } +} diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/GeneralTypeDefinition.java b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/GeneralTypeDefinition.java new file mode 100644 index 000000000..88d3be70a --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/GeneralTypeDefinition.java @@ -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 Adam Murdoch + */ +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; + } +} diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/TypeDefinition.java b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/TypeDefinition.java new file mode 100644 index 000000000..9f2cec902 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/TypeDefinition.java @@ -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 Adam Murdoch + */ +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; + } +} diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/TypeDeployer.java b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/TypeDeployer.java index f453987d9..971fa3c4f 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/TypeDeployer.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/deployer/TypeDeployer.java @@ -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 Adam Murdoch */ public interface TypeDeployer { @@ -26,29 +26,23 @@ public interface TypeDeployer * read from the type library descriptor. * * @param roleShorthand - * The shorthand 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; } diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/ComponentTestBase.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/ComponentTestBase.java new file mode 100644 index 000000000..94bf8f472 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/ComponentTestBase.java @@ -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 Adam Murdoch + */ +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 ); + } +} diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java index b2911e9f4..6089be9ce 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java @@ -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 ); - } } diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/DefaultDeployerTest.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/DefaultDeployerTest.java new file mode 100644 index 000000000..9820b4687 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/DefaultDeployerTest.java @@ -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 Adam Murdoch + */ +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 ); + } +} diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/TestConverter1.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/TestConverter1.java new file mode 100644 index 000000000..a35c763f0 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/TestConverter1.java @@ -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 Adam Murdoch + */ +public class TestConverter1 + implements Converter +{ + /** + * Convert original to destination type. + */ + public Object convert( Class destination, Object original, Context context ) + throws ConverterException + { + return new TestType1(); + } +} diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/TestType1.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/TestType1.java new file mode 100644 index 000000000..a0c6e3109 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/deployer/TestType1.java @@ -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 Adam Murdoch + */ +public class TestType1 + implements DataType +{ +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/ComponentTestBase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/ComponentTestBase.java new file mode 100644 index 000000000..94bf8f472 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/ComponentTestBase.java @@ -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 Adam Murdoch + */ +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 ); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java index b2911e9f4..6089be9ce 100644 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java @@ -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 ); - } } diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/DefaultDeployerTest.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/DefaultDeployerTest.java new file mode 100644 index 000000000..9820b4687 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/DefaultDeployerTest.java @@ -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 Adam Murdoch + */ +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 ); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/TestConverter1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/TestConverter1.java new file mode 100644 index 000000000..a35c763f0 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/TestConverter1.java @@ -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 Adam Murdoch + */ +public class TestConverter1 + implements Converter +{ + /** + * Convert original to destination type. + */ + public Object convert( Class destination, Object original, Context context ) + throws ConverterException + { + return new TestType1(); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/TestType1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/TestType1.java new file mode 100644 index 000000000..a0c6e3109 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/deployer/TestType1.java @@ -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 Adam Murdoch + */ +public class TestType1 + implements DataType +{ +}