No.3 簡易工作流系統搭建(2) : 整合Activiti + 模型管理功能
之前的一篇文章我們整合了系統最簡單的部分,就是使用者管理部分。在這篇文章中,我們將整合activiti,新增使用者管理中的註冊功能,同時增加模型管理功能
一、整合Activiti5.17
1. 修改web.xml
在web.xml相應位置新增spring-activiti.xml檔案配置位置
<param-value>
classpath*:/applicationContext.xml,
classpath*:/spring-activiti.xml
</param-value>
2.新增spring-activiti.xml
在resources中新增spring-activiti.xml
3.在pom.xml中增加maven依賴<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource"/> <property name="transactionManager" ref="transactionManager"/> <property name="databaseSchemaUpdate" value="true"/> <property name="jobExecutorActivate" value="false"/> <property name="activityFontName" value="宋體"/> <property name="labelFontName" value="宋體"/> <property name="history" value="full"/> </bean> <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <property name="processEngineConfiguration" ref="processEngineConfiguration"/> </bean> <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/> <bean id="formService" factory-bean="processEngine" factory-method="getFormService"/> <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/> <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/> <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/> <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/> <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> </beans>
在pom.xml中新增以下內容
此時,執行專案,在資料庫中即可看到activit相關的23張表。<!-- Activiti --> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-engine --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>${activiti.version}</version> <exclusions> <exclusion> <artifactId>commons-dbcp</artifactId> <groupId>commons-dbcp</groupId> </exclusion> </exclusions> </dependency> <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.5</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.activation/activation --> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-bpmn-model --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-model</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-bpmn-converter --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-converter</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-bpmn-layout --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-layout</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-common-rest --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-common-rest</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-crystalball --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-crystalball</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-diagram-rest --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-diagram-rest</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-explorer --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-explorer</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-image-generator --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-image-generator</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.activiti/activiti-json-converter --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-json-converter</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-modeler</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-simple-workflow</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.vaadin.addons/dcharts-widget --> <dependency> <groupId>org.vaadin.addons</groupId> <artifactId>dcharts-widget</artifactId> <version>0.10.0</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-process-validation</artifactId> <version>${activiti.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/xmlgraphics-commons --> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>xmlgraphics-commons</artifactId> <version>1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.vaadin/vaadin --> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin</artifactId> <version>6.8.8</version> </dependency> <!-- https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib --> <dependency> <dependency> <groupId>org.json</groupId> <artifactId>org.json</artifactId> <version>chargebee-1.0</version> </dependency> <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib-ext-spring --> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib-ext-spring</artifactId> <version>1.0.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.7.4</version> </dependency>
到此為止,activiti就成功的整合到了專案中
二、添加註冊功能
1.在activiti的act_id_group表中加入以下資料(這裡為了圖方便,提前預設了組關係)
在之前的LoginController中,刪去registerPost()函式的註釋,同時刪去IdentityService的註釋,重新啟動專案,即可註冊
三、整合activiti modeler
在為了在專案中成功整合activiti modeler你需要在activiti5.17中找到以下內容:
1. 在activiti-5.17的lib資料夾內,解壓以下兩個jar包:
將其org.activiti.rest路徑下的資料夾拷貝到專案的org.activiti.rest包中,內容如下所示:
2.解壓war資料夾中的兩個war包,把activiti-explorer\WEB-INF\classes 路徑下的stencilset.json、ui.properties、ui.properties.alfresco拷貝到新專案resources中
3.把wars\activiti-explorer下的diagram-viewer、editor-app、modeler.html拷貝到新專案webapp中
4.更改editor-app/app-cfg.js中的contextRoot,刪去/activiti-explorer,只保留/service
5.將org.activiti.rest包下所有controller註解的類添加註解:@RequestMapping("/service")
6.在applicationContext.xml相應位置中新增:
<context:component-scan base-package="org.activiti.rest.diagram">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:component-scan base-package="org.activiti.rest.editor">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
7.在pom.xml中新增以下依賴:
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin</artifactId>
<version>6.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib -->
<dependency>
<groupId>org.imgscalr</groupId>
<artifactId>imgscalr-lib</artifactId>
<version>4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/geronimo-spec/geronimo-spec-servlet -->
<!-- https://mvnrepository.com/artifact/org.apache.geronimo.specs/geronimo-servlet_3.0_spec -->
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
<version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/batik/batik-transcoder -->
<dependency>
<groupId>batik</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-dom</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-bridge</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-css</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-anim</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-codec</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-ext</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-gvt</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-script</artifactId>
<version>1.7</version>
</dependency>
<!--<dependency>
<groupId>batik</groupId>
<artifactId>batik-js</artifactId>
<version>1.7</version>
</dependency>-->
<dependency>
<groupId>batik</groupId>
<artifactId>batik-parser</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-svg-dom</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-svggen</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-util</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-xml</artifactId>
<version>1.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/batik-js -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-js</artifactId>
<version>1.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/xml-apis/xml-apis-ext -->
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis-ext</artifactId>
<version>1.3.04</version>
</dependency>
<!-- https://mvnrepository.com/artifact/xml-apis/xml-apis-ext -->
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.3.04</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/xmlgraphics-commons -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>xmlgraphics-commons</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/batik-awt-util -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-awt-util</artifactId>
<version>1.7</version>
</dependency>
注:batik相關的依賴可能無法下載,可以自行在activiti5.17\wars\activiti-explorer\WEB-INF\lib中找到,手動加入
8.為了測試我們的modeler是否能正常工作,我們在這裡新增一個ModuleController進行測試
package com.blog.yanming.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import net.sf.json.JSONArray;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
/**
* Created by YanMing on 2017/7/15.
*/
@Controller
@RequestMapping("/model")
public class ModuleController {
private Logger logger = LoggerFactory.getLogger(ModuleController.class);
@Autowired
private RepositoryService repositoryService;
/**
* @Date: 13:41 2017/6/15
* 建立模型功能
* @param name 模型名稱
* @param key 模型key值
* @param description 模型描述
*
*/
@RequestMapping(value = "create")
public void create(@RequestParam("name")String name,
@RequestParam("key")String key,
@RequestParam("description")String description,
HttpServletRequest request, HttpServletResponse response) {
try{
//將前端 ISO-8859-1編碼轉碼為 UTF-8
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
key = new String(key.getBytes("ISO-8859-1"),"UTF-8");
description = new String(description.getBytes("ISO-8859-1"),"UTF-8");
//建立一個activiti bpmn模板物件
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode editorNode = objectMapper.createObjectNode();
editorNode.put("id","canvas");
editorNode.put("resourceId","canvas");
ObjectNode stencilSetNode = objectMapper.createObjectNode();
stencilSetNode.put("namespace","http://b3mn.org/stencilset/bpmn2.0#");
editorNode.put("stencilset",stencilSetNode); //為模型繫結引數
Model modelData = repositoryService.newModel(); //建立模型物件
ObjectNode modelObjectNode = objectMapper.createObjectNode();
modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME,name);
modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION,1);
description = StringUtils.defaultString(description);
modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION,description);
modelData.setMetaInfo(modelObjectNode.toString());
modelData.setName(name);
modelData.setKey(StringUtils.defaultString(key));
repositoryService.saveModel(modelData); //儲存模型模型
repositoryService.addModelEditorSource(modelData.getId(),editorNode.toString().getBytes("utf-8"));
response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + modelData.getId());//跳轉到模型設計介面
}catch (Exception e){
logger.error("建立模型失敗",e);
}
}
}
執行專案,輸入http://localhost:8080/model/create?name=test&key=test&description=testModel成功跳轉到以下介面:
到此,Activiti modeler整合完畢,接下來就編寫我們的模型管理。很簡單,直接上程式碼!
四、整合模型管理:
1.完整的ModuleController
package com.adc.gim.controller;
import com.adc.gim.service.ModelService;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import net.sf.json.JSONArray;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
/**
* Created by YanMing on 2017/6/8.
*/
/**
* @Date: 13:33 2017/6/6
* 實現關於module管理相關操作功能
*/
@Controller
@RequestMapping("/model")
public class ModuleController {
private Logger logger = LoggerFactory.getLogger(ModuleController.class);
@Autowired
private ModelService modelService;
@Autowired
private RepositoryService repositoryService;
/**
* @Date: 13:41 2017/6/15
* 建立模型功能
* @param name 模型名稱
* @param key 模型key值
* @param description 模型描述
*
*/
@RequestMapping(value = "create")
public void create(@RequestParam("name")String name,
@RequestParam("key")String key,
@RequestParam("description")String description,
HttpServletRequest request, HttpServletResponse response) {
try{
//將前端 ISO-8859-1編碼轉碼為 UTF-8
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
key = new String(key.getBytes("ISO-8859-1"),"UTF-8");
description = new String(description.getBytes("ISO-8859-1"),"UTF-8");
//建立一個activiti bpmn模板物件
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode editorNode = objectMapper.createObjectNode();
editorNode.put("id","canvas");
editorNode.put("resourceId","canvas");
ObjectNode stencilSetNode = objectMapper.createObjectNode();
stencilSetNode.put("namespace","http://b3mn.org/stencilset/bpmn2.0#");
editorNode.put("stencilset",stencilSetNode); //為模型繫結引數
Model modelData = repositoryService.newModel(); //建立模型物件
ObjectNode modelObjectNode = objectMapper.createObjectNode();
modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME,name);
modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION,1);
description = StringUtils.defaultString(description);
modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION,description);
modelData.setMetaInfo(modelObjectNode.toString());
modelData.setName(name);
modelData.setKey(StringUtils.defaultString(key));
repositoryService.saveModel(modelData); //儲存模型模型
repositoryService.addModelEditorSource(modelData.getId(),editorNode.toString().getBytes("utf-8"));
response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + modelData.getId());//跳轉到模型設計介面
}catch (Exception e){
logger.error("建立模型失敗",e);
}
}
/**
* @Date: 13:44 2017/6/15
* 獲取所ACTI_RE_MODEL表所有模型資訊
*
*/
@RequestMapping(value = "/getAllModel",method = RequestMethod.GET)
@ResponseBody
public JSONArray getAllModel(){
return modelService.getAllModule();
}
/**
* @Date: 13:45 2017/6/15
* 根據指定模型Id、部署模型
* 返回狀態字串
*
*/
@RequestMapping(value = "/deployModel",method = RequestMethod.POST)
@ResponseBody
public String deployModel(@RequestParam("modelId") String modelId) throws UnsupportedEncodingException{
//前端modelId轉碼為UTF-8
modelId = new String(modelId.getBytes("ISO-8859-1"),"UTF-8");
return modelService.deployModel(modelId)?"right":"wrong";
}
/**
* @Date: 13:47 2017/6/15
* 根據制定模型Id、匯出模型XML檔案,顯示在新的HTML中
*
*/
@RequestMapping(value = "/exportModel",method = RequestMethod.GET)
@ResponseBody
public String exportModel(HttpServletRequest request) throws UnsupportedEncodingException{
//獲取modelId並轉碼
String modelId = request.getParameter("modelId");
modelId = new String(modelId.getBytes("ISO-8859-1"),"UTF-8");
String res = "<xmp>";
res = res + modelService.exportModel(modelId) + "</xmp>";
return res;
}
/**
* @Date: 13:48 2017/6/15
* 根據制定模型Id、刪除模型
*
*/
@RequestMapping(value = "/deleteModel",method = RequestMethod.POST)
@ResponseBody
public String deleteModel(@RequestParam("modelId") String modelId)throws UnsupportedEncodingException{
modelId = new String(modelId.getBytes("ISO-8859-1"),"UTF-8");
return modelService.deleteModel(modelId)?"right":"wrong";
}
}
2.在model包中新增Mymodel,用於在檢視層進行顯示模型資訊的類
package com.adc.gim.model;
import org.activiti.engine.repository.Model;
/**
* Created by YanMing on 2017/6/9.
*/
/**
* @Date: 16:11 2017/6/18
* 模型列表顯示
*
*/
public class MyModel {
private String modelId;
private String modelKey;
private String modelName;
private String modelVersion;
private String modelCtime;
private String modelLMtime;
private String modelMetaData;
public MyModel(){
}
public MyModel(Model model){
this.modelId = model.getId();
this.modelKey = model.getKey();
this.modelName = model.getName();
this.modelVersion = model.getVersion().toString();
this.modelCtime = model.getCreateTime().toString();
this.modelLMtime=model.getLastUpdateTime().toString();
this.modelMetaData = model.getMetaInfo();
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelKey() {
return modelKey;
}
public void setModelKey(String modelKey) {
this.modelKey = modelKey;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getModelVersion() {
return modelVersion;
}
public void setModelVersion(String modelVersion) {
this.modelVersion = modelVersion;
}
public String getModelCtime() {
return modelCtime;
}
public void setModelCtime(String modelCtime) {
this.modelCtime = modelCtime;
}
public String getModelLMtime() {
return modelLMtime;
}
public void setModelLMtime(String modelLMtime) {
this.modelLMtime = modelLMtime;
}
public String getModelMetaData() {
return modelMetaData;
}
public void setModelMetaData(String modelMetaData) {
this.modelMetaData = modelMetaData;
}
}
3.在service包中新增ModelService 和 ModelServiceImpl
ModelService
package com.adc.gim.service;
import com.adc.gim.model.MyModel;
import net.sf.json.JSONArray;
import java.util.List;
/**
* Created by YanMing on 2017/6/12.
*/
public interface ModelService {
JSONArray getAllModule();
boolean deployModel(String modelId);
String exportModel(String modelId);
boolean deleteModel(String modelId);
}
ModelServiceImpl
package com.adc.gim.service.impl;
import com.adc.gim.model.MyModel;
import com.adc.gim.service.ModelService;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import net.sf.json.JSONArray;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.Model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by YanMing on 2017/6/1.
*/
@Service
public class ModelServiceImpl implements ModelService {
@Autowired
private RepositoryService repositoryService;
/**
* @Date: 16:26 2017/6/2
* 獲取所有模型
*/
@Override
public JSONArray getAllModule() {
List<MyModel> resList = new ArrayList<MyModel>();
JSONArray jsonArray = null;
try {
//獲取所有模型列表
List<Model>list = repositoryService.createModelQuery().orderByCreateTime()
.desc().list();
for (Model model : list) {
//轉換為前端顯示MyModel
MyModel myModel = new MyModel(model);
resList.add(myModel);
}
jsonArray = JSONArray.fromObject(resList);
return jsonArray;
}catch (Exception e){
System.out.println(e.getMessage());
return jsonArray;
}
}
/**
* @Date: 16:28 2017/6/2
* 部署模型
*/
@Override
public boolean deployModel(String modelId){
//System.out.println(modelId);
try {
//獲取指定模型id的模型
Model modelData = repositoryService.getModel(modelId);
//解析模型
ObjectNode modelNode = (ObjectNode) new ObjectMapper()
.readTree(repositoryService.getModelEditorSource(modelData.getId()));
byte [] bpmnBytes = null;
BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
bpmnBytes = new BpmnXMLConverter().convertToXML(model);
String processName = modelData.getName() + ".bpmn20.xml";
//部署
Deployment deployment = repositoryService.createDeployment()
.name(modelData.getName())
.addString(processName,new String(bpmnBytes))
.deploy();
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
/**
* @Date: 16:31 2017/6/2
* 匯出模型定義
*/
@Override
public String exportModel(String modelId) {
String res = "";
try {
Model modelData = repositoryService.getModel(modelId);
ObjectNode modelNode = (ObjectNode) new ObjectMapper()
.readTree(repositoryService.getModelEditorSource(modelData.getId()));
BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
byte [] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);
byte [] bytes = new byte [1024];
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int len = -1;
while ((len = in.read(bytes,0,1024))!=-1){
outStream.write(bytes,0,len);
}
res = new String(outStream.toString().getBytes("UTF-8"),"ISO-8859-1");
return res;
}catch (Exception e){
e.printStackTrace();
return res;
}
}
/**
* @Date: 16:31 2017/6/2
* 刪除模型
*/
@Override
public boolean deleteModel(String modelId) {
try {
repositoryService.deleteModel(modelId);
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
}
4.新增控制導航的MainController
package com.adc.gim.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Autohr:YanMing
* @Description:
*
* 實現流程管理和模型管理頁面跳轉
*
* @Date: 13:43 2017/6/5
*/
@Controller
public class MainController {
private static final Logger logger = LoggerFactory.getLogger(MainController.class);
/**
* @Date: 13:29 2017/6/6
* 跳轉到模型管理頁面
*/
@RequestMapping(value = {"/modelPage"})
public String modelManagePage(){
return "modelManage";
}
/**
* @Date: 13:30 2017/6/6
* 跳轉到流程管理頁面
*/
@RequestMapping(value = {"/processPage"})
public String processManagePage(){
return "processManage";
}
}
新增模型管理的html檔案以及資原始檔,見原始碼,這裡不再贅述
執行專案,效果如下:
P.S.文章不妥之處還望指正