Skip to content

uEngine5 API Reference

Jinyoung Jang edited this page Mar 16, 2018 · 20 revisions

원칙

  • uEngine5 의 모든 API 들은 REST MM 3 인 Hateoas(HAL) 수준을 준수한다: https://en.wikipedia.org/wiki/HATEOAS
  • 따라서 hybind 와 같은 Javascript binding library 를 통해 쉽게 UI 와 인터랙션 하도록 한다.

Resources

/definition

  • 폴더의 생성
http PUT localhost:8080/definition/folder
http POST localhost:8080/definition/folder/folder2
http POST localhost:8080/definition name="new folder" directory=true
  • 정의의 저장: (raw 가 꼭 들어가야 한다)
http POST localhost:8080/definition/raw/folder/object1.json definition="Hello"
http POST localhost:8080/definition/raw/folder/object2.json definition="Hello this is object 2"
  • 정의의 인출: (raw 가 꼭 들어가야 한다)
http GET localhost:8080/definition/raw/folder/object1.json
http GET localhost:8080/definition/raw/folder/object1.json unwrap==true # definition wrapping 을 하지 않음
  • 파일의 리스팅
http GET localhost:8080/definition
http GET localhost:8080/definition/folder
결과
{
    "_embedded": {
        "definitions": [
            {
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/definition/folder/folder2"
                    }
                }, 
                "directory": true, 
                "name": "folder2", 
                "path": "folder/folder2"
            }, 
            {
                "_links": {
                    "raw": {
                        "href": "http://localhost:8080/definition/raw/folder/object1.json"
                    }, 
                    "self": {
                        "href": "http://localhost:8080/definition/folder/object1.json"
                    }
                }, 
                "directory": false, 
                "name": "object1.json", 
                "path": "folder/object1.json"
            }, 
            {
                "_links": {
                    "raw": {
                        "href": "http://localhost:8080/definition/raw/folder/object2.json"
                    }, 
                    "self": {
                        "href": "http://localhost:8080/definition/folder/object2.json"
                    }
                }, 
                "directory": false, 
                "name": "object2.json", 
                "path": "folder/object2.json"
            }
        ]
    }
}
  • 파일명의 변경
http PATCH localhost:8080/definition/folder/object1.json path="folder/object_one.json"
  • 파일위치의 변경
http PATCH localhost:8080/definition/folder/object2.json path="folder/folder2/object2.json"
  • 폴더명의 변경
http PATCH localhost:8080/definition/folder/folder2 path="folder/folder_two"
  • 파일/폴더의 삭제
http DELETE localhost:8080/definition/folder/folder_two
http DELETE localhost:8080/definition/folder/object2.json
  • 프로세스 정의 디플로이

다음을 body 로 하여, localhost:8080/definition/raw/process.json 으로 POST 한다:

vi process.json
http localhost:8080/definition/raw/process.json < process.json
프로세스 정의 JSON
{
    "definition": {
        "_type": "org.uengine.kernel.ProcessDefinition", 
        "adhoc": true, 
        "archive": true, 
        "childActivities": [
            "java.util.ArrayList", 
            [
                {
                    "_type": "org.uengine.kernel.bpmn.StartEvent", 
                    "description": {}, 
                    "dynamicChangeAllowed": true, 
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView", 
                        "height": 30.0, 
                        "id": "2", 
                        "parent": "d2852bad-5291-5ca4-aaf5-b61eac1d3aa7", 
                        "shapeId": "OG.shape.bpmn.A_Task", 
                        "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\"}", 
                        "width": 30.0, 
                        "x": 263.0, 
                        "y": 187.0
                    }, 
                    "isDynamicChangeAllowed": true, 
                    "name": {}, 
                    "retryDelay": 60, 
                    "tracingTag": "2"
                }, 
                {
                    "_type": "org.uengine.kernel.bpmn.EndEvent", 
                    "description": {}, 
                    "dynamicChangeAllowed": true, 
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView", 
                        "height": 30.0, 
                        "id": "3", 
                        "parent": "d2852bad-5291-5ca4-aaf5-b61eac1d3aa7", 
                        "shapeId": "OG.shape.bpmn.A_Task", 
                        "style": "{\"stroke\":\"black\",\"fill-r\":\".5\",\"fill-cx\":\".5\",\"fill-cy\":\".5\",\"fill\":\"white\",\"fill-opacity\":0,\"label-position\":\"bottom\",\"stroke-width\":3,\"cursor\":\"move\"}", 
                        "width": 30.0, 
                        "x": 767.0, 
                        "y": 188.0
                    }, 
                    "isDynamicChangeAllowed": true, 
                    "name": {}, 
                    "retryDelay": 60, 
                    "tracingTag": "3"
                }, 
                {
                    "_type": "org.uengine.kernel.bpmn.CallActivity", 
                    "definitionId": "new-process-definition4", 
                    "description": {}, 
                    "dynamicChangeAllowed": true, 
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView", 
                        "height": 100.0, 
                        "id": "6", 
                        "parent": "d2852bad-5291-5ca4-aaf5-b61eac1d3aa7", 
                        "shapeId": "OG.shape.bpmn.A_Task", 
                        "style": "{\"stroke\":\"black\",\"fill-r\":1,\"fill-cx\":0.1,\"fill-cy\":0.1,\"fill\":\"#FFFFFF\",\"fill-opacity\":0,\"label-position\":\"center\",\"stroke-width\":3,\"r\":\"10\",\"cursor\":\"move\"}", 
                        "width": 100.0, 
                        "x": 531.0, 
                        "y": 371.0
                    }, 
                    "instanceId": "<%=Instance.Name%>", 
                    "isDynamicChangeAllowed": true, 
                    "multipleInstanceLabel": {}, 
                    "name": {
                        "text": "????"
                    }, 
                    "retryDelay": 60, 
                    "roleBindings": [
                        {
                            "argument": "role1", 
                            "direction": "IN-OUT", 
                            "role": {
                                "askWhenInit": true, 
                                "displayName": {}, 
                                "name": "role1"
                            }
                        }, 
                        {
                            "argument": "role2", 
                            "direction": "IN-OUT", 
                            "role": {
                                "askWhenInit": true, 
                                "displayName": {}, 
                                "name": "role2"
                            }
                        }
                    ], 
                    "tracingTag": "6", 
                    "variableBindings": [
                        {
                            "argument": {
                                "text": "aaa"
                            }, 
                            "direction": "IN-OUT", 
                            "variable": {
                                "defaultValue": "", 
                                "displayName": {}, 
                                "name": "aaa", 
                                "type": "java.lang.String", 
                                "typeClassName": "java.lang.String"
                            }
                        }, 
                        {
                            "argument": {
                                "text": "bbb"
                            }, 
                            "direction": "IN-OUT", 
                            "variable": {
                                "defaultValue": "", 
                                "displayName": {}, 
                                "name": "bbb", 
                                "type": "java.lang.String", 
                                "typeClassName": "java.lang.String"
                            }
                        }
                    ]
                }, 
                {
                    "_type": "org.uengine.kernel.HumanActivity", 
                    "allowAnonymous": true, 
                    "description": {}, 
                    "duration": 5, 
                    "dynamicChangeAllowed": true, 
                    "elementView": {
                        "_type": "org.uengine.kernel.view.DefaultActivityView", 
                        "height": 100.0, 
                        "id": "4", 
                        "parent": "d2852bad-5291-5ca4-aaf5-b61eac1d3aa7", 
                        "shapeId": "OG.shape.bpmn.A_Task", 
                        "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\"}", 
                        "width": 100.0, 
                        "x": 431.0, 
                        "y": 187.0
                    }, 
                    "instruction": {}, 
                    "isAllowAnonymous": true, 
                    "isDynamicChangeAllowed": true, 
                    "isSendEmailWorkitem": true, 
                    "keyword": {}, 
                    "name": {
                        "text": "??2"
                    }, 
                    "parameters": [
                        {
                            "argument": {
                                "text": "arg"
                            }, 
                            "direction": "OUT", 
                            "multipleInput": true, 
                            "variable": {
                                "defaultValue": "", 
                                "displayName": {}, 
                                "name": "aaa", 
                                "type": "java.lang.String", 
                                "typeClassName": "java.lang.String"
                            }
                        }, 
                        {
                            "argument": {
                                "text": "arg2"
                            }, 
                            "direction": "OUT", 
                            "variable": {
                                "defaultValue": "", 
                                "displayName": {}, 
                                "name": "bbb", 
                                "type": "java.lang.String", 
                                "typeClassName": "java.lang.String"
                            }
                        }
                    ], 
                    "retryDelay": 60, 
                    "role": {
                        "askWhenInit": true, 
                        "displayName": {}, 
                        "elementView": {
                            "_type": "org.uengine.kernel.view.DefaultActivityView", 
                            "height": 218.0, 
                            "id": "OG_3580_88", 
                            "parent": "d2852bad-5291-5ca4-aaf5-b61eac1d3aa7", 
                            "shapeId": "OG.shape.bpmn.A_Task", 
                            "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\"}", 
                            "width": 690.0, 
                            "x": 528.0, 
                            "y": 187.0
                        }, 
                        "name": "role1"
                    }, 
                    "sendEmailWorkitem": true, 
                    "tool": "defaultHandler", 
                    "tracingTag": "4"
                }
            ]
        ], 
        "defaultFlowchartViewOption": "vertical", 
        "defaultFlowchartViewType": "swimlane", 
        "duration": 10, 
        "dynamicChangeAllowed": true, 
        "id": "codi/new-process-definition4.json", 
        "initiateByFirstWorkitem": true, 
        "isAdhoc": true, 
        "isDynamicChangeAllowed": true, 
        "name": {
            "text": "codi/new-process-definition4.json"
        }, 
        "processVariableDescriptors": [
            {
                "defaultValue": "", 
                "displayName": {}, 
                "name": "aaa", 
                "type": "java.lang.String", 
                "typeClassName": "java.lang.String"
            }, 
            {
                "defaultValue": "", 
                "displayName": {}, 
                "name": "bbb", 
                "type": "java.lang.String", 
                "typeClassName": "java.lang.String"
            }
        ], 
        "retryDelay": 60, 
        "roles": [
            {
                "askWhenInit": true, 
                "displayName": {}, 
                "elementView": {
                    "_type": "org.uengine.kernel.view.DefaultActivityView", 
                    "height": 370.0, 
                    "id": "d2852bad-5291-5ca4-aaf5-b61eac1d3aa7", 
                    "shapeId": "OG.shape.bpmn.A_Task", 
                    "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\"}", 
                    "width": 710.0, 
                    "x": 518.0, 
                    "y": 263.0
                }, 
                "name": "team"
            }, 
            {
                "askWhenInit": true, 
                "displayName": {}, 
                "elementView": {
                    "_type": "org.uengine.kernel.view.DefaultActivityView", 
                    "height": 218.0, 
                    "id": "OG_3580_88", 
                    "parent": "d2852bad-5291-5ca4-aaf5-b61eac1d3aa7", 
                    "shapeId": "OG.shape.bpmn.A_Task", 
                    "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\"}", 
                    "width": 690.0, 
                    "x": 528.0, 
                    "y": 187.0
                }, 
                "name": "role1"
            }, 
            {
                "askWhenInit": true, 
                "displayName": {}, 
                "elementView": {
                    "_type": "org.uengine.kernel.view.DefaultActivityView", 
                    "height": 152.0, 
                    "id": "OG_3580_92", 
                    "parent": "d2852bad-5291-5ca4-aaf5-b61eac1d3aa7", 
                    "shapeId": "OG.shape.bpmn.A_Task", 
                    "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\"}", 
                    "width": 690.0, 
                    "x": 528.0, 
                    "y": 372.0
                }, 
                "name": "role2"
            }
        ], 
        "sequenceFlows": [
            {
                "condition": {
                    "_type": "org.uengine.kernel.ExpressionEvaluateCondition", 
                    "description": {}
                }, 
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0", 
                    "shapeId": "OG.shape.bpmn.C_Flow", 
                    "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\"}", 
                    "value": "[[278,188],[381,188]]"
                }, 
                "sourceRef": "2", 
                "targetRef": "4"
            }, 
            {
                "condition": {
                    "_type": "org.uengine.kernel.ExpressionEvaluateCondition", 
                    "description": {}
                }, 
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0", 
                    "shapeId": "OG.shape.bpmn.C_Flow", 
                    "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\"}", 
                    "value": "[[432,237],[432,268],[532,268],[532,321]]"
                }, 
                "sourceRef": "4", 
                "targetRef": "6"
            }, 
            {
                "condition": {
                    "_type": "org.uengine.kernel.ExpressionEvaluateCondition", 
                    "description": {}
                }, 
                "relationView": {
                    "TERMINAL_IN_OUT": "_TERMINAL_C_INOUT_0", 
                    "shapeId": "OG.shape.bpmn.C_Flow", 
                    "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\"}", 
                    "value": "[[581,372],[668,372],[668,188],[752,188]]"
                }, 
                "sourceRef": "6", 
                "targetRef": "3"
            }
        ], 
        "simulationInputFrequency": 10, 
        "simulationInstanceCount": 10
    }
}
  • 디플로이 결과:
{
    "_links": {
        "instantiation": {
            "href": "http://localhost:8080/definition/instance/process.json"
        }, 
        "raw": {
            "href": "http://localhost:8080/definition/raw/process.json"
        }, 
        "self": {
            "href": "http://localhost:8080/definition/process.json"
        }
    }, 
    "directory": false, 
    "name": "process.json", 
    "path": "process.json"
}
  • instantiation 링크를 따라 가본다:
http POST localhost:8080/definition/instance/process.json
  • 결과
{
    "_links": {
        "definition": {
            "href": "http://localhost:8080/definition/process.json"
        }, 
        "role-mapping": {
            "href": "http://localhost:8080/instance/3451/role-mapping/{roleName}", 
            "templated": true
        }, 
        "self": {
            "href": "http://localhost:8080/instance/3451"
        }, 
        "stop": {
            "href": "http://localhost:8080/instance/3451/stop"
        }, 
        "suspend": {
            "href": "http://localhost:8080/instance/3451/stop"
        }, 
        "variables": {
            "href": "http://localhost:8080/instance/3451/variables"
        }
    }, 
    "name": "Volatile_0"
}
  • 변수값 링크를 따라가본다:
http localhost:8080/instance/3451/variables
  • 결과
  변수 값들이 리스팅 된다.
  • 이렇듯 HATEOAS 에서는 stop, suspend 등 액션을 취할 수 있는 링크를 POST 로 전송하여 액션을 취할 수 있다.

Hybind example

<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
<script src="https://unpkg.com/hybind@latest/index.js"></script>

<script src="https://unpkg.com/vue"></script>

<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/vue-material@0.7.1"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.3/require.js"></script>
<link rel="stylesheet" href="https://unpkg.com/vue-material@0.7.1/dist/vue-material.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">




<script>
      var backend = hybind("http://localhost:8080");
      var definitions = [];

      backend.$bind("definition", definitions);


      //creating a new folder
      definitions.$create({name:"new folder", directory: true}).then(function(folder){
          folder.$load().then(function(thefolder){

              console.log("The folder has been created:", thefolder);

             thefolder.$delete();
          });
      });

//      $.post({
//        url: "http://localhost:8080/definition/folder",
//        async: false
//      });

//      $.post({
//        url: "http://localhost:8080/definition/folder/folder2",
//        async: false
//      });

      var process;

      definitions.$load().then(function(definitions){

          if(definitions){

              definitions.forEach(function(definition){
                console.log(definition.name);

                if(definition.directory){

                  //drill down all the directories only for the first level.
                  definition.$load().then(function(directory){
                     console.log(directory);
                  });
                }

                if(definition.name == "process.json") process = definition;

              });

              process.raw.$load().then(function(raw_definition){
                 console.log("definition", raw_definition);
              });

            //invoke the instantiation:  this invoke the GET: definition (list definition) again.
            //  it may be a try for adding a list to the first bound variable (definitions).
            //  maybe there's any sort of option to disable this.

              process.instantiation.$create().then(function(instance, r1, r2, r3){

                  console.log("instance", instance);

                //we need to load again for adding the _links as properties. this looks dummy action.
                  instance.$load().then(function(instance_detail){

                    instance_detail.variables.$load().then(function(variables){
                      console.log("variables", variables);
                    });

                  });

              });

          }

      });


</script>

/version

  • 버전 리스팅
http localhost:8080/version

결과

{
    "_embedded": {
        "versions": [
            {
                "_links": {
                    "definitions": {
                        "href": "http://localhost:8080/version/1.0/definition/"
                    }, 
                    "makeProduction": {
                        "href": "http://localhost:8080/version/1.0/production"
                    }, 
                    "self": {
                        "href": "http://localhost:8080/version/1.0"
                    }
                }, 
                "version": {
                    "date": null, 
                    "description": null, 
                    "major": 1, 
                    "minor": 0, 
                    "production": false
                }
            }, 

  • 버전업 (편집중이 버전의 snapshot 을 뜨는 일종의 tagging)
# 마이너 버전업 v1.0 -> v1.1
http POST localhost:8080/version

# 메이저 버전업 v1.0 -> v2.0
http POST localhost:8080/version?major=true
  • 프로덕션 설정
http POST localhost:8080/version/1.0/production

혹은 hateoas (hybind) 에 의해

//hybind
version.makeProduction.$create()

//jquery
$.post(version._links.makeProduction.href)
  • 프로덕션 버전 정보 얻기
http localhost:8080/version/production
  • 프로덕션 버전의 프로세스 정의 얻기 (현재 xml 만 지원함)
http localhost:8080/definition/xml/process.json?production=true
Clone this wiki locally