From ed7685cd6f28da8710ca2209e711d9c644a4d053 Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Mon, 28 Jan 2002 00:49:13 +0000 Subject: [PATCH] Add in the ability for types to automagicall instantiated based on registration into TypeManager as previously discussed. Also added unit tests to verify everything works as expected git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270976 13f79535-47bb-0310-9956-ffa450edef68 --- .../configurer/DefaultConfigurer.java | 176 ++++++++++-------- .../configurer/DefaultObjectConfigurer.java | 9 +- .../configurer/Resources.properties | 3 +- .../components/configurer/ConfigTest6.java | 34 ++++ .../components/configurer/ConfigTest7.java | 34 ++++ .../components/configurer/ConfigTest8.java | 34 ++++ .../configurer/DefaultConfigurerTest.java | 83 +++++++++ .../components/configurer/MyType1.java | 23 +++ .../components/configurer/MyType2.java | 23 +++ .../components/configurer/ConfigTest6.java | 34 ++++ .../components/configurer/ConfigTest7.java | 34 ++++ .../components/configurer/ConfigTest8.java | 34 ++++ .../configurer/DefaultConfigurerTest.java | 83 +++++++++ .../components/configurer/MyType1.java | 23 +++ .../components/configurer/MyType2.java | 23 +++ 15 files changed, 574 insertions(+), 76 deletions(-) create mode 100644 proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest6.java create mode 100644 proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest7.java create mode 100644 proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest8.java create mode 100644 proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/MyType1.java create mode 100644 proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/MyType2.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest6.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest7.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest8.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/MyType1.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/MyType2.java diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/DefaultConfigurer.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/DefaultConfigurer.java index d398e305d..b43fbe7d3 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/DefaultConfigurer.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/DefaultConfigurer.java @@ -26,6 +26,10 @@ import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.logger.LogEnabled; import org.apache.myrmidon.interfaces.configurer.Configurer; import org.apache.myrmidon.interfaces.converter.MasterConverter; +import org.apache.myrmidon.interfaces.type.TypeFactory; +import org.apache.myrmidon.interfaces.type.TypeManager; +import org.apache.myrmidon.interfaces.type.TypeException; +import org.apache.myrmidon.api.TaskException; /** * Class used to configure tasks. @@ -42,6 +46,9 @@ public class DefaultConfigurer ///Converter to use for converting between values private MasterConverter m_converter; + //TypeManager to use to create types in typed adders + private TypeManager m_typeManager; + ///Cached object configurers. This is a map from Class to the ///ObjectConfigurer for that class. private Map m_configurerCache = new HashMap(); @@ -50,6 +57,7 @@ public class DefaultConfigurer throws ComponentException { m_converter = (MasterConverter)componentManager.lookup( MasterConverter.ROLE ); + m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE ); } /** @@ -262,7 +270,8 @@ public class DefaultConfigurer final String name = element.getName(); // Locate the configurer for the child element - final PropertyConfigurer childConfigurer = state.getConfigurer().getProperty( name ); + final PropertyConfigurer childConfigurer = + state.getConfigurer().getProperty( name ); // Create & configure the child element final Object child = @@ -272,79 +281,6 @@ public class DefaultConfigurer childConfigurer.addValue( state, child ); } - private Object setupChild( final ConfigurationState state, - final Configuration element, - final Context context, - final PropertyConfigurer childConfigurer ) - throws ConfigurationException - { - final String name = element.getName(); - final Class type = childConfigurer.getType(); - Object child = childConfigurer.createValue( state ); - - if( null == child && Configuration.class == type ) - { - //special case where you have add(Configuration) - return element; - } - else if( null == child ) - { - // Create an instance using the default constructor - if( type.isInterface() ) - { - child = createdTypedObject( name, type ); - configureObject( child, element, context ); - } - else - { - child = createObject( type ); - configureObject( child, element, context ); - } - } - configureObject( child, element, context ); - return child; - } - - /** - * Utility method to create an instance of the - * specified type that satisfied supplied interface. - */ - private Object createdTypedObject( final String name, - final Class type ) - throws ConfigurationException - { - try - { - return type.newInstance(); - } - catch( final Exception e ) - { - final String message = - REZ.getString( "create-object.error", - type.getName() ); - throw new ConfigurationException( message, e ); - } - } - - /** - * Utility method to instantiate an instance of the specified class. - */ - private Object createObject( final Class type ) - throws ConfigurationException - { - try - { - return type.newInstance(); - } - catch( final Exception e ) - { - final String message = - REZ.getString( "create-object.error", - type.getName() ); - throw new ConfigurationException( message, e ); - } - } - /** * Configures a property from a reference. */ @@ -468,4 +404,96 @@ public class DefaultConfigurer } return configurer; } + + private Object setupChild( final ConfigurationState state, + final Configuration element, + final Context context, + final PropertyConfigurer childConfigurer ) + throws ConfigurationException + { + final String name = element.getName(); + final Class type = childConfigurer.getType(); + Object child = childConfigurer.createValue( state ); + + if( null == child && Configuration.class == type ) + { + //special case where you have add...(Configuration) + return element; + } + else if( null == child ) + { + // Create an instance using the default constructor + if( type.isInterface() ) + { + child = createdTypedObject( name, type ); + configureObject( child, element, context ); + } + else + { + child = createObject( type ); + configureObject( child, element, context ); + } + } + configureObject( child, element, context ); + return child; + } + + /** + * Utility method to create an instance of the + * specified type that satisfied supplied interface. + */ + private Object createdTypedObject( final String name, + final Class type ) + throws ConfigurationException + { + final TypeFactory factory = getTypeFactory( type.getName() ); + try + { + return factory.create( name ); + } + catch( final Exception e ) + { + final String message = + REZ.getString( "create-typed-object.error", + name, + type.getName() ); + throw new ConfigurationException( message, e ); + } + } + + /** + * Utility method to instantiate an instance of the specified class. + */ + private Object createObject( final Class type ) + throws ConfigurationException + { + try + { + return type.newInstance(); + } + catch( final Exception e ) + { + final String message = + REZ.getString( "create-object.error", + type.getName() ); + throw new ConfigurationException( message, e ); + } + } + + /** + * Locates a type factory. + */ + protected final TypeFactory getTypeFactory( final String role ) + throws ConfigurationException + { + try + { + return m_typeManager.getFactory( role ); + } + catch( final TypeException te ) + { + final String message = REZ.getString( "no-factory-for-role.error", role ); + throw new ConfigurationException( message, te ); + } + } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/DefaultObjectConfigurer.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/DefaultObjectConfigurer.java index 4f00d7db5..abd057da6 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/DefaultObjectConfigurer.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/DefaultObjectConfigurer.java @@ -351,7 +351,14 @@ class DefaultObjectConfigurer public PropertyConfigurer getProperty( final String name ) throws NoSuchPropertyException { - final PropertyConfigurer configurer = (PropertyConfigurer)m_props.get( name ); + PropertyConfigurer configurer = (PropertyConfigurer)m_props.get( name ); + if( null != configurer ) + { + return configurer; + } + + //Maybe there is a typed adder?? + configurer = (PropertyConfigurer)m_props.get( "" ); if( null != configurer ) { return configurer; diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/Resources.properties b/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/Resources.properties index 1aa9c0096..28f739b8f 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/Resources.properties +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/Resources.properties @@ -20,4 +20,5 @@ no-such-element.error=Nested <{1}> elements are not allowed for element <{0}>. bad-set-element.error=Could not handle element <{1}>, nested in element <{0}>. no-content.error=Text content is not allowed for element <{0}>. bad-set-content.error=Could not set text content for element <{0}>. -typed-adder-non-interface.error=The typed adder for class "{0}" must have a single parameter that is an interface rather than {1} which defines a class. \ No newline at end of file +typed-adder-non-interface.error=The typed adder for class "{0}" must have a single parameter that is an interface rather than {1} which defines a class. +no-factory-for-role.error=Unable to locate type factory for role "{0}" \ No newline at end of file diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest6.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest6.java new file mode 100644 index 000000000..7f67ae5c5 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest6.java @@ -0,0 +1,34 @@ +/* + * 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.configurer; + +import java.util.ArrayList; +import junit.framework.AssertionFailedError; +import org.apache.avalon.framework.configuration.Configuration; + +/** + * Simple class to test typed adder. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class ConfigTest6 +{ + private ArrayList m_roles = new ArrayList(); + + public void add( final MyRole1 role1 ) + { + m_roles.add( role1 ); + } + + public boolean equals( final Object object ) + { + final ConfigTest6 other = (ConfigTest6)object; + return m_roles.equals( other.m_roles ); + } +} diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest7.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest7.java new file mode 100644 index 000000000..b10c7f990 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest7.java @@ -0,0 +1,34 @@ +/* + * 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.configurer; + +import java.util.ArrayList; +import junit.framework.AssertionFailedError; +import org.apache.avalon.framework.configuration.Configuration; + +/** + * Simple class to test adder for Configurations. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class ConfigTest7 +{ + private ArrayList m_configurations = new ArrayList(); + + public void add( final Configuration configuration ) + { + m_configurations.add( configuration ); + } + + public boolean equals( final Object object ) + { + final ConfigTest7 other = (ConfigTest7)object; + return m_configurations.equals( other.m_configurations ); + } +} diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest8.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest8.java new file mode 100644 index 000000000..d1792f33c --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/ConfigTest8.java @@ -0,0 +1,34 @@ +/* + * 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.configurer; + +import java.util.ArrayList; +import junit.framework.AssertionFailedError; +import org.apache.avalon.framework.configuration.Configuration; + +/** + * Simple class to test adder for Configurations. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class ConfigTest8 +{ + private ArrayList m_configurations = new ArrayList(); + + public void addConfig( final Configuration configuration ) + { + m_configurations.add( configuration ); + } + + public boolean equals( final Object object ) + { + final ConfigTest8 other = (ConfigTest8)object; + return m_configurations.equals( other.m_configurations ); + } +} 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 6501e9a44..3f40393ba 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 @@ -36,6 +36,7 @@ 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; /** @@ -51,6 +52,7 @@ public class DefaultConfigurerTest private DefaultComponentManager m_componentManager; private Configurer m_configurer; + private TypeManager m_typeManager; private Logger m_logger; private DefaultTaskContext m_context; @@ -134,6 +136,8 @@ public class DefaultConfigurerTest // Find the configurer m_configurer = (Configurer)m_componentManager.lookup( Configurer.ROLE ); + // Find the typeManager + m_typeManager = (TypeManager)m_componentManager.lookup( TypeManager.ROLE ); } /** @@ -412,6 +416,85 @@ public class DefaultConfigurerTest } } + /** + * Tests to see if typed adder works. + */ + public void testTypedAdder() + throws Exception + { + // Setup test data + final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); + final DefaultConfiguration child1 = new DefaultConfiguration( "my-type1", "test" ); + final DefaultConfiguration child2 = new DefaultConfiguration( "my-type2", "test" ); + config.addChild( child1 ); + config.addChild( child2 ); + + final ClassLoader loader = getClass().getClassLoader(); + 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.getName(), "my-type1", factory ); + m_typeManager.registerType( MyRole1.class.getName(), "my-type2", factory ); + + final ConfigTest6 test = new ConfigTest6(); + + // Configure the object + m_configurer.configure( test, config, m_context ); + + final ConfigTest6 expected = new ConfigTest6(); + expected.add( new MyType1() ); + expected.add( new MyType2() ); + assertEquals( expected, test ); + } + + /** + * Tests to see if typed adder works. + */ + public void testTypedConfigAdder() + throws Exception + { + // Setup test data + final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); + final DefaultConfiguration child1 = new DefaultConfiguration( "my-type1", "test" ); + final DefaultConfiguration child2 = new DefaultConfiguration( "my-type2", "test" ); + config.addChild( child1 ); + config.addChild( child2 ); + + final ConfigTest7 test = new ConfigTest7(); + + // Configure the object + m_configurer.configure( test, config, m_context ); + + final ConfigTest7 expected = new ConfigTest7(); + expected.add( child1 ); + expected.add( child2 ); + assertEquals( expected, test ); + } + + /** + * Tests to see if typed adder works. + */ + public void testConfigAdder() + throws Exception + { + // Setup test data + final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); + final DefaultConfiguration child1 = new DefaultConfiguration( "config", "test" ); + final DefaultConfiguration child2 = new DefaultConfiguration( "config", "test" ); + config.addChild( child1 ); + config.addChild( child2 ); + + final ConfigTest8 test = new ConfigTest8(); + + // Configure the object + m_configurer.configure( test, config, m_context ); + + final ConfigTest8 expected = new ConfigTest8(); + expected.addConfig( child1 ); + expected.addConfig( child2 ); + assertEquals( expected, test ); + } + /** * Test resolving properties in an id. */ diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/MyType1.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/MyType1.java new file mode 100644 index 000000000..ee40c9eae --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/MyType1.java @@ -0,0 +1,23 @@ +/* + * 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.configurer; + +/** + * A basic implementation of MyRole1 to test configurer. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class MyType1 + implements MyRole1 +{ + public boolean equals( final Object object ) + { + return object.getClass() == getClass(); + } +} diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/MyType2.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/MyType2.java new file mode 100644 index 000000000..c573feff1 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/configurer/MyType2.java @@ -0,0 +1,23 @@ +/* + * 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.configurer; + +/** + * A basic implementation of MyRole1 to test configurer. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class MyType2 + implements MyRole1 +{ + public boolean equals( final Object object ) + { + return object.getClass() == getClass(); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest6.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest6.java new file mode 100644 index 000000000..7f67ae5c5 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest6.java @@ -0,0 +1,34 @@ +/* + * 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.configurer; + +import java.util.ArrayList; +import junit.framework.AssertionFailedError; +import org.apache.avalon.framework.configuration.Configuration; + +/** + * Simple class to test typed adder. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class ConfigTest6 +{ + private ArrayList m_roles = new ArrayList(); + + public void add( final MyRole1 role1 ) + { + m_roles.add( role1 ); + } + + public boolean equals( final Object object ) + { + final ConfigTest6 other = (ConfigTest6)object; + return m_roles.equals( other.m_roles ); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest7.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest7.java new file mode 100644 index 000000000..b10c7f990 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest7.java @@ -0,0 +1,34 @@ +/* + * 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.configurer; + +import java.util.ArrayList; +import junit.framework.AssertionFailedError; +import org.apache.avalon.framework.configuration.Configuration; + +/** + * Simple class to test adder for Configurations. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class ConfigTest7 +{ + private ArrayList m_configurations = new ArrayList(); + + public void add( final Configuration configuration ) + { + m_configurations.add( configuration ); + } + + public boolean equals( final Object object ) + { + final ConfigTest7 other = (ConfigTest7)object; + return m_configurations.equals( other.m_configurations ); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest8.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest8.java new file mode 100644 index 000000000..d1792f33c --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/ConfigTest8.java @@ -0,0 +1,34 @@ +/* + * 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.configurer; + +import java.util.ArrayList; +import junit.framework.AssertionFailedError; +import org.apache.avalon.framework.configuration.Configuration; + +/** + * Simple class to test adder for Configurations. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class ConfigTest8 +{ + private ArrayList m_configurations = new ArrayList(); + + public void addConfig( final Configuration configuration ) + { + m_configurations.add( configuration ); + } + + public boolean equals( final Object object ) + { + final ConfigTest8 other = (ConfigTest8)object; + return m_configurations.equals( other.m_configurations ); + } +} 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 6501e9a44..3f40393ba 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 @@ -36,6 +36,7 @@ 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; /** @@ -51,6 +52,7 @@ public class DefaultConfigurerTest private DefaultComponentManager m_componentManager; private Configurer m_configurer; + private TypeManager m_typeManager; private Logger m_logger; private DefaultTaskContext m_context; @@ -134,6 +136,8 @@ public class DefaultConfigurerTest // Find the configurer m_configurer = (Configurer)m_componentManager.lookup( Configurer.ROLE ); + // Find the typeManager + m_typeManager = (TypeManager)m_componentManager.lookup( TypeManager.ROLE ); } /** @@ -412,6 +416,85 @@ public class DefaultConfigurerTest } } + /** + * Tests to see if typed adder works. + */ + public void testTypedAdder() + throws Exception + { + // Setup test data + final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); + final DefaultConfiguration child1 = new DefaultConfiguration( "my-type1", "test" ); + final DefaultConfiguration child2 = new DefaultConfiguration( "my-type2", "test" ); + config.addChild( child1 ); + config.addChild( child2 ); + + final ClassLoader loader = getClass().getClassLoader(); + 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.getName(), "my-type1", factory ); + m_typeManager.registerType( MyRole1.class.getName(), "my-type2", factory ); + + final ConfigTest6 test = new ConfigTest6(); + + // Configure the object + m_configurer.configure( test, config, m_context ); + + final ConfigTest6 expected = new ConfigTest6(); + expected.add( new MyType1() ); + expected.add( new MyType2() ); + assertEquals( expected, test ); + } + + /** + * Tests to see if typed adder works. + */ + public void testTypedConfigAdder() + throws Exception + { + // Setup test data + final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); + final DefaultConfiguration child1 = new DefaultConfiguration( "my-type1", "test" ); + final DefaultConfiguration child2 = new DefaultConfiguration( "my-type2", "test" ); + config.addChild( child1 ); + config.addChild( child2 ); + + final ConfigTest7 test = new ConfigTest7(); + + // Configure the object + m_configurer.configure( test, config, m_context ); + + final ConfigTest7 expected = new ConfigTest7(); + expected.add( child1 ); + expected.add( child2 ); + assertEquals( expected, test ); + } + + /** + * Tests to see if typed adder works. + */ + public void testConfigAdder() + throws Exception + { + // Setup test data + final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); + final DefaultConfiguration child1 = new DefaultConfiguration( "config", "test" ); + final DefaultConfiguration child2 = new DefaultConfiguration( "config", "test" ); + config.addChild( child1 ); + config.addChild( child2 ); + + final ConfigTest8 test = new ConfigTest8(); + + // Configure the object + m_configurer.configure( test, config, m_context ); + + final ConfigTest8 expected = new ConfigTest8(); + expected.addConfig( child1 ); + expected.addConfig( child2 ); + assertEquals( expected, test ); + } + /** * Test resolving properties in an id. */ diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/MyType1.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/MyType1.java new file mode 100644 index 000000000..ee40c9eae --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/MyType1.java @@ -0,0 +1,23 @@ +/* + * 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.configurer; + +/** + * A basic implementation of MyRole1 to test configurer. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class MyType1 + implements MyRole1 +{ + public boolean equals( final Object object ) + { + return object.getClass() == getClass(); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/MyType2.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/MyType2.java new file mode 100644 index 000000000..c573feff1 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/MyType2.java @@ -0,0 +1,23 @@ +/* + * 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.configurer; + +/** + * A basic implementation of MyRole1 to test configurer. + * + * @author Peter Donald + * @version $Revision$ $Date$ + */ +public class MyType2 + implements MyRole1 +{ + public boolean equals( final Object object ) + { + return object.getClass() == getClass(); + } +}