package com.mossle.bpm.cmd;
import java.io.InputStream;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.impl.cmd.GetBpmnModelCmd;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
public class UpdateProcessCmd implements Command<Void> {
private static Logger logger = LoggerFactory
.getLogger(UpdateProcessCmd.class);
private String processDefinitionId;
private byte[] bytes;
public UpdateProcessCmd(String processDefinitionId, byte[] bytes) {
this.processDefinitionId = processDefinitionId;
this.bytes = bytes;
}
public Void execute(CommandContext commandContext) {
ProcessDefinitionEntity processDefinitionEntity = commandContext
.getProcessDefinitionEntityManager().findProcessDefinitionById(
processDefinitionId);
String resourceName = processDefinitionEntity.getResourceName();
String deploymentId = processDefinitionEntity.getDeploymentId();
JdbcTemplate jdbcTemplate = new JdbcTemplate(Context
.getProcessEngineConfiguration().getDataSource());
jdbcTemplate
.update("update ACT_GE_BYTEARRAY set BYTES_=? where NAME_=? and DEPLOYMENT_ID_=?",
bytes, resourceName, deploymentId);
Context.getProcessEngineConfiguration().getProcessDefinitionCache()
.remove(processDefinitionId);
try {
// update png
GetBpmnModelCmd getBpmnModelCmd = new GetBpmnModelCmd(
processDefinitionId);
BpmnModel bpmnModel = getBpmnModelCmd.execute(commandContext);
ProcessEngineConfiguration processEngineConfiguration = Context
.getProcessEngineConfiguration();
ProcessDefinitionDiagramCmd processDefinitionDiagramCmd = new ProcessDefinitionDiagramCmd(
processDefinitionEntity.getId());
InputStream is = processDefinitionDiagramCmd
.execute(commandContext);
byte[] pngBytes = IOUtils.toByteArray(is);
String diagramResourceName = processDefinitionEntity
.getDiagramResourceName();
jdbcTemplate
.update("update ACT_GE_BYTEARRAY set BYTES_=? where NAME_=? and DEPLOYMENT_ID_=?",
pngBytes, diagramResourceName, deploymentId);
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
return null;
}
}