/* * 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. */ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.jbpm.services.task.audit; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.EntityManagerFactory; import org.jbpm.services.task.audit.impl.model.AuditTaskImpl; import org.jbpm.services.task.audit.impl.model.TaskEventImpl; import org.jbpm.services.task.audit.variable.TaskIndexerManager; import org.jbpm.services.task.lifecycle.listeners.TaskLifeCycleEventListener; import org.jbpm.services.task.persistence.PersistableEventListener; import org.jbpm.services.task.utils.ClassUtil; import org.kie.api.task.TaskEvent; import org.kie.api.task.model.Task; import org.kie.internal.task.api.TaskContext; import org.kie.internal.task.api.TaskPersistenceContext; import org.kie.internal.task.api.TaskVariable; import org.kie.internal.task.api.TaskVariable.VariableType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * */ public class JPATaskLifeCycleEventListener extends PersistableEventListener implements TaskLifeCycleEventListener { private static final Logger logger = LoggerFactory.getLogger(JPATaskLifeCycleEventListener.class); private static final List<String> SKIPPED_TASK_VARIABLES = Arrays.asList(new String[]{"ActorId", "TaskName", "NodeName"}); public JPATaskLifeCycleEventListener(boolean flag) { super(null); } public JPATaskLifeCycleEventListener(EntityManagerFactory emf) { super(emf); } @Override public void afterTaskStartedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.STARTED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId )); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskActivatedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.ACTIVATED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); auditTaskImpl.setDescription(ti.getDescription()); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskClaimedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.CLAIMED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); auditTaskImpl.setDescription(ti.getDescription()); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskSkippedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.SKIPPED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); auditTaskImpl.setDescription(ti.getDescription()); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskStoppedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.STOPPED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskCompletedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.COMPLETED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskFailedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.FAILED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskAddedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if(ti.getTaskData().getProcessId() != null){ userId = ti.getTaskData().getProcessId(); }else if(ti.getTaskData().getActualOwner() != null){ userId = ti.getTaskData().getActualOwner().getId(); } AuditTaskImpl auditTaskImpl = new AuditTaskImpl( ti.getId(), ti.getName(), ti.getTaskData().getStatus().name(), ti.getTaskData().getActivationTime(), (ti.getTaskData().getActualOwner() != null) ? ti.getTaskData().getActualOwner().getId() : "", ti.getDescription(), ti.getPriority(), (ti.getTaskData().getCreatedBy() != null) ? ti.getTaskData().getCreatedBy().getId() : "", ti.getTaskData().getCreatedOn(), ti.getTaskData().getExpirationTime(), ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getProcessId(), ti.getTaskData().getProcessSessionId(), ti.getTaskData().getDeploymentId(), ti.getTaskData().getParentId(), ti.getTaskData().getWorkItemId() ); persistenceContext.persist(auditTaskImpl); persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.ADDED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); } finally { cleanup(persistenceContext); } } @Override public void afterTaskExitedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.EXITED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskReleasedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskResumedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.RESUMED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskSuspendedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.SUSPENDED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskForwardedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.FORWARDED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskDelegatedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.DELEGATED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void afterTaskNominatedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.NOMINATED, userId, new Date())); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } /* * helper methods - start */ protected AuditTaskImpl getAuditTask(TaskEvent event, TaskPersistenceContext persistenceContext, Task ti) { AuditTaskImpl auditTaskImpl = persistenceContext.queryWithParametersInTransaction("getAuditTaskById", true, persistenceContext.addParametersToMap("taskId", ti.getId()), ClassUtil.<AuditTaskImpl>castClass(AuditTaskImpl.class)); return auditTaskImpl; } /* * helper methods - end */ @Override public void beforeTaskActivatedEvent(TaskEvent event) { } @Override public void beforeTaskClaimedEvent(TaskEvent event) { } @Override public void beforeTaskSkippedEvent(TaskEvent event) { } @Override public void beforeTaskStartedEvent(TaskEvent event) { } @Override public void beforeTaskStoppedEvent(TaskEvent event) { } @Override public void beforeTaskCompletedEvent(TaskEvent event) { } @Override public void beforeTaskFailedEvent(TaskEvent event) { } @Override public void beforeTaskAddedEvent(TaskEvent event) { } @Override public void beforeTaskExitedEvent(TaskEvent event) { } @Override public void beforeTaskReleasedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.RELEASED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void beforeTaskResumedEvent(TaskEvent event) { } @Override public void beforeTaskSuspendedEvent(TaskEvent event) { } @Override public void beforeTaskForwardedEvent(TaskEvent event) { } @Override public void beforeTaskDelegatedEvent(TaskEvent event) { } @Override public void beforeTaskNominatedEvent(TaskEvent event) { } @Override public boolean equals(Object obj) { if ( this == obj ) return true; if ( obj == null ) return false; if ( (obj instanceof JPATaskLifeCycleEventListener) ) return true; return false; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + this.getClass().getName().hashCode(); return result; } @Override public void beforeTaskUpdatedEvent(TaskEvent event) { } @Override public void afterTaskUpdatedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } if((ti.getDescription() != null && !ti.getDescription().equals(auditTaskImpl.getDescription())) || (ti.getDescription() == null && auditTaskImpl.getDescription() != null)){ String message ="Updated Description {From: "+auditTaskImpl.getDescription()+ ", to: "+ti.getDescription()+"}"; persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.UPDATED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId, message)); } if( (ti.getName() != null && !ti.getName().equals(auditTaskImpl.getName())) || (ti.getName() == null && auditTaskImpl.getName() != null)){ String message ="Updated Name {From: "+auditTaskImpl.getName()+ ", to: "+ti.getName()+"}"; persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.UPDATED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId, message)); } if( auditTaskImpl.getPriority() != ti.getPriority()){ String message ="Updated Priority {From: "+auditTaskImpl.getPriority()+ ", to: "+ti.getPriority()+"}"; persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.UPDATED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId, message)); } if((auditTaskImpl.getDueDate() != null && ti.getTaskData().getExpirationTime() != null && auditTaskImpl.getDueDate().getTime() != ti.getTaskData().getExpirationTime().getTime()) || (auditTaskImpl.getDueDate() == null && ti.getTaskData().getExpirationTime() != null) || (auditTaskImpl.getDueDate() != null && ti.getTaskData().getExpirationTime() == null)){ String message ="Updated DueDate {From: "+auditTaskImpl.getDueDate()+ ", to: "+ti.getTaskData().getExpirationTime()+"}"; persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.UPDATED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId, message)); } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } catch(Exception e){ e.printStackTrace(); } finally { cleanup(persistenceContext); } } @Override public void beforeTaskReassignedEvent(TaskEvent event) { } @Override public void afterTaskReassignedEvent(TaskEvent event) { String userId = ""; Task ti = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); try { if (ti.getTaskData().getActualOwner() != null) { userId = ti.getTaskData().getActualOwner().getId(); } persistenceContext.persist(new TaskEventImpl(ti.getId(), org.kie.internal.task.api.model.TaskEvent.TaskEventType.DELEGATED, ti.getTaskData().getProcessInstanceId(), ti.getTaskData().getWorkItemId(), userId)); AuditTaskImpl auditTaskImpl = getAuditTask(event, persistenceContext, ti); if (auditTaskImpl == null) { logger.warn("Unable find audit task entry for task id {} '{}', skipping audit task update", ti.getId(), ti.getName()); return; } auditTaskImpl.setDescription(ti.getDescription()); auditTaskImpl.setName(ti.getName()); auditTaskImpl.setActivationTime(ti.getTaskData().getActivationTime()); auditTaskImpl.setPriority(ti.getPriority()); auditTaskImpl.setDueDate(ti.getTaskData().getExpirationTime()); auditTaskImpl.setStatus(ti.getTaskData().getStatus().name()); auditTaskImpl.setActualOwner(userId); updateLastModifiedDate(auditTaskImpl); persistenceContext.merge(auditTaskImpl); } finally { cleanup(persistenceContext); } } @Override public void beforeTaskNotificationEvent(TaskEvent event) { } @Override public void afterTaskNotificationEvent(TaskEvent event) { } @Override public void afterTaskOutputVariableChangedEvent(TaskEvent event, Map<String, Object> variables) { Task task = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); // first cleanup previous values if any HashMap<String, Object> params = new HashMap<String, Object>(); params.put("type", VariableType.OUTPUT); params.put("taskId", task.getId()); int removed = persistenceContext.executeUpdate("DeleteTaskVariableForTask", params); logger.debug("Deleted {} output variables logs for task id {}", removed, task.getId()); if (variables == null || variables.isEmpty()) { return; } indexAndPersistVariables(task, variables, persistenceContext, VariableType.OUTPUT); } @Override public void afterTaskInputVariableChangedEvent(TaskEvent event, Map<String, Object> variables) { if (variables == null || variables.isEmpty()) { return; } Task task = event.getTask(); TaskPersistenceContext persistenceContext = getPersistenceContext(((TaskContext)event.getTaskContext()).getPersistenceContext()); indexAndPersistVariables(task, variables, persistenceContext, VariableType.INPUT); } protected void indexAndPersistVariables(Task task, Map<String, Object> variables, TaskPersistenceContext persistenceContext, VariableType type) { TaskIndexerManager manager = TaskIndexerManager.get(); for (Map.Entry<String, Object> variable : variables.entrySet()) { if (SKIPPED_TASK_VARIABLES.contains(variable.getKey()) || variable.getValue() == null) { continue; } List<TaskVariable> taskVars = manager.index(task, variable.getKey(), variable.getValue()); if (taskVars != null) { for (TaskVariable tVariable : taskVars) { tVariable.setType(type); persistenceContext.persist(tVariable); } } } } private void updateLastModifiedDate(AuditTaskImpl auditTaskImpl){ auditTaskImpl.setLastModificationDate(new Date()); } }