/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.process.workitem.java; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jbpm.process.workitem.AbstractLogOrThrowWorkItemHandler; import org.kie.api.runtime.process.WorkItem; import org.kie.api.runtime.process.WorkItemManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JavaInvocationWorkItemHandler extends AbstractLogOrThrowWorkItemHandler { private static final Logger logger = LoggerFactory.getLogger(JavaInvocationWorkItemHandler.class); @SuppressWarnings("unchecked") public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { String className = (String) workItem.getParameter("Class"); String methodName = (String) workItem.getParameter("Method"); Object object = workItem.getParameter("Object"); List<String> paramTypes = (List<String>) workItem.getParameter("ParameterTypes"); List<Object> params = (List<Object>) workItem.getParameter("Parameters"); Object result = null; try { Class<?> c = Class.forName(className); Class<?>[] classes = null; Method method = null; if (params == null) { params = new ArrayList<Object>(); } if (paramTypes == null) { classes = new Class<?>[0]; try { method = c.getMethod(methodName, classes); } catch (NoSuchMethodException e) { for (Method m: c.getMethods()) { if (m.getName().equals(methodName) && (m.getParameterTypes().length == params.size())) { method = m; break; } } if (method == null) { throw new NoSuchMethodException(className + "." + methodName + "(..)"); } } } else { List<Class<?>> classesList = new ArrayList<Class<?>>(); for (String paramType: paramTypes) { classesList.add(Class.forName(paramType)); } classes = classesList.toArray(new Class<?>[classesList.size()]); method = c.getMethod(methodName, classes); } if (!Modifier.isStatic(method.getModifiers())) { if (object == null) { object = c.newInstance(); } } result = method.invoke(object, params.toArray()); Map<String, Object> results = new HashMap<String, Object>(); results.put("Result", result); manager.completeWorkItem(workItem.getId(), results); return; } catch (ClassNotFoundException e) { handleException(e); } catch (InstantiationException e) { handleException(e); } catch (IllegalAccessException e) { handleException(e); } catch (NoSuchMethodException e) { handleException(e); } catch (InvocationTargetException e) { handleException(e); } } public void abortWorkItem(WorkItem arg0, WorkItemManager arg1) { // Do nothing } }