package pl.net.bluesoft.rnd.awf.mule.step; import org.mule.api.ExceptionPayload; import org.mule.api.MuleMessage; import org.mule.api.client.LocalMuleClient; import pl.net.bluesoft.rnd.awf.mule.MulePluginManager; import pl.net.bluesoft.rnd.processtool.model.BpmStep; import pl.net.bluesoft.rnd.processtool.model.BpmTask; import pl.net.bluesoft.rnd.processtool.model.ProcessInstance; import pl.net.bluesoft.rnd.processtool.model.ProcessInstanceAttribute; import pl.net.bluesoft.rnd.processtool.steps.ProcessToolProcessStep; import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AliasName; import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AutoWiredProperty; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import static pl.net.bluesoft.util.lang.FormatUtil.nvl; /** * Created by IntelliJ IDEA. * * @author tlipski@bluesoft.net.pl */ @AliasName(name = "MuleStep") public class MuleStep implements ProcessToolProcessStep { private static final Logger logger = Logger.getLogger(MuleStep.class.getName()); @AutoWiredProperty private String destinationEndpointUrl; private Object payload; @AutoWiredProperty private Boolean asynchronous = false; @AutoWiredProperty private Long timeout = Long.valueOf(-1); private MulePluginManager mulePluginManager; public MuleStep(MulePluginManager mulePluginManager) { this.mulePluginManager = mulePluginManager; } @Override public String invoke(BpmStep step, Map params) throws Exception { try { ProcessInstance processInstance = step.getProcessInstance(); payload = params.get("payload"); LocalMuleClient client = mulePluginManager.getMuleContext().getClient(); // XStream xs = new XStream(); // xs.registerConverter(new MyPersistentSetConverter(xs.getMapper()), XStream.PRIORITY_VERY_HIGH); // xs.omitField(ProcessInstance.class, "definition"); // xs.omitField(ProcessInstance.class, "processLogs"); // String input = xs.toXML(processInstance); if (asynchronous) { client.dispatch(destinationEndpointUrl, processInstance, null); } else { MuleMessage muleMessage = client.send(destinationEndpointUrl, payload != null ? payload : processInstance, null, timeout); if (muleMessage != null) { ExceptionPayload exceptionPayload = muleMessage.getExceptionPayload(); if (exceptionPayload != null) { logger.log(Level.SEVERE, "Mule step has failed: " + exceptionPayload.getMessage(), exceptionPayload.getException()); return "FAIL"; } Object payload = muleMessage.getPayload(); if (payload instanceof String) { return (String)payload; } else if (payload instanceof ProcessInstanceAttribute) { ProcessInstanceAttribute pia = (ProcessInstanceAttribute) payload; ProcessInstanceAttribute attributeByKey = processInstance.findAttributeByKey(pia.getKey()); if (attributeByKey != null) { processInstance.removeAttribute(attributeByKey); } processInstance.addAttribute(pia); return pia.toString(); } else if (payload instanceof ProcessInstanceAttribute[]) { ProcessInstanceAttribute[] pias = (ProcessInstanceAttribute[]) payload; for (ProcessInstanceAttribute pia : pias) { ProcessInstanceAttribute attributeByKey = processInstance.findAttributeByKey(pia.getKey()); if (attributeByKey != null) { processInstance.removeAttribute(attributeByKey); } processInstance.addAttribute(pia); } } else if (payload instanceof Iterable) { Iterable pias = (Iterable) payload; for (Object o : pias) { if (o instanceof ProcessInstanceAttribute) { ProcessInstanceAttribute pia = (ProcessInstanceAttribute) o; ProcessInstanceAttribute attributeByKey = processInstance.findAttributeByKey(pia.getKey()); if (attributeByKey != null) { processInstance.removeAttribute(attributeByKey); } processInstance.addAttribute(pia); } } } } } return "OK"; } catch (Exception e) { logger.log(Level.SEVERE, "Error invoking MuleStep: " + e.getMessage(), e); return "FAIL"; } } public String getDestinationEndpointUrl() { return destinationEndpointUrl; } public void setDestinationEndpointUrl(String destinationEndpointUrl) { this.destinationEndpointUrl = destinationEndpointUrl; } public boolean isAsynchronous() { return nvl(asynchronous, false); } public void setAsynchronous(boolean asynchronous) { this.asynchronous = asynchronous; } public Object getPayload() { return payload; } public void setPayload(Object payload) { this.payload = payload; } public long getTimeout() { return timeout; } public void setTimeout(long timeout) { this.timeout = timeout; } }