Merge "Fix tosca parser"
[clamp.git] / src / main / resources / META-INF / resources / designer / scripts / UpgradeSchemaCtrl.js
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP CLAMP
4  * ================================================================================
5  * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
6  *                             reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License"); 
9  * you may not use this file except in compliance with the License. 
10  * You may obtain a copy of the License at
11  * 
12  * http://www.apache.org/licenses/LICENSE-2.0
13  * 
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============================================
20  * ===================================================================
21  * 
22  */
23 var elementKeys = [];
24 app
25 .directive(
26 'inputInfoUpgradeClass',
27 function($compile) {
28         console.log("////UpgradeSchemaCtrl");
29         return {
30         restrict : "C",
31         replace : true,
32         link : function(scope, element, attrs) {
33                 var elementHTML = '';
34                 angular
35                 .forEach(
36                 scope.infoType.schemaElements,
37                 function(value, key) {
38                         scope.schemaElement = value;
39                         if (scope.schemaElement.complexType != null) {
40                                 if (scope.currentElementName == '') {
41                                         scope.currentElementName = scope.schemaElement.complexType.name;
42                                 }
43                                 scope.ParentKey = scope.parentName + '_'
44                                 + scope.currentElementName;
45                                 if (scope.schemaElement.repeatableHierarchicalPrefix != null) {
46                                         scope.ParentKey = scope.ParentKey
47                                         + scope.schemaElement.repeatableHierarchicalPrefix;
48                                 }
49                                 scope.parElement = scope.schemaElement;
50                                 scope.tableStyle = 'table-level' + scope.heirarchyLevel
51                                 + '-tree';
52                                 scope.tdLabelStyle = 'td-level' + scope.heirarchyLevel
53                                 + '-label-tree';
54                                 scope.heirLevel = scope.heirarchyLevel;
55                                 elementHTML = elementHTML
56                                 + '<div ng-show="schemaElement.complexType != null">';
57                                 elementHTML = elementHTML
58                                 + '<table class="{{tableStyle}}"> <tr>';
59                                 elementHTML = elementHTML + '<td class="{{tdLabelStyle}}">';
60                                 elementHTML = elementHTML
61                                 + '<span class="pull-left" ng-click="showUTMViewMsgHeader=!showUTMViewMsgHeader">';
62                                 elementHTML = elementHTML
63                                 + '<i ng-class="showUTMViewMsgHeader == true ?\'fa fa-plus-circle\':\'fa fa-minus-circle\'"></i>';
64                                 elementHTML = elementHTML + '</span>';
65                                 elementHTML = elementHTML + '<b>{{currentElementName}}</b>';
66                                 elementHTML = elementHTML + '</td>';
67                                 elementHTML = elementHTML + '<td class="td-tree"></td>';
68                                 elementHTML = elementHTML
69                                 + '<td class="td-default_value-tree"> </td>';
70                                 elementHTML = elementHTML + '</tr></table>';
71                                 elementHTML = elementHTML
72                                 + '<div style="margin-left: 10px" ng-class="{hidden:showUTMViewMsgHeader,chaldean:showUTMViewMsgHeader}">';
73                                 elementHTML = elementHTML
74                                 + '<div class="inputInfoUpgradeClassMember" style="margin-left: 10px" ng-repeat="schemaElement in schemaElement.elements"></div>';
75                                 elementHTML = elementHTML + '</div>';
76                                 elementHTML = elementHTML + '</div>';
77                                 var x = angular.element(elementHTML);
78                                 element.append(x);
79                                 $compile(x)(scope);
80                         }
81                 });
82         }
83         }
84 });
85 app
86 .directive(
87 'inputInfoUpgradeClassMember',
88 function($compile) {
89         return {
90         restrict : "C",
91         link : function(scope, element, attrs) {
92                 var elementHTML = '';
93                 scope.currentElementName = scope.objectName;
94                 scope.parentName = scope.ParentKey;
95                 scope.parentElement = scope.parElement;
96                 scope.heirarchyLevel = scope.heirLevel + 1;
97                 if (scope.schemaElement.element.name != null) {
98                         scope.elementKey = scope.parentName + '_'
99                         + scope.schemaElement.element.name;
100                         if (scope.schemaElement.repeatableHierarchicalPrefix != null) {
101                                 scope.elementKey = scope.elementKey
102                                 + scope.schemaElement.repeatableHierarchicalPrefix;
103                         }
104                         scope.tableStyle = 'table-level' + scope.heirarchyLevel + '-tree';
105                         scope.tdLabelStyle = 'td-level' + scope.heirarchyLevel
106                         + '-label-tree';
107                         if (scope.schemaElement.type.complexType != null) {
108                                 scope.showUTMViewMsgHeader = false;
109                         } else {
110                                 scope.showUTMViewMsgHeader = true;
111                         }
112                         elementHTML = elementHTML
113                         + '<div ng-show="schemaElement.element.name != null">';
114                         elementHTML = elementHTML + '<table class="{{tableStyle}}"> ';
115                         elementHTML = elementHTML + '<tr>';
116                         elementHTML = elementHTML
117                         + '<td style="text-align: left;vertical-align: top;" class="{{tdLabelStyle}}">';
118                         elementHTML = elementHTML
119                         + '<span class="pull-left" ng-click="showUTMViewMsgHeader=!showUTMViewMsgHeader">';
120                         elementHTML = elementHTML + '<div style="display:inline">';
121                         elementHTML = elementHTML
122                         + '<input type="radio" name={{radioName}} id="{{elementKey}}" value={{schemaElement.element.name}}>';
123                         elementHTML = elementHTML + '</div>';
124                         elementHTML = elementHTML
125                         + '<i expandable ng-class="showUTMViewMsgHeader == true ?\'fa fa-minus-circle\':\'fa fa-plus-circle\'"></i>';
126                         elementHTML = elementHTML + '{{schemaElement.element.name}}  ';
127                         elementHTML = elementHTML + '';
128                         elementHTML = elementHTML + '';
129                         elementHTML = elementHTML + '';
130                         elementHTML = elementHTML + '';
131                         elementHTML = elementHTML + '</span>';
132                         elementHTML = elementHTML
133                         + '<div ng-init="complexMapElements(elementKey,schemaElement,radioName)"></div>';
134                         elementHTML = elementHTML + '</td>';
135                         elementHTML = elementHTML + '</tr>';
136                         elementHTML = elementHTML + '</table>';
137                         elementHTML = elementHTML + '';
138                         elementHTML = elementHTML + '';
139                         elementHTML = elementHTML + '</div>';
140                         var x = angular.element(elementHTML);
141                         element.append(x);
142                         $compile(x)(scope);
143                         if (scope.schemaElement.type.complexType != null) {
144                                 var elementHTML2 = '<div ng-show="schemaElement.type.complexType != null">'
145                                 elementHTML2 = elementHTML2
146                                 + '<div ng-init="parKey=parentName + \'_\' + schemaElement.element.name + (schemaElement.repeatableHierarchicalPrefix != null ? schemaElement.repeatableHierarchicalPrefix : \'\'); heirLevel=heirarchyLevel; parElement=schemaElement; ParentKey=ParentKey+\'_\'+schemaElement.element.name + (schemaElement.repeatableHierarchicalPrefix != null ? schemaElement.repeatableHierarchicalPrefix : \'\')">'
147                                 elementHTML2 = elementHTML2
148                                 + '<div style="margin-left: 10px" ng-class="{hidden:!showUTMViewMsgHeader,chaldean:!showUTMViewMsgHeader}">'
149                                 elementHTML2 = elementHTML2
150                                 + '<div class="{{sourceExplorer+\'_\'+parKey}}"></div>'
151                                 elementHTML2 = elementHTML2 + '</div>'
152                                 elementHTML2 = elementHTML2 + '</div>'
153                                 elementHTML2 = elementHTML2 + '</div>';
154                                 var x = angular.element(elementHTML2);
155                                 element.append(x);
156                                 $compile(x)(scope);
157                         }
158                 }
159         }
160         }
161 });
162 app
163 .controller(
164 'UpgradeSchemaCtrl',
165 [
166 '$scope',
167 '$rootScope',
168 '$uibModalInstance',
169 'dialogs',
170 function($scope, $rootScope, $uibModalInstance, dialogs) {
171         $rootScope.Currentmappedvalues = [];
172         $scope.utmSchemaExts = {};
173         $scope.callFromMap = false;
174         $scope.oldMapValFlag = false;
175         $scope.complexMappedValuesOld = {};
176         $scope.complexMappedValuesNew = {};
177         var allCurrentElementKeyArray = [];
178         $scope.checkedValues = {};
179         var checkedElementValueArray = [];
180         $scope.complexMapElements = function(elementKey, schemaElement, radioName) {
181                 if (schemaElement.complexType != null
182                 || (schemaElement.type != null && schemaElement.type.complexType != null)) {
183                         if (radioName == "oldChk")
184                                 $scope.complexMappedValuesOld[elementKey] = schemaElement;
185                         else if (radioName == "newChk")
186                                 $scope.complexMappedValuesNew[elementKey] = schemaElement;
187                 }
188                 if (elementKey != null)
189                         allCurrentElementKeyArray.push(elementKey);
190         };
191         $scope.mapElements = function() {
192                 var oldVal = $('input[name=oldChk]:checked').val();
193                 var newVal = $('input[name=newChk]:checked').val();
194                 var oldId = $('input[name=oldChk]:checked').attr('id');
195                 var newId = $('input[name=newChk]:checked').attr('id');
196                 $scope.mappedvalues = {};
197                 $scope.checkedValues.oldVal = oldVal;
198                 $scope.checkedValues.newVal = newVal;
199                 checkedElementValueArray.push($scope.checkedValues);
200                 $scope.oldMappedvaluesKeyArray = [];
201                 $scope.newMappedvaluesKeyArray = [];
202                 $scope.oldmappedvaluesArray = [];
203                 $scope.newMappedvaluesArray = [];
204                 if ($scope.complexMappedValuesOld[oldId] != null
205                 && $scope.complexMappedValuesNew[newId] != null) {
206                         $scope.matchType = '';
207                         $scope.matchType = $scope.compareElements(
208                         $scope.complexMappedValuesOld[oldId],
209                         $scope.complexMappedValuesNew[newId]);
210                         if ($scope.matchType == "true") {
211                                 console
212                                 .log("Element Type Matches and eligible for upgrade schema");
213                                 $scope.callFromMap = true;
214                                 for (var i = 0; i < $scope.complexMappedValuesOld[oldId].type.elements.length; i++) {
215                                         $scope.oldMapValFlag = true;
216                                         getElementkeys(oldId,
217                                         $scope.complexMappedValuesOld[oldId].type.elements[i]);
218                                 }
219                                 for (var j = 0; j < $scope.complexMappedValuesNew[newId].type.elements.length; j++) {
220                                         $scope.oldMapValFlag = false;
221                                         getElementkeys(newId,
222                                         $scope.complexMappedValuesNew[newId].type.elements[j]);
223                                 }
224                                 for (var k = 0; k < $scope.oldmappedvaluesArray.length; k++) {
225                                         $scope.mappedvalues = {};
226                                         $scope.mappedvalues.oldvalue = $scope.oldmappedvaluesArray[k];
227                                         $scope.mappedvalues.newvalue = $scope.newMappedvaluesArray[k];
228                                         $scope.mappedvalues.oldidvalue = $scope.oldMappedvaluesKeyArray[k];
229                                         $scope.mappedvalues.newidvalue = $scope.newMappedvaluesKeyArray[k];
230                                         $rootScope.Currentmappedvalues.push($scope.mappedvalues);
231                                 }
232                         } else if ($scope.matchType == "false") {
233                                 dialogs
234                                 .error(
235                                 'Invalid Selection Error',
236                                 'The mapping of the selected elements is invalid. Please select valid complex elements for Upgrade Schema');
237                         }
238                 } else if (($scope.complexMappedValuesOld[oldId] == null && $scope.complexMappedValuesNew[newId] != null)
239                 || ($scope.complexMappedValuesOld[oldId] != null && $scope.complexMappedValuesNew[newId] == null)) {
240                         dialogs
241                         .error(
242                         'Invalid Selection Error',
243                         'The mapping of the selected elements is invalid. Please select valid complex elements for Upgrade Schema');
244                 } else {
245                         $scope.mappedvalues.oldvalue = oldVal;
246                         $scope.mappedvalues.newvalue = newVal;
247                         $scope.mappedvalues.oldidvalue = oldId;
248                         $scope.mappedvalues.newidvalue = newId;
249                         $rootScope.Currentmappedvalues.push($scope.mappedvalues);
250                 }
251                 $rootScope.checkRepeatable = false;
252         };
253         // Utility Method to compare Object Structure of Complex Type Elements
254         // before upgrade schema
255         $scope.compareElements = function(oldElement, newElement) {
256                 if (oldElement.type.complexType != null
257                 && newElement.type.complexType != null) {
258                         if (oldElement.type.elements.length == newElement.type.elements.length) {
259                                 for (var i = 0; i < oldElement.type.elements.length; i++) {
260                                         if (oldElement.type.elements[i].type.complexType != null
261                                         && newElement.type.elements[i].type.complexType != null) {
262                                                 $scope.compareElements(oldElement.type.elements[i],
263                                                 newElement.type.elements[i]);
264                                         } else if (oldElement.type.elements[i].type.complexType == null
265                                         && newElement.type.elements[i].type.complexType != null) {
266                                                 $scope.matchType = "false";
267                                                 return $scope.matchType;
268                                         }
269                                         if ($scope.matchType == "false")
270                                                 return $scope.matchType;
271                                 }
272                                 for (var i = 0; i < newElement.type.elements.length; i++) {
273                                         if (newElement.type.elements[i].type.complexType != null
274                                         && oldElement.type.elements[i].type.complexType != null) {
275                                                 $scope.compareElements(newElement.type.elements[i],
276                                                 oldElement.type.elements[i]);
277                                         } else if (newElement.type.elements[i].type.complexType == null
278                                         && oldElement.type.elements[i].type.complexType != null) {
279                                                 $scope.matchType = "false";
280                                                 return $scope.matchType;
281                                         }
282                                         if ($scope.matchType == "false")
283                                                 return $scope.matchType;
284                                 }
285                                 $scope.matchType = "true";
286                                 return $scope.matchType;
287                         } else
288                                 $scope.matchType = "false";
289                         return $scope.matchType;
290                 }
291         };
292         $scope.checkRepeatableElement = function(elementKey, key) {
293                 if (elementKey != key)
294                         $rootScope.checkRepeatable = true;
295         };
296         $scope.upgradeSchema = function() {
297                 // console.log("List Model Path Details before Upgrade Schema :: " +
298                 // JSON.stringify(list_model_path_details[selected_model]));
299                 $scope.callFromMap = false;
300                 $rootScope.isHorR = true;
301                 $rootScope.repeatableHeirarchicalElementMap = map_model_repeatable_heirarchical_elements[selected_model];
302                 // Checking Repeatable Hierarchical elements mapping and changing
303                 // elementkey if repeatable hierarchical is mapped
304                 for ( var key in $rootScope.repeatableHeirarchicalElementMap) {
305                         for (var i = 0; i < allCurrentElementKeyArray.length; i++) {
306                                 if (allCurrentElementKeyArray[i].indexOf(key) > -1)
307                                         elementKeys.push(allCurrentElementKeyArray[i]);
308                         }
309                         for (var j = 0; j < checkedElementValueArray.length; j++) {
310                                 var currentCheckedMappedvalue = checkedElementValueArray[j];
311                                 if (key.indexOf(currentCheckedMappedvalue.oldVal) > -1) {
312                                         var newObject = JSON
313                                         .stringify($rootScope.repeatableHeirarchicalElementMap);
314                                         var oldvalue = currentCheckedMappedvalue.oldVal;
315                                         var newvalue = currentCheckedMappedvalue.newVal;
316                                         var modObject = newObject.replace(oldvalue, newvalue);
317                                         $rootScope.repeatableHeirarchicalElementMap = angular
318                                         .fromJson(modObject);
319                                 }
320                         }
321                 }
322                 $scope.oldSchemaLocation = $rootScope.wsdlInfo.schemaLocation;
323                 $rootScope.wsdlInfo = $rootScope.updateWsdlInfo;
324                 $rootScope.wsdlInfo.schemaUpgradedFlag = true;
325                 $rootScope.wsdlInfo.oldSchemaLocation = $scope.oldSchemaLocation;
326                 $rootScope.serviceInfo = $rootScope.updateServiceInfo;
327                 $rootScope.schemaLocation = $rootScope.updateWsdlInfo.schemaLocation;
328                 $rootScope.serviceInput = $rootScope.updateServiceInput;
329                 $rootScope.serviceInputPartInfo = $rootScope.updateServiceInputPartInfo;
330                 $rootScope.inputSchemaServiceInputPartInfo = [];
331                 $rootScope.inputSchemaServiceOutputPartInfo = [];
332                 $rootScope.inputSchemaServicefaultPartInfo = [];
333                 angular.copy($rootScope.serviceInputPartInfo,
334                 $rootScope.inputSchemaServiceInputPartInfo);
335                 angular.copy($rootScope.serviceOutputPartInfo,
336                 $rootScope.inputSchemaServiceOutputPartInfo);
337                 angular.copy($rootScope.servicefaultPartInfo,
338                 $rootScope.inputSchemaServicefaultPartInfo);
339                 // Form all the element keys of the Upgraded Schema so that to know the
340                 // attibutes removed
341                 for (var i = 0; i < $rootScope.serviceInputPartInfo.length; i++) {
342                         for (var j = 0; j < $rootScope.serviceInputPartInfo[i].schemaElements.length; j++) {
343                                 getElementkeys('ServiceInput',
344                                 $rootScope.serviceInputPartInfo[i].schemaElements[j]);
345                         }
346                 }
347                 $rootScope.serviceOutput = $rootScope.updateServiceOutput;
348                 $rootScope.serviceOutputPartInfo = $rootScope.updateServiceOutputPartInfo;
349                 for (var i = 0; i < $rootScope.serviceOutputPartInfo.length; i++) {
350                         for (var j = 0; j < $rootScope.serviceOutputPartInfo[i].schemaElements.length; j++) {
351                                 getElementkeys('ServiceOutput',
352                                 $rootScope.serviceOutputPartInfo[i].schemaElements[j]);
353                         }
354                 }
355                 $rootScope.servicefault = $rootScope.updateServicefault;
356                 $rootScope.servicefaultPartInfo = $rootScope.updateServicefaultPartInfo;
357                 for (var i = 0; i < $rootScope.servicefaultPartInfo.length; i++) {
358                         for (var j = 0; j < $rootScope.servicefaultPartInfo[i].schemaElements.length; j++) {
359                                 getElementkeys('ServiceFault',
360                                 $rootScope.servicefaultPartInfo[i].schemaElements[j]);
361                         }
362                 }
363                 console.log("mapped values of current"
364                 + JSON.stringify($rootScope.Currentmappedvalues));
365                 // For each model in the project
366                 // a) For the mapped elements
367                 // i) replace the old ids with new ids for the Schema Extensions
368                 // ii) replace the old ids with new ids for the Path Details
369                 // b) For the deleted attributes in the Upgraded schema
370                 // i) Remove the ids from Schema Extensions
371                 // ii) Remove the ids from Path Details
372                 for (var modelIndex = 0; modelIndex < $rootScope.models.length; modelIndex++) {
373                         var current_model = $rootScope.models[modelIndex];
374                         $scope.utmSchemaExts = list_model_schema_extensions[current_model].utmSchemaExtentionMap;
375                         $scope.pathDetailsArray = list_model_path_details[current_model];
376                         for (var i = 0; i < $rootScope.Currentmappedvalues.length; i++) {
377                                 $scope.mappedvalues = $rootScope.Currentmappedvalues[i];
378                                 if ($scope.utmSchemaExts != null) {
379                                         $scope.utmSchemaExts[$scope.mappedvalues.newidvalue] = $scope.utmSchemaExts[$scope.mappedvalues.oldidvalue];
380                                         if ($scope.mappedvalues.newidvalue != $scope.mappedvalues.oldidvalue)
381                                                 delete $scope.utmSchemaExts[$scope.mappedvalues.oldidvalue];
382                                 }
383                                 if ($scope.pathDetailsArray != null
384                                 && $scope.pathDetailsArray.length > 0) {
385                                         for (var k = 0; k < $scope.pathDetailsArray.length; k++) {
386                                                 $scope.pathDetails = $scope.pathDetailsArray[k];
387                                                 if ($scope.pathDetails != null) {
388                                                         for (var j = 0; j < $scope.pathDetails.decisionIdentifiers.length; j++) {
389                                                                 if ($scope.pathDetails.decisionIdentifiers[j].elementValues[$scope.mappedvalues.oldidvalue] != null)
390                                                                         $scope.pathDetails.decisionIdentifiers[j].elementValues[$scope.mappedvalues.newidvalue] = $scope.pathDetails.decisionIdentifiers[j].elementValues[$scope.mappedvalues.oldidvalue];
391                                                                 if ($scope.mappedvalues.newidvalue != $scope.mappedvalues.oldidvalue)
392                                                                         delete $scope.pathDetails.decisionIdentifiers[j].elementValues[$scope.mappedvalues.oldidvalue];
393                                                         }
394                                                 }
395                                         }
396                                 }
397                         }
398                         $scope.schemenExts = angular.copy($scope.utmSchemaExts);
399                         // If an attribute is removed from upgraded schema, remove that
400                         // attribute related details from SchemaExtensions
401                         Object.keys($scope.schemenExts).forEach(function(key) {
402                                 var key_isavailable = false;
403                                 for (var j = 0; j < elementKeys.length; j++) {
404                                         if (elementKeys[j] === key) {
405                                                 key_isavailable = true;
406                                         }
407                                 }
408                                 if (!key_isavailable) {
409                                         // Implement this later. Commented this as this is wiping
410                                         // out all the Repeatable/Heirarchical values
411                                         // delete $scope.utmSchemaExts[key];
412                                 }
413                         });
414                         // If an attribute is removed from upgraded schema, remove that
415                         // attribute related details from PathDetails
416                         if ($scope.pathDetailsArray != null
417                         && $scope.pathDetailsArray.length > 0) {
418                                 for (var k = 0; k < $scope.pathDetailsArray.length; k++) {
419                                         $scope.pathDetails = $scope.pathDetailsArray[k];
420                                         for (var j = 0; j < $scope.pathDetails.decisionIdentifiers.length; j++) {
421                                                 $scope.decisionElementValues = angular
422                                                 .copy($scope.pathDetails.decisionIdentifiers[j].elementValues);
423                                                 Object.keys($scope.decisionElementValues).forEach(
424                                                 function(key) {
425                                                         var key_isavailable = false;
426                                                         for (var l = 0; l < elementKeys.length; l++) {
427                                                                 if (elementKeys[l] === key) {
428                                                                         key_isavailable = true;
429                                                                 }
430                                                         }
431                                                         if (!key_isavailable) {
432                                                                 // Implement this later. Commented this as this
433                                                                 // is wiping out all the Repeatable/Heirarchical
434                                                                 // values
435                                                                 // delete
436                                                                 // $scope.pathDetails.decisionIdentifiers[j].elementValues[key];
437                                                         }
438                                                 });
439                                         }
440                                 }
441                         }
442                 }
443                 $uibModalInstance.close("closed");
444         };
445         $scope.close = function() {
446                 $uibModalInstance.close("closed");
447         };
448         function getElementkeys(parentname, schemaelement) {
449                 if (schemaelement.complexType != null) {
450                         var parentkey = parentname + "_" + schemaelement.complexType.name;
451                         for (var i = 0; i < schemaelement.elements.length; i++) {
452                                 getElementkeys(parentkey, schemaelement.elements[i]);
453                         }
454                 }
455                 if (schemaelement.element != null && schemaelement.element.name != null) {
456                         var elementKey = parentname + '_' + schemaelement.element.name;
457                         if (!$scope.callFromMap) {
458                                 elementKeys.push(elementKey);
459                         } else {
460                                 if ($scope.oldMapValFlag) {
461                                         $scope.oldmappedvaluesArray
462                                         .push(schemaelement.element.name);
463                                         $scope.oldMappedvaluesKeyArray.push(elementKey);
464                                 } else {
465                                         $scope.newMappedvaluesArray
466                                         .push(schemaelement.element.name);
467                                         $scope.newMappedvaluesKeyArray.push(elementKey);
468                                 }
469                         }
470                 }
471                 if (schemaelement.type != null
472                 && schemaelement.type.complexType != null) {
473                         var parentkey = parentname + '_' + schemaelement.element.name;
474                         for (var i = 0; i < schemaelement.type.elements.length; i++) {
475                                 getElementkeys(parentkey, schemaelement.type.elements[i]);
476                         }
477                 }
478         }
479 } ]);