diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/ClassicConfigurer.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/ClassicConfigurer.java index 1116f23b5..77c73524b 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/ClassicConfigurer.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/configurer/ClassicConfigurer.java @@ -51,6 +51,58 @@ public class ClassicConfigurer m_converter = (Converter)serviceManager.lookup( Converter.ROLE ); } + /** + * Configure an object based on a configuration in a particular context. + * This configuring can be done in different ways for different + * configurers. + * + * The implementation of this method should only use the methods + * specified by the supplied class. It is an error for the specified + * class not to be a base class or interface compatible with specified + * object. + * + * @param object the object + * @param clazz the Class object to use during configuration + * @param configuration the configuration + * @param context the Context + * @exception ConfigurationException if an error occurs + */ + public void configureElement( Object object, + Class clazz, + Configuration configuration, + TaskContext context ) + throws ConfigurationException + { + throw new UnsupportedOperationException(); + } + + /** + * Configure named attribute of object in a particular context. + * This configuring can be done in different ways for different + * configurers. + * + * The implementation of this method should only use the methods + * specified by the supplied class. It is an error for the specified + * class not to be a base class or interface compatible with specified + * object. + * + * @param object the object + * @param clazz the Class object to use during configuration + * @param name the attribute name + * @param value the attribute value + * @param context the Context + * @exception ConfigurationException if an error occurs + */ + public void configureAttribute( Object object, + Class clazz, + String name, + String value, + TaskContext context ) + throws ConfigurationException + { + throw new UnsupportedOperationException(); + } + /** * Configure a task based on a configuration in a particular context. * This configuring can be done in different ways for different @@ -65,8 +117,8 @@ public class ClassicConfigurer * @exception ConfigurationException if an error occurs */ public void configureElement( final Object object, - final Configuration configuration, - final TaskContext context ) + final Configuration configuration, + final TaskContext context ) throws ConfigurationException { if( DEBUG ) @@ -106,7 +158,7 @@ public class ClassicConfigurer getLogger().debug( message ); } - configureAttribute( object, name, value, context ); + doConfigureAttribute( object, name, value, context ); } final Configuration[] children = configuration.getChildren(); @@ -122,7 +174,7 @@ public class ClassicConfigurer getLogger().debug( message ); } - configureElement( object, child, context ); + doConfigureElement( object, child, context ); } final String content = configuration.getValue( null ); @@ -155,12 +207,12 @@ public class ClassicConfigurer * @exception ConfigurationException if an error occurs */ public void configureAttribute( final Object object, - final String name, - final String value, - final TaskContext context ) + final String name, + final String value, + final TaskContext context ) throws ConfigurationException { - configureAttribute( object, name, value, context ); + doConfigureAttribute( object, name, value, context ); } /** @@ -179,10 +231,10 @@ public class ClassicConfigurer setValue( object, "addContent", content, context ); } - private void configureAttribute( final Object object, - final String name, - final String value, - final TaskContext context ) + private void doConfigureAttribute( final Object object, + final String name, + final String value, + final TaskContext context ) throws ConfigurationException { final String methodName = getMethodNameFor( name ); @@ -431,9 +483,9 @@ public class ClassicConfigurer return sb.toString(); } - private void configureElement( final Object object, - final Configuration configuration, - final TaskContext context ) + private void doConfigureElement( final Object object, + final Configuration configuration, + final TaskContext context ) throws ConfigurationException { final String name = configuration.getName(); @@ -474,7 +526,7 @@ public class ClassicConfigurer try { final Object created = method.invoke( object, new Object[ 0 ] ); - configureElement( created, configuration, context ); + doConfigureElement( created, configuration, context ); } catch( final ConfigurationException ce ) { @@ -498,7 +550,7 @@ public class ClassicConfigurer final Class clazz = method.getParameterTypes()[ 0 ]; final Object created = clazz.newInstance(); - configureElement( created, configuration, context ); + doConfigureElement( created, configuration, context ); method.invoke( object, new Object[]{created} ); } catch( final ConfigurationException ce ) 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 205ccffe9..6965511dc 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 @@ -78,14 +78,23 @@ public class DefaultConfigurer * @exception ConfigurationException if an error occurs */ public void configureElement( final Object object, - final Configuration configuration, - final TaskContext context ) + final Configuration configuration, + final TaskContext context ) + throws ConfigurationException + { + configureElement( object, object.getClass(), configuration, context ); + } + + public void configureElement( final Object object, + final Class clazz, + final Configuration configuration, + final TaskContext context ) throws ConfigurationException { try { // Configure the object - configureObject( object, configuration, context ); + configureObject( object, clazz, configuration, context ); } catch( final ReportableConfigurationException e ) { @@ -109,6 +118,7 @@ public class DefaultConfigurer * @throws Exception On error */ private void configureObject( final Object object, + final Class clazz, final Configuration configuration, final TaskContext context ) throws Exception @@ -122,7 +132,7 @@ public class DefaultConfigurer { // Start configuration of the object final String elemName = configuration.getName(); - final ObjectConfigurer configurer = getConfigurer( object.getClass() ); + final ObjectConfigurer configurer = getConfigurer( clazz ); final ConfigurationState state = configurer.startConfiguration( object ); // Set each of the attributes @@ -140,7 +150,7 @@ public class DefaultConfigurer { final String message = REZ.getString( "no-such-attribute.error", elemName, name ); - throw new ReportableConfigurationException( message ); + throw new ReportableConfigurationException( message ); } catch( final Exception ce ) { @@ -218,13 +228,34 @@ public class DefaultConfigurer * @exception ConfigurationException if an error occurs */ public void configureAttribute( final Object object, - final String name, - final String value, - final TaskContext context ) + final String name, + final String value, + final TaskContext context ) + throws ConfigurationException + { + configureAttribute( object, object.getClass(), name, value, context ); + } + + /** + * Configure named attribute of object in a particular context. + * This configuring can be done in different ways for different + * configurers. + * + * @param object the object + * @param name the attribute name + * @param value the attribute value + * @param context the Context + * @exception ConfigurationException if an error occurs + */ + public void configureAttribute( final Object object, + final Class clazz, + final String name, + final String value, + final TaskContext context ) throws ConfigurationException { // Locate the configurer for this object - final ObjectConfigurer configurer = getConfigurer( object.getClass() ); + final ObjectConfigurer configurer = getConfigurer( clazz ); // TODO - this ain't right, the validation is going to be screwed up final ConfigurationState state = configurer.startConfiguration( object ); @@ -471,7 +502,8 @@ public class DefaultConfigurer } // Configure the object - configureObject( child, element, context ); + final Object object = child; + configureObject( object, object.getClass(), element, context ); // Convert the object, if necessary if( !type.isInstance( child ) ) diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/configurer/Configurer.java b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/configurer/Configurer.java index 56970eccc..f7501b8d9 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/configurer/Configurer.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/configurer/Configurer.java @@ -48,4 +48,50 @@ public interface Configurer */ void configureAttribute( Object object, String name, String value, TaskContext context ) throws ConfigurationException; + + /** + * Configure an object based on a configuration in a particular context. + * This configuring can be done in different ways for different + * configurers. + * + * The implementation of this method should only use the methods + * specified by the supplied class. It is an error for the specified + * class not to be a base class or interface compatible with specified + * object. + * + * @param object the object + * @param clazz the Class object to use during configuration + * @param configuration the configuration + * @param context the Context + * @exception ConfigurationException if an error occurs + */ + void configureElement( Object object, + Class clazz, + Configuration configuration, + TaskContext context ) + throws ConfigurationException; + + /** + * Configure named attribute of object in a particular context. + * This configuring can be done in different ways for different + * configurers. + * + * The implementation of this method should only use the methods + * specified by the supplied class. It is an error for the specified + * class not to be a base class or interface compatible with specified + * object. + * + * @param object the object + * @param clazz the Class object to use during configuration + * @param name the attribute name + * @param value the attribute value + * @param context the Context + * @exception ConfigurationException if an error occurs + */ + void configureAttribute( Object object, + Class clazz, + String name, + String value, + TaskContext context ) + throws ConfigurationException; }