package org.codehaus.mojo.ruby.plexus.component.configurator.converters; import org.codehaus.mojo.ruby.RubyMojo; import org.codehaus.plexus.component.configurator.ComponentConfigurationException; import org.codehaus.plexus.component.configurator.ConfigurationListener; import org.codehaus.plexus.component.configurator.converters.ConfigurationConverter; import org.codehaus.plexus.component.configurator.converters.composite.ObjectWithFieldsConverter; import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator; import org.codehaus.plexus.configuration.PlexusConfiguration; public class RubyComponentValueSetter { private RubyMojo mojo; private String fieldName; private ConverterLookup lookup; private Class setterParamType; private ConfigurationConverter setterTypeConverter; private ConfigurationListener listener; public RubyComponentValueSetter( String fieldName, Class setterParamType, Object object, ConverterLookup lookup, ConfigurationListener listener ) throws ComponentConfigurationException { this.fieldName = fieldName; this.mojo = (RubyMojo) object; this.lookup = lookup; this.listener = listener; this.setterParamType = setterParamType; if ( object == null ) { throw new ComponentConfigurationException( "Component is null" ); } initSetter(); } private void initSetter() { try { if( Object.class.equals( setterParamType ) ) { setterTypeConverter = new ObjectWithFieldsConverter(); } else { setterTypeConverter = lookup.lookupConverterForType( setterParamType ); } } catch(ComponentConfigurationException e) { } } private void setValueUsingSetter( Object value ) throws ComponentConfigurationException { if ( setterParamType == null ) { throw new ComponentConfigurationException( "No setter found" ); } if ( listener != null ) { listener.notifyFieldChangeUsingSetter( fieldName, value, mojo ); } try { mojo.set( fieldName, value ); } catch ( IllegalArgumentException e ) { String exceptionInfo = mojo.getClass().getName() + "." + fieldName + "( " + setterParamType.getClass().getName() + " )"; throw new ComponentConfigurationException( "Invalid parameter supplied while setting '" + value + "' to " + exceptionInfo, e ); } } public void configure( PlexusConfiguration config, ClassLoader cl, ExpressionEvaluator evaluator ) throws ComponentConfigurationException { //System.out.println( fieldName + " converter: " + setterTypeConverter.getClass() ); Object value = setterTypeConverter.fromConfiguration( lookup, config, setterParamType, mojo.getClass(), cl, evaluator, listener ); //System.out.println( value ); if ( value != null ) { setValueUsingSetter( value ); } } }