2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 import {GlobalExtConstants} from './GlobalExtConstants.js';
22 import * as Excel from 'exceljs/dist/exceljs.min.js';
24 let OXM = GlobalExtConstants.OXM;
25 let EXCELCELLS = GlobalExtConstants.EXCELCELLS;
26 let DOWNLOAD_ALL = GlobalExtConstants.DOWNLOAD_ALL;
27 let INVLIST = GlobalExtConstants.INVLIST;
29 function camelToDash(str) {
30 return (str.replace(/\W+/g, '-')
31 .replace(/([a-z\d])([A-Z])/g, '$1-$2')).toLowerCase();
34 function sortColumn(col1, col2) {
35 if (col1.value < col2.value) {
37 } else if (col1.value > col2.value) {
44 var buildAttrList = function(inputParam, cols, sortBy) {
45 // console.log('[getSearchParam] inputParam: ' + inputParam);
46 let searchParam = inputParam;
48 if (['PSERVER', 'COMPLEX', 'CLOUDREGION',
49 'NETWORKPROFILE', 'VIRTUALDATACENTER','VNFC'].indexOf(inputParam.toUpperCase()) === -1) {
50 searchParam = inputParam.substring(0, inputParam.length - 1);
51 // console.log('[getSearchParam] searchParam: ' + searchParam);
53 if('CHASSIES'.indexOf(inputParam.toUpperCase()) !== -1){
54 searchParam = inputParam.substring(0, inputParam.length - 2) + 's';
55 }else if(inputParam.substr(inputParam.length - 3) === 'ies'){
56 searchParam = inputParam.substring(0, inputParam.length - 3) + 'y';
57 }else if('COMPLEXES'.indexOf(inputParam.toUpperCase()) !== -1){
58 searchParam = inputParam.substring(0, inputParam.length - 2);
60 if(inputParam.toUpperCase() === 'PINTERFACES'){
61 searchParam = 'pInterface';
63 if (inputParam.toUpperCase() === 'LINESOFBUSINESS') {
64 searchParam = 'lineOfBusiness';
65 // console.log('[getSearchParam] searchParam: ' + searchParam);
69 let oxmFile = JSON.parse(OXM);
70 let javaTypes = oxmFile['xml-bindings']['java-types'][0]['java-type'];
71 // console.log('[buildAttrList] javaTypes:');
72 // console.log(javaTypes);
75 for (let i = 0; i < javaTypes.length && foundIndex === -1; i++) {
76 if (javaTypes[i]['xml-root-element'][0]['$']['name'] === camelToDash(searchParam)) {
77 // console.log(javaTypes[i]);
82 //Adding Quick fix will be get rid of it later
83 console.log('searchParam>>>>>>>stage2:',inputParam);
84 if(foundIndex === -1){
85 for (let i = 0; i < javaTypes.length && foundIndex === -1; i++) {
86 if (javaTypes[i]['xml-root-element'][0]['$']['name'] === camelToDash(inputParam)) {
89 if(foundIndex === -1){
90 if(inputParam.substr(inputParam.length - 1) === 's'){
91 searchParam = inputParam.substring(0, inputParam.length - 1);
92 console.log('searchParam>>>>>>>stage3:',searchParam);
94 if (javaTypes[i]['xml-root-element'][0]['$']['name'] === camelToDash(searchParam)) {
101 // build the column list
103 let requiredColumn = [];
104 if(foundIndex > -1) {
105 //for (let j = 0; j < javaTypes[foundIndex]['java-attributes'][0]['xml-element'].length; j++) {
106 // columns.push({value: javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['name']});
108 if (javaTypes[foundIndex]['java-attributes']) {
109 let elementLength = 0;
110 if (javaTypes[foundIndex]['java-attributes'][0]['xml-element']) {
111 elementLength = javaTypes[foundIndex]['java-attributes'][0]['xml-element'].length;
113 for (var j = 0; j < elementLength; j++) {
114 let isPrimitive = JSON.stringify(javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['type']).indexOf('java.lang') > -1;
115 let reqObj = JSON.stringify(javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['required']);
117 if(javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['xml-properties'] && javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['xml-properties'][0]['xml-property'][0]['$']['name']=='description'){
118 description= javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['xml-properties'][0]['xml-property'][0]['$']['value'];
120 let node = {value: javaTypes[foundIndex]['java-attributes'][0]['xml-element'][j]['$']['name'],description: description};
121 if(isPrimitive) { //add to the list
124 if(reqObj && reqObj.indexOf('true') > -1){
125 requiredColumn.push(node);
131 //sort the column list
132 columns.sort(sortColumn);
133 //Sort column with requiredColumn
134 if(sortBy === 'required'){
135 for(var c=0; c< columns.length; c++){
136 if(requiredColumn.indexOf(columns[c]) === -1){
137 requiredColumn.push(columns[c]);
141 if(sortBy && (sortBy === 'required' || sortBy === 'mandatory')){
142 columns = requiredColumn;
144 // console.log('[buildAttrList] columns:');
145 // console.log(columns);
149 var getDescriptionForNodes= function (){
150 var invKeys = Object.keys(INVLIST.INVENTORYLIST);
151 let oxmFile = JSON.parse(OXM);
152 let javaTypes = oxmFile['xml-bindings']['java-types'][0]['java-type'];
153 let nodeDescriptionObj={};
154 let invList = invKeys.map(item => {
155 for (let i = 0; i < javaTypes.length; i++) {
156 if(javaTypes[i]['$']['name'].toLowerCase() === camelToDash(INVLIST.INVENTORYLIST[item].modelPath).toLowerCase()) {
157 if(javaTypes[i]['xml-properties'] !== undefined && javaTypes[i]['xml-properties'][0]['xml-property'] && javaTypes[i]['xml-properties'][0]['xml-property'][0]['$']['name']==='description'){
158 nodeDescriptionObj[INVLIST.INVENTORYLIST[item].modelPath]=javaTypes[i]['xml-properties'][0]['xml-property'][0]['$']['value'];
160 nodeDescriptionObj[INVLIST.INVENTORYLIST[item].modelPath]='';
164 return nodeDescriptionObj;
169 var generateExcels = function(nodeResults,dslQuery) {
170 console.log('inside generateExcels>>>>>');
171 //Creating New Workbook
172 var workbook = new Excel.Workbook();
175 var columnsJsonObj = {}
177 columnsJsonObj.columns = columnsList;
178 var nodesLength = nodeResults.length;
179 console.log('nodeResults.length.......',nodesLength);
180 for(var n=0;n<nodesLength;n++){
181 //Creating Sheet for that particular WorkBook
182 let nodeTypeVal = nodeResults[n]["node-type"];
183 let url = nodeResults[n]["url"];
185 let buildColumns = [];
186 if(nodesType.indexOf(nodeTypeVal) == -1){
187 nodesType.push(nodeTypeVal);
188 worksheet = workbook.addWorksheet(nodeTypeVal,{properties: {showGridLines: true}});
189 buildColumns = buildAttrList(nodeTypeVal, [], 'required');
191 let tempDslQuery= dslQuery+',';
192 let nodeTypeProperties ='';
194 var nodePatternwithProp = generateRegexForDsl(nodeTypeVal);
195 var nodeRegularExp = new RegExp(nodePatternwithProp, 'g');
196 plainNodes = tempDslQuery.match(nodeRegularExp);
197 console.log('plainNodes model Gallery null>>>>>*',plainNodes);
199 let propertiesPattern ="\\{.*?\\}";
200 var propRegularExp = new RegExp(propertiesPattern, 'g');
201 nodeTypeProperties = plainNodes[0].match(propRegularExp);
202 console.log('nodeTypeProperties model Gallery>>>>>*',nodeTypeProperties);
203 nodeTypeProperties = nodeTypeProperties[0].slice(1,-1).replace(/\'/g,'').toLowerCase().split(',');
204 for(var z=0;z<buildColumns.length;z++){
205 if(nodeTypeProperties.indexOf(buildColumns[z].value.toLowerCase()) !== -1){
206 columns.push(buildColumns[z]);
209 console.log('on condition table columns>>>>',columns);
211 columns=buildColumns;
214 columns=buildColumns;
216 columns.push({value: 'uri'});
217 columns.push({value: 'relationship-list'});
219 [nodeTypeVal] : columns
221 columnsJsonObj.columns.push(column);
222 if (!worksheet.columns) {
223 worksheet.columns = Object.keys(columns).map((k) => ({ header: columns[k].value, key: columns[k].value, width:15}))
226 worksheet = workbook.getWorksheet(nodeTypeVal);
227 let col = columnsJsonObj.columns;
229 if(col[c][nodeTypeVal]){
230 columns = col[c][nodeTypeVal];
234 var excelCellsHeader = [];
236 var noOfCol = Math.ceil(columns.length/26);
239 for(var j=0; j<EXCELCELLS.length; j++){
240 excelCellsHeader.push(EXCELCELLS[j]);
243 for(var j=0; j<EXCELCELLS.length; j++){
244 excelCellsHeader.push(EXCELCELLS[loop-1]+EXCELCELLS[j]);
249 console.log('excelCellsHeader.......',excelCellsHeader);
250 console.log('worksheet.columns>>>>',worksheet.columns);
252 var relativeRow = [];
254 for(var x in columns){
255 if(nodeResults[n].properties[columns[x].value] !== undefined){
256 row.push(nodeResults[n].properties[columns[x].value]);
257 relativeRow.push("");
260 relativeRow.push("");
263 row[row.length-2] = url;
264 console.log('Push Row after>>>>>>>>>>>',row);
265 var relationships = [];
266 if(nodeResults[n]["related-to"]){
267 let relative =nodeResults[n]["related-to"];
268 var relativeLength = relative.length;
269 console.log('relativeLength>>>>>>>>>>>',relativeLength);
270 if(relativeLength>0){
271 for(var r = 0; r<relative.length; r++){
272 var relationship = '';
273 var relationshipLabel = '';
276 for(var k in relative[r]){
277 let relation = k.toString();
278 if(relation === 'relationship-label'){
279 relationshipLabel = relative[r][k].toString().slice(33);
281 if(relation === 'node-type'){
282 nodeType = relative[r][k].toString();
284 if(relation === 'url'){
285 localUrl = relative[r][k].toString();
288 relationship = 'Relationship ' + relationshipLabel + ' ' + nodeType + ' - ' + localUrl;
290 row[row.length-1] = relationship;
294 tempRow = [...relativeRow]; // cloning in ES6 Way to avoid deep copy
295 tempRow[tempRow.length-1] = relationship;
305 console.log('Rows before pushing>>>>>>>>>>>',rows);
306 let initMergeCell = (n==0) ? 2: worksheet.rowCount + 1;
307 worksheet.addRows(rows);
308 console.log('initMergeCell>>>>>>',initMergeCell);
309 //worksheet.getColumn(columns.length).values = relationships;
310 let lastMergeCell = (relativeLength==0)? initMergeCell : initMergeCell + relativeLength - 1;
311 console.log('lastMergeCell>>>>>>',lastMergeCell);
312 for(var x=0;x<columns.length-1;x++){
313 var cell = excelCellsHeader[x] + initMergeCell +':'+excelCellsHeader[x]+lastMergeCell;
314 worksheet.mergeCells(cell);
317 var workbookName = 'NodesList_'+nodesLength+'_Results.xlsx';
318 generateWorkbook(workbook,workbookName);
320 var generateRegexForDsl= function(nodeType){
321 var nodePatternwithProp = nodeType+"\\*\\{.*?\\}\\(.*?\\)[\\,|\\>|\\]|\\)]|"+nodeType+"\\*\\(.*?\\)\\{.*?\\}[\\,|\\>|\\]|\\)]|"+nodeType+"\\{.*?\\}\\(.*?\\)[\\,|\\>|\\]|\\)]|"+nodeType+"\\(.*?\\)\\{.*?\\}[\\,|\\>|\\]|\\)]|"+nodeType+"\\{.*?\\}[\\,|\\>|\\]|\\)]|"+nodeType+"\\*\\{.*?\\}[\\,|\\>|\\]|\\)]";
322 return nodePatternwithProp;
324 var generateExcelFromTabularView = function(tabledata,tableheaders,workbookName) {
325 console.log('inside generateExcelFromTabularView>>>>>');
326 //Creating New Workbook
327 var workbook = new Excel.Workbook();
328 var worksheet = workbook.addWorksheet('Results',{properties: {showGridLines: true}});
330 if (!worksheet.columns) {
331 worksheet.columns = Object.keys(tableheaders).map((k) => ({ header: tableheaders[k].name, key: tableheaders[k].name, width:20}))
335 for(var n=0; n<tabledata.length; n++){
336 console.log('TableData<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<',tabledata[n]);
338 Object.keys(tableheaders).map((k) => { row.push(tabledata[n][tableheaders[k].name])});
341 worksheet.addRows(rows);
342 generateWorkbook(workbook,workbookName);
344 var generateExcelFromTabularViewMultiTabs = function(tabData,tabHeaders,workBookName) {
345 console.log('inside generateExcelFromTabularViewMultiTabs>>>>>');
346 //Creating New Workbook
347 var workbook = new Excel.Workbook();
348 Object.keys(tabData).forEach((key,index) => {
349 var worksheet = workbook.addWorksheet((index+1)+'_'+key,{properties: {showGridLines: true}});
351 var tableData = tabData[key];
352 var tableHeaders = tabHeaders[key];
353 if (!worksheet.columns) {
354 worksheet.columns = Object.keys(tableHeaders).map((k) => ({ header: tableHeaders[k].name, key: tableHeaders[k].name, width:20}))
358 for(var n = 0; n < tableData.length; n++){
359 console.log('TableData<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<',tableData[n]);
361 Object.keys(tableHeaders).map((k) => { row.push(tableData[n][tableHeaders[k].name])});
364 worksheet.addRows(rows);
366 generateWorkbook(workbook,workBookName);
368 var generateViolationExcels = function(tabledata,tableheaders) {
369 generateExcelFromTabularView(tabledata, tableheaders, 'DataIntegrityViolationTable.xlsx');
371 var generateWorkbook = function(workbook,workbookName){
372 console.log('generateWorkbook :',workbookName);
373 workbook.xlsx.writeBuffer().then(function (data) {
374 const blob = new Blob([data],
375 { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
376 const url = window.URL.createObjectURL(blob);
377 const anchor = document.createElement('a');
378 document.body.appendChild(anchor);
380 anchor.download = workbookName;
382 window.URL.revokeObjectURL(url);
387 export const ExportExcel = {
388 buildAttrList : buildAttrList,
389 generateExcels : generateExcels,
390 generateViolationExcels : generateViolationExcels,
391 generateExcelFromTabularView: generateExcelFromTabularView,
392 generateExcelFromTabularViewMultiTabs: generateExcelFromTabularViewMultiTabs,
393 getDescriptionForNodes: getDescriptionForNodes