/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* 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.activiti.kickstart.service;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.impl.util.IoUtil;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.kickstart.bpmn20.model.Definitions;
import org.activiti.kickstart.diagram.ProcessDiagramGenerator;
import org.activiti.kickstart.dto.KickstartWorkflow;
import org.activiti.kickstart.dto.KickstartWorkflowInfo;
/**
* @author Joram Barrez
*/
public class KickstartServiceImpl implements KickstartService {
protected RepositoryService repositoryService;
protected TransformationService transformationService;
protected Bpmn20MarshallingService marshallingService;
// Kickstart operations //////////////////////////////////////////////////////////////
public String deployWorkflow(KickstartWorkflow kickstartWorkflow, Map<String, String> metadata) {
String deploymentName = "Process " + kickstartWorkflow.getName();
String bpmn20XmlResourceName = generateBpmnResourceName(kickstartWorkflow.getName());
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().name(deploymentName);
// png image (must go first, since it will add DI to the process xml)
ProcessDiagramGenerator diagramGenerator = new ProcessDiagramGenerator(kickstartWorkflow, marshallingService);
deploymentBuilder.addInputStream(bpmn20XmlResourceName.replace(".bpmn20.xml", ".png"), diagramGenerator.execute());
// bpmn 2.0 xml
String workflowXml = marshallingService.marshallWorkflow(kickstartWorkflow);
deploymentBuilder.addString(bpmn20XmlResourceName,workflowXml);
Deployment deployment = deploymentBuilder.deploy();
return deployment.getId();
}
public String getWorkflowMetaData(String processDefinitionId, String metadataKey) {
throw new UnsupportedOperationException();
}
public List<KickstartWorkflowInfo> findWorkflowInformation(boolean includeCounts) {
List<ProcessDefinition> processDefinitions = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKeyLike("adhoc_%")
.orderByProcessDefinitionName().asc()
.orderByProcessDefinitionVersion().desc().list();
return transformationService.convertToWorkflowInfoList(processDefinitions, includeCounts);
}
public KickstartWorkflowInfo findWorkflowInformation(String processDefinitionId, boolean includeCounts) {
throw new UnsupportedOperationException();
}
public KickstartWorkflow findWorkflowById(String id) {
// Get process definition for key
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery().processDefinitionId(id)
.singleResult();
// Get BPMN 2.0 XML file from database and parse it with JAXB
InputStream is = null;
Definitions definitions = null;
try {
is = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName());
JAXBContext jc = JAXBContext.newInstance(Definitions.class);
Unmarshaller um = jc.createUnmarshaller();
definitions = (Definitions) um.unmarshal(is);
} catch (JAXBException e) {
throw new RuntimeException("Could not unmarshall workflow xml", e);
} finally {
IoUtil.closeSilently(is);
}
// Convert JAXB to internal model
return transformationService.convertToKickstartWorkflow( definitions);
}
public InputStream getProcessImage(String processDefinitionId) {
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
return repositoryService.getResourceAsStream(
processDefinition.getDeploymentId(),
processDefinition.getDiagramResourceName());
}
public void setProcessImage(String processDefinitionId, InputStream processImageStream) {
throw new UnsupportedOperationException();
}
public InputStream getBpmnXml(String processDefinitionId) {
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
return repositoryService.getResourceAsStream(
processDefinition.getDeploymentId(),
processDefinition.getResourceName());
}
public void deleteWorkflow(String processDefinitionId) {
throw new UnsupportedOperationException();
}
// Helper methods
// ///////////////////////////////////////////////////////////////////
/**
* Generates a valid bpmn 2.0 file name for the given process name.
*/
protected String generateBpmnResourceName(String processName) {
return processName.replace(" ", "_") + ".bpmn20.xml";
}
// Getters and Setters //////////////////////////////////////////////////////////////
public RepositoryService getRepositoryService() {
return repositoryService;
}
public void setRepositoryService(RepositoryService repositoryService) {
this.repositoryService = repositoryService;
}
public TransformationService getTransformationService() {
return transformationService;
}
public void setTransformationService(TransformationService transformationService) {
this.transformationService = transformationService;
}
public Bpmn20MarshallingService getMarshallingService() {
return marshallingService;
}
public void setMarshallingService(Bpmn20MarshallingService marshallingService) {
this.marshallingService = marshallingService;
}
}