Updated Sparky to add ECOMP functionality Browse, Specialized Search, BYOQ, and the...
[aai/sparky-fe.git] / src / utils / CSV.js
1 /*
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2021 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *       http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 import {GlobalExtConstants} from './GlobalExtConstants.js';
22 let OXM = GlobalExtConstants.OXM;
23
24 function camelToDash(str) {
25   return (str.replace(/\W+/g, '-')
26     .replace(/([a-z\d])([A-Z])/g, '$1-$2')).toLowerCase();
27 }
28
29 function sortColumn(col1, col2) {
30   if (col1.value < col2.value) {
31     return -1;
32   } else if (col1.value > col2.value) {
33     return 1;
34   } else {
35     return 0;
36   }
37 }
38
39 var  buildAttrList = function(inputParam, cols) {
40   // console.log('[getSearchParam] inputParam: ' + inputParam);
41   let searchParam = inputParam;
42
43   if (['PSERVER', 'COMPLEX', 'CLOUDREGION',
44     'NETWORKPROFILE', 'VIRTUALDATACENTER'].indexOf(inputParam.toUpperCase()) === -1) {
45     searchParam = inputParam.substring(0, inputParam.length - 1);
46     // console.log('[getSearchParam] searchParam: ' + searchParam);
47   }
48   console.log('Before loop included',searchParam);
49   if('CHASSIES'.indexOf(inputParam.toUpperCase()) !== -1){
50     searchParam = inputParam.substring(0, inputParam.length - 2) + 's';
51   }else if(inputParam.substr(inputParam.length - 3) === 'ies'){
52     searchParam = inputParam.substring(0, inputParam.length - 3) + 'y';
53   }else if('COMPLEXES'.indexOf(inputParam.toUpperCase()) !== -1){
54     searchParam = inputParam.substring(0, inputParam.length - 2);
55   }
56   if(inputParam.toUpperCase() === 'PINTERFACES'){
57     searchParam = 'pInterface';
58   }
59   console.log('After loop included',searchParam);
60   if (inputParam.toUpperCase() === 'LINESOFBUSINESS') {
61     searchParam = 'lineOfBusiness';
62     // console.log('[getSearchParam] searchParam: ' + searchParam);
63   }
64
65   // read oxm xml file
66   let oxmFile = JSON.parse(OXM);
67   let javaTypes = oxmFile['xml-bindings']['java-types'][0]['java-type'];
68   // console.log('[buildAttrList] javaTypes:');
69   // console.log(javaTypes);
70
71   let foundIndex = -1;
72   for (let i = 0; i < javaTypes.length && foundIndex === -1; i++) {
73     if (javaTypes[i]['xml-root-element'][0]['$']['name'] === camelToDash(searchParam)) {
74       // console.log(javaTypes[i]);
75       foundIndex = i;
76     }
77   }
78   
79   //Adding Quick fix will be get rid of it later
80   console.log('searchParam>>>>>>>stage2:',inputParam);
81   if(foundIndex === -1){
82    for (let i = 0; i < javaTypes.length && foundIndex === -1; i++) {
83      if (javaTypes[i]['xml-root-element'][0]['$']['name'] === camelToDash(inputParam)) {
84        foundIndex = i;
85      }
86      if(foundIndex === -1){
87        if(inputParam.substr(inputParam.length - 1) === 's'){
88          searchParam = inputParam.substring(0, inputParam.length - 1);
89          console.log('searchParam>>>>>>>stage3:',searchParam);        
90        }
91        if (javaTypes[i]['xml-root-element'][0]['$']['name'] === camelToDash(searchParam)) {
92          foundIndex = i;
93        }
94      }
95    }
96   }
97  
98   // build the column list
99   let columns = cols;
100   if(foundIndex > -1) {
101     //for (let j = 0; j < javaTypes[foundIndex]['java-attributes'][0]['xml-element'].length; j++) {
102      // columns.push({value: javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['name']});
103     //}
104     if (javaTypes[foundIndex]['java-attributes']) {
105       let elementLength = 0;
106       if (javaTypes[foundIndex]['java-attributes'][0]['xml-element']) {
107         elementLength = javaTypes[foundIndex]['java-attributes'][0]['xml-element'].length;
108       }
109       for (var j = 0; j < elementLength; j++) {
110         let isPrimitive = JSON.stringify(javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['type']).indexOf('java.lang') > -1;
111         if(isPrimitive) { //add to the list
112           let node = {value: javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['name']};
113           columns.push(node);
114         }
115       }
116     }
117   }
118
119   //sort the column list
120   columns.sort(sortColumn);
121
122   // console.log('[buildAttrList] columns:');
123   // console.log(columns);
124
125   return columns;
126 }
127
128 var multiTypeBuildAttrList = function(nodes) {
129   // read oxm xml file
130   let oxmFile = JSON.parse(OXM);
131   let javaTypes = oxmFile['xml-bindings']['java-types'][0]['java-type'];
132
133   let typeList = new Map();
134
135   nodes.forEach(node => {
136     let searchParam = node['node-type'];
137
138     let foundIndex = -1;
139     for (let i = 0; i < javaTypes.length && foundIndex === -1; i++) {
140       if (javaTypes[i]['xml-root-element'][0]['$']['name'] === camelToDash(searchParam)) {
141         foundIndex = i;
142         if (!typeList.has(searchParam)) {
143
144           let props = [];
145           //for (let j = 0; j < javaTypes[foundIndex]['java-attributes'][0]['xml-element'].length; j++) {
146             //props.push({
147               //value: javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['name']
148             //});
149           //}
150           if (javaTypes[foundIndex]['java-attributes']) {
151             let elementLength = 0;
152             if (javaTypes[foundIndex]['java-attributes'][0]['xml-element']) {
153               elementLength = javaTypes[foundIndex]['java-attributes'][0]['xml-element'].length;
154             }
155             for (var j = 0; j < elementLength; j++) {
156               let isPrimitive = JSON.stringify(javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['type']).indexOf('java.lang') > -1;
157               if(isPrimitive) { //add to the list
158                 let node = {value: javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['name']};
159                 props.push(node);
160               }
161             }
162           }
163
164           props.sort(sortColumn);
165           typeList.set(searchParam, props);
166         }
167       }
168     }
169   });
170
171   // console.log('typeList:');
172   // console.log(typeList);
173
174   return typeList;
175 }
176
177 var buildCSV = function(columns, nodes) {
178   let outputArray = [];
179   outputArray[0] = [];
180
181   for (let i = 0; i < columns.length; i++) {
182     let str = columns[i].value;
183     outputArray[0][str] = columns[i];
184   }
185
186   // console.log('[buildCSV] initial outputArray with columns:');
187   // console.log(outputArray);
188
189   // console.log('[buildCSV] nodes.length:');
190   // console.log(nodes.length);
191
192   let q = 0;
193   for (let j = 1; j < nodes.length + 1; j++) {
194     outputArray[j] = [];
195     for (var k in nodes[q].properties) {
196       if (nodes[q].properties.hasOwnProperty(k)) {
197         let str = k;
198         outputArray[j][str] = nodes[q].properties[k].toString();
199       }
200     }
201     let relative = nodes[q]['related-to'];
202     for(var r = 0; r<relative.length; r++){
203       var relationship = '';
204       var relationshipLabel = '';
205       var nodeType = '';
206       var url = '';
207       for(var k in relative[r]){
208         let relation = k.toString();
209         if(relation === 'relationship-label'){
210           relationshipLabel = relative[r][k].toString().slice(33);
211         }
212         if(relation === 'node-type'){
213           nodeType = relative[r][k].toString();
214         } 
215         if(relation === 'url'){
216           url = relative[r][k].toString();
217         }       
218         relationship = 'Relationship ' + relationshipLabel + ' ' + nodeType + ' - ' + url;
219         console.log('relationship>>>>>',relationship);
220       }
221       let cnt = r + 1;
222       let str = 'Relationship' + cnt;      
223       outputArray[j][str] = relationship;
224       outputArray[0][str] ='Relationship'+cnt;
225     }
226     q++;
227   }
228
229   return outputArray;
230 }
231
232 var multiTypebuildCSV = function(nodes) {
233   let outputArray = [];
234
235   nodes.forEach(node => {
236     let nodeVal = [];
237     for (var prop in node.properties) {
238       if (node.properties.hasOwnProperty(prop)) {
239         let val = { value: prop + ': ' + node.properties[prop].toString()};
240         // console.log(val);
241         nodeVal.push(val);
242       }
243     }
244     nodeVal.sort(sortColumn);
245     nodeVal.unshift({ value: node['node-type'] }, {value : node.url });
246     let relative = node['related-to'];
247     for(var r = 0; r<relative.length; r++){
248       var relationship = '';
249       var relationshipLabel = '';
250       var nodeType = '';
251       var url = '';
252       for(var k in relative[r]){
253         let relation = k.toString();
254         if(relation === 'relationship-label'){
255           relationshipLabel = relative[r][k].toString().slice(33);
256         }
257         if(relation === 'node-type'){
258           nodeType = relative[r][k].toString();
259         } 
260         if(relation === 'url'){
261           url = relative[r][k].toString();
262         }       
263         relationship = 'Relationship ' + relationshipLabel + ' ' + nodeType + ' - ' + url;
264         console.log('relationship>>>>>',relationship);
265       }
266       let cnt = r + 1;  
267       let val = { value: 'Relationship'+cnt + ': ' + relationship};
268       nodeVal.push(val);
269     }
270     outputArray.push(nodeVal);
271   });
272
273   // console.log(outputArray);
274   return outputArray;
275 }
276
277 var convertToCSVStr = function(outputArray) {
278   let array = (typeof outputArray !== 'object' ? JSON.parse(outputArray) : outputArray);
279   let str = '';
280   let row = '';
281
282   for (let index in outputArray[0]) {
283     // convert each value to string and comma-separated
284     row += index + ',';
285   }
286   row = row.slice(0, -1);
287   // append Label row with line break
288   str += row + '\r\n';
289
290   for (let i = 1; i < array.length; i++) {
291     let line = '';
292     for (let k in outputArray[0]) {
293       if (outputArray[0].hasOwnProperty(k)) {
294         if (array[i][k]) {
295           line += array[i][k] + ',';
296         } else {
297           line += ',';
298         }
299       }
300     }
301     str += line + '\r\n';
302   }
303   return str;
304 }
305
306 var multiTypeConvertToCSVStr = function(outputArray) {
307   let array = (typeof outputArray !== 'object' ? JSON.parse(outputArray) : outputArray);
308   let str = '';
309   let max = 0;
310   // find max length of array to determine number of rows to loop through
311   array.forEach(node => {
312     if (node.length > max) {
313       max = node.length;
314     }
315   });
316
317   // console.log('max: ' + max);
318
319   for (let i = 0; i < max; i++) {
320     let line = '';
321     for (let j = 0; j < array.length; j++) {
322       line += array[j][i] ? array[j][i].value  + ',' : ',';
323     }
324     str += line + '\r\n';
325   }
326   return str;
327 }
328
329 var downloadCSV = function(csvStr, filename) {
330   // console.log(csvStr);
331   var a = document.createElement('a');
332   a.setAttribute('style', 'display:none;');
333   document.body.appendChild(a);
334   var blob = new Blob([csvStr], { type: 'text/csv' });
335   var url = window.URL.createObjectURL(blob);
336   a.href = url;
337   a.download = filename + '.csv';
338   a.click();
339 }
340 export const CSV = {
341   buildAttrList : buildAttrList,
342   multiTypeBuildAttrList : multiTypeBuildAttrList,
343   buildCSV : buildCSV,
344   multiTypebuildCSV : multiTypebuildCSV,
345   convertToCSVStr : convertToCSVStr,
346   multiTypeConvertToCSVStr : multiTypeConvertToCSVStr,
347   downloadCSV : downloadCSV
348 };