git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271741 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -459,19 +459,16 @@ public class DefaultConfigurer | |||||
| } | } | ||||
| // Create an instance | // Create an instance | ||||
| Object child = childConfigurer.createValue( state ); | |||||
| if( null == child ) | |||||
| Object child = null; | |||||
| if( childConfigurer == state.getConfigurer().getTypedProperty() ) | |||||
| { | { | ||||
| if( childConfigurer == state.getConfigurer().getTypedProperty() ) | |||||
| { | |||||
| // Typed property | |||||
| child = createTypedObject( name, type ); | |||||
| } | |||||
| else | |||||
| { | |||||
| // Named property | |||||
| child = createNamedObject( type ); | |||||
| } | |||||
| // Typed property | |||||
| child = createTypedObject( name, type ); | |||||
| } | |||||
| else | |||||
| { | |||||
| // Named property | |||||
| child = createNamedObject( type ); | |||||
| } | } | ||||
| // Configure the object | // Configure the object | ||||
| @@ -12,11 +12,9 @@ import java.lang.reflect.Modifier; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.Collection; | import java.util.Collection; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.HashSet; | |||||
| import java.util.Iterator; | import java.util.Iterator; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.Set; | |||||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | import org.apache.avalon.excalibur.i18n.ResourceManager; | ||||
| import org.apache.avalon.excalibur.i18n.Resources; | import org.apache.avalon.excalibur.i18n.Resources; | ||||
| import org.apache.avalon.framework.configuration.ConfigurationException; | import org.apache.avalon.framework.configuration.ConfigurationException; | ||||
| @@ -72,58 +70,28 @@ class DefaultObjectConfigurer | |||||
| public void enableAll() | public void enableAll() | ||||
| throws ConfigurationException | throws ConfigurationException | ||||
| { | { | ||||
| // TODO - get rid of creators | |||||
| enableProperties(); | enableProperties(); | ||||
| enableContent(); | enableContent(); | ||||
| } | } | ||||
| /** | /** | ||||
| * Enables all creators + adders. | |||||
| * Enables all adders. | |||||
| */ | */ | ||||
| private void enableProperties() | private void enableProperties() | ||||
| throws ConfigurationException | throws ConfigurationException | ||||
| { | { | ||||
| final Map creators = findCreators(); | |||||
| final Map adders = findAdders(); | final Map adders = findAdders(); | ||||
| // Add the elements | // Add the elements | ||||
| final Set elemNames = new HashSet(); | |||||
| elemNames.addAll( creators.keySet() ); | |||||
| elemNames.addAll( adders.keySet() ); | |||||
| final Iterator iterator = elemNames.iterator(); | |||||
| final Iterator iterator = adders.keySet().iterator(); | |||||
| while( iterator.hasNext() ) | while( iterator.hasNext() ) | ||||
| { | { | ||||
| final String propName = (String)iterator.next(); | final String propName = (String)iterator.next(); | ||||
| final Method createMethod = (Method)creators.get( propName ); | |||||
| final Method addMethod = (Method)adders.get( propName ); | final Method addMethod = (Method)adders.get( propName ); | ||||
| // Determine and check the return type | // Determine and check the return type | ||||
| Class type; | |||||
| if( createMethod != null && addMethod != null ) | |||||
| { | |||||
| // Make sure the add method is more general than the create | |||||
| // method | |||||
| type = createMethod.getReturnType(); | |||||
| final Class addType = addMethod.getParameterTypes()[ 0 ]; | |||||
| if( !addType.isAssignableFrom( type ) ) | |||||
| { | |||||
| final String message = | |||||
| REZ.getString( "incompatible-element-types.error", | |||||
| m_class.getName(), | |||||
| propName ); | |||||
| throw new ConfigurationException( message ); | |||||
| } | |||||
| } | |||||
| else if( createMethod != null ) | |||||
| { | |||||
| type = createMethod.getReturnType(); | |||||
| } | |||||
| else | |||||
| { | |||||
| type = addMethod.getParameterTypes()[ 0 ]; | |||||
| } | |||||
| final Class type = addMethod.getParameterTypes()[ 0 ]; | |||||
| final boolean isTypedProp = ( propName.length() == 0 ); | final boolean isTypedProp = ( propName.length() == 0 ); | ||||
| if( isTypedProp && !type.isInterface() ) | if( isTypedProp && !type.isInterface() ) | ||||
| { | { | ||||
| @@ -144,7 +112,6 @@ class DefaultObjectConfigurer | |||||
| final DefaultPropertyConfigurer configurer = | final DefaultPropertyConfigurer configurer = | ||||
| new DefaultPropertyConfigurer( m_allProps.size(), | new DefaultPropertyConfigurer( m_allProps.size(), | ||||
| type, | type, | ||||
| createMethod, | |||||
| addMethod, | addMethod, | ||||
| maxCount ); | maxCount ); | ||||
| m_allProps.add( configurer ); | m_allProps.add( configurer ); | ||||
| @@ -224,45 +191,6 @@ class DefaultObjectConfigurer | |||||
| return adders; | return adders; | ||||
| } | } | ||||
| /** | |||||
| * Find all 'create' methods, which return a non-primitive type, | |||||
| * and take no parameters. | |||||
| */ | |||||
| private Map findCreators() | |||||
| throws ConfigurationException | |||||
| { | |||||
| final Map creators = new HashMap(); | |||||
| final List methodSet = new ArrayList(); | |||||
| findMethodsWithPrefix( "create", methodSet ); | |||||
| final Iterator iterator = methodSet.iterator(); | |||||
| while( iterator.hasNext() ) | |||||
| { | |||||
| final Method method = (Method)iterator.next(); | |||||
| final String methodName = method.getName(); | |||||
| if( method.getReturnType().isPrimitive() || | |||||
| method.getParameterTypes().length != 0 ) | |||||
| { | |||||
| continue; | |||||
| } | |||||
| // Extract element name | |||||
| final String elemName = extractName( 6, methodName ); | |||||
| // Add to the creators map | |||||
| if( creators.containsKey( elemName ) ) | |||||
| { | |||||
| final String message = | |||||
| REZ.getString( "multiple-creator-methods-for-element.error", | |||||
| m_class.getName(), | |||||
| methodName ); | |||||
| throw new ConfigurationException( message ); | |||||
| } | |||||
| creators.put( elemName, method ); | |||||
| } | |||||
| return creators; | |||||
| } | |||||
| /** | /** | ||||
| * Enables content. | * Enables content. | ||||
| */ | */ | ||||
| @@ -300,7 +228,6 @@ class DefaultObjectConfigurer | |||||
| m_contentConfigurer = | m_contentConfigurer = | ||||
| new DefaultPropertyConfigurer( m_allProps.size(), | new DefaultPropertyConfigurer( m_allProps.size(), | ||||
| type, | type, | ||||
| null, | |||||
| method, | method, | ||||
| 1 ); | 1 ); | ||||
| m_allProps.add( m_contentConfigurer ); | m_allProps.add( m_contentConfigurer ); | ||||
| @@ -28,13 +28,11 @@ class DefaultPropertyConfigurer | |||||
| private final int m_propIndex; | private final int m_propIndex; | ||||
| private final Class m_type; | private final Class m_type; | ||||
| private final Method m_createMethod; | |||||
| private final Method m_addMethod; | private final Method m_addMethod; | ||||
| private final int m_maxCount; | private final int m_maxCount; | ||||
| public DefaultPropertyConfigurer( final int propIndex, | public DefaultPropertyConfigurer( final int propIndex, | ||||
| final Class type, | final Class type, | ||||
| final Method createMethod, | |||||
| final Method addMethod, | final Method addMethod, | ||||
| final int maxCount ) | final int maxCount ) | ||||
| { | { | ||||
| @@ -47,7 +45,6 @@ class DefaultPropertyConfigurer | |||||
| { | { | ||||
| m_type = type; | m_type = type; | ||||
| } | } | ||||
| m_createMethod = createMethod; | |||||
| m_addMethod = addMethod; | m_addMethod = addMethod; | ||||
| m_maxCount = maxCount; | m_maxCount = maxCount; | ||||
| } | } | ||||
| @@ -60,44 +57,6 @@ class DefaultPropertyConfigurer | |||||
| return m_type; | return m_type; | ||||
| } | } | ||||
| /** | |||||
| * Creates a default value for this property. | |||||
| */ | |||||
| public Object createValue( final ConfigurationState state ) | |||||
| throws ConfigurationException | |||||
| { | |||||
| if( null == m_createMethod ) | |||||
| { | |||||
| return null; | |||||
| } | |||||
| final DefaultConfigurationState defState = (DefaultConfigurationState)state; | |||||
| // Make sure there isn't a pending object for this property | |||||
| if( defState.getCreatedObject( m_propIndex ) != null ) | |||||
| { | |||||
| final String message = REZ.getString( "pending-property-value.error" ); | |||||
| throw new ConfigurationException( message ); | |||||
| } | |||||
| try | |||||
| { | |||||
| // Create the value | |||||
| final Object object = m_createMethod.invoke( defState.getObject(), null ); | |||||
| defState.setCreatedObject( m_propIndex, object ); | |||||
| return object; | |||||
| } | |||||
| catch( final InvocationTargetException ite ) | |||||
| { | |||||
| final Throwable cause = ite.getTargetException(); | |||||
| throw new ConfigurationException( cause.getMessage(), cause ); | |||||
| } | |||||
| catch( final Exception e ) | |||||
| { | |||||
| throw new ConfigurationException( e.getMessage(), e ); | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * Adds a value for this property, to an object. | * Adds a value for this property, to an object. | ||||
| */ | */ | ||||
| @@ -112,13 +71,6 @@ class DefaultPropertyConfigurer | |||||
| { | { | ||||
| } | } | ||||
| // Make sure the creator method was called, if necessary | |||||
| if( pending == null && m_createMethod != null ) | |||||
| { | |||||
| final String message = REZ.getString( "must-be-element.error" ); | |||||
| throw new ConfigurationException( message ); | |||||
| } | |||||
| defState.setCreatedObject( m_propIndex, null ); | defState.setCreatedObject( m_propIndex, null ); | ||||
| // Check the property count | // Check the property count | ||||
| @@ -23,19 +23,6 @@ interface PropertyConfigurer | |||||
| */ | */ | ||||
| Class getType(); | Class getType(); | ||||
| /** | |||||
| * Creates a default value for this property. This value must be configured, | |||||
| * and then attached to the object using {@link #addValue}. | |||||
| * | |||||
| * @param state The state object, representing the object being configured. | |||||
| * @return An object which is assignable to the type returned by | |||||
| * {@link #getType}. Returns null if this property does not | |||||
| * need a default value. | |||||
| * @throws ConfigurationException If the object cannot be created. | |||||
| */ | |||||
| Object createValue( ConfigurationState state ) | |||||
| throws ConfigurationException; | |||||
| /** | /** | ||||
| * Adds a value for this property, to an object. | * Adds a value for this property, to an object. | ||||
| * | * | ||||
| @@ -3,10 +3,8 @@ extra-config-for-ref.error=A reference element can only include an "id" attribut | |||||
| mismatch-ref-types.error=Could not convert reference "{0}" to the type expected for property "{1}". | 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}". | 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-adder-methods-for-element.error=Multiple add{1}() or set{1}() methods found in class {0}. | ||||
| multiple-creator-methods-for-element.error=Multiple {1}() methods found in class {0}. | |||||
| multiple-content-setter-methods.error=Multiple content setter 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. | pending-property-value.error=An object created using the creator method has not been set using the adder/setter method. | ||||
| must-be-element.error=This property must be configured using a nested element. | |||||
| too-many-values.error=Too many values for this property. | 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-complex-type.error=Can not get complex type for non-primitive type {0}. | ||||
| no-such-attribute.error=Element <{0}> does not support attribute "{1}". | no-such-attribute.error=Element <{0}> does not support attribute "{1}". | ||||