* Handle the case where a class has both a setFoo() and addFoo() method. * Ignore addContent( String ) if there is a non-String addContent() method. * Ignore add( String ) if there is a non-String add() method. * Added test cases for these. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271898 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -10,11 +10,11 @@ package org.apache.myrmidon.components.configurer; | |||
| import java.lang.reflect.Method; | |||
| import java.lang.reflect.Modifier; | |||
| import java.util.ArrayList; | |||
| import java.util.Collection; | |||
| import java.util.HashMap; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Collection; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.avalon.framework.configuration.ConfigurationException; | |||
| @@ -35,7 +35,7 @@ class DefaultObjectConfigurer | |||
| private final Class m_class; | |||
| /** | |||
| * All property configurers. (For XML elements) | |||
| * Adder property configurers. (For XML elements) | |||
| */ | |||
| private final HashMap m_adders = new HashMap(); | |||
| @@ -54,6 +54,11 @@ class DefaultObjectConfigurer | |||
| */ | |||
| private PropertyConfigurer m_contentConfigurer; | |||
| /** | |||
| * Total number of properties. | |||
| */ | |||
| private int m_propCount; | |||
| /** | |||
| * Creates an object configurer for a particular class. The newly | |||
| * created configurer will not handle any attributes, elements, or content. | |||
| @@ -70,97 +75,143 @@ class DefaultObjectConfigurer | |||
| private void enableAll() | |||
| throws ConfigurationException | |||
| { | |||
| enableProperties(); | |||
| enableSetters(); | |||
| enableAdders(); | |||
| enableTypedAdder(); | |||
| enableContent(); | |||
| } | |||
| /** | |||
| * Enables all adders. | |||
| * Enables all setters. | |||
| */ | |||
| private void enableProperties() | |||
| private void enableSetters() | |||
| throws ConfigurationException | |||
| { | |||
| final Map configurers = findPropertyConfigurers(); | |||
| // Locate all the setter methods | |||
| final Collection methods = findMethods( "set", false ); | |||
| // Add the elements | |||
| // Create a configurer for each setter | |||
| final Iterator iterator = methods.iterator(); | |||
| while( iterator.hasNext() ) | |||
| { | |||
| final Method method = (Method)iterator.next(); | |||
| final Class type = method.getParameterTypes()[ 0 ]; | |||
| final String propName = extractName( 3, method.getName() ); | |||
| final Iterator iterator = configurers.keySet().iterator(); | |||
| final DefaultPropertyConfigurer setter = | |||
| new DefaultPropertyConfigurer( getPropertyCount(), | |||
| type, | |||
| method, | |||
| 1 ); | |||
| m_setters.put( propName, setter ); | |||
| } | |||
| } | |||
| /** | |||
| * Enables all adders. | |||
| */ | |||
| private void enableAdders() | |||
| throws ConfigurationException | |||
| { | |||
| // Locate all the adder methods | |||
| final Collection methods = findMethods( "add", false ); | |||
| final Iterator iterator = methods.iterator(); | |||
| while( iterator.hasNext() ) | |||
| { | |||
| final String name = (String)iterator.next(); | |||
| final Method method = (Method)configurers.get( name ); | |||
| final boolean isSetter = method.getName().startsWith( "set" ); | |||
| final Method method = (Method)iterator.next(); | |||
| final String methodName = method.getName(); | |||
| // Determine and check the return type | |||
| final Class type = method.getParameterTypes()[ 0 ]; | |||
| final boolean isTypedProp = ( name.length() == 0 ); | |||
| if( isTypedProp && !type.isInterface() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "typed-adder-non-interface.error", | |||
| m_class.getName(), | |||
| type.getName() ); | |||
| throw new ConfigurationException( message ); | |||
| } | |||
| else if( isTypedProp && isSetter ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "typed-setter-not-allowed.error", | |||
| m_class.getName(), | |||
| type.getName() ); | |||
| throw new ConfigurationException( message ); | |||
| } | |||
| else if( isTypedProp && null != m_typedPropertyConfigurer ) | |||
| // Skip the text content method | |||
| if( methodName.equals( "addContent" ) ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "typed-adder-duplicates.error", | |||
| m_class.getName(), | |||
| type.getName() ); | |||
| throw new ConfigurationException( message ); | |||
| continue; | |||
| } | |||
| // Determine the max count for the property | |||
| if( isSetter ) | |||
| { | |||
| final DefaultPropertyConfigurer setter = | |||
| new DefaultPropertyConfigurer( getPropertyCount(), | |||
| type, | |||
| method, | |||
| 1 ); | |||
| m_setters.put( name, setter ); | |||
| } | |||
| else | |||
| { | |||
| final DefaultPropertyConfigurer configurer = | |||
| new DefaultPropertyConfigurer( getPropertyCount(), | |||
| type, | |||
| method, | |||
| Integer.MAX_VALUE ); | |||
| if( isTypedProp ) | |||
| { | |||
| m_typedPropertyConfigurer = configurer; | |||
| } | |||
| else | |||
| { | |||
| m_adders.put( name, configurer ); | |||
| } | |||
| } | |||
| final Class type = method.getParameterTypes()[ 0 ]; | |||
| final String propName = extractName( 3, methodName ); | |||
| final DefaultPropertyConfigurer configurer = | |||
| new DefaultPropertyConfigurer( getPropertyCount(), | |||
| type, | |||
| method, | |||
| Integer.MAX_VALUE ); | |||
| m_adders.put( propName, configurer ); | |||
| } | |||
| } | |||
| /** | |||
| * Locate all 'add' and 'set' methods which return void, and take a | |||
| * single parameter. | |||
| * Enables the typed adder. | |||
| */ | |||
| private Map findPropertyConfigurers() | |||
| private void enableTypedAdder() | |||
| throws ConfigurationException | |||
| { | |||
| final Map adders = new HashMap(); | |||
| final List methodSet = new ArrayList(); | |||
| findMethodsWithPrefix( "add", methodSet ); | |||
| findMethodsWithPrefix( "set", methodSet ); | |||
| final Collection methods = findMethods( "add", true ); | |||
| if( methods.size() == 0 ) | |||
| { | |||
| return; | |||
| } | |||
| final Method method = (Method)methods.iterator().next(); | |||
| final Class type = method.getParameterTypes()[ 0 ]; | |||
| // TODO - this isn't necessary | |||
| if( !type.isInterface() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "typed-adder-non-interface.error", | |||
| m_class.getName(), | |||
| type.getName() ); | |||
| throw new ConfigurationException( message ); | |||
| } | |||
| m_typedPropertyConfigurer | |||
| = new DefaultPropertyConfigurer( getPropertyCount(), | |||
| type, | |||
| method, | |||
| Integer.MAX_VALUE ); | |||
| } | |||
| final Iterator iterator = methodSet.iterator(); | |||
| /** | |||
| * Enables text content. | |||
| */ | |||
| private void enableContent() | |||
| throws ConfigurationException | |||
| { | |||
| // Locate the 'addContent' methods, which return void, and take | |||
| // a single parameter. | |||
| final Collection methods = findMethods( "addContent", true ); | |||
| if( methods.size() == 0 ) | |||
| { | |||
| return; | |||
| } | |||
| final Method method = (Method)methods.iterator().next(); | |||
| final Class type = method.getParameterTypes()[ 0 ]; | |||
| m_contentConfigurer = new DefaultPropertyConfigurer( getPropertyCount(), | |||
| type, | |||
| method, | |||
| 1 ); | |||
| } | |||
| /** | |||
| * Locate all methods whose name starts with a particular | |||
| * prefix, and which are non-static, return void, and take a single | |||
| * parameter. If there are more than one matching methods of a given | |||
| * name, the method that takes a String parameter (if any) is ignored. | |||
| * If after that there are more than one matching methods of a given | |||
| * name, an exception is thrown. | |||
| * | |||
| * @return Map from property name -> Method object for that property. | |||
| */ | |||
| private Collection findMethods( final String prefix, | |||
| final boolean exactMatch ) | |||
| throws ConfigurationException | |||
| { | |||
| final Map methods = new HashMap(); | |||
| final List allMethods = findMethodsWithPrefix( prefix, exactMatch ); | |||
| final Iterator iterator = allMethods.iterator(); | |||
| while( iterator.hasNext() ) | |||
| { | |||
| final Method method = (Method)iterator.next(); | |||
| @@ -171,26 +222,13 @@ class DefaultObjectConfigurer | |||
| continue; | |||
| } | |||
| // Skip the text content method | |||
| if( methodName.equals( "addContent" ) ) | |||
| { | |||
| continue; | |||
| } | |||
| // Extract property name | |||
| final String propName = extractName( 3, methodName ); | |||
| final Class type = method.getParameterTypes()[ 0 ]; | |||
| // Add to the adders map | |||
| if( adders.containsKey( propName ) ) | |||
| if( methods.containsKey( methodName ) ) | |||
| { | |||
| final Method candidate = (Method)adders.get( propName ); | |||
| final String operation = methodName.substring( 0, 3 ); | |||
| if( !candidate.getName().startsWith( operation ) ) | |||
| { | |||
| continue; | |||
| } | |||
| final Method candidate = (Method)methods.get( methodName ); | |||
| final Class currentType = candidate.getParameterTypes()[ 0 ]; | |||
| // Ditch the string version, if any | |||
| @@ -202,70 +240,27 @@ class DefaultObjectConfigurer | |||
| } | |||
| else if( currentType != String.class || type == String.class ) | |||
| { | |||
| // Both are string, or both are not string | |||
| // Both are string (which would be odd), or both are not string | |||
| final String message = | |||
| REZ.getString( "multiple-adder-methods-for-element.error", | |||
| REZ.getString( "multiple-methods-for-element.error", | |||
| m_class.getName(), | |||
| propName ); | |||
| methodName ); | |||
| throw new ConfigurationException( message ); | |||
| } | |||
| // Else, current type is string, and new type is not, so | |||
| // continue below, and overwrite the current method | |||
| // continue below, and replace the current method | |||
| } | |||
| adders.put( propName, method ); | |||
| methods.put( methodName, method ); | |||
| } | |||
| return adders; | |||
| } | |||
| /** | |||
| * Enables content. | |||
| */ | |||
| private void enableContent() | |||
| throws ConfigurationException | |||
| { | |||
| // TODO - should be using 'setContent', rather than 'addContent', | |||
| // to better match the call-at-most-once semantics of the other | |||
| // setter methods | |||
| // Locate any 'addContent' methods, which return void, and take | |||
| // a single parameter. | |||
| final Method[] methods = m_class.getMethods(); | |||
| for( int i = 0; i < methods.length; i++ ) | |||
| { | |||
| final Method method = methods[ i ]; | |||
| final String methodName = method.getName(); | |||
| if( Modifier.isStatic( method.getModifiers() ) || | |||
| !methodName.equals( "addContent" ) || | |||
| method.getReturnType() != Void.TYPE || | |||
| method.getParameterTypes().length != 1 ) | |||
| { | |||
| continue; | |||
| } | |||
| // Check for multiple content setters | |||
| if( null != m_contentConfigurer ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "multiple-content-setter-methods.error", m_class.getName() ); | |||
| throw new ConfigurationException( message ); | |||
| } | |||
| final Class type = method.getParameterTypes()[ 0 ]; | |||
| m_contentConfigurer = | |||
| new DefaultPropertyConfigurer( getPropertyCount(), | |||
| type, | |||
| method, | |||
| 1 ); | |||
| } | |||
| return methods.values(); | |||
| } | |||
| private int getPropertyCount() | |||
| { | |||
| final int typedSize = ( null != m_typedPropertyConfigurer ) ? 1 : 0; | |||
| final int contentSize = ( null != m_contentConfigurer ) ? 1 : 0; | |||
| return m_adders.size() + m_setters.size() + contentSize + typedSize; | |||
| return m_propCount++; | |||
| } | |||
| /** | |||
| @@ -369,22 +364,31 @@ class DefaultObjectConfigurer | |||
| * Locates all non-static methods whose name starts with a particular | |||
| * prefix. | |||
| */ | |||
| private void findMethodsWithPrefix( final String prefix, final Collection matches ) | |||
| private List findMethodsWithPrefix( final String prefix, | |||
| final boolean exactMatch ) | |||
| { | |||
| final ArrayList matches = new ArrayList(); | |||
| final int prefixLen = prefix.length(); | |||
| final Method[] methods = m_class.getMethods(); | |||
| for( int i = 0; i < methods.length; i++ ) | |||
| { | |||
| final Method method = methods[ i ]; | |||
| final String methodName = method.getName(); | |||
| if( Modifier.isStatic( method.getModifiers() ) || | |||
| methodName.length() < prefixLen || | |||
| !methodName.startsWith( prefix ) ) | |||
| if( Modifier.isStatic( method.getModifiers() ) ) | |||
| { | |||
| continue; | |||
| } | |||
| if( methodName.length() < prefixLen || !methodName.startsWith( prefix ) ) | |||
| { | |||
| continue; | |||
| } | |||
| if( exactMatch && methodName.length() != prefixLen ) | |||
| { | |||
| continue; | |||
| } | |||
| matches.add( method ); | |||
| } | |||
| return matches; | |||
| } | |||
| } | |||
| @@ -2,9 +2,7 @@ create-object.error=Could not create an object of class {0}. | |||
| extra-config-for-ref.error=A reference element can only include an "id" attribute. | |||
| mismatch-ref-types.error=Could not convert reference "{0}" to the type expected for property "{1}". | |||
| incompatible-element-types.error=Incompatible creator and adder/setter methods found in class {0} for property "{1}". | |||
| multiple-adder-methods-for-element.error=Multiple add{1}() or set{1}() methods found in class {0}. | |||
| multiple-content-setter-methods.error=Multiple content setter methods found in class {0}. | |||
| pending-property-value.error=An object created using the creator method has not been set using the adder/setter method. | |||
| multiple-methods-for-element.error=Multiple non-String {1}() methods found in class {0}. | |||
| too-many-values.error=Too many values for this property. | |||
| no-complex-type.error=Can not get complex type for non-primitive type {0}. | |||
| no-such-attribute.error=Element <{0}> does not support attribute "{1}". | |||
| @@ -16,6 +14,4 @@ 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. | |||
| create-typed-object.error=Could not create an object of type "{0}" of class {1}. | |||
| unknown-reference.error=Could not find referenced object "{0}". | |||
| bad-configure-element.error=Could not configure element <{0}>. | |||
| typed-setter-not-allowed.error=Not allowed to have "typed" setters as found in class {0}. | |||
| typed-adder-duplicates.error=Multiple typed adders found in class {0}. | |||
| bad-configure-element.error=Could not configure element <{0}>. | |||
| @@ -38,6 +38,7 @@ import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedAdderR | |||
| import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedAdderRole; | |||
| import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedConfigAdder; | |||
| import org.apache.myrmidon.components.configurer.test.data.ConfigTestUnknownReference; | |||
| import org.apache.myrmidon.components.configurer.test.data.ConfigTestSetAndAdd; | |||
| import org.apache.myrmidon.components.workspace.DefaultTaskContext; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| import org.apache.myrmidon.interfaces.configurer.Configurer; | |||
| @@ -80,7 +81,7 @@ public class DefaultConfigurerTestCase | |||
| } | |||
| /** | |||
| * Tests setting an attribute, via adder and setter methods. | |||
| * Tests setting an attribute, via a setter method. | |||
| */ | |||
| public void testSetAttribute() | |||
| throws Exception | |||
| @@ -89,8 +90,6 @@ public class DefaultConfigurerTestCase | |||
| final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); | |||
| final String value1 = "some value"; | |||
| config.setAttribute( "some-prop", value1 ); | |||
| final String value2 = "some other value"; | |||
| config.setAttribute( "prop", value2 ); | |||
| final ConfigTestSetAttribute test = new ConfigTestSetAttribute(); | |||
| @@ -100,7 +99,6 @@ public class DefaultConfigurerTestCase | |||
| // Check result | |||
| final ConfigTestSetAttribute expected = new ConfigTestSetAttribute(); | |||
| expected.setSomeProp( value1 ); | |||
| expected.setProp( value2 ); | |||
| assertEquals( expected, test ); | |||
| } | |||
| @@ -167,7 +165,7 @@ public class DefaultConfigurerTestCase | |||
| final String value1 = "some value"; | |||
| child1.setAttribute( "some-prop", value1 ); | |||
| config.addChild( child1 ); | |||
| final DefaultConfiguration child2 = new DefaultConfiguration( "another-prop", "test" ); | |||
| final DefaultConfiguration child2 = new DefaultConfiguration( "prop", "test" ); | |||
| final String value2 = "another value"; | |||
| child2.setAttribute( "some-prop", value2 ); | |||
| config.addChild( child2 ); | |||
| @@ -184,7 +182,7 @@ public class DefaultConfigurerTestCase | |||
| expected.addProp( elem ); | |||
| elem = new ConfigTestSetElement(); | |||
| elem.setSomeProp( value2 ); | |||
| expected.addAnotherProp( elem ); | |||
| expected.addProp( elem ); | |||
| assertEquals( expected, test ); | |||
| } | |||
| @@ -465,9 +463,9 @@ public class DefaultConfigurerTestCase | |||
| final String[] messages = new String[] | |||
| { | |||
| REZ.getString( "bad-configure-element.error", "test" ), | |||
| REZ.getString( "multiple-adder-methods-for-element.error", | |||
| REZ.getString( "multiple-methods-for-element.error", | |||
| ConfigTestMultipleTypedAdder.class.getName(), | |||
| "" ) | |||
| "add" ) | |||
| }; | |||
| assertSameMessage( messages, ce ); | |||
| } | |||
| @@ -486,8 +484,9 @@ public class DefaultConfigurerTestCase | |||
| config.addChild( child1 ); | |||
| config.addChild( child2 ); | |||
| registerType( DataType.ROLE, "my-type1", MyType1.class ); | |||
| registerType( DataType.ROLE, "my-type2", MyType2.class ); | |||
| registerRole( new RoleInfo( MyRole1.ROLE, "my-role1", MyRole1.class ) ); | |||
| registerType( MyRole1.ROLE, "my-type1", MyType1.class ); | |||
| registerType( MyRole1.ROLE, "my-type2", MyType2.class ); | |||
| final ConfigTestTypedAdder test = new ConfigTestTypedAdder(); | |||
| @@ -606,7 +605,7 @@ public class DefaultConfigurerTestCase | |||
| /** | |||
| * Tests to check that Configurable is handled properly. | |||
| */ | |||
| public void testConfigable() | |||
| public void testConfigurable() | |||
| throws Exception | |||
| { | |||
| // Setup test data | |||
| @@ -773,11 +772,17 @@ public class DefaultConfigurerTestCase | |||
| { | |||
| // Setup test data | |||
| final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); | |||
| DefaultConfiguration elem = new DefaultConfiguration( "prop1", "test" ); | |||
| config.setAttribute( "prop1", "some-value" ); | |||
| config.setValue( "99" ); | |||
| DefaultConfiguration elem = new DefaultConfiguration( "prop2", "test" ); | |||
| config.addChild( elem ); | |||
| elem = new DefaultConfiguration( "prop2", "test" ); | |||
| elem = new DefaultConfiguration( "my-type1", "test" ); | |||
| config.addChild( elem ); | |||
| registerConverter( ObjectToMyRole1Converter.class, String.class, MyRole1.class ); | |||
| registerConverter( StringToIntegerConverter.class, String.class, Integer.class ); | |||
| registerType( DataType.ROLE, "my-type1", MyType1.class ); | |||
| final ConfigTestIgnoreStringMethods test = new ConfigTestIgnoreStringMethods(); | |||
| // Configure the object | |||
| @@ -785,8 +790,37 @@ public class DefaultConfigurerTestCase | |||
| // Test expected value | |||
| final ConfigTestIgnoreStringMethods expected = new ConfigTestIgnoreStringMethods(); | |||
| expected.addProp1( new ConfigTestIgnoreStringMethods() ); | |||
| expected.setProp1( new MyRole1Adaptor( "some-value" ) ); | |||
| expected.addProp2( new ConfigTestIgnoreStringMethods() ); | |||
| expected.add( new MyType1() ); | |||
| expected.addContent( 99 ); | |||
| assertEquals( expected, test ); | |||
| } | |||
| /** | |||
| * Tests that a class with a setter and adder with the same property name | |||
| * is handled correctly. | |||
| */ | |||
| public void testSetAndAdd() throws Exception | |||
| { | |||
| // Setup test data | |||
| final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); | |||
| config.setAttribute( "prop", "some value" ); | |||
| DefaultConfiguration elem = new DefaultConfiguration( "prop", "test" ); | |||
| elem.setAttribute( "prop", "another value" ); | |||
| config.addChild( elem ); | |||
| final ConfigTestSetAndAdd test = new ConfigTestSetAndAdd(); | |||
| // Configure the object | |||
| configure( test, config ); | |||
| // Test expected value | |||
| final ConfigTestSetAndAdd expected = new ConfigTestSetAndAdd(); | |||
| expected.setProp( "some value" ); | |||
| final ConfigTestSetAndAdd nested = new ConfigTestSetAndAdd(); | |||
| nested.setProp( "another value" ); | |||
| expected.addProp( nested ); | |||
| assertEquals( expected, test ); | |||
| } | |||
| @@ -7,12 +7,10 @@ | |||
| */ | |||
| package org.apache.myrmidon.components.configurer.test.data; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| /** | |||
| * A simple test class with string properties. | |||
| * An empty class. | |||
| * | |||
| * @author Adam Murdoch | |||
| */ | |||
| @@ -10,6 +10,7 @@ package org.apache.myrmidon.components.configurer.test.data; | |||
| import java.util.ArrayList; | |||
| import junit.framework.AssertionFailedError; | |||
| import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| import org.apache.myrmidon.components.configurer.test.MyRole1; | |||
| /** | |||
| * A test class with multiple setters/adders/creators for a property. | |||
| @@ -18,8 +19,10 @@ import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| */ | |||
| public class ConfigTestIgnoreStringMethods | |||
| { | |||
| private ConfigTestIgnoreStringMethods m_prop1; | |||
| private MyRole1 m_prop1; | |||
| private ArrayList m_prop2 = new ArrayList(); | |||
| private int m_content; | |||
| private ArrayList m_typed = new ArrayList(); | |||
| public boolean equals( Object obj ) | |||
| { | |||
| @@ -32,19 +35,27 @@ public class ConfigTestIgnoreStringMethods | |||
| { | |||
| return false; | |||
| } | |||
| if( m_content != test.m_content ) | |||
| { | |||
| return false; | |||
| } | |||
| if( !m_typed.equals( test.m_typed ) ) | |||
| { | |||
| return false; | |||
| } | |||
| return true; | |||
| } | |||
| // | |||
| // Multiple setters | |||
| // Multiple Setters | |||
| // | |||
| public void addProp1( final String value ) | |||
| public void setProp1( final String value ) | |||
| { | |||
| throw new AssertionFailedError(); | |||
| } | |||
| public void addProp1( final ConfigTestIgnoreStringMethods value ) | |||
| public void setProp1( final MyRole1 value ) | |||
| { | |||
| m_prop1 = value; | |||
| } | |||
| @@ -62,4 +73,33 @@ public class ConfigTestIgnoreStringMethods | |||
| { | |||
| m_prop2.add( value ); | |||
| } | |||
| // | |||
| // Multiple typed adders | |||
| // | |||
| public void add( final String value ) | |||
| { | |||
| throw new AssertionFailedError(); | |||
| } | |||
| public void add( final MyRole1 value ) | |||
| { | |||
| m_typed.add( value ); | |||
| } | |||
| // | |||
| // Multiple content setters | |||
| // | |||
| public void addContent( final int value ) | |||
| { | |||
| m_content = value; | |||
| } | |||
| public void addContent( final String value ) | |||
| { | |||
| throw new AssertionFailedError(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,50 @@ | |||
| /* | |||
| * 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.test.data; | |||
| import java.util.ArrayList; | |||
| import org.apache.myrmidon.AbstractMyrmidonTest; | |||
| /** | |||
| * A test class with a setter and adder with the same property name. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class ConfigTestSetAndAdd | |||
| { | |||
| private String m_prop; | |||
| private ArrayList m_nested = new ArrayList(); | |||
| public void setProp( final String prop ) | |||
| { | |||
| m_prop = prop; | |||
| } | |||
| public void addProp( final ConfigTestSetAndAdd elem ) | |||
| { | |||
| m_nested.add( elem ); | |||
| } | |||
| public boolean equals( final Object obj ) | |||
| { | |||
| ConfigTestSetAndAdd test = (ConfigTestSetAndAdd)obj; | |||
| if( ! AbstractMyrmidonTest.equals( m_prop, test.m_prop) ) | |||
| { | |||
| return false; | |||
| } | |||
| else if( ! m_nested.equals( test.m_nested ) ) | |||
| { | |||
| return false; | |||
| } | |||
| else | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| } | |||
| @@ -12,7 +12,7 @@ import java.util.ArrayList; | |||
| import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| /** | |||
| * Simple class to test typed adder. | |||
| * Simple class to test setter. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| @@ -20,7 +20,6 @@ import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| public class ConfigTestSetAttribute | |||
| { | |||
| private String m_someProp; | |||
| private List m_propList = new ArrayList(); | |||
| public boolean equals( final Object obj ) | |||
| { | |||
| @@ -29,10 +28,6 @@ public class ConfigTestSetAttribute | |||
| { | |||
| return false; | |||
| } | |||
| else if( !m_propList.equals( test.m_propList ) ) | |||
| { | |||
| return false; | |||
| } | |||
| else | |||
| { | |||
| return true; | |||
| @@ -43,9 +38,4 @@ public class ConfigTestSetAttribute | |||
| { | |||
| m_someProp = value; | |||
| } | |||
| public void setProp( final String value ) | |||
| { | |||
| m_propList.add( value ); | |||
| } | |||
| } | |||
| @@ -18,18 +18,13 @@ import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| */ | |||
| public class ConfigTestSetElement | |||
| { | |||
| private ConfigTestSetElement m_prop; | |||
| private List m_propList = new ArrayList(); | |||
| private String m_someProp; | |||
| public boolean equals( Object obj ) | |||
| { | |||
| ConfigTestSetElement test = (ConfigTestSetElement)obj; | |||
| if( !DefaultConfigurerTestCase.equals( m_prop, test.m_prop ) ) | |||
| { | |||
| return false; | |||
| } | |||
| else if( !m_propList.equals( test.m_propList ) ) | |||
| if( !m_propList.equals( test.m_propList ) ) | |||
| { | |||
| return false; | |||
| } | |||
| @@ -46,11 +41,6 @@ public class ConfigTestSetElement | |||
| } | |||
| public void addProp( final ConfigTestSetElement test ) | |||
| { | |||
| m_prop = test; | |||
| } | |||
| public void addAnotherProp( final ConfigTestSetElement test ) | |||
| { | |||
| m_propList.add( test ); | |||
| } | |||
| @@ -8,7 +8,6 @@ | |||
| package org.apache.myrmidon.components.configurer.test.data; | |||
| import java.util.ArrayList; | |||
| import org.apache.avalon.framework.configuration.Configuration; | |||
| import org.apache.myrmidon.components.configurer.test.MyRole1; | |||
| /** | |||
| @@ -7,10 +7,7 @@ | |||
| */ | |||
| package org.apache.myrmidon.components.configurer.test.data; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| /** | |||
| * A simple test class with string properties. | |||
| @@ -38,6 +38,7 @@ import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedAdderR | |||
| import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedAdderRole; | |||
| import org.apache.myrmidon.components.configurer.test.data.ConfigTestTypedConfigAdder; | |||
| import org.apache.myrmidon.components.configurer.test.data.ConfigTestUnknownReference; | |||
| import org.apache.myrmidon.components.configurer.test.data.ConfigTestSetAndAdd; | |||
| import org.apache.myrmidon.components.workspace.DefaultTaskContext; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| import org.apache.myrmidon.interfaces.configurer.Configurer; | |||
| @@ -80,7 +81,7 @@ public class DefaultConfigurerTestCase | |||
| } | |||
| /** | |||
| * Tests setting an attribute, via adder and setter methods. | |||
| * Tests setting an attribute, via a setter method. | |||
| */ | |||
| public void testSetAttribute() | |||
| throws Exception | |||
| @@ -89,8 +90,6 @@ public class DefaultConfigurerTestCase | |||
| final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); | |||
| final String value1 = "some value"; | |||
| config.setAttribute( "some-prop", value1 ); | |||
| final String value2 = "some other value"; | |||
| config.setAttribute( "prop", value2 ); | |||
| final ConfigTestSetAttribute test = new ConfigTestSetAttribute(); | |||
| @@ -100,7 +99,6 @@ public class DefaultConfigurerTestCase | |||
| // Check result | |||
| final ConfigTestSetAttribute expected = new ConfigTestSetAttribute(); | |||
| expected.setSomeProp( value1 ); | |||
| expected.setProp( value2 ); | |||
| assertEquals( expected, test ); | |||
| } | |||
| @@ -167,7 +165,7 @@ public class DefaultConfigurerTestCase | |||
| final String value1 = "some value"; | |||
| child1.setAttribute( "some-prop", value1 ); | |||
| config.addChild( child1 ); | |||
| final DefaultConfiguration child2 = new DefaultConfiguration( "another-prop", "test" ); | |||
| final DefaultConfiguration child2 = new DefaultConfiguration( "prop", "test" ); | |||
| final String value2 = "another value"; | |||
| child2.setAttribute( "some-prop", value2 ); | |||
| config.addChild( child2 ); | |||
| @@ -184,7 +182,7 @@ public class DefaultConfigurerTestCase | |||
| expected.addProp( elem ); | |||
| elem = new ConfigTestSetElement(); | |||
| elem.setSomeProp( value2 ); | |||
| expected.addAnotherProp( elem ); | |||
| expected.addProp( elem ); | |||
| assertEquals( expected, test ); | |||
| } | |||
| @@ -465,9 +463,9 @@ public class DefaultConfigurerTestCase | |||
| final String[] messages = new String[] | |||
| { | |||
| REZ.getString( "bad-configure-element.error", "test" ), | |||
| REZ.getString( "multiple-adder-methods-for-element.error", | |||
| REZ.getString( "multiple-methods-for-element.error", | |||
| ConfigTestMultipleTypedAdder.class.getName(), | |||
| "" ) | |||
| "add" ) | |||
| }; | |||
| assertSameMessage( messages, ce ); | |||
| } | |||
| @@ -486,8 +484,9 @@ public class DefaultConfigurerTestCase | |||
| config.addChild( child1 ); | |||
| config.addChild( child2 ); | |||
| registerType( DataType.ROLE, "my-type1", MyType1.class ); | |||
| registerType( DataType.ROLE, "my-type2", MyType2.class ); | |||
| registerRole( new RoleInfo( MyRole1.ROLE, "my-role1", MyRole1.class ) ); | |||
| registerType( MyRole1.ROLE, "my-type1", MyType1.class ); | |||
| registerType( MyRole1.ROLE, "my-type2", MyType2.class ); | |||
| final ConfigTestTypedAdder test = new ConfigTestTypedAdder(); | |||
| @@ -606,7 +605,7 @@ public class DefaultConfigurerTestCase | |||
| /** | |||
| * Tests to check that Configurable is handled properly. | |||
| */ | |||
| public void testConfigable() | |||
| public void testConfigurable() | |||
| throws Exception | |||
| { | |||
| // Setup test data | |||
| @@ -773,11 +772,17 @@ public class DefaultConfigurerTestCase | |||
| { | |||
| // Setup test data | |||
| final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); | |||
| DefaultConfiguration elem = new DefaultConfiguration( "prop1", "test" ); | |||
| config.setAttribute( "prop1", "some-value" ); | |||
| config.setValue( "99" ); | |||
| DefaultConfiguration elem = new DefaultConfiguration( "prop2", "test" ); | |||
| config.addChild( elem ); | |||
| elem = new DefaultConfiguration( "prop2", "test" ); | |||
| elem = new DefaultConfiguration( "my-type1", "test" ); | |||
| config.addChild( elem ); | |||
| registerConverter( ObjectToMyRole1Converter.class, String.class, MyRole1.class ); | |||
| registerConverter( StringToIntegerConverter.class, String.class, Integer.class ); | |||
| registerType( DataType.ROLE, "my-type1", MyType1.class ); | |||
| final ConfigTestIgnoreStringMethods test = new ConfigTestIgnoreStringMethods(); | |||
| // Configure the object | |||
| @@ -785,8 +790,37 @@ public class DefaultConfigurerTestCase | |||
| // Test expected value | |||
| final ConfigTestIgnoreStringMethods expected = new ConfigTestIgnoreStringMethods(); | |||
| expected.addProp1( new ConfigTestIgnoreStringMethods() ); | |||
| expected.setProp1( new MyRole1Adaptor( "some-value" ) ); | |||
| expected.addProp2( new ConfigTestIgnoreStringMethods() ); | |||
| expected.add( new MyType1() ); | |||
| expected.addContent( 99 ); | |||
| assertEquals( expected, test ); | |||
| } | |||
| /** | |||
| * Tests that a class with a setter and adder with the same property name | |||
| * is handled correctly. | |||
| */ | |||
| public void testSetAndAdd() throws Exception | |||
| { | |||
| // Setup test data | |||
| final DefaultConfiguration config = new DefaultConfiguration( "test", "test" ); | |||
| config.setAttribute( "prop", "some value" ); | |||
| DefaultConfiguration elem = new DefaultConfiguration( "prop", "test" ); | |||
| elem.setAttribute( "prop", "another value" ); | |||
| config.addChild( elem ); | |||
| final ConfigTestSetAndAdd test = new ConfigTestSetAndAdd(); | |||
| // Configure the object | |||
| configure( test, config ); | |||
| // Test expected value | |||
| final ConfigTestSetAndAdd expected = new ConfigTestSetAndAdd(); | |||
| expected.setProp( "some value" ); | |||
| final ConfigTestSetAndAdd nested = new ConfigTestSetAndAdd(); | |||
| nested.setProp( "another value" ); | |||
| expected.addProp( nested ); | |||
| assertEquals( expected, test ); | |||
| } | |||
| @@ -7,12 +7,10 @@ | |||
| */ | |||
| package org.apache.myrmidon.components.configurer.test.data; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| /** | |||
| * A simple test class with string properties. | |||
| * An empty class. | |||
| * | |||
| * @author Adam Murdoch | |||
| */ | |||
| @@ -10,6 +10,7 @@ package org.apache.myrmidon.components.configurer.test.data; | |||
| import java.util.ArrayList; | |||
| import junit.framework.AssertionFailedError; | |||
| import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| import org.apache.myrmidon.components.configurer.test.MyRole1; | |||
| /** | |||
| * A test class with multiple setters/adders/creators for a property. | |||
| @@ -18,8 +19,10 @@ import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| */ | |||
| public class ConfigTestIgnoreStringMethods | |||
| { | |||
| private ConfigTestIgnoreStringMethods m_prop1; | |||
| private MyRole1 m_prop1; | |||
| private ArrayList m_prop2 = new ArrayList(); | |||
| private int m_content; | |||
| private ArrayList m_typed = new ArrayList(); | |||
| public boolean equals( Object obj ) | |||
| { | |||
| @@ -32,19 +35,27 @@ public class ConfigTestIgnoreStringMethods | |||
| { | |||
| return false; | |||
| } | |||
| if( m_content != test.m_content ) | |||
| { | |||
| return false; | |||
| } | |||
| if( !m_typed.equals( test.m_typed ) ) | |||
| { | |||
| return false; | |||
| } | |||
| return true; | |||
| } | |||
| // | |||
| // Multiple setters | |||
| // Multiple Setters | |||
| // | |||
| public void addProp1( final String value ) | |||
| public void setProp1( final String value ) | |||
| { | |||
| throw new AssertionFailedError(); | |||
| } | |||
| public void addProp1( final ConfigTestIgnoreStringMethods value ) | |||
| public void setProp1( final MyRole1 value ) | |||
| { | |||
| m_prop1 = value; | |||
| } | |||
| @@ -62,4 +73,33 @@ public class ConfigTestIgnoreStringMethods | |||
| { | |||
| m_prop2.add( value ); | |||
| } | |||
| // | |||
| // Multiple typed adders | |||
| // | |||
| public void add( final String value ) | |||
| { | |||
| throw new AssertionFailedError(); | |||
| } | |||
| public void add( final MyRole1 value ) | |||
| { | |||
| m_typed.add( value ); | |||
| } | |||
| // | |||
| // Multiple content setters | |||
| // | |||
| public void addContent( final int value ) | |||
| { | |||
| m_content = value; | |||
| } | |||
| public void addContent( final String value ) | |||
| { | |||
| throw new AssertionFailedError(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,50 @@ | |||
| /* | |||
| * 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.test.data; | |||
| import java.util.ArrayList; | |||
| import org.apache.myrmidon.AbstractMyrmidonTest; | |||
| /** | |||
| * A test class with a setter and adder with the same property name. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class ConfigTestSetAndAdd | |||
| { | |||
| private String m_prop; | |||
| private ArrayList m_nested = new ArrayList(); | |||
| public void setProp( final String prop ) | |||
| { | |||
| m_prop = prop; | |||
| } | |||
| public void addProp( final ConfigTestSetAndAdd elem ) | |||
| { | |||
| m_nested.add( elem ); | |||
| } | |||
| public boolean equals( final Object obj ) | |||
| { | |||
| ConfigTestSetAndAdd test = (ConfigTestSetAndAdd)obj; | |||
| if( ! AbstractMyrmidonTest.equals( m_prop, test.m_prop) ) | |||
| { | |||
| return false; | |||
| } | |||
| else if( ! m_nested.equals( test.m_nested ) ) | |||
| { | |||
| return false; | |||
| } | |||
| else | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| } | |||
| @@ -12,7 +12,7 @@ import java.util.ArrayList; | |||
| import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| /** | |||
| * Simple class to test typed adder. | |||
| * Simple class to test setter. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| @@ -20,7 +20,6 @@ import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| public class ConfigTestSetAttribute | |||
| { | |||
| private String m_someProp; | |||
| private List m_propList = new ArrayList(); | |||
| public boolean equals( final Object obj ) | |||
| { | |||
| @@ -29,10 +28,6 @@ public class ConfigTestSetAttribute | |||
| { | |||
| return false; | |||
| } | |||
| else if( !m_propList.equals( test.m_propList ) ) | |||
| { | |||
| return false; | |||
| } | |||
| else | |||
| { | |||
| return true; | |||
| @@ -43,9 +38,4 @@ public class ConfigTestSetAttribute | |||
| { | |||
| m_someProp = value; | |||
| } | |||
| public void setProp( final String value ) | |||
| { | |||
| m_propList.add( value ); | |||
| } | |||
| } | |||
| @@ -18,18 +18,13 @@ import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| */ | |||
| public class ConfigTestSetElement | |||
| { | |||
| private ConfigTestSetElement m_prop; | |||
| private List m_propList = new ArrayList(); | |||
| private String m_someProp; | |||
| public boolean equals( Object obj ) | |||
| { | |||
| ConfigTestSetElement test = (ConfigTestSetElement)obj; | |||
| if( !DefaultConfigurerTestCase.equals( m_prop, test.m_prop ) ) | |||
| { | |||
| return false; | |||
| } | |||
| else if( !m_propList.equals( test.m_propList ) ) | |||
| if( !m_propList.equals( test.m_propList ) ) | |||
| { | |||
| return false; | |||
| } | |||
| @@ -46,11 +41,6 @@ public class ConfigTestSetElement | |||
| } | |||
| public void addProp( final ConfigTestSetElement test ) | |||
| { | |||
| m_prop = test; | |||
| } | |||
| public void addAnotherProp( final ConfigTestSetElement test ) | |||
| { | |||
| m_propList.add( test ); | |||
| } | |||
| @@ -8,7 +8,6 @@ | |||
| package org.apache.myrmidon.components.configurer.test.data; | |||
| import java.util.ArrayList; | |||
| import org.apache.avalon.framework.configuration.Configuration; | |||
| import org.apache.myrmidon.components.configurer.test.MyRole1; | |||
| /** | |||
| @@ -7,10 +7,7 @@ | |||
| */ | |||
| package org.apache.myrmidon.components.configurer.test.data; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| import org.apache.myrmidon.components.configurer.test.DefaultConfigurerTestCase; | |||
| /** | |||
| * A simple test class with string properties. | |||