Giter VIP home page Giter VIP logo

theopencloudengine / uengine5-base Goto Github PK

View Code? Open in Web Editor NEW
10.0 18.0 13.0 12.7 MB

uEngine5 BPMS that totally re-written in Microservices architecture. uEngine5 can act as not only a conventional Workflow or BPMS but also as a REST api orchestrator or a BPaaS (Business process as a service) of members of OCE's MSA components.

License: MIT License

Java 4.72% JavaScript 71.69% HTML 3.33% Vue 13.29% CSS 6.91% Shell 0.01% Dockerfile 0.06%

uengine5-base's Introduction

This project is a base library for uEngine customization applications.

To run a default uEngine5 BPM backend server, build https://github.com/TheOpenCloudEngine/uEngine5-default rather than this.

Run uEngine5 in monolothic architecture

Running backend server

git clone https://github.com/TheOpenCloudEngine/uEngine5-default.git
cd uEngine5-default
mvn spring-boot:run

go to localhost:8080

Running front-end server

You need a npm installation on your machine

cd src/main/resources/dev
npm install
npm run dev

go to localhost:8081

Run uEngine5 in microservices architecture

To run uEngine5 in MSA, you need to launch all the micro-services one by one:

# run local kafka
docker-compose -f docker-compose-kafka.yml up -d

cd uengine5-eureka
mvn spring-boot:run

cd ../definition-service
mvn package -B -U
java -jar target/uengine-five-definistion-*-exec.jar --server.port=9091 --spring.profiles.active=msa

cd ../process-service
mvn package -B -U
javar -jar target/uengine-five-process-*-exec.jar --server.port=9092 --spring.profiles.active=msa

cd uengine5-zuul
mvn spring-boot:run

cd ../front-end
npm install
npm run dev

Or, you can use the docker-compose.yml file:

docker-compose -f docker-compose.yml up -d

Documents

Wiki :

https://github.com/TheOpenCloudEngine/uEngine5-base/wiki

uengine5-base's People

Contributors

jinyoung avatar jo-narae avatar lusky87 avatar kimsanghoon1 avatar seungpilpark avatar kim-youngtak avatar kimscott avatar basquiat78 avatar

Stargazers

Yi, Seung Yong avatar Gkoran Stoilkovits avatar Rey F. Diaz avatar  avatar  avatar Gabor Dolla avatar  avatar  avatar  avatar Kevin Ramsunder avatar

Watchers

Edward KIM avatar  avatar  avatar James Cloos avatar Yi, Seung Yong avatar  avatar  avatar  avatar Clyde Hawker avatar Choi JongHyeok avatar  avatar Gkoran Stoilkovits avatar  avatar Park JH avatar  avatar  avatar  avatar  avatar

uengine5-base's Issues

메인 프로세스 모델링 시 서브프로세스 모델로 이동 기능

기존 uEngine 프로세스 디자이너에서는 지원되지 않던 기능이나, LGD에 적용되어 있는 기능입니다.
메인 프로세스 모델링 중간 서브 프로세스 모델로 이동하여 서브 프로세스 모델링 가능합니다.(서브 프로세스 모델링 중간에 메인 프로세스로 이동도 가능합니다) 그리고 서브 프로세스 모델 배포 이후 메인 프로세스에서는 배포된 서브 프로세스 버전으로 자동 적용됩니다.

UserPicker UI Html Tag

  1. 인스턴스 검색 후, 담당자를 위임처리 하기 위하여 Role Mapping 을 지정할 수 있는 UI 가 제공되어야 함.
  2. 회사마다 사용하는 조직도 데이터베이스 (일반 DB인 경우, LDAP 인 경우등)가 다르기 때문에 조직도를 여는 방식에 대한 우리의 기본 방향은 IAM 에서 유저를 검색하는 방식으로 한다.
  3. 사용자를 선택하도록 하는 버튼으로 만들거나 (옛날방식) 혹은 사용자 이름 그냥 넣으면 사용자를 하단에 팝업으로 바로 선택할 수 있도록 하는 Auto complete Text field 방식도 좋음

TextContext locale 적용

모델링 시 locale 변경 기능 요구됨
적용된 locale에 따라 TextContext의 locale로 적용되어야 함.
모니터링 시 로그인 사용자의 locale에 따라 TextContext get이 되어야 함

프로세스 정의 버전관리 및 활성화 기능

현재 파일로 관리하고 있는 프로세스 정의(BPM_PROCDEF)를 DB로 관리하는 방안에 대한 검토 요구됩니다.
그리고 프로세스 정의에 대한 버전관리(BPM_PROCDEFVER) 및 특정버전 활성화 기능, 실행중인 프로세스 정의 변경 기능 등이 요구됩니다.

Working with IAM

보안 관련 이슈

Public 한 클라이언트가 유저 관련 작업을 할때,

  1. 클라이언트키와 클라이언트 시크릿 키를 통해야만 가능
  • 사용자 Crud
  • 토큰 재발급
  • 신규 토큰 발급 (로그인)
  1. 발급된 토큰으로만 가능한 것
  • 토큰 검증
  • 토큰 정보 얻기

클라이언트키과 비밀번호 키는 자바스크립트에서 절대 유출되면 안됨

따라서, App 스크립트에서는 어떤 경로로든 키와 비밀키는 없어야함.

iam-client.js 를 통해 사용하는 명령어는 App 의 서버를 통하고, App 의 서버는 키와 비밀키를 헤더에 삽입하여 IAM 서버와 프락시 통신을 함. 이 로직을 iam-java-client 에서 Bean 등록시 3줄 내외로 처리가능하도록 설정함.

서버 코딩 없는 회원가입, 비밀번호 변경 작업

IAM 이슈 참조

2017-08-12 10 14 01

IAM 의 아바타 기능을 사용토록 함

IAM 이슈 참조

Standalone setting

mw4 와 잠시 분리.
Spring Configuration 및 Context 코드 추가.

[Process Designer] ProcessVariable Panel

Process Data definition grid

  • object-grid can be used for CRUD of Process Data (online option is off)
  • object types are 1. primitive types - Text, Number, Money, Date, Boolean 2. complex types - defined in Java class or Class designer:

refer to
Class Designer for class definition design: UML diagraming or just class member definition similar to dRools model designer.

Definition Tree

  1. 기능: 패키지명(폴더) 생성, 패키지 삭제, package 명 변경
  2. 이슈: 패키지명 변경 시, 이를 참조하고 있는 CallActivity 들의 모든 연결 문제 발생 (기존 3.0에서는 폴더와 프로세스 alias 를 분리하였 때문에 발생하지 않았던 문제, 현재 방식으로 갈때는 모든 프로세스 정의를 열어 변경될 패키지명들을 찾아서 수정해주는 일종의 IntelliJ 의 리팩토링 기능같은게 필요해짐)

Class Designer

Level1: just class definition that is just a group of member attribute declarations. An attribute may be complex type which type is link to other class definition or itself (recursive data structure) and it can be multiple (array) type of it.

user interface may be like this:
datamodellocked

By the class model information, metaworks4 will generate the Default Work-item-handler for UI-unspecified User-tasks which only has its input/output process data.

Level2: Incorporating an UML diagraming tool to declare more complex class models, which is a step toward Model driven development.

Change to Visitor pattern for executing BPMN

Currently we converts JAXB-generated BPMN model to BPMN-like-and-uEngine-like model and run the later one. It's kind of good approach having some Pros. and Cons. as described below:

  1. Pros. It's kind of good approach, since the JAXB-generated BPMN is quite data model-driven, it is not suitable for execution. (e.g. for storing the model, class hierarchy must be A extends B. but, for executing it the behaviors are more inherited from A not from B, then B extends A is better choice for execution.) And the JAXB-generated BPMN will be overwritten automatically by the generator, we can't have any modification to the model classes such as inserting any execution method like 'executeActivity(ProcessInstance)' - will be ignored when the model has been upgraded.
  2. Cons. but it requires unnecessary conversion between object models - it will brought some inconsistency in the model finally. Also for educational perspective, the developers must understand two models together in the spite of we will match the property name as possible.

So, we need someday reconciling two perspectives with 'Visitor pattern' for dividing model and executor. With the approach we've utilized before in designer support, BlockFinder, and the adapter itself:

    ActivityFor(){
       visit(TFlowNode flowNode){
            Executor executor = UEngineUtil.getComponentByEscalation(flowNode, "executor");
            executor.run(flowNode, processInstance);
       }
   }

Instance Tree

  1. Instance 하나가 선택되면, instance 보기 (현재 프로세스 모델링 화면) 화면의 왼편에 sub process 에 대한 tree 탐색기가 열려야 합니다. 이는 아래와 같은 REST service 를 재귀호출 하여 하위 참조 인스턴스가 없을 때 까지 찾아서 ajax 로 뿌려주면 됩니다. instances/{instId}/childs 라는 백엔드는 만들어줘야 합니다.
/instances/70/childs
===> 96, 98
/instances/96/childs
===> 100, 101

self node --> data 

{
   _self:{ href: 'http://localhost:8080/instances/96' }
    ....
}

--> http://localhost:8080/instances/96/childs

Condition Editor

condition editor

JSON 형식:

...
{ _type: 'org.uengine.kernel.bpmn.SequenceFlow', 
  condition: {
    _type: 'org.uengine.kernel.ExpressionEvaluateCondition',
    conditionExpression: 'arg2=="call"'
  }
}

RoleMapping Popup when Process Initiation

http POST localhost:8080/definition/new-process-definition4.json/initiate             //not instance
> 1 // <-- is instance id will be used below:

http POST localhost:8080/instance/1/role-mapping/role1 endpoint="[email protected]"
http POST localhost:8080/instance/1/role-mapping/role2 endpoint="[email protected]"
http POST localhost:8080/instance/1/role-mapping/role3 endpoint="[email protected]"
...

http POST localhost:8080/instance/1/start
<template>
 <md-dialog ref="roleMappingDialog">
  <role-mapping-panel :data="roleMappings"></role-mapping-panel>
  <md-button @click:native="initiateAndRun">START</md-button>
 </md-dialog>

 <md-button @click:native="refs['roleMappingDialog'].open()">ACTIVATE</md-button>
</template>

...

data:{
  roleMappings: {}
},

methods:{
  initiateAndRun: function(){

      http POST localhost:8080/definition/new-process-definition4.json/initiate             //not instance

      this.roleMappings.forEach(function(roleMapping){

              ajax("localhost:8080/instance/" + instanceId + "/" + roleName, roleMapping);

       }

      http POST localhost:8080/instance/1/start


  }

}

JPAWorkList need to get current date from database

Old implementation gets the current date from database not from the back end server.
That means, some insert queries may be companied with native SQLs with current date, it may causes inconsistency with the date obtained by back-end and database server. But for new implementation will not use the native SQLs as possible, it may be ok. If it is problematic again, we need to implement this again:

Potential problematic implementations can be found at JPAWorkList or JPAProcessInstance

 Calendar dueDate = null;
            try{
                String dueDateInMSStr = ""+parameterMap.get(KeyedParameter.DUEDATE);
                long dueDateInMS = Long.parseLong(dueDateInMSStr);
                dueDate = Calendar.getInstance();
                dueDate.setTimeInMillis(dueDateInMS);
            }catch(Exception e){
            }

Old implementations obtains the date from the database like this SQL:

  select SYSDATE from dual

Introduction of Process Definition Cache Server

For very high performance process execution, worth to consider introducing a process definition cache server that caches process definition objects in memory which will be requested from many instances frequently.

The Process Definition Service As A microservice,

The microservce maybe implemented with Redis or Memcached and for the base repository, a gitlab (a REST wrapper of git) could be used.

Wondering things on Vue and Hateoas

  1. For hateoas, if all the links are provided and linked from the start, don't we need the 'serviceLocator' anymore?
  2. For router, all the resources are mapped with page and resource url, is the current vue-router the best model ? it doesn't look so component model.

[Human Activity] Property Panel

Property panel for HumanActivity

  1. vue component name: 'org-uengine-kernel-humanactivity'
  2. properties are
  • id
  • name
  • description
  • documentation
  • input arguments
  • output arguments

SubProcess

제작 전 검토

그림

2017-09-29 1 14 57

definition

{
    "definition": {
        "_type": "org.uengine.kernel.ProcessDefinition",
        "name": {
            "text": "codi/call2.json"
        },
        "retryDelay": 60,
        "isDynamicChangeAllowed": true,
        "childActivities": [
            "java.util.ArrayList",
            [
                {
                    "_type": "org.uengine.kernel.bpmn.SubProcess",
                    "name": {
                        "text": "SUB"
                    },
                    "description": {},
                    "tracingTag": "SUB",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "SUB",
                        "parent": "4777a2aa-d9d0-9a22-fa82-d3cc69c60936",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 356,
                        "y": 337,
                        "width": 200,
                        "height": 200,
                        "style": "{\"stroke\":\"black\",\"fill-r\":\".5\",\"fill-cx\":\".5\",\"fill-cy\":\".5\",\"fill\":\"white\",\"fill-opacity\":0,\"label-position\":\"bottom\",\"stroke-width\":1.5,\"cursor\":\"move\"}"
                    },
                    "childActivities": [
                        "java.util.ArrayList",
                        [
                            {
                                "_type": "org.uengine.kernel.bpmn.StartEvent",
                                "name": {
                                    "text": "CC"
                                },
                                "tracingTag": "3",
                                "retryDelay": 60,
                                "isDynamicChangeAllowed": true,
                                "elementView": {
                                    "_type": "org.uengine.kernel.view.DefaultActivityView",
                                    "id": "3",
                                    "parent": "SUB",
                                    "shapeId": "OG.shape.bpmn.A_Task",
                                    "x": 440,
                                    "y": 309,
                                    "width": 30,
                                    "height": 30,
                                    "style": "{\"stroke\":\"black\",\"fill-r\":\".5\",\"fill-cx\":\".5\",\"fill-cy\":\".5\",\"fill\":\"white\",\"fill-opacity\":0,\"label-position\":\"bottom\",\"stroke-width\":1.5,\"cursor\":\"move\"}"
                                },
                                "dynamicChangeAllowed": true
                            },
                            {
                                "_type": "org.uengine.kernel.DefaultActivity",
                                "name": {
                                    "text": "DD"
                                },
                                "tracingTag": "4",
                                "retryDelay": 60,
                                "isDynamicChangeAllowed": true,
                                "elementView": {
                                    "_type": "org.uengine.kernel.view.DefaultActivityView",
                                    "id": "4",
                                    "parent": "SUB",
                                    "shapeId": "OG.shape.bpmn.A_Task",
                                    "x": 663,
                                    "y": 306,
                                    "width": 100,
                                    "height": 100,
                                    "style": "{\"stroke\":\"black\",\"fill-r\":1,\"fill-cx\":0.1,\"fill-cy\":0.1,\"fill\":\"#FFFFFF\",\"fill-opacity\":0,\"label-position\":\"center\",\"stroke-width\":1.2,\"r\":\"10\",\"cursor\":\"move\"}"
                                },
                                "dynamicChangeAllowed": true
                            }
                        ]
                    ],
                    "sequenceFlows": [
                        {
                            "relationView": {
                                "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                                "shapeId": "OG.shape.bpmn.C_Flow",
                                "value": "[[455,308],[613,308]]",
                                "style": "{\"stroke\":\"black\",\"fill-r\":\".5\",\"fill-cx\":\".5\",\"fill-cy\":\".5\",\"fill\":\"none\",\"fill-opacity\":0,\"label-position\":\"center\",\"stroke-width\":1.5,\"stroke-opacity\":1,\"edge-type\":\"plain\",\"arrow-start\":\"none\",\"arrow-end\":\"block\",\"stroke-dasharray\":\"\",\"stroke-linejoin\":\"round\",\"cursor\":\"pointer\"}"
                            },
                            "sourceRef": "3",
                            "targetRef": "4"
                        }
                    ],
                    "instanceId": "<%=Instance.Name%>",
                    "multipleInstanceLabel": {},
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.bpmn.StartEvent",
                    "name": {
                        "text": "AA"
                    },
                    "tracingTag": "1",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "1",
                        "parent": "4777a2aa-d9d0-9a22-fa82-d3cc69c60936",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 256,
                        "y": 237,
                        "width": 30,
                        "height": 30,
                        "style": "{\"stroke\":\"black\",\"fill-r\":\".5\",\"fill-cx\":\".5\",\"fill-cy\":\".5\",\"fill\":\"white\",\"fill-opacity\":0,\"label-position\":\"bottom\",\"stroke-width\":1.5,\"cursor\":\"move\"}"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.DefaultActivity",
                    "name": {
                        "text": "BB"
                    },
                    "tracingTag": "2",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "2",
                        "parent": "4777a2aa-d9d0-9a22-fa82-d3cc69c60936",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 257,
                        "y": 408,
                        "width": 100,
                        "height": 100,
                        "style": "{\"stroke\":\"black\",\"fill-r\":1,\"fill-cx\":0.1,\"fill-cy\":0.1,\"fill\":\"#FFFFFF\",\"fill-opacity\":0,\"label-position\":\"center\",\"stroke-width\":1.2,\"r\":\"10\",\"cursor\":\"move\"}"
                    },
                    "dynamicChangeAllowed": true
                }
            ]
        ],
        "roles": [
            {
                "name": "ROLE",
                "askWhenInit": true,
                "displayName": {},
                "elementView": {
                    "_type": "org.uengine.kernel.view.DefaultActivityView",
                    "id": "4777a2aa-d9d0-9a22-fa82-d3cc69c60936",
                    "shapeId": "OG.shape.bpmn.A_Task",
                    "x": 548,
                    "y": 362,
                    "width": 760,
                    "height": 366,
                    "style": "{\"stroke\":\"black\",\"fill-r\":\".5\",\"fill-cx\":\".5\",\"fill-cy\":\".5\",\"fill\":\"#ffffff\",\"fill-opacity\":0,\"label-position\":\"center\",\"label-direction\":\"vertical\",\"vertical-align\":\"top\",\"cursor\":\"move\"}"
                }
            }
        ],
        "sequenceFlows": [
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.bpmn.C_Flow",
                    "value": "[[256,252],[256,358]]",
                    "style": "{\"stroke\":\"black\",\"fill-r\":\".5\",\"fill-cx\":\".5\",\"fill-cy\":\".5\",\"fill\":\"none\",\"fill-opacity\":0,\"label-position\":\"center\",\"stroke-width\":1.5,\"stroke-opacity\":1,\"edge-type\":\"plain\",\"arrow-start\":\"none\",\"arrow-end\":\"block\",\"stroke-dasharray\":\"\",\"stroke-linejoin\":\"round\",\"cursor\":\"pointer\"}"
                },
                "sourceRef": "1",
                "targetRef": "2"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.bpmn.C_Flow",
                    "value": "[[256,252],[256,358]]",
                    "style": "{\"stroke\":\"black\",\"fill-r\":\".5\",\"fill-cx\":\".5\",\"fill-cy\":\".5\",\"fill\":\"none\",\"fill-opacity\":0,\"label-position\":\"center\",\"stroke-width\":1.5,\"stroke-opacity\":1,\"edge-type\":\"plain\",\"arrow-start\":\"none\",\"arrow-end\":\"block\",\"stroke-dasharray\":\"\",\"stroke-linejoin\":\"round\",\"cursor\":\"pointer\"}"
                },
                "sourceRef": "2",
                "targetRef": "SUB"
            }
        ],
        "defaultFlowchartViewType": "swimlane",
        "defaultFlowchartViewOption": "vertical",
        "duration": 10,
        "simulationInstanceCount": 10,
        "simulationInputFrequency": 10,
        "archive": true,
        "id": "codi/call2.json",
        "isAdhoc": true,
        "initiateByFirstWorkitem": true,
        "adhoc": true,
        "dynamicChangeAllowed": true
    }
}

인스턴스 실행 결과

- [uEngine] Start Executing Activity: AA (1)
- [uEngine] Start Executing Activity: BB (2)
default activity::execute: BB
- [uEngine] Start Executing Activity: SUB (SUB)
- [uEngine] Start Executing Activity: CC (3)
- [uEngine] Start Executing Activity: DD (4)
default activity::execute: DD
- [uEngine] End Executing Activity: DD (4) - Elapsed Time : 1
- [uEngine] End Executing Activity: CC (3) - Elapsed Time : 1
- [uEngine] End Executing Activity: SUB (SUB) - Elapsed Time : 1
- [uEngine] End Executing Activity: BB (2) - Elapsed Time : 1
- [uEngine] End Executing Activity: AA (1) - Elapsed Time : 1

InstanceService and Instance Monitoring

GET method on 'http://localhost:8080/instance/{instanceId}/variables'

will return:

{
    "Task_1mv9429:_status:prop": "Completed",
    ":_end_time:prop": 1503463573556,
    "Task_1mv9429:tokenCount:prop": 0,
    "Task_1bhopl7:_status:prop": "Completed",
    ":MESSAGE_onHumanActivityResultTask_1:prop": "Task_1",
    "ExclusiveGateway_00h0ahe:_start_time:prop": 1503463573554,
    "Task_1bhopl7:tokenCount:prop": 0,
    "StartEvent_17h60l3:_status:prop": "Completed",
    "Task_1bhopl7:_end_time:prop": 1503463573556,
    "Task_1:_task id:prop": "2",
    "Task_160le9n:tokenCount:prop": 0,
    "StartEvent_1:_start_time:prop": 1503463573514,
    "StartEvent_1:tokenCount:prop": 0,
    "Task_160le9n:_status:prop": "Completed",
    ":_status:prop": "Completed",
    "StartEvent_17h60l3:tokenCount:prop": 0,
    "Task_160le9n:_end_time:prop": 1503463573556,
    ":_due date:prop": 1504327573512,
    "EndEvent_1308wjc:_start_time:prop": 1503463573556,
    "Task_1:tokenCount:prop": 1,
    ":tokenCount:prop": 0,
    "EndEvent_1308wjc:_end_time:prop": 1503463573556,
    "StartEvent_1:_status:prop": "Completed",
    "ExclusiveGateway_00h0ahe:tokenCount:prop": 0,
    "Task_1mv9429:_start_time:prop": 1503463573556,
    "Task_1:_due date:prop": 1503895573538,
    "Task_1mv9429:_end_time:prop": 1503463573556,
    "StartEvent_17h60l3:_end_time:prop": 1503463573554,
    "ExclusiveGateway_00h0ahe:_status:prop": "Completed",
    "IntermediateThrowEvent_0j16tsn:tokenCount:prop": 1,
    "Task_1bhopl7:_start_time:prop": 1503463573556,
    "Task_1:_status:prop": "Running",
    "IntermediateThrowEvent_0j16tsn:_status:prop": "Running",
    "StartEvent_17h60l3:_start_time:prop": 1503463573554,
    "IntermediateThrowEvent_0j16tsn:_start_time:prop": 1503463573556,
    "Task_160le9n:_start_time:prop": 1503463573556,
    ":MESSAGE_event:prop": "StartEvent_1,StartEvent_17h60l3",
    "EndEvent_1308wjc:_status:prop": "Completed",
    "StartEvent_1:_end_time:prop": 1503463573514,
    "EndEvent_1308wjc:tokenCount:prop": 0,
    ":_start_time:prop": 1503463573512,
    "ExclusiveGateway_00h0ahe:_end_time:prop": 1503463573554,
    "Task_1:_start_time:prop": 1503463573535
}

And the process instance flow chart will shows each tasks running states:

  • if the task is running, the activity's background would be blinking.
  • if the task is done, a completed badge (check) would be marked on the activity box.
  • if the task is skipped, a skipped badge would be marked and so on.

Deployment

1단계 : mvn spring-boot:run 또는 java -jar <jar명> 사용하기.

  • Resource classpath 관련 로직 변경하기.
  • jar 배포
  • 클라이언트 location 변경

2단계 : dist 폴더 및 배포스크립트

API Pattern Standard Decisions (표준화 관련 결정 사항)

  • 복수형 or 단수형
 http://localhost:8080/instances or http://localhost:8080/instance
  • Hateoas 에서는 보통
 http://localhost:8080/instance 로 접근하면
 _embedded 에 instances 필드로서 자신의 리스트를 뿌리는 것이 표준임.
  • 따라서, 다음과 같이 표준화 함:
  복수형:  http://localhost:8080/instance  의 _embedded.instances 값을 가지고 옴
  단수형:  http://localhost:8080/instance/{id} 로 id 값을 넘겨서 받아옴

현재 표준에 따라 변경되어야 하는 url 들:

 ProcessInstanceRepository --> path="instance" 로 변경 필요
 WorkListRepository --> collectionResourceRel="worklists" 로 변경 필요
 RoleMappingRepository --> collectionResourceRel = "rolemappings" 로 변경 필요

[HumanActivity] Role Setting by Client-side or Server-side?

When I draw a process with a UserTask (HumanActivity) within a Lane (role), but when I initiate the process, it causes an exception below:

java.lang.IllegalStateException: Role is not set for HumanActivity [테스트]
	at org.uengine.kernel.HumanActivity.getActualMapping(HumanActivity.java:494) ~[classes/:na]
	at org.uengine.kernel.HumanActivity.addWorkitem(HumanActivity.java:602) ~[classes/:na]
	at org.uengine.kernel.HumanActivity.executeActivity(HumanActivity.java:594) ~[classes/:na]
	at org.uengine.kernel.AbstractProcessInstance.execute(AbstractProcessInstance.java:215) ~[classes/:na]
	at org.uengine.kernel.AbstractProcessInstance.execute(AbstractProcessInstance.java:163) ~[classes/:na]
	at org.uengine.kernel.ComplexActivity.queueActivity(ComplexActivity.java:398) ~[classes/:na]
	at org.uengine.kernel.bpmn.FlowActivity.onEvent(FlowActivity.java:258) ~[classes/:na]
	at org.uengine.kernel.ScopeActivity.onEvent(ScopeActivity.java:299) ~[classes/:na]
	at org.uengine.kernel.ProcessDefinition.onEvent(ProcessDefinition.java:815) ~[classes/:na]
	at org.uengine.kernel.Activity.onEvent(Activity.java:644) ~[classes/:na]
	at org.uengine.kernel.Activity.fireComplete(Activity.java:715) ~[classes/:na]
	at org.uengine.kernel.bpmn.StartEvent.executeActivity(StartEvent.java:14) ~[classes/:na]
	at org.uengine.kernel.AbstractProcessInstance.execute(AbstractProcessInstance.java:215) ~[classes/:na]
	at org.uengine.kernel.AbstractProcessInstance.execute(AbstractProcessInstance.java:163) ~[classes/:na]
	at org.uengine.kernel.ComplexActivity.queueActivity(ComplexActivity.java:398) ~[classes/:na]
	at org.uengine.kernel.bpmn.FlowActivity.executeActivity(FlowActivity.java:196) ~[classes/:na]
	at org.uengine.kernel.AbstractProcessInstance.execute(AbstractProcessInstance.java:215) ~[classes/:na]
	at org.uengine.kernel.AbstractProcessInstance.execute(AbstractProcessInstance.java:163) ~[classes/:na]
	at org.uengine.kernel.AbstractProcessInstance.execute(AbstractProcessInstance.java:157) ~[classes/:na]
	at org.uengine.kernel.AbstractProcessInstance$$FastClassBySpringCGLIB$$20e0f4f2.invoke(<generated>) ~[classes/:na]
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669) ~[spring-aop-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.uengine.five.JPAProcessInstance$$EnhancerBySpringCGLIB$$527ce8f9.execute(<generated>) ~[classes/:na]
	at org.uengine.social.service.DefinitionService.runDefinition(DefinitionService.java:201) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65]
	at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.metaworks.iam.IamRestFilter.doFilter(IamRestFilter.java:143) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.metaworks.multitenancy.tenantawarefilter.TenantAwareFilter.doFilter(TenantAwareFilter.java:78) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_65]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_65]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.14.jar:8.5.14]
	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_65]


which means, there's no role has been selected for the UserTask, so we need to decide which part of the system should set the role information for that UserTask.

REST Invocation Activity

  • Action: Invocation of a REST path and obtaining values from the JSON output.

  • Input : Template JSON which could be filled out with process variables or system variables (such as instance.id, or SpEL). http://jtwig.org/documentation/reference/tags/control-flow can be used as template engine, SpEL can be used as evaluator. I didn't verified the two can be merged.

  • Output: process variable changes from output JSON Path.

IAM-Avatar Tag

Usage 1: (Current login user avatar)

  • Description:
    VueJs tag that displays user avatar currently logged in and logout and profile detail button.
<iam-avatar></iam-avatar>

  • It doesn't have any attribute to iam-server, just request the logged in user information with client side's localStorage token.
  • It companies with the "iam-login" tag.

Usage 2 (User avatar if userId is provided)

<iam-avatar size="small" userId="[email protected]"></iam-avatar>
  • Displays user avatar with the provided 'userId' attribute. Loads the name of user by lazy loading (invoke iam-server API for getting the user name and portrait image)
  • When the avatar clicked, popup user information dialog for detail information - Bigger user image and displays detail information with a md-card view.

Opengraph for vue

Prop 타입 퍼포먼스 영향도

SvgTest.vue

<template>
  <div>
    <v-btn v-on:click="update()" flat class="orange--text">UpdateOne</v-btn>
    <v-btn v-on:click="updateAll()" flat class="orange--text">UpdateAll(expand)</v-btn>
    <v-btn v-on:click="updateCollapse()" flat class="orange--text">UpdateAll(collapse)</v-btn>
    <div style="width:10000px;height: 10000px">
      <svg height="10000" width="10000">

        <svg-test-element v-for="node in items" :x="node.x" :y="node.y" :path="node.path" :text="node.text" fill="none"
                          stroke="#000" :aaa="node.aaa">

        </svg-test-element>
      </svg>
    </div>
  </div>

</template>


<script>
  export default {
    props: {},

    data: function () {
      var items = [];
      for (var i = 0; i < 10000; i++) {
        var x = (i % 10) * 100;
        var y = Math.floor(i / 10) * 100 + 100;
        items.push(this.getGeom(x, y))
      }

      return {
        items: items
      };

    },

    watch: {
      items: function () {
        console.log('items change');
      }
    },

    computed: {},

    methods: {
      getGeom: function (x, y) {
        return {
          x: x,
          y: y,
          path: "M" + x + "," + y +
          "Q" + x + "," + (y - 10) + "," + (x + 10) + "," + (y - 10) +
          "L" + (x + 100) + "," + (y - 10) +
          "Q" + (x + 100) + "," + (y - 10) + "," + (x + 100) + "," + (y) +
          "L" + (x + 100) + "," + (y + 60) +
          "Q" + (x + 100) + "," + (y + 70) + "," + (x + 90) + "," + (y + 70) +
          "L" + (x + 10) + "," + (y + 70) +
          "Q" + (x) + "," + (y + 70) + "," + x + "," + (y + 60)
          + "Z",
          text: 'hello',
          aaa: {
            bbb: 'ccc'
          }
        }
      },
      update: function () {
        let geom = this.getGeom(50, 150);
        this.items[0].x = geom.x;
        this.items[0].y = geom.y;
        this.items[0].path = geom.path;
        this.items = JSON.parse(JSON.stringify(this.items))
      },
      updateAll: function () {
        var items = [];
        for (var i = 0; i < 10; i++) {
          var x = (i % 10) * 110;
          var y = Math.floor(i / 10) * 110 + 100;
          items.push(this.getGeom(x, y));
        }
        this.items = items;
      },
      updateCollapse: function () {
        var items = [];
        for (var i = 0; i < 10; i++) {
          var x = (i % 10) * 100;
          var y = Math.floor(i / 10) * 100 + 100;
          items.push(this.getGeom(x, y));
        }
        this.items = items;
      }
    }
  }
</script>

SvgTestElement.vue

<template>
  <g :x="x" :y="y" fill="none" stroke="#000">
    <path fill="url(#364r_.1__.1__FFFFFF-_FFFFCC)"
          stroke="#000000"
          :d="path"
          fill-r="1"
          fill-cx="0.1"
          fill-cy="0.1"
          opacity="1"
          fill-opacity="1"
          stroke-width="1.2"
          r="10"
          name="ORIGINAL_NODE"
          style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); opacity: 1; fill-opacity: 1; cursor: move;">
    </path>
    <g x="0" y="0" fill="none" stroke="#000" id="Task_1_LABEL"
       style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
      <text :x="x+50" :y="y+50" text-anchor="middle" font="10px 'serif'" stroke="none" fill="#000000"
            style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px; line-height: normal; font-family: serif; cursor: move; background-color: rgb(255, 255, 255);"
            fill-r="1" fill-cx="0.1" fill-cy="0.1" fill-opacity="1" stroke-width="1.2" r="10" font-size="12px"
            id="Task_1_LABELFO">
        <tspan dy="3.75" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
          {{ text }}
        </tspan>
      </text>
    </g>
  </g>
</template>


<script>
  export default {
    props: {
      x: Number,
      y: Number,
      path: String,
      text: String,
      aaa: Object
    },

    data: function () {

      return {};

    },

    watch: {
      aaa(){
        console.log('aaa');
      },
      x(){
          console.log('x');
      },
      y(){
        console.log('y');
      },
      path(){
        console.log('path');
      },
      text(){
        console.log('text');
      }
    },

    computed: {},

    methods: {}
  }
</script>

결과

2017-08-29 10 26 30

  • items 한개 업데이트시, items 안에 소속되어있는 다른 node 들은, String,Number 값이 같으므로 렌더링 재수행을 하지 않음. But Object 형식의 값은 새로운 값으로 인정이되서, 모든 노드드이 렌더링을 재수행해버림.

Class Object (OG.Canvas) prop 변경 테스트

다음과 같이 로직을 변경해봄.

SvgTest.vue

update: function () {
        let geom = this.getGeom(50, 150);
        this.items[0].x = geom.x;
        this.items[0].y = geom.y;
        this.items[0].path = geom.path;
        this.items[0].aaa = geom.aaa;
        //this.items = JSON.parse(JSON.stringify(this.items))

        this.canvas.drawShape([100,100],new OG.A_HumanTask('bbb'), [100,100]);
        this.canvas._CONFIG.AUTOMATIC_GUIDANCE = false;
      },

SvgTestElement.vue

watch: {
      canvas(){
        console.log('canvas');
      },
  • 이 경우 Update 를 통하여 상위 컴포넌트의 canvas 클래스의 메소드 실행, 컨피그레이션 변경시, 하위 컴포넌트에서 canvas watch 가 실행되지는 않는다. 그러나 canvas 를 호출했을 때 변경된 값은 접근가능하다. 이점을 잘 파악하여 제작할 것.

WorkItemService and work-item-handler tag component

WorkItemService that

  • completes, save workitem for POST action
  • for GET action, it returns current state of workitem

GET will returns:

{
    "worklist": {
        "taskId": 2,
        "instId": 1,
        "processInstance": null,
        "title": "피자선택",
        "description": null,
        "endpoint": "[email protected]",
        "roleName": "고객",
        "refRoleName": "null",
        "resName": "[email protected]",
        "defId": "codi/test2.json",
        "defName": "codi/test2.json",
        "trcTag": "Task_1",
        "tool": "defaultHandler",
        "parameter": null,
        "priority": 1,
        "startDate": 1503415481615,
        "endDate": null,
        "saveDate": null,
        "dueDate": 1503847481617,
        "status": "NEW",
        "dispatchOption": 0,
        "dispatchParam1": null,
        "prevUserName": null,
        "rootInstId": 1,
        "readDate": null,
        "actType": null,
        "absTrcTag": null,
        "delegated": null,
        "urget": null,
        "execScope": null,
        "ext1": null,
        "ext2": null,
        "ext3": null,
        "ext4": null,
        "ext5": null
    },
    "activity": {
        "metaworksContext": null,
        "viewId": null,
        "breakpoint": false,
        "name": "피자선택",
        "description": null,
        "tracingTag": "Task_1",
        "cost": 0,
        "extendedAttributes": null,
        "retryLimit": 0,
        "retryDelay": 60,
        "integrity": 0,
        "activityIcon": null,
        "statusCode": null,
        "checked": false,
        "elementView": {
            "id": "Task_1",
            "parent": null,
            "shapeId": "OG.shape.bpmn.A_HumanTask",
            "x": 366,
            "y": 248,
            "width": 100,
            "height": 80,
            "fromEdge": null,
            "toEdge": null,
            "label": "피자선택",
            "style": null,
            "index": 0,
            "metaworksContext": null,
            "instStatus": null,
            "backgroundColor": null,
            "viewType": null,
            "propertyDialogHeight": 700,
            "propertyDialogWidth": 800,
            "elementViewActionDelegate": null,
            "changed": false,
            "byDrop": false
        },
        "document": null,
        "message": "onHumanActivityResultTask_1",
        "messageDefinition": null,
        "parameters": null,
        "fromRole": null,
        "mapper": null,
        "mapperIn": null,
        "mappingContexts": null,
        "mappingContextsIn": null,
        "role": {
            "metaworksContext": null,
            "name": "고객",
            "roleResolutionContext": null,
            "dispatchingOption": 0,
            "serviceType": null,
            "askWhenInit": true,
            "identifier": null,
            "defaultEndpoint": null,
            "displayName": {
                "text": null,
                "localedTexts": null
            },
            "dontPersistResolutionResult": false,
            "currentEditorId": null,
            "elementView": {
                "id": "Process_1",
                "parent": "null",
                "shapeId": "OG.shape.HorizontalLaneShape",
                "x": 753,
                "y": 317,
                "width": 1268,
                "height": 258,
                "fromEdge": null,
                "toEdge": null,
                "label": "고객",
                "style": null,
                "index": 0,
                "metaworksContext": null,
                "instStatus": null,
                "backgroundColor": null,
                "viewType": null,
                "propertyDialogHeight": 0,
                "propertyDialogWidth": 0,
                "elementViewActionDelegate": null,
                "changed": false,
                "byDrop": false
            },
            "description": null,
            "humanWorker": false
        },
        "referenceRole": null,
        "tool": "defaultHandler",
        "id": null,
        "duration": 5,
        "co2Emission": 0,
        "workload": 0,
        "priority": 0,
        "input": null,
        "extValue1": null,
        "extValue2": null,
        "extValue3": null,
        "extValue4": null,
        "extValue5": null,
        "extValue6": null,
        "extValue7": null,
        "extValue8": null,
        "extValue9": null,
        "extValue10": null,
        "instruction": {
            "text": null,
            "localedTexts": {}
        },
        "keyword": {
            "text": null,
            "localedTexts": {}
        },
        "notificationWorkitem": false,
        "parameterMap": null,
        "sendEmailWorkitem": true,
        "allowAnonymous": true,
        "hidden": false,
        "previousActivities": [
            {
                "metaworksContext": null,
                "viewId": null,
                "breakpoint": false,
                "name": "피자먹고싶어",
                "description": null,
                "tracingTag": "StartEvent_1",
                "cost": 0,
                "extendedAttributes": null,
                "retryLimit": 0,
                "retryDelay": 60,
                "integrity": 0,
                "activityIcon": null,
                "statusCode": null,
                "checked": false,
                "elementView": {
                    "id": "StartEvent_1",
                    "parent": null,
                    "shapeId": "OG.shape.bpmn.E_Start",
                    "x": 233,
                    "y": 248,
                    "width": 30,
                    "height": 30,
                    "fromEdge": null,
                    "toEdge": null,
                    "label": "피자먹고싶어",
                    "style": null,
                    "index": 0,
                    "metaworksContext": null,
                    "instStatus": null,
                    "backgroundColor": null,
                    "viewType": null,
                    "propertyDialogHeight": 0,
                    "propertyDialogWidth": 0,
                    "elementViewActionDelegate": null,
                    "changed": false,
                    "byDrop": false
                },
                "document": null,
                "attachedToRef": null,
                "eventType": null,
                "intermediate": false,
                "startTriggerCode": null,
                "message": "event",
                "hidden": false,
                "previousActivities": null,
                "dynamicChangeAllowed": true,
                "queuingEnabled": false,
                "faultTolerant": false
            }
        ],
        "dynamicChangeAllowed": true,
        "queuingEnabled": false,
        "faultTolerant": false
    },
}

if you changes the worklist.status to following values and POST it, it will be:

  1. 'COMPLETED': workitem will be completed,
  2. 'DRAFT': workitem will be saved with the changes.
  3. 'CANCELLED': workitem will be skipped.

the state mapping are found at : DefaultWorkList.java:

public class DefaultWorkList implements WorkList{

	public final static String WORKITEM_STATUS_DRAFT	= "DRAFT";
	public final static String WORKITEM_STATUS_NEW 		= "NEW";
	public final static String WORKITEM_STATUS_CONFIRMED= "CONFIRMED";
	public final static String WORKITEM_STATUS_RESERVED	= "RESERVED";
	public final static String WORKITEM_STATUS_REFERENCE= "REFERENCE";
	public final static String WORKITEM_STATUS_COMPLETED= "COMPLETED";
	public final static String WORKITEM_STATUS_CANCELLED= "CANCELLED";
	public final static String WORKITEM_STATUS_SUSPENDED= "SUSPENDED";
	//When user delegate a workitem, the workitem's status whould be changed to this status and another workitem.	
	public final static String WORKITEM_STATUS_DELEGATED= "DELEGATED"; 

Transaction Demacation and Listening before commit event

before commit 에 대한 aop event 를 만드는 것이 가장 빠른 방법.

JPAProcessInstance 가 새로운 인스턴스를 생성시마다 자신을 ThreadLocal 객체에 저장해놓으면 한 트랜잭션에 발생한 모든 인스턴스들을 끄집어 냄.

기존 ProcessTransactionContext를 재사용 하거나 발췌하여 사용하면 sharedContext 등을 사용할 수는 있을것임.

스프링에서의 per request 에 local 한 값을 저장하는 방법이 있다면 좋고 그걸 사용하는것도 좋음. 하나의 문맥에 유일한 ...

Generic Typed JSON Framework

Generic typed json that doesn't require any prior knowledge on the Java type.

Useful for serialization of any POJO object when it required to be serialized or processed by javascript.

The format:

{
    "definition": {
        "_type": "org.uengine.kernel.ProcessDefinition",
        "name": {},
        "retryDelay": 60,
        "isDynamicChangeAllowed": true,
        "childActivities": [
            "java.util.ArrayList",
            [
                {
                    "_type": "org.uengine.kernel.bpmn.StartEvent",
                    "name": {
                        "text": "??????"
                    },
                    "tracingTag": "StartEvent_1",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.bpmn.view.StartEventView",
                        "id": "StartEvent_1",
                        "shapeId": "OG.shape.bpmn.E_Start",
                        "x": 233,
                        "y": 248,
                        "width": 30,
                        "height": 30,
                        "label": "??????"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.HumanActivity",
                    "name": {
                        "text": "????"
                    },
                    "description": {},
                    "tracingTag": "Task_1",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.HumanActivityView",
                        "id": "Task_1",
                        "shapeId": "OG.shape.bpmn.A_HumanTask",
                        "x": 366,
                        "y": 248,
                        "width": 100,
                        "height": 80,
                        "label": "????",
                        "propertyDialogHeight": 700,
                        "propertyDialogWidth": 800
                    },
                    "message": "onHumanActivityResultTask_1",
                    "role": {
                        "name": "??",
                        "askWhenInit": true,
                        "displayName": {},
                        "elementView": {
                            "_type": "org.uengine.kernel.view.RoleView",
                            "id": "Process_1",
                            "parent": "null",
                            "shapeId": "OG.shape.HorizontalLaneShape",
                            "x": 753,
                            "y": 317,
                            "width": 1268,
                            "height": 258,
                            "label": "??"
                        }
                    },
                    "tool": "defaultHandler",
                    "isSendEmailWorkitem": true,
                    "isAllowAnonymous": true,
                    "duration": 5,
                    "instruction": {},
                    "keyword": {},
                    "sendEmailWorkitem": true,
                    "allowAnonymous": true,
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.bpmn.Gateway",
                    "name": {},
                    "tracingTag": "ExclusiveGateway_1w7uff2",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.bpmn.view.GatewayView",
                        "id": "ExclusiveGateway_1w7uff2",
                        "shapeId": "OG.shape.bpmn.G_Gateway",
                        "x": 607,
                        "y": 248,
                        "width": 50,
                        "height": 50
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.bpmn.Event",
                    "name": {
                        "text": "1???"
                    },
                    "tracingTag": "IntermediateCatchEvent_1sumefn",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.bpmn.view.EventView",
                        "id": "IntermediateCatchEvent_1sumefn",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 702,
                        "y": 333,
                        "width": 36,
                        "height": 36,
                        "label": "1???"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.DefaultActivity",
                    "name": {
                        "text": "??"
                    },
                    "tracingTag": "Task_18dzztd",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "Task_18dzztd",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 1061,
                        "y": 248,
                        "width": 100,
                        "height": 80,
                        "label": "??"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.DefaultActivity",
                    "name": {
                        "text": "??"
                    },
                    "tracingTag": "Task_1aittr0",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "Task_1aittr0",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 1179,
                        "y": 248,
                        "width": 100,
                        "height": 80,
                        "label": "??"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.bpmn.EndEvent",
                    "name": {
                        "text": "???"
                    },
                    "tracingTag": "EndEvent_1hrop0e",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.bpmn.view.EndEventView",
                        "id": "EndEvent_1hrop0e",
                        "shapeId": "OG.shape.bpmn.E_End",
                        "x": 1279,
                        "y": 248,
                        "width": 36,
                        "height": 36,
                        "label": "???"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.bpmn.Event",
                    "name": {
                        "text": "????"
                    },
                    "tracingTag": "IntermediateCatchEvent_15fabo1",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.bpmn.view.EventView",
                        "id": "IntermediateCatchEvent_15fabo1",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 970,
                        "y": 248,
                        "width": 36,
                        "height": 36,
                        "label": "????"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.DefaultActivity",
                    "name": {
                        "text": "????"
                    },
                    "tracingTag": "Task_0htz8uy",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "Task_0htz8uy",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 502,
                        "y": 248,
                        "width": 100,
                        "height": 80,
                        "label": "????"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.DefaultActivity",
                    "name": {
                        "text": "???????"
                    },
                    "tracingTag": "Task_0j7mean",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "Task_0j7mean",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 824,
                        "y": 333,
                        "width": 100,
                        "height": 80,
                        "label": "???????"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.DefaultActivity",
                    "name": {
                        "text": "?? ??"
                    },
                    "tracingTag": "Task_1mv9429",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "Task_1mv9429",
                        "parent": "Lane_1rbv5es",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 426,
                        "y": 659,
                        "width": 100,
                        "height": 80,
                        "label": "?? ??"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.DefaultActivity",
                    "name": {
                        "text": "???"
                    },
                    "tracingTag": "Task_160le9n",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "Task_160le9n",
                        "parent": "Lane_1rvfkbb",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 1062,
                        "y": 783,
                        "width": 100,
                        "height": 80,
                        "label": "???"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.bpmn.EndEvent",
                    "name": {},
                    "tracingTag": "EndEvent_1308wjc",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.bpmn.view.EndEventView",
                        "id": "EndEvent_1308wjc",
                        "parent": "Lane_1rvfkbb",
                        "shapeId": "OG.shape.bpmn.E_End",
                        "x": 1157,
                        "y": 783,
                        "width": 36,
                        "height": 36
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.bpmn.StartEvent",
                    "name": {
                        "text": "????"
                    },
                    "tracingTag": "StartEvent_17h60l3",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.bpmn.view.StartEventView",
                        "id": "StartEvent_17h60l3",
                        "parent": "Lane_0mi5sok",
                        "shapeId": "OG.shape.bpmn.E_Start",
                        "x": 235,
                        "y": 538,
                        "width": 36,
                        "height": 36,
                        "label": "????"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.bpmn.ParallelGateway",
                    "name": {},
                    "tracingTag": "ExclusiveGateway_00h0ahe",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.bpmn.view.ParallelGatewayView",
                        "id": "ExclusiveGateway_00h0ahe",
                        "parent": "Lane_0mi5sok",
                        "shapeId": "OG.shape.bpmn.G_Parallel",
                        "x": 322,
                        "y": 538,
                        "width": 50,
                        "height": 50
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.bpmn.Event",
                    "name": {
                        "text": "????"
                    },
                    "tracingTag": "IntermediateThrowEvent_0j16tsn",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.bpmn.view.EventView",
                        "id": "IntermediateThrowEvent_0j16tsn",
                        "parent": "Lane_0mi5sok",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 408,
                        "y": 538,
                        "width": 36,
                        "height": 36,
                        "label": "????"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.DefaultActivity",
                    "name": {
                        "text": "?????"
                    },
                    "tracingTag": "Task_0l1zagg",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "Task_0l1zagg",
                        "parent": "Lane_0mi5sok",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 515,
                        "y": 538,
                        "width": 100,
                        "height": 80,
                        "label": "?????"
                    },
                    "dynamicChangeAllowed": true
                },
                {
                    "_type": "org.uengine.kernel.DefaultActivity",
                    "name": {
                        "text": "????"
                    },
                    "tracingTag": "Task_1bhopl7",
                    "retryDelay": 60,
                    "isDynamicChangeAllowed": true,
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView",
                        "id": "Task_1bhopl7",
                        "parent": "Lane_1rvfkbb",
                        "shapeId": "OG.shape.bpmn.A_Task",
                        "x": 849,
                        "y": 784,
                        "width": 100,
                        "height": 80,
                        "label": "????"
                    },
                    "dynamicChangeAllowed": true
                }
            ]
        ],
        "roles": [
            {
                "name": "??",
                "askWhenInit": true,
                "displayName": {},
                "elementView": {
                    "_type": "org.uengine.kernel.view.RoleView",
                    "id": "Process_1",
                    "parent": "null",
                    "shapeId": "OG.shape.HorizontalLaneShape",
                    "x": 753,
                    "y": 317,
                    "width": 1268,
                    "height": 258,
                    "label": "??"
                }
            },
            {
                "name": "?",
                "askWhenInit": true,
                "displayName": {},
                "elementView": {
                    "_type": "org.uengine.kernel.view.RoleView",
                    "shapeId": "OG.shape.HorizontalLaneShape",
                    "label": "?"
                }
            },
            {
                "name": "???",
                "askWhenInit": true,
                "displayName": {},
                "elementView": {
                    "_type": "org.uengine.kernel.view.RoleView",
                    "id": "Lane_1rbv5es",
                    "parent": "Lane_Set",
                    "shapeId": "OG.shape.HorizontalLaneShape",
                    "x": 769,
                    "y": 660,
                    "width": 1239,
                    "height": 125,
                    "label": "???"
                }
            },
            {
                "name": "???",
                "askWhenInit": true,
                "displayName": {},
                "elementView": {
                    "_type": "org.uengine.kernel.view.RoleView",
                    "id": "Lane_1rvfkbb",
                    "parent": "Lane_Set",
                    "shapeId": "OG.shape.HorizontalLaneShape",
                    "x": 769,
                    "y": 783,
                    "width": 1239,
                    "height": 121,
                    "label": "???"
                }
            },
            {
                "name": "??",
                "askWhenInit": true,
                "displayName": {},
                "elementView": {
                    "_type": "org.uengine.kernel.view.RoleView",
                    "id": "Lane_0mi5sok",
                    "parent": "Lane_Set",
                    "shapeId": "OG.shape.HorizontalLaneShape",
                    "x": 769,
                    "y": 537,
                    "width": 1239,
                    "height": 120,
                    "label": "??"
                }
            }
        ],
        "sequenceFlows": [
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 406,
                    "y": 372,
                    "width": 316,
                    "from": "StartEvent_1_TERMINAL_C_INOUT_0",
                    "to": "Task_1_TERMINAL_C_INOUT_0",
                    "value": "[233,248],[366,248]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B233%2C248%5D%2C%5B366%2C248%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "StartEvent_1",
                "targetRef": "Task_1"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 642,
                    "y": 372,
                    "width": 452,
                    "from": "Task_1_TERMINAL_C_INOUT_0",
                    "to": "Task_0htz8uy_TERMINAL_C_INOUT_0",
                    "value": "[366,248],[502,248]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B366%2C248%5D%2C%5B502%2C248%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "Task_1",
                "targetRef": "Task_0htz8uy"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 843,
                    "y": 372,
                    "width": 582,
                    "from": "Task_0htz8uy_TERMINAL_C_INOUT_0",
                    "to": "ExclusiveGateway_1w7uff2_TERMINAL_C_INOUT_0",
                    "value": "[607,248],[502,248]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B607%2C248%5D%2C%5B502%2C248%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "Task_0htz8uy",
                "targetRef": "ExclusiveGateway_1w7uff2"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 1342.5,
                    "y": 499.5,
                    "width": 937,
                    "from": "Task_0j7mean_TERMINAL_C_INOUT_0",
                    "to": "ExclusiveGateway_1w7uff2_TERMINAL_C_INOUT_0",
                    "value": "[607,248],[824,333]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B607%2C248%5D%2C%5B824%2C333%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "Task_0j7mean",
                "targetRef": "ExclusiveGateway_1w7uff2"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 910.5,
                    "y": 439.5,
                    "width": 607,
                    "from": "ExclusiveGateway_1w7uff2_TERMINAL_C_INOUT_0",
                    "to": "IntermediateCatchEvent_1sumefn_TERMINAL_C_INOUT_0",
                    "value": "[607,248],[702,333]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B607%2C248%5D%2C%5B702%2C333%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "ExclusiveGateway_1w7uff2",
                "targetRef": "IntermediateCatchEvent_1sumefn"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 1108.5,
                    "y": 372,
                    "width": 953,
                    "from": "ExclusiveGateway_1w7uff2_TERMINAL_C_INOUT_0",
                    "to": "IntermediateCatchEvent_15fabo1_TERMINAL_C_INOUT_0",
                    "value": "[607,248],[970,248]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B607%2C248%5D%2C%5B970%2C248%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "ExclusiveGateway_1w7uff2",
                "targetRef": "IntermediateCatchEvent_15fabo1"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 1094.5,
                    "y": 499.5,
                    "width": 749,
                    "from": "IntermediateCatchEvent_1sumefn_TERMINAL_C_INOUT_0",
                    "to": "Task_0j7mean_TERMINAL_C_INOUT_0",
                    "value": "[702,333],[824,333]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B702%2C333%5D%2C%5B824%2C333%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "IntermediateCatchEvent_1sumefn",
                "targetRef": "Task_0j7mean"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 1493.5,
                    "y": 372,
                    "width": 1011,
                    "from": "IntermediateCatchEvent_15fabo1_TERMINAL_C_INOUT_0",
                    "to": "Task_18dzztd_TERMINAL_C_INOUT_0",
                    "value": "[1061,248],[970,248]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B1061%2C248%5D%2C%5B970%2C248%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "IntermediateCatchEvent_15fabo1",
                "targetRef": "Task_18dzztd"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 1675.5,
                    "y": 372,
                    "width": 1129,
                    "from": "Task_18dzztd_TERMINAL_C_INOUT_0",
                    "to": "Task_1aittr0_TERMINAL_C_INOUT_0",
                    "value": "[1061,248],[1179,248]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B1061%2C248%5D%2C%5B1179%2C248%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "Task_18dzztd",
                "targetRef": "Task_1aittr0"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 1859.5,
                    "y": 372,
                    "width": 1261,
                    "from": "Task_1aittr0_TERMINAL_C_INOUT_0",
                    "to": "EndEvent_1hrop0e_TERMINAL_C_INOUT_0",
                    "value": "[1179,248],[1279,248]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B1179%2C248%5D%2C%5B1279%2C248%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "Task_1aittr0",
                "targetRef": "EndEvent_1hrop0e"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 390.5,
                    "y": 807,
                    "width": 275,
                    "from": "StartEvent_17h60l3_TERMINAL_C_INOUT_0",
                    "to": "ExclusiveGateway_00h0ahe_TERMINAL_C_INOUT_0",
                    "value": "[235,538],[322,538]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B235%2C538%5D%2C%5B322%2C538%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "StartEvent_17h60l3",
                "targetRef": "ExclusiveGateway_00h0ahe"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 531.5,
                    "y": 807,
                    "width": 369,
                    "from": "ExclusiveGateway_00h0ahe_TERMINAL_C_INOUT_0",
                    "to": "IntermediateThrowEvent_0j16tsn_TERMINAL_C_INOUT_0",
                    "value": "[322,538],[408,538]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B322%2C538%5D%2C%5B408%2C538%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "ExclusiveGateway_00h0ahe",
                "targetRef": "IntermediateThrowEvent_0j16tsn"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 658.5,
                    "y": 807,
                    "width": 465,
                    "from": "IntermediateThrowEvent_0j16tsn_TERMINAL_C_INOUT_0",
                    "to": "Task_0l1zagg_TERMINAL_C_INOUT_0",
                    "value": "[408,538],[515,538]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B408%2C538%5D%2C%5B515%2C538%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "IntermediateThrowEvent_0j16tsn",
                "targetRef": "Task_0l1zagg"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 711,
                    "y": 871,
                    "width": 474,
                    "from": "Task_0l1zagg_TERMINAL_C_INOUT_0",
                    "to": "IntermediateThrowEvent_0j16tsn_TERMINAL_C_INOUT_0",
                    "value": "[408,538],[515,538]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B408%2C538%5D%2C%5B515%2C538%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "Task_0l1zagg",
                "targetRef": "IntermediateThrowEvent_0j16tsn"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 483,
                    "y": 892.5,
                    "width": 322,
                    "from": "ExclusiveGateway_00h0ahe_TERMINAL_C_INOUT_0",
                    "to": "Task_1mv9429_TERMINAL_C_INOUT_0",
                    "value": "[426,659],[322,538]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B426%2C659%5D%2C%5B322%2C538%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "ExclusiveGateway_00h0ahe",
                "targetRef": "Task_1mv9429"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 794.5,
                    "y": 988.5,
                    "width": 637,
                    "from": "Task_1mv9429_TERMINAL_C_INOUT_0",
                    "to": "Task_1bhopl7_TERMINAL_C_INOUT_0",
                    "value": "[426,659],[849,784]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B426%2C659%5D%2C%5B849%2C784%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "Task_1mv9429",
                "targetRef": "Task_1bhopl7"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 1405,
                    "y": 1174.5,
                    "width": 1012,
                    "from": "Task_1bhopl7_TERMINAL_C_INOUT_0",
                    "to": "Task_160le9n_TERMINAL_C_INOUT_0",
                    "value": "[1062,783],[849,784]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B1062%2C783%5D%2C%5B849%2C784%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "Task_1bhopl7",
                "targetRef": "Task_160le9n"
            },
            {
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0",
                    "shapeId": "OG.shape.EdgeShape",
                    "x": 1681.5,
                    "y": 1174.5,
                    "width": 1139,
                    "from": "Task_160le9n_TERMINAL_C_INOUT_0",
                    "to": "EndEvent_1308wjc_TERMINAL_C_INOUT_0",
                    "value": "[1062,783],[1157,783]",
                    "geom": "%7B%22type%22%3A%22PolyLine%22%2C%22vertices%22%3A%5B%5B1062%2C783%5D%2C%5B1157%2C783%5D%5D%7D",
                    "style": "%7B%22map%22%3A%7B%22stroke%22%3A%22black%22%2C%22fill-r%22%3A%22.5%22%2C%22fill-cx%22%3A%22.5%22%2C%22fill-cy%22%3A%22.5%22%2C%22fill%22%3A%22none%22%2C%22fill-opacity%22%3A0%2C%22label-position%22%3A%22center%22%2C%22stroke-width%22%3A1.5%2C%22stroke-opacity%22%3A1%2C%22edge-type%22%3A%22plain%22%2C%22edge-direction%22%3A%22c+c%22%2C%22arrow-start%22%3A%22none%22%2C%22arrow-end%22%3A%22block%22%2C%22stroke-dasharray%22%3A%22%22%2C%22stroke-linejoin%22%3A%22round%22%2C%22cursor%22%3A%22pointer%22%7D%7D"
                },
                "sourceRef": "Task_160le9n",
                "targetRef": "EndEvent_1308wjc"
            }
        ],
        "defaultFlowchartViewType": "swimlane",
        "defaultFlowchartViewOption": "vertical",
        "duration": 10,
        "simulationInstanceCount": 10,
        "simulationInputFrequency": 10,
        "archive": true,
        "isAdhoc": true,
        "initiateByFirstWorkitem": true,
        "adhoc": true,
        "dynamicChangeAllowed": true
    }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.