support set parameter for workflow
[sdc/sdc-workflow-designer.git] / sdc-workflow-designer-ui / src / app / services / workflow.service.ts
1 /**\r
2  * Copyright (c) 2017 ZTE Corporation.\r
3  * All rights reserved. This program and the accompanying materials\r
4  * are made available under the terms of the Eclipse Public License v1.0\r
5  * and the Apache License 2.0 which both accompany this distribution,\r
6  * and are available at http://www.eclipse.org/legal/epl-v10.html\r
7  * and http://www.apache.org/licenses/LICENSE-2.0\r
8  *\r
9  * Contributors:\r
10  *     ZTE - initial API and implementation and/or initial documentation\r
11  */\r
12 \r
13 import { Injectable } from '@angular/core';\r
14 import { WorkflowNode } from "../model/workflow/workflow-node";\r
15 import { DataAccessService } from "./data-access/data-access.service";\r
16 import { Observable } from "rxjs/Observable";\r
17 import { Workflow } from "../model/workflow/workflow";\r
18 import { Position } from "../model/workflow/position";\r
19 import { NodeType } from "../model/workflow/node-type.enum";\r
20 import { StartEvent } from "../model/workflow/start-event";\r
21 import { SequenceFlow } from "../model/workflow/sequence-flow";\r
22 \r
23 /**\r
24  * WorkflowService\r
25  * provides all of the operations about workflow operations.\r
26  */\r
27 @Injectable()\r
28 export class WorkflowService {\r
29 \r
30     public workflow: Workflow;\r
31 \r
32     constructor(private dataAccessService: DataAccessService) {\r
33 \r
34     }\r
35 \r
36     public save(): Observable<boolean> {\r
37         return this.dataAccessService.catalogService.saveWorkflow(this.workflow);\r
38     }\r
39 \r
40     public addNode(name: string, type: string, top: number, left: number): WorkflowNode {\r
41         let node: WorkflowNode;\r
42         switch (type) {\r
43             case NodeType[NodeType.startEvent]:\r
44                 node = new StartEvent(this.createId(), name, type, new Position(top, left), []);\r
45                 break;\r
46             default:\r
47                 node = new WorkflowNode(this.createId(), name, type, new Position(top, left), []);\r
48                 break;\r
49         }\r
50 \r
51         this.workflow.nodes.push(node);\r
52         return node;\r
53     }\r
54 \r
55     public deleteNode(nodeId: string): WorkflowNode {\r
56         // delete related connections\r
57         this.workflow.nodes.forEach(node => this.deleteSequenceFlow(node.id, nodeId));\r
58 \r
59         // delete current node\r
60         const index = this.workflow.nodes.findIndex(node => node.id === nodeId);\r
61         if (index !== -1) {\r
62             const node = this.workflow.nodes.splice(index, 1)[0];\r
63             node.sequenceFlows = [];\r
64             return node;\r
65         }\r
66 \r
67         return undefined;\r
68     }\r
69 \r
70     public addSequenceFlow(sourceId: string, targetId: string) {\r
71         const node = this.getNodeById(sourceId);\r
72         if (node) {\r
73             const index = node.sequenceFlows.findIndex(sequenceFlow => sequenceFlow.targetRef === targetId);\r
74             if (index === -1) {\r
75                 node.sequenceFlows.push(new SequenceFlow(sourceId, targetId));\r
76             }\r
77         }\r
78     }\r
79 \r
80     public deleteSequenceFlow(sourceId: string, targetId: string) {\r
81         const node = this.getNodeById(sourceId);\r
82         if (node) {\r
83             const index = node.sequenceFlows.findIndex(sequenceFlow => sequenceFlow.targetRef === targetId);\r
84             if (index !== -1) {\r
85                 node.sequenceFlows.splice(index, 1);\r
86             }\r
87         }\r
88     }\r
89 \r
90     public getNodeById(sourceId: string): WorkflowNode {\r
91         return this.workflow.nodes.find(node => node.id === sourceId);\r
92     }\r
93 \r
94     private createId() {\r
95         const idSet = new Set();\r
96         this.workflow.nodes.forEach(node => idSet.add(node.id));\r
97 \r
98         for (let i = 0; i < idSet.size; i++) {\r
99             if (!idSet.has('node' + i)) {\r
100                 return 'node' + i;\r
101             }\r
102         }\r
103 \r
104         return 'node' + idSet.size;\r
105     }\r
106 }\r