/** * Copyright 2010 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. * You may obtain a copy of the License at * * 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.transform; import java.lang.reflect.Method; import java.util.HashMap; 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 TransformWorkItemHandler extends AbstractLogOrThrowWorkItemHandler { private static final Logger logger = LoggerFactory.getLogger(TransformWorkItemHandler.class); private static String INPUT_KEY = "InputObject"; private static String OUTPUT_TYPE_KEY = "OutputType"; private static String VARIABLE_OUTPUT_NAME = "OutputObject"; // Keyed on the return type of the transformer with a second key of the parameter type private Map<Class<?>, Map<Class<?>, Method>> transforms = new HashMap<Class<?>, Map<Class<?>, Method>>(); public void executeWorkItem(WorkItem inputItem, WorkItemManager itemMgr) { try { Object in = inputItem.getParameter(INPUT_KEY); String outputType = (String) inputItem.getParameter(OUTPUT_TYPE_KEY); Object output = Class.forName(outputType).newInstance(); Method txMethod = this.findTransform(output.getClass(), in.getClass()); if (txMethod != null) { Object out = txMethod.invoke(null, in); Map<String, Object> result = new HashMap<String, Object>(); result.put(VARIABLE_OUTPUT_NAME, out); itemMgr.completeWorkItem(inputItem.getId(), result); } else { logger.error("Failed to find a transform "); } } catch (Exception e) { handleException(e); } } public void registerTransformer(Class<?> transformer) { Method[] methods = transformer.getMethods(); if (methods == null) { return; } for (Method meth : methods) { // Only consider methods that have the @Transformer annotation if (meth.getAnnotation(Transformer.class) == null) { continue; } Class<?> returnType = meth.getReturnType(); Class<?> paramType = meth.getParameterTypes()[0]; Map<Class<?>, Method> index = transforms.get(returnType); if (index == null) { index = new HashMap<Class<?>, Method>(); transforms.put(returnType, index); } index.put(paramType, meth); } } private Method findTransform(Class<?> returnClass, Class<?> paramClass) { Map<Class<?>, Method> indexedTxForm = transforms.get(returnClass); if (indexedTxForm == null) { return null; } return indexedTxForm.get(paramClass); } public void abortWorkItem(WorkItem arg0, WorkItemManager arg1) { // Do nothing } }