2 ============LICENSE_START==========================================
3 ===================================================================
4 Copyright (C) 2019 IBM Intellectual Property. All rights reserved.
5 ===================================================================
7 Unless otherwise specified, all software contained herein is licensed
8 under the Apache License, Version 2.0 (the License);
9 you may not use this software except in compliance with the License.
10 You may obtain a copy of the License at
12 http://www.apache.org/licenses/LICENSE-2.0
14 Unless required by applicable law or agreed to in writing, software
15 distributed under the License is distributed on an "AS IS" BASIS,
16 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 See the License for the specific language governing permissions and
18 limitations under the License.
19 ============LICENSE_END============================================
22 import { Component, OnInit, ViewChild, EventEmitter, Output } from '@angular/core';
23 import { FormBuilder, FormGroup, Validators } from '@angular/forms';
24 import { Store } from '@ngrx/store';
25 import { SearchTemplateService } from '../search-template.service';
26 import { MatAutocompleteTrigger } from '@angular/material';
27 import { NotificationHandlerService } from 'src/app/common/core/services/notification-handler.service';
28 import { SearchPipe } from 'src/app/common/shared/pipes/search.pipe';
29 import * as JSZip from 'jszip';
30 import { SortPipe } from '../../../../../common/shared/pipes/sort.pipe';
31 import { LoaderService } from '../../../../../common/core/services/loader.service';
32 import { IBlueprint } from '../../../../../common/core/store/models/blueprint.model';
33 import { IBlueprintState } from '../../../../../common/core/store/models/blueprintState.model';
34 import { IAppState } from '../../../../../common/core/store/state/app.state';
35 import { SetBlueprintState } from '../../../../../common/core/store/actions/blueprint.action';
38 selector: 'app-search-from-database',
39 templateUrl: './search-from-database.component.html',
40 styleUrls: ['./search-from-database.component.scss']
42 export class SearchFromDatabaseComponent implements OnInit {
45 @Output() resourcesData = new EventEmitter();
47 // @ViewChild('resourceSelect', { read: MatAutocompleteTrigger }) resourceSelect: MatAutocompleteTrigger;
49 validfile: boolean = false;
52 private zipFile: JSZip = new JSZip();
55 private fileObject: any;
56 private activationBlueprint: any;
57 private tocsaMetadaData: any;
58 private blueprintName: string;
59 private entryDefinition: string;
60 uploadedFileName: string;
62 searchText: string = '';
63 constructor(private _formBuilder: FormBuilder,
64 private searchService: SearchTemplateService, private alertService: NotificationHandlerService,
65 private loader: LoaderService, private store: Store<IAppState>) { }
68 this.myControl = this._formBuilder.group({
69 search_input: ['', Validators.required]
73 this.resourcesData.emit(value);
76 fetchResourceByName() {
78 this.searchService.searchByTags(this.searchText)
80 data.forEach(element => {
81 this.options.push(element)
84 this.alertService.error('Blueprint not matching the search tag' + error);
88 editCBA(artifactName: string,artifactVersion:string, option: string) {
89 this.zipFile.generateAsync({ type: "blob" })
91 const formData = new FormData();
92 formData.append("file", blob);
93 // this.editorService.enrich("/enrich-blueprint/", formData)
94 this.searchService.getBlueprintZip(artifactName + "/" + artifactVersion)
97 // console.log(response);
98 this.zipFile.files = {};
99 this.zipFile.loadAsync(response)
102 this.buildFileViewData(zip);
103 // console.log("processed");
104 let data: IBlueprint = this.activationBlueprint ? JSON.parse(this.activationBlueprint.toString()) : this.activationBlueprint;
105 let blueprintState = {
107 name: this.blueprintName,
109 filesData: this.paths,
110 uploadedFileName: this.blueprintName,
111 entryDefinition: this.entryDefinition
113 this.store.dispatch(new SetBlueprintState(blueprintState));
114 // console.log(blueprintState);
117 // this.alertService.success('Blueprint enriched successfully');
120 this.alertService.error('Blue print error' + error.message);
126 this.filesData.forEach((path) => {
127 let index = path.name.indexOf("/");
128 let name = path.name.slice(index + 1, path.name.length);
129 this.zipFile.file(name, path.data);
133 async buildFileViewData(zip) {
134 this.validfile = false;
136 // console.log(zip.files);
137 for (var file in zip.files) {
138 console.log("name: " + zip.files[file].name);
140 // nameForUIDisplay: this.uploadedFileName + '/' + zip.files[file].name,
141 // name: zip.files[file].name,
142 name: this.uploadedFileName + '/' + zip.files[file].name,
145 const value = <any>await zip.files[file].async('string');
146 this.fileObject.data = value;
147 this.paths.push(this.fileObject);
151 this.paths.forEach(path => {
152 if (path.name.includes("TOSCA.meta")) {
153 this.validfile = true
157 alert('Please update proper file');
160 if (this.validfile) {
161 this.fetchTOSACAMetadata();
162 this.paths = new SortPipe().transform(this.paths, 'asc', 'name');
163 this.tree = this.arrangeTreeData(this.paths);
165 alert('Please update proper file with TOSCA metadata');
169 arrangeTreeData(paths) {
172 paths.forEach((path) => {
174 const pathParts = path.name.split('/');
175 // pathParts.shift();
176 let currentLevel = tree;
178 pathParts.forEach((part) => {
179 const existingPath = currentLevel.filter(level => level.name === part);
181 if (existingPath.length > 0) {
182 currentLevel = existingPath[0].children;
190 if (part.trim() == this.blueprintName.trim()) {
191 this.activationBlueprint = path.data;
192 newPart.data = JSON.parse(this.activationBlueprint.toString());
193 // console.log('newpart', newPart);
194 this.entryDefinition = path.name.trim();
196 if (newPart.name !== '') {
197 currentLevel.push(newPart);
198 currentLevel = newPart.children;
203 this.loader.hideLoader();
207 fetchTOSACAMetadata() {
209 this.paths.forEach(file => {
210 if (file.name.includes('TOSCA.meta')) {
211 let keys = file.data.split("\n");
212 keys.forEach((key) => {
213 let propertyData = key.split(':');
214 toscaData[propertyData[0]] = propertyData[1];
218 this.blueprintName = (((toscaData['Entry-Definitions']).split('/'))[1]).toString();;
219 // console.log(toscaData);