adding import package basic functionalities
[ccsdk/cds.git] / cds-ui / designer-client / src / app / modules / feature-modules / packages / package-creation / package-creation-extraction.service.ts
1 import {Injectable, ViewChild} from '@angular/core';
2 import {MetaDataTabModel} from './mapping-models/metadata/MetaDataTab.model';
3 import {VlbDefinition} from './mapping-models/definitions/VlbDefinition';
4 import {DslDefinition} from './mapping-models/CBAPacakge.model';
5 import {PackageCreationStore} from './package-creation.store';
6 import * as JSZip from 'jszip';
7 import {PackageCreationUtils} from './package-creation.utils';
8 import {MetadataTabComponent} from './metadata-tab/metadata-tab.component';
9 import {DesignerStore} from '../designer/designer.store';
10
11 @Injectable({
12     providedIn: 'root'
13 })
14 export class PackageCreationExtractionService {
15
16     zipFile: JSZip = new JSZip();
17     entryDefinitionKeys: string[] = ['template_tags', 'user-groups',
18         'author-email', 'template_version', 'template_name', 'template_author', 'template_description'];
19     @ViewChild(MetadataTabComponent, {static: false})
20     metadataTabComponent: MetadataTabComponent;
21
22     constructor(private packageCreationStore: PackageCreationStore,
23                 private packageCreationUtils: PackageCreationUtils,
24                 private designerStore: DesignerStore) {
25     }
26
27     public extractBlobToStore(blob) {
28         let packageName = null;
29         this.zipFile.loadAsync(blob).then((zip) => {
30             Object.keys(zip.files).filter(fileName => fileName.includes('TOSCA-Metadata/'))
31                 .forEach((filename) => {
32                     zip.files[filename].async('string').then((fileData) => {
33                         if (fileData) {
34                             if (filename.includes('TOSCA-Metadata/')) {
35                                 const metaDataTabInfo: MetaDataTabModel = this.getMetaDataTabInfo(fileData);
36                                 packageName = metaDataTabInfo.name;
37                                 this.setMetaData(metaDataTabInfo);
38                                 console.log('found file ' + packageName);
39                             }
40                         }
41                     });
42                 });
43         });
44
45         this.zipFile.loadAsync(blob).then((zip) => {
46             Object.keys(zip.files).forEach((filename) => {
47                 zip.files[filename].async('string').then((fileData) => {
48                     console.log(filename);
49                     if (fileData) {
50                         if (filename.includes('Scripts/')) {
51                             this.setScripts(filename, fileData);
52                         } else if (filename.includes('Templates/')) {
53                             if (filename.includes('-mapping.')) {
54                                 this.setMapping(filename, fileData);
55                             } else if (filename.includes('-template.')) {
56                                 this.setTemplates(filename, fileData);
57                             }
58
59                         } else if (filename.includes('Definitions/')) {
60                             this.setImports(filename, fileData, packageName);
61                         }
62                     }
63                 });
64             });
65         });
66     }
67
68     setScripts(filename: string, fileData: any) {
69         this.packageCreationStore.addScripts(filename, fileData);
70     }
71
72     setImports(filename: string, fileData: any, packageName: string) {
73         console.log(filename);
74         if (filename.includes(packageName)) {
75             let definition = new VlbDefinition();
76             definition = fileData as VlbDefinition;
77             definition = JSON.parse(fileData);
78             const dslDefinition = new DslDefinition();
79             dslDefinition.content = this.packageCreationUtils.transformToJson(definition.dsl_definitions);
80             const mapOfCustomKeys = new Map<string, string>();
81             for (const metadataKey in definition.metadata) {
82                 if (!this.entryDefinitionKeys.includes(metadataKey + '')) {
83                     mapOfCustomKeys.set(metadataKey + '', definition.metadata[metadataKey + '']);
84                 }
85             }
86             this.packageCreationStore.changeDslDefinition(dslDefinition);
87             this.packageCreationStore.setCustomKeys(mapOfCustomKeys);
88             this.setPackageDescription(definition.metadata.template_description);
89             if (definition.topology_template && definition.topology_template.content) {
90                 this.designerStore.saveSourceContent(definition.topology_template.content);
91             }
92
93         }
94         this.packageCreationStore.addDefinition(filename, fileData);
95
96     }
97
98     setTemplates(filename: string, fileData: any) {
99         this.packageCreationStore.addTemplate(filename, fileData);
100     }
101
102     setMapping(fileName: string, fileData: string) {
103         this.packageCreationStore.addMapping(fileName, fileData);
104     }
105
106     setMetaData(metaDataObject: MetaDataTabModel) {
107         this.packageCreationStore.changeMetaData(metaDataObject);
108     }
109
110     getMetaDataTabInfo(fileData: string) {
111         const metaDataTabModel = new MetaDataTabModel();
112         const arrayOfLines = fileData.split('\n');
113         metaDataTabModel.entryFileName = arrayOfLines[3].split(':')[1];
114         metaDataTabModel.name = arrayOfLines[4].split(':')[1];
115         metaDataTabModel.version = arrayOfLines[5].split(':')[1];
116         metaDataTabModel.mode = arrayOfLines[6].split(':')[1];
117         console.log(arrayOfLines[7]);
118         if (arrayOfLines[7].split(':')) {
119             metaDataTabModel.templateTags = new Set<string>(arrayOfLines[7].split(':')[1].split(','));
120         }
121         return metaDataTabModel;
122     }
123
124     private setPackageDescription(templateDescription: string) {
125         const metaData = this.packageCreationStore.getMetaData();
126         metaData.description = templateDescription;
127         this.setMetaData(metaData);
128
129     }
130 }