/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.activiti.listeners;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.impl.pvm.delegate.ExecutionListenerExecution;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.adm.database.Bid;
import ru.codeinside.adm.database.BidStatus;
import ru.codeinside.adm.database.DefinitionStatus;
import ru.codeinside.gses.activiti.Activiti;
import ru.codeinside.gses.activiti.ReceiptEnsurance;
import ru.codeinside.gses.manager.ManagerService;
import ru.codeinside.gses.webui.Flash;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
final public class EndProcessListener implements ExecutionListener {
final private Logger logger = Logger.getLogger(getClass().getName());
final private boolean endEvent;
final private ReceiptEnsurance receiptEnsurance;
public EndProcessListener(boolean endEvent, ReceiptEnsurance receiptEnsurance) {
this.endEvent = endEvent;
this.receiptEnsurance = receiptEnsurance;
}
@Override
public void notify(DelegateExecution execution) throws Exception {
deleteFormBuffers();
String executionId = execution.getId();
String deleteReason = getDeleteReason(execution);
boolean forcedDelete = deleteReason != null;
AdminServiceProvider.get()
.createLog(Flash.getActor(), "execution", executionId, endEvent ? "end" : "complete", forcedDelete ? "forced" : null,
true);
final Bid bid = getBid(executionId);
if (bid == null) {
logger.info("Завершение исполнения " + executionId + " вне заявки.");
return;
}
bid.setStatus(BidStatus.Executed);
bid.setDateFinished(new Date());
bid.setComment(deleteReason);
Activiti.getEm().merge(bid);
if (DefinitionStatus.PathToArchive.equals(bid.getProcedureProcessDefinition().getStatus())) {
String processDefinitionId = bid.getProcedureProcessDefinition().getProcessDefinitionId();
if (Flash.flash().getProcessEngine().getRuntimeService().createProcessInstanceQuery().processDefinitionId(processDefinitionId).count() <= 1) {
ManagerService.get().updateProcessDefinationStatus(processDefinitionId, DefinitionStatus.Archive, 1);
}
}
// Завершение имеет смысл лишь кода мы обнаружили заявку, когда executionId==processInstanceId,
// в других случаях может завершаться дочерний процесс.
// endEvent==true - обработчик блока endEvent.
// endEvent==false - обработчик завершения процесса.
if (!endEvent) {
if (receiptEnsurance != null) {
receiptEnsurance.completeReceipt(execution, deleteReason);
}
AdminServiceProvider.get().createLog(Flash.getActor(), "Bid", bid.getId().toString(), "complete", null, true);
}
}
/**
* Для случаев, когда taskProcessListener не вызывался
*/
private void deleteFormBuffers() {
Activiti
.getEm()
.createNativeQuery("delete from form_buffer where task not in (select id_ from act_ru_task)")
.executeUpdate();
}
private String getDeleteReason(final DelegateExecution execution) {
if (!(execution instanceof ExecutionListenerExecution)) {
return null;
}
return ((ExecutionListenerExecution) execution).getDeleteReason();
}
private Bid getBid(final String executionId) {
final List<Bid> bids = Activiti.getEm()
.createQuery("select b from Bid b where b.processInstanceId = :processInstanceId", Bid.class)
.setParameter("processInstanceId", executionId).getResultList();
if (bids.isEmpty()) {
return null;
}
return bids.get(0);
}
}