| package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid.editor; |
| |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.Method; |
| import java.util.Hashtable; |
| |
| import org.eclipse.bpmn2.modeler.core.utils.JavaProjectClassLoader; |
| |
| public class DroolsProxy { |
| private JavaProjectClassLoader classLoader; |
| private Hashtable<String, Class> droolsClasses = new Hashtable<String, Class>(); |
| |
| public DroolsProxy() { |
| this.classLoader = null; |
| } |
| |
| public DroolsProxy(JavaProjectClassLoader classLoader) { |
| this.classLoader = classLoader; |
| } |
| |
| public Class loadClass(String className) { |
| String fqn = className; |
| if (!className.contains(".")) { |
| // just the class name - no package name |
| if ("Work".equals(className)) { |
| fqn = "org.drools.core.process.core.Work"; |
| } |
| else if ("WorkEditor".equals(className)) { |
| fqn = "org.drools.core.process.core.WorkEditor"; |
| } |
| else if ("WorkDefinition".equals(className)) { |
| fqn = "org.drools.core.process.core.WorkDefinition"; |
| } |
| else if ("WorkEditor".equals(className)) { |
| fqn = "org.drools.core.process.core.WorkEditor"; |
| } |
| else if ("ParameterDefinition".equals(className)) { |
| fqn = "org.drools.core.process.core.ParameterDefinition"; |
| } |
| else if ("ParameterDefinitionImpl".equals(className)) { |
| fqn = "org.drools.core.process.core.impl.ParameterDefinitionImpl"; |
| } |
| else if ("WorkDefinitionImpl".equals(className)) { |
| fqn = "org.drools.core.process.core.impl.WorkDefinitionImpl"; |
| } |
| else if ("WorkImpl".equals(className)) { |
| fqn = "org.drools.core.process.core.impl.WorkImpl"; |
| } |
| else if ("DataType".equals(className)) { |
| fqn = "org.drools.core.process.core.datatype.DataType"; |
| } |
| } |
| Class droolsClass = droolsClasses.get(fqn); |
| if (droolsClass==null) { |
| droolsClass = classLoader.loadClass(fqn); |
| if (droolsClass!=null) |
| droolsClasses.put(fqn, droolsClass); |
| } |
| return droolsClass; |
| } |
| |
| public Object newObject(String className, Object...args) { |
| Class droolsClass = loadClass(className); |
| return newObject(droolsClass, args); |
| } |
| |
| public Object newObject(Class droolsClass, Object...args) { |
| try { |
| Class types[] = new Class[args.length]; |
| for (int i=0; i<args.length; ++i) { |
| types[i] = args[i].getClass(); |
| } |
| Constructor ctor = droolsClass.getConstructor(types); |
| return ctor.newInstance(args); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| public Object newParameterDefinition(String name, Object value) { |
| try { |
| Class types[] = new Class[2]; |
| types[0] = String.class; |
| types[1] = loadClass("DataType"); |
| Class parameterDefinitionClass = loadClass("ParameterDefinitionImpl"); |
| Constructor ctor = parameterDefinitionClass.getConstructor(types); |
| return ctor.newInstance(name, value); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| public static Object invoke(Object droolsObject, String methodName, Object...args) { |
| try { |
| Class types[] = new Class[args.length]; |
| for (int i=0; i<args.length; ++i) { |
| types[i] = args[i].getClass(); |
| } |
| Class c = droolsObject.getClass(); |
| Method m = c.getMethod(methodName, types); |
| return m.invoke(droolsObject, args); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| public static Object invokeWithTypes(Object droolsObject, String methodName, Object...args) { |
| try { |
| Class types[] = new Class[args.length/2]; |
| Object values[] = new Object[args.length/2]; |
| for (int i=0; i<args.length/2; ++i) { |
| types[i] = (Class)args[i*2]; |
| } |
| for (int i=0; i<args.length/2; ++i) { |
| values[i] = args[i*2+1]; |
| } |
| Class c = droolsObject.getClass(); |
| Method m = c.getMethod(methodName, types); |
| return m.invoke(droolsObject, values); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| } |