jBPM + Reflection
Aquí os dejo un ejemplo de jBPM aplicando la técnica de Reflection que puede ser más que interesante en algunos casos.
Para la gente que no sepa que es reflection, os pongo una dirección donde nos hacen una introduccion bastante buena con ejemplos.
http://www.javahispano.org/contenidos/es/introduccrion_al_api_reflection_reflexrion_de_ja/
La base es la misma que en los ejemplos anteriores :

Para este ejemplo hago un nodo decision con el que elegiré una operacion (suma o resta) a hacer.

Las operaciones estan implementadas en una clase “Operation” a la que llamaremos a partir de un método implementado en el handle llamado “Call Operation”. Én este método está implementada la técnica de reflection.
El código de la clase handle es el siguiente :
package basico.action;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
import java.lang.reflect.*;
import javax.naming.Context;public class MessageActionHandler implements ActionHandler {
private static final long serialVersionUID = 1L;
String message;
int var1,var2,out;public void execute(ExecutionContext context) throws Exception {
context.getContextInstance().setVariable(“message”, message);
context.getContextInstance().setVariable(“var1″,var1);
context.getContextInstance().setVariable(“var2″,var2);
System.out.println(“WFE:” + message);
Object obj = CallOperation(message,var1,var2,context);
context.getContextInstance().setVariable(“out”, obj);
}public Object CallOperation(String method, int var1, int var2, ExecutionContext context)
{
Class myClass;
Class[] parametrosClase;
Object[] parametros;Method miMetodo;
Object miObjetoOperacion;
Object obj = null;try {
myClass = Class.forName(“basico.classes.Operation”);
parametrosClase = new Class[2];
parametrosClase[0] = Integer.TYPE;
parametrosClase[1] = Integer.TYPE;try {
miObjetoOperacion = myClass.newInstance();
try {
miMetodo = myClass.getMethod(method,parametrosClase);parametros = new Object[2];
parametros[0] = var1;
parametros[1] = var2;obj = miMetodo.invoke(miObjetoOperacion, parametros);
System.out.println(“Reflecting – ” + method + “(” + var1 + “,” + var2 + “) -> ” + obj.toString());} catch (NoSuchMethodException e) {
System.out.println(“Error, method not found ” + e);
}
} catch (InstantiationException e) {
System.out.println(“Error, object instance” + e);
}
} catch (Exception e) {
System.out.println(“Class not found”);
}
return obj;
}
}
Para tomar la decision utilizo una “expression” que me evaluará la variable “operacion” creada en Start.java.
ContextInstance ci = instance.getContextInstance();
ci.createVariable(“operacion”, “Resta”);
El codigo os lo podeis bajar, como siempre en la pestaña de Descargas