2 ============LICENSE_START==========================================
3 ===================================================================
4 Copyright (C) 2018 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, EventEmitter, Output, ViewChild, Input } from '@angular/core';
23 import { Store } from '@ngrx/store';
24 import * as JSZip from 'jszip';
25 import { Observable } from 'rxjs';
27 import { IBlueprint } from '../../../../common/core/store/models/blueprint.model';
28 import { IBlueprintState } from '../../../../common/core/store/models/blueprintState.model';
29 import { IAppState } from '../../../../common/core/store/state/app.state';
30 import { LoadBlueprintSuccess, SET_BLUEPRINT_STATE, SetBlueprintState } from '../../../../common/core/store/actions/blueprint.action';
31 import { SortPipe } from '../../../../common/shared/pipes/sort.pipe';
32 import { LoaderService } from '../../../../common/core/services/loader.service';
33 import { FormGroup, FormBuilder, Validators } from '@angular/forms';
36 selector: 'app-search-template',
37 templateUrl: './search-template.component.html',
38 styleUrls: ['./search-template.component.scss']
40 export class SearchTemplateComponent implements OnInit {
42 localBlueprintData: IBlueprint;
44 blueprintState: IBlueprintState;
45 bpState: Observable<IBlueprintState>;
46 validfile: boolean = false;
47 uploadedFileName: string;
48 @ViewChild('fileInput') fileInput;
50 @Input() optionSelected: string;
52 @Output() resourcesData = new EventEmitter();
54 searchText: string = '';
58 private zipFile: JSZip = new JSZip();
59 private fileObject: any;
60 private activationBlueprint: any;
61 private tocsaMetadaData: any;
62 private blueprintName: string;
63 private entryDefinition: string;
65 constructor(private store: Store<IAppState>, private loader: LoaderService, private formBuilder: FormBuilder) { }
68 this.myControl = this.formBuilder.group({
69 search_input: ['', Validators.required]
74 this.resourcesData.emit(value);
79 this.file = e.target.files[0];
80 this.uploadedFileName = (this.file.name.split('.'))[0];
81 this.zipFile.files = {};
82 this.zipFile.loadAsync(this.file)
85 this.loader.showLoader();
86 this.buildFileViewData(zip);
91 updateBlueprintState() {
92 let data: IBlueprint = this.activationBlueprint ? JSON.parse(this.activationBlueprint.toString()) : this.activationBlueprint;
93 let blueprintState = {
95 name: this.blueprintName,
97 filesData: this.paths,
98 uploadedFileName: this.uploadedFileName,
99 entryDefinition: this.entryDefinition
101 this.store.dispatch(new SetBlueprintState(blueprintState))
105 async buildFileViewData(zip) {
106 this.validfile = false;
108 console.log(zip.files);
109 for (var file in zip.files) {
110 console.log("name: " + zip.files[file].name);
112 // nameForUIDisplay: this.uploadedFileName + '/' + zip.files[file].name,
113 // name: zip.files[file].name,
114 name: this.uploadedFileName + '/' + zip.files[file].name,
117 const value = <any>await zip.files[file].async('string');
118 this.fileObject.data = value;
119 this.paths.push(this.fileObject);
123 this.paths.forEach(path => {
124 if (path.name.includes("TOSCA.meta")) {
125 this.validfile = true
129 alert('Please update proper file');
132 if (this.validfile) {
133 this.fetchTOSACAMetadata();
134 this.paths = new SortPipe().transform(this.paths, 'asc', 'name');
135 this.tree = this.arrangeTreeData(this.paths);
137 alert('Please update proper file with TOSCA metadata');
141 arrangeTreeData(paths) {
144 paths.forEach((path) => {
146 const pathParts = path.name.split('/');
147 // pathParts.shift();
148 let currentLevel = tree;
150 pathParts.forEach((part) => {
151 const existingPath = currentLevel.filter(level => level.name === part);
153 if (existingPath.length > 0) {
154 currentLevel = existingPath[0].children;
162 if (part.trim() == this.blueprintName.trim()) {
163 this.activationBlueprint = path.data;
164 newPart.data = JSON.parse(this.activationBlueprint.toString());
165 console.log('newpart', newPart);
166 this.entryDefinition = path.name.trim();
168 if (newPart.name !== '') {
169 currentLevel.push(newPart);
170 currentLevel = newPart.children;
175 this.loader.hideLoader();
179 fetchTOSACAMetadata() {
181 this.paths.forEach(file => {
182 if (file.name.includes('TOSCA.meta')) {
183 let keys = file.data.split("\n");
184 keys.forEach((key) => {
185 let propertyData = key.split(':');
186 toscaData[propertyData[0]] = propertyData[1];
190 this.blueprintName = (((toscaData['Entry-Definitions']).split('/'))[1]).toString();;
191 console.log(toscaData);