[工作流与Activiti] - 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

<?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>
3.在pom.xml中增加maven依赖

在pom.xml中添加以下内容

<!-- 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>
此时,运行项目,在数据库中即可看到activit相关的23张表。

到此为止,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.文章不妥之处还望指正


本文Github源码下载



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值