--- /dev/null
+/* Copyright (c) 2019 AT&T Intellectual Property. #\r
+# #\r
+# Licensed under the Apache License, Version 2.0 (the "License"); #\r
+# you may not use this file except in compliance with the License. #\r
+# You may obtain a copy of the License at #\r
+# #\r
+# http://www.apache.org/licenses/LICENSE-2.0 #\r
+# #\r
+# Unless required by applicable law or agreed to in writing, software #\r
+# distributed under the License is distributed on an "AS IS" BASIS, #\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #\r
+# See the License for the specific language governing permissions and #\r
+# limitations under the License. #\r
+##############################################################################*/\r
+\r
+\r
+import { Injectable } from '@angular/core';\r
+import { FileTransferService } from '../services/file-transfer.service';\r
+import { TestDefinitionService } from '../services/test-definition.service';\r
+import { Observable } from 'rxjs';\r
+import { Buffer } from 'buffer';\r
+import { BpmnOptions, Bpmn } from '../models/bpmn.model';\r
+\r
+interface BpmnFactoryOptions extends BpmnOptions {\r
+ fileId?: String,\r
+ testDefinitionId?: String,\r
+ version?: String,\r
+ xml?: String\r
+}\r
+\r
+@Injectable({\r
+ providedIn: 'root'\r
+})\r
+export class BpmnFactoryService {\r
+\r
+ constructor(\r
+ private filesTransfer: FileTransferService,\r
+ private testDefinition: TestDefinitionService\r
+ ) { }\r
+\r
+ public async setup(options: BpmnFactoryOptions): Promise<any> {\r
+ return new Promise(async (resolve, reject) => {\r
+ //check for required options\r
+ if (!options.mode) {\r
+ console.error('Bpmn options require: mode');\r
+ reject('Bpmn options require: mode')\r
+ }\r
+\r
+ let xml = await this.getXml(options);\r
+\r
+ let instance = new Bpmn(xml, {\r
+ mode: options.mode,\r
+ options: options.options\r
+ })\r
+\r
+ resolve(instance);\r
+ });\r
+\r
+ }\r
+\r
+ public async getXml(options): Promise<any> {\r
+ return new Promise(async (resolve, reject) => {\r
+ let xml;\r
+\r
+ //handle the way to retrieve bpmn xml\r
+ if (options.xml) {\r
+ xml = options.xml\r
+ } else if (options.fileId) {\r
+ xml = await this.loadFile(options.fileId);\r
+ } else if (options.testDefinitionId && options.version) {\r
+ let fileId = await this.getFileId(options.testDefinitionId, options.version);\r
+ xml = await this.loadFile(fileId);\r
+ } else if (options.testDefinitionId) {\r
+ let fileId = await this.getFileId(options.testDefinitionId);\r
+ xml = await this.loadFile(fileId);\r
+ } else {\r
+ console.warn('Either xml, fileId, testDefinitionId and version, or testDefinitionId is required to render the bpmn');\r
+ }\r
+\r
+ resolve(xml);\r
+\r
+ });\r
+\r
+ }\r
+\r
+ private getFileId(id, version?): Observable<Object> {\r
+ return new Observable(observer => {\r
+ this.testDefinition.get(id).subscribe(\r
+ data => {\r
+ if (data['bpmnInstances']) {\r
+ if (version) {\r
+ let index;\r
+ for (let i = 0; i < data['bpmnInstances'].length; i++) {\r
+ if (version == data['bpmnInstances'][i].version) {\r
+ index = i;\r
+ break;\r
+ }\r
+ }\r
+ if (index) {\r
+ observer.next(data['bpmnInstances'][index].bpmnFileId);\r
+ } else {\r
+ observer.error('No bpmn file');\r
+ }\r
+\r
+ } else {\r
+ if (data['bpmnInstances'][data['bpmnInstances'].length - 1].bpmnFileId) {\r
+ observer.next(data['bpmnInstances'][data['bpmnInstances'].length - 1].bpmnFileId);\r
+ } else {\r
+ observer.error('No bpmn file');\r
+ }\r
+ }\r
+ } else {\r
+ observer.error('No bpmn instances');\r
+ }\r
+ },\r
+ err => {\r
+ observer.error('No test definition found');\r
+ }\r
+ )\r
+ })\r
+ }\r
+\r
+ public loadFile(bpmnFileId) {\r
+ return new Promise((resolve, reject) => {\r
+ this.filesTransfer.get(bpmnFileId).subscribe(content => {\r
+ resolve(new Buffer(content as Buffer).toString());\r
+ }, err => {\r
+ reject(err);\r
+ });\r
+ });\r
+ }\r
+}\r