package org.jbpm.pvm.internal.wire.operation; import java.lang.reflect.Method; import org.jbpm.pvm.internal.util.ReflectUtil; import org.jbpm.pvm.internal.wire.Descriptor; import org.jbpm.pvm.internal.wire.WireContext; import org.jbpm.pvm.internal.wire.WireException; /** * injects another object with a setter method. * * @author Tom Baeyens * @author Guillaume Porcher (documentation) * */ public class PropertyOperation extends AbstractOperation { private static final long serialVersionUID = 1L; String setterName = null; /* the method will be searched by reflection on the runtime value */ Descriptor descriptor = null; public void apply(Object target, WireContext wireContext) { // create the value to assign to the property Object value = wireContext.create(descriptor, true); Method method = null; Class clazz = target.getClass(); Object[] args = new Object[]{value}; method = ReflectUtil.findMethod(clazz, setterName, null, args); if (method==null) { throw new WireException("couldn't find property setter "+setterName+" for value "+value); } ReflectUtil.invoke(method, target, args); } /** * Sets the name of the property that should be updated by this operation. * If propertyName is foo, the method used to set the value will be setFoo. * @param propertyName */ public void setPropertyName(String propertyName) { this.setterName = "set"+propertyName.substring(0,1).toUpperCase()+propertyName.substring(1); } /** * Gets the name of the setter method used to inject the property value. * @return name of the setter method used to inject the property value. */ public String getSetterName() { return setterName; } /** * Sets the name of the setter method to use to inject the property value. * @param setterName */ public void setSetterName(String setterName) { this.setterName = setterName; } /** * Gets the descriptor used to create the field's value. */ public Descriptor getDescriptor() { return descriptor; } /** * Sets the descriptor used to create the field's value * @param valueDescriptor */ public void setDescriptor(Descriptor valueDescriptor) { this.descriptor = valueDescriptor; } }