/*
* 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.audit.event;
import java.util.Date;
import org.jbpm.process.audit.NodeInstanceLog;
import org.jbpm.process.audit.ProcessInstanceLog;
import org.jbpm.process.audit.VariableInstanceLog;
import org.jbpm.process.instance.impl.ProcessInstanceImpl;
import org.jbpm.workflow.core.WorkflowProcess;
import org.jbpm.workflow.instance.impl.NodeInstanceImpl;
import org.jbpm.workflow.instance.node.SubProcessNodeInstance;
import org.jbpm.workflow.instance.node.WorkItemNodeInstance;
import org.kie.api.definition.process.Node;
import org.kie.api.definition.process.NodeContainer;
import org.kie.api.event.process.ProcessCompletedEvent;
import org.kie.api.event.process.ProcessNodeLeftEvent;
import org.kie.api.event.process.ProcessNodeTriggeredEvent;
import org.kie.api.event.process.ProcessStartedEvent;
import org.kie.api.event.process.ProcessVariableChangedEvent;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.internal.process.CorrelationKey;
public class DefaultAuditEventBuilderImpl implements AuditEventBuilder {
@Override
public AuditEvent buildEvent(ProcessStartedEvent pse) {
ProcessInstanceImpl pi = (ProcessInstanceImpl) pse.getProcessInstance();
ProcessInstanceLog log = new ProcessInstanceLog(pi.getId(), pi.getProcessId());
log.setExternalId(""+((KieSession) pse.getKieRuntime()).getIdentifier());
log.setProcessName(pi.getProcess().getName());
log.setProcessVersion(pi.getProcess().getVersion());
log.setStatus(ProcessInstance.STATE_ACTIVE);
log.setProcessInstanceDescription( pi.getDescription() );
log.setProcessType(((WorkflowProcess)pi.getProcess()).getProcessType());
// store correlation key in its external form
CorrelationKey correlationKey = (CorrelationKey) pi.getMetaData().get("CorrelationKey");
if (correlationKey != null) {
log.setCorrelationKey(correlationKey.toExternalForm());
}
try {
long parentProcessInstanceId = (Long) pi.getMetaData().get("ParentProcessInstanceId");
log.setParentProcessInstanceId(parentProcessInstanceId);
} catch (Exception e) {
//in case of problems with getting hold of parentProcessInstanceId don't break the operation
log.setParentProcessInstanceId(-1L);
}
return log;
}
@Override
public AuditEvent buildEvent(ProcessCompletedEvent pce, Object log) {
ProcessInstanceImpl pi = (ProcessInstanceImpl) pce.getProcessInstance();
ProcessInstanceLog logEvent = null;
if (log != null) {
logEvent = (ProcessInstanceLog) log;
} else {
logEvent = new ProcessInstanceLog(pi.getId(), pi.getProcessId());
}
logEvent.setOutcome(pi.getOutcome());
logEvent.setStatus(pi.getState());
logEvent.setEnd(new Date());
logEvent.setDuration(logEvent.getEnd().getTime() - logEvent.getStart().getTime());
logEvent.setProcessInstanceDescription( pi.getDescription() );
return logEvent;
}
@Override
public AuditEvent buildEvent(ProcessNodeTriggeredEvent pnte) {
ProcessInstanceImpl pi = (ProcessInstanceImpl) pnte.getProcessInstance();
NodeInstanceImpl nodeInstance = (NodeInstanceImpl) pnte.getNodeInstance();
Node node = nodeInstance.getNode();
String nodeId = null;
String nodeType = null;
String nodeContainerId = null;
if (node != null) {
nodeId = (String)node.getMetaData().get("UniqueId");
nodeType = node.getClass().getSimpleName();
nodeContainerId = getNodeContainerId(node.getNodeContainer());
} else {
nodeId = Long.toString(nodeInstance.getNodeId());
nodeType = (String)nodeInstance.getMetaData("NodeType");
}
NodeInstanceLog log = new NodeInstanceLog(
NodeInstanceLog.TYPE_ENTER, pi.getId(), pi.getProcessId(), Long.toString(nodeInstance.getId()),
nodeId, nodeInstance.getNodeName());
if (nodeInstance instanceof WorkItemNodeInstance && ((WorkItemNodeInstance) nodeInstance).getWorkItem() != null) {
log.setWorkItemId(((WorkItemNodeInstance) nodeInstance).getWorkItem().getId());
}
if (nodeInstance instanceof SubProcessNodeInstance) {
log.setReferenceId(((SubProcessNodeInstance) nodeInstance).getProcessInstanceId());
}
String connection = (String)nodeInstance.getMetaData().get("IncomingConnection");
log.setConnection(connection);
log.setExternalId(""+((KieSession) pnte.getKieRuntime()).getIdentifier());
log.setNodeType(nodeType);
log.setNodeContainerId(nodeContainerId);
return log;
}
@Override
public AuditEvent buildEvent(ProcessNodeTriggeredEvent pnte, Object log) {
NodeInstanceImpl nodeInstance = (NodeInstanceImpl) pnte.getNodeInstance();
NodeInstanceLog logEvent =null;
if (log != null) {
logEvent = (NodeInstanceLog) log;
if (nodeInstance instanceof WorkItemNodeInstance && ((WorkItemNodeInstance) nodeInstance).getWorkItem() != null) {
logEvent.setWorkItemId(((WorkItemNodeInstance) nodeInstance).getWorkItem().getId());
}
if (nodeInstance instanceof SubProcessNodeInstance) {
logEvent.setReferenceId(((SubProcessNodeInstance) nodeInstance).getProcessInstanceId());
}
return logEvent;
}
return null;
}
@Override
public AuditEvent buildEvent(ProcessNodeLeftEvent pnle, Object log) {
ProcessInstanceImpl pi = (ProcessInstanceImpl) pnle.getProcessInstance();
NodeInstanceImpl nodeInstance = (NodeInstanceImpl) pnle.getNodeInstance();
Node node = nodeInstance.getNode();
String nodeId = null;
String nodeType = null;
String nodeContainerId = null;
if (node != null) {
nodeId = (String)node.getMetaData().get("UniqueId");
nodeType = node.getClass().getSimpleName();
nodeContainerId = getNodeContainerId(node.getNodeContainer());
} else {
nodeId = Long.toString(nodeInstance.getNodeId());
nodeType = (String)nodeInstance.getMetaData("NodeType");
}
NodeInstanceLog logEvent =null;
if (log != null) {
logEvent = (NodeInstanceLog) log;
} else {
logEvent = new NodeInstanceLog(
NodeInstanceLog.TYPE_EXIT, pi.getId(), pi.getProcessId(), Long.toString(nodeInstance.getId()),
nodeId, nodeInstance.getNodeName());
}
if (nodeInstance instanceof WorkItemNodeInstance && ((WorkItemNodeInstance) nodeInstance).getWorkItem() != null) {
logEvent.setWorkItemId(((WorkItemNodeInstance) nodeInstance).getWorkItem().getId());
}
if (nodeInstance instanceof SubProcessNodeInstance) {
logEvent.setReferenceId(((SubProcessNodeInstance) nodeInstance).getProcessInstanceId());
}
String connection = (String)nodeInstance.getMetaData().get("OutgoingConnection");
logEvent.setConnection(connection);
logEvent.setExternalId(""+((KieSession) pnle.getKieRuntime()).getIdentifier());
logEvent.setNodeType(nodeType);
logEvent.setNodeContainerId(nodeContainerId);
return logEvent;
}
@Override
public AuditEvent buildEvent(ProcessVariableChangedEvent pvce) {
long processInstanceId = pvce.getProcessInstance().getId();
String processId = pvce.getProcessInstance().getProcessId();
String variableId = pvce.getVariableId();
String variableInstanceId = pvce.getVariableInstanceId();
String oldValue = (pvce.getOldValue() != null)?pvce.getOldValue().toString():"";
String newValue = (pvce.getNewValue() != null)?pvce.getNewValue().toString():"";
VariableInstanceLog log = new VariableInstanceLog(
processInstanceId, processId, variableInstanceId, variableId, newValue, oldValue);
log.setExternalId(""+((KieSession) pvce.getKieRuntime()).getIdentifier());
return log;
}
protected String getNodeContainerId(NodeContainer nodeContainer) {
if (nodeContainer instanceof Node) {
return (String) ((Node) nodeContainer).getMetaData().get("UniqueId");
}
return null;
}
}