5fcea7f8a0474887cf0c5a44885784dd8eee54c9
[vid.git] / vid-app-common / src / main / webapp / app / vid / scripts / services / utilityService.js
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * VID\r
4  * ================================================================================\r
5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * \r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  */\r
20 \r
21 "use strict";\r
22 \r
23 /*\r
24  * "UtilityService" contains various generic methods.\r
25  * \r
26  * (*** DEPRECATED - Use PropertyService instead ***) setProperties() and\r
27  * getProperties()\r
28  * \r
29  * SYNTAX: hasContents(object)\r
30  * \r
31  * Returns "true" if "object" contains contents (i.e. is NOT undefined, null or\r
32  * ""), "false" otherwise.\r
33  * \r
34  * SYNTAX: checkUndefined(name, value)\r
35  * \r
36  * Throws an exception if "value" is undefined. The exception includes "name" as\r
37  * the cause of the exception. Returns "value" if it is defined.\r
38  * \r
39  * SYNTAX: getCurrentTime()\r
40  * \r
41  * Returns the current local date and time in the format "MM/DD/YY HH:MM:SS"\r
42  * \r
43  * SYNTAX: setHttpErrorHandler(function)\r
44  * \r
45  * Sets the HTTP error handler to "function".\r
46  * \r
47  * SYNTAX: runHttpErrorHandler(response, status)\r
48  * \r
49  * Logs warning messages and the runs the HTTP error handler previously set by\r
50  * "setHttpErrorHandler". The intended usage is for "$http" calls. Example:\r
51  * $http.get(...).then(...)["catch"](UtilityService.runHttpErrorHandler);\r
52  * \r
53  * SYNTAX: getHttpStatusText(statusCode)\r
54  * \r
55  * Expects "statusCode" to be an HTTP response code (e.g. 404). The function\r
56  * returns a string that includes both the code and an equivalent text summary.\r
57  * Example: "Not found (404)"\r
58  * \r
59  * SYNTAX: getHttpErrorMessage(response)\r
60  * \r
61  * Expects "response" to be the response object generated by a "$http" error\r
62  * condition. "getHttpErrorMessage" examines the object and returns a summary\r
63  * string for some known conditions.\r
64  */\r
65 \r
66 var UtilityService = function($log, DataService, PARAMETER, _) {\r
67 \r
68     var _this = this;\r
69 \r
70     function hasCustomizationUuidFields(mapOfVfs) {\r
71         return _.some(mapOfVfs, function (o) {\r
72             return _.has(o, "customizationUuid");\r
73         });\r
74     }\r
75 \r
76     var convertModel = function (serviceModel) {\r
77 \r
78         var isNewFlow =\r
79                         hasCustomizationUuidFields(serviceModel.networks)\r
80                         || hasCustomizationUuidFields(serviceModel.pnfs)\r
81                         || hasCustomizationUuidFields(serviceModel.vnfs)\r
82                         || hasCustomizationUuidFields(serviceModel.configurations);\r
83 \r
84         if ( isNewFlow ) {\r
85             return (convertNewModel (serviceModel) );\r
86         }\r
87         else {\r
88             return (convertOldModel (serviceModel) );\r
89         }\r
90     };\r
91     var convertNewModel = function (serviceModel ) {\r
92         var completeResources = new Array();\r
93                 var resource = {};\r
94                 var convertedAsdcModel = {\r
95                                 "service": serviceModel.service,\r
96                                 "networks": {},\r
97                                 "vnfs": {},\r
98                                 "pnfs": serviceModel.pnfs,\r
99                                 "serviceProxies": serviceModel.serviceProxies,\r
100                                 "completeDisplayInputs": {},\r
101                                 "isNewFlow": true\r
102                         };\r
103                 var networkModelDisplayInputs = {};\r
104                 var vnfModelDisplayInputs = {};\r
105         for (var networkCustomizationName in serviceModel.networks) {\r
106                         var networkModel = serviceModel.networks[networkCustomizationName];\r
107                         \r
108                         convertedAsdcModel.networks[networkModel.customizationUuid] = {\r
109                                         "uuid": networkModel.uuid,\r
110                                         "invariantUuid": networkModel.invariantUuid,\r
111                                         "version": networkModel.version,\r
112                                         "name": networkModel.name,\r
113                                         "modelCustomizationName": networkModel.modelCustomizationName,\r
114                                         "customizationUuid": networkModel.customizationUuid,\r
115                                         "inputs": "",\r
116                                         "description": networkModel.description,\r
117                                         "commands": {},\r
118                                         "displayInputs": {}\r
119                         }\r
120                         resource = {\r
121                                         "name": networkModel.modelCustomizationName,\r
122                                         "description": networkModel.description\r
123                         };\r
124                         completeResources.push (resource);\r
125                         \r
126                         if (networkModel.commands != null) {\r
127                                 /*\r
128                                  * commands: \r
129                                  *  internal_net_param_ntu: {\r
130                                  *              command: get_input,\r
131                                  *              displaName: internal_net_param_ntu,\r
132                                  *              inputName: vccfd1_internal_net_param_ntu // pointer to input key\r
133                                  * }\r
134                                  * If the input name (ptr) is one of instance_node_target,  naming_policy or vf_instance_name\r
135                                  * then ignore it\r
136                                  * \r
137                                  */\r
138                                 \r
139                                 for ( var cmd in networkModel.commands ) {\r
140                                         var cmdObj = networkModel.commands[cmd];\r
141                                         if ( cmdObj.inputName != null ) {\r
142                                                 switch (cmdObj.inputName) {\r
143                                                         case "instance_node_target":\r
144                                                                 break;\r
145                                                         case "naming_policy":\r
146                                                                 break;\r
147                                                         case "vf_instance_name":\r
148                                                                 break;\r
149                                                         default: \r
150                                                                 if (serviceModel.service != null && serviceModel.service.inputs != null &&\r
151                                                                                 serviceModel.service.inputs[cmdObj.inputName] != null ) {\r
152                                                                         networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);\r
153                                                                         networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;\r
154                                                                         //E2E services need this\r
155                                                                         ["templateInvariantUUID", "templateCustomizationUUID", "templateUUID", "templateName"].forEach(function(templateProp) {\r
156                                                                                 networkModelDisplayInputs[cmdObj.inputName][templateProp] = networkModel.inputs[cmdObj.displayName][templateProp];\r
157                                                                         });\r
158 \r
159                                                                 }\r
160                                                 }\r
161                                                                 \r
162                                         }\r
163                                         \r
164                                 }\r
165                                 convertedAsdcModel.networks[networkModel.customizationUuid].displayInputs=networkModelDisplayInputs;\r
166                                 \r
167                         }\r
168                 }\r
169 \r
170         _.forEach(serviceModel.configurations, function(element, key) {\r
171             element.isConfig = true;\r
172         });\r
173         _.forEach(serviceModel.pnfs, function(element, key) {\r
174                 element.isPnf= true;\r
175                 element.modelCustomizationName= key;\r
176         });\r
177         var mergedVnfs = Object.assign({}, serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);\r
178 \r
179                 for (var vnfCustomizationName in mergedVnfs) {\r
180                         var vnfModel = mergedVnfs[vnfCustomizationName];\r
181                         var vnfCustomizationUuid = vnfModel.customizationUuid;\r
182                         convertedAsdcModel.vnfs[vnfModel.customizationUuid] = {\r
183                                         "uuid": vnfModel.uuid,\r
184                                         "invariantUuid": vnfModel.invariantUuid,\r
185                                         "version": vnfModel.version,\r
186                                         "name": vnfModel.name,\r
187                                         "modelCustomizationName": vnfModel.modelCustomizationName,\r
188                                         "customizationUuid": vnfModel.customizationUuid,\r
189                                         "inputs": "",\r
190                                         "description": vnfModel.description,\r
191                                         "vfModules": {},\r
192                                         "volumeGroups": {},\r
193                                         "commands": {},\r
194                                         "displayInputs": {},\r
195                                         "properties": {},\r
196                                         "nfRole": "",\r
197                                         "nfType": "",\r
198                                         "sourceNodes": vnfModel.sourceNodes,\r
199                                         "collectorNodes": vnfModel.collectorNodes,\r
200                         "isConfigurationByPolicy": vnfModel.configurationByPolicy ? vnfModel.configurationByPolicy : false,\r
201                         "isConfig": vnfModel.isConfig ? vnfModel.isConfig : false,\r
202                         "isPnf": vnfModel.isPnf ? vnfModel.isPnf : false\r
203                         };\r
204                         \r
205                         resource = {\r
206                                         "name": vnfModel.modelCustomizationName,\r
207                                         "description": vnfModel.description\r
208                         };\r
209                         completeResources.push (resource);\r
210                         \r
211                         if (vnfModel.commands != null) {\r
212                                 /*\r
213                                  * commands: {\r
214                                  *  internal_net_param_ntu: {\r
215                                  *              command: get_input,\r
216                                  *              displaName: internal_net_param_ntu,\r
217                                  *              inputName: vccfd1_internal_net_param_ntu // pointer to input key\r
218                                  * }\r
219                                  * If the input name (ptr) is one of instance_node_target,  naming_policy or vf_instance_name\r
220                                  * then ignore it\r
221                                  * \r
222                                  */\r
223                                 \r
224                                 for ( var cmd in vnfModel.commands ) {\r
225                                         var cmdObj = vnfModel.commands[cmd];\r
226                                         if ( cmdObj.inputName != null ) {\r
227                                                 // To Do: Make this list configurable\r
228                                                 switch (cmdObj.inputName) {\r
229                                                         case "instance_node_target":\r
230                                                                 break;\r
231                                                         case "naming_policy":\r
232                                                                 break;\r
233                                                         case "vf_instance_name":\r
234                                                                 break;\r
235                                                         default: \r
236                                                                 if (serviceModel.service != null && serviceModel.service.inputs != null &&\r
237                                                                                 serviceModel.service.inputs[cmdObj.inputName] != null ) {\r
238                                                                         vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);\r
239                                                                         vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;\r
240                                                                         //E2E services need this\r
241                                                                         ["templateInvariantUUID", "templateCustomizationUUID", "templateUUID", "templateName"].forEach(function(templateProp) {\r
242                                                                                 networkModelDisplayInputs[cmdObj.inputName][templateProp] = vnfModel.inputs[cmdObj.displayName][templateProp];\r
243                                                                         });\r
244                                                                 }\r
245                                                 }\r
246                                                                 \r
247                                         }\r
248                                         \r
249                                 }\r
250                                 \r
251                                 convertedAsdcModel.vnfs[vnfCustomizationUuid].displayInputs=vnfModelDisplayInputs;\r
252                                 convertedAsdcModel.vnfs[vnfCustomizationUuid].properties=vnfModel.properties;\r
253                                 //\r
254                                 var vnf_type = "";\r
255                                 var vnf_role = "";\r
256                                 var vnf_function = "";\r
257                                 var vnf_code = "";\r
258                                 if ( !( isObjectEmpty(vnfModel.properties) ) ) {\r
259                                         if (hasContents (vnfModel.properties.nf_type) ) {\r
260                                                 vnf_type = vnfModel.properties.nf_type;\r
261                                         }\r
262                                         if (hasContents (vnfModel.properties.nf_role) ) {\r
263                                                 vnf_role = vnfModel.properties.nf_role;\r
264                                         }\r
265                                         if (hasContents (vnfModel.properties.nf_function) ) {\r
266                                                 vnf_function = vnfModel.properties.nf_function;\r
267                                         }\r
268                                         if (hasContents (vnfModel.properties.nf_naming_code) ) {\r
269                                                 vnf_code = vnfModel.properties.nf_naming_code;\r
270                                         }\r
271                                 }\r
272                                 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfType"] = vnf_type;\r
273                                 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfRole"] = vnf_role;\r
274                                 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfFunction"] = vnf_function;\r
275                                 convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfCode"] = vnf_code;\r
276                                 //\r
277                                 for (var vfModuleCustomizationName in vnfModel.vfModules) {\r
278                                         var vfModuleModel = vnfModel.vfModules[vfModuleCustomizationName];\r
279                                         convertedAsdcModel.vnfs[vnfCustomizationUuid].vfModules[vfModuleModel.customizationUuid] = vfModuleModel;\r
280                                 }\r
281                                 \r
282                                 for (var volumeGroupCustomizationName in mergedVnfs[vnfCustomizationName].volumeGroups) {\r
283                                         var volumeGroupModel = mergedVnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];\r
284                                         convertedAsdcModel.vnfs[vnfCustomizationUuid].volumeGroups[volumeGroupModel.customizationUuid] = volumeGroupModel;\r
285                                 }\r
286                         }\r
287                 }\r
288                 \r
289                 var completeDisplayInputs = {};\r
290                 \r
291                 for (var key in vnfModelDisplayInputs) {\r
292                         completeDisplayInputs[key] = vnfModelDisplayInputs[key];\r
293                 }\r
294                 for (var key in networkModelDisplayInputs) {\r
295                         completeDisplayInputs[key] = networkModelDisplayInputs[key];\r
296                 }\r
297                 \r
298                 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;\r
299                 // Need to collect all the model customization names (node template tag) and descriptions\r
300                 DataService.setResources (completeResources);\r
301 \r
302         $log.debug ("convertedAsdcModel: ", convertedAsdcModel);\r
303                 return (convertedAsdcModel);\r
304     };\r
305 \r
306     var convertOldModel = function (serviceModel ) {\r
307         \r
308                 var resource = {};\r
309                 var convertedAsdcModel = {\r
310                                 "service": serviceModel.service,\r
311                                 "networks": {},\r
312                                 "vnfs": {},\r
313                 "pnfs": serviceModel.pnfs,\r
314                 "serviceProxies": serviceModel.serviceProxies,\r
315                                 "completeDisplayInputs": {},\r
316                                 "isNewFlow": false\r
317                         };\r
318                 var completeResources = new Array();\r
319                 var resource = {};\r
320                 var vnfModelDisplayInputs = {};\r
321                 var networkModelDisplayInputs = {};\r
322                 for (var networkCustomizationName in serviceModel.networks) {\r
323                         var networkModel = serviceModel.networks[networkCustomizationName];\r
324                         convertedAsdcModel.networks[networkModel.invariantUuid] = {};\r
325                         //convertedAsdcModel.networks[networkModel.invariantUuid][networkModel.version] = networkModel;\r
326                         // need a network model to test this\r
327                         convertedAsdcModel.networks[networkModel.uuid] = {\r
328                                         "uuid": networkModel.uuid,\r
329                                         "invariantUuid": networkModel.invariantUuid,\r
330                                         "version": networkModel.version,\r
331                                         "name": networkModel.name,\r
332                                         "modelCustomizationName": networkModel.modelCustomizationName,\r
333                                         "customizationUuid": networkModel.customizationUuid,\r
334                                         "inputs": "",\r
335                                         "description": networkModel.description,\r
336                                         "commands": {},\r
337                                         "displayInputs": {}\r
338                         }\r
339                         resource = {\r
340                                         "name": networkModel.modelCustomizationName,\r
341                                         "description": networkModel.description\r
342                         };\r
343                         completeResources.push (resource);\r
344                         if (networkModel.commands != null) {\r
345                                 /*\r
346                                  * commands: \r
347                                  *  internal_net_param_ntu: {\r
348                                  *              command: get_input,\r
349                                  *              displaName: internal_net_param_ntu,\r
350                                  *              inputName: vccfd1_internal_net_param_ntu // pointer to input key\r
351                                  * }\r
352                                  * If the input name (ptr) is one of instance_node_target,  naming_policy or vf_instance_name\r
353                                  * then ignore it\r
354                                  * \r
355                                  */\r
356                                 \r
357                                 for ( var cmd in networkModel.commands ) {\r
358                                         var cmdObj = networkModel.commands[cmd];\r
359                                         if ( cmdObj.inputName != null ) {\r
360                                                 switch (cmdObj.inputName) {\r
361                                                         case "instance_node_target":\r
362                                                                 break;\r
363                                                         case "naming_policy":\r
364                                                                 break;\r
365                                                         case "vf_instance_name":\r
366                                                                 break;\r
367                                                         default: \r
368                                                                 if (serviceModel.service != null && serviceModel.service.inputs != null &&\r
369                                                                                 serviceModel.service.inputs[cmdObj.inputName] != null ) {\r
370                                                                         networkModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);\r
371                                                                         networkModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;\r
372                                                                 }\r
373                                                 }\r
374                                                                 \r
375                                         }\r
376                                         \r
377                                 }\r
378                                 convertedAsdcModel.networks[networkModel.uuid].displayInputs=networkModelDisplayInputs;\r
379                         }\r
380                 }\r
381 \r
382         _.forEach(serviceModel.configurations, function(element, key) {\r
383             element.isConfig = true;\r
384         });\r
385         _.forEach(serviceModel.pnfs, function(element, key) {\r
386             element.isPnf= true;\r
387             element.modelCustomizationName= key;\r
388         });\r
389         var mergedVnfs = Object.assign({}, serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);\r
390 \r
391                 for (var vnfCustomizationName in mergedVnfs) {\r
392                         var vnfModel = mergedVnfs[vnfCustomizationName];\r
393                         convertedAsdcModel.vnfs[vnfModel.uuid] = {\r
394                                         "uuid": vnfModel.uuid,\r
395                                         "invariantUuid": vnfModel.invariantUuid,\r
396                                         "version": vnfModel.version,\r
397                                         "name": vnfModel.name,\r
398                                         "modelCustomizationName": vnfModel.modelCustomizationName,\r
399                                         "customizationUuid": vnfModel.customizationUuid,\r
400                                         "inputs": "",\r
401                                         "description": vnfModel.description,\r
402                                         "vfModules": {},\r
403                                         "volumeGroups": {},\r
404                                         "commands": {},\r
405                                         "displayInputs": {},\r
406                                         "sourceNodes": vnfModel.sourceNodes,\r
407                                         "collectorNodes": vnfModel.collectorNodes,\r
408                                         "isConfigurationByPolicy": vnfModel.configurationByPolicy ? vnfModel.configurationByPolicy : false,\r
409                                         "isConfig": vnfModel.isConfig ? vnfModel.isConfig : false,\r
410                         "isPnf": vnfModel.isPnf ? vnfModel.isPnf : false\r
411                         };\r
412                         resource = {\r
413                                         "name": vnfModel.modelCustomizationName,\r
414                                         "description": vnfModel.description\r
415                         };\r
416                         completeResources.push (resource);\r
417                         \r
418                         if (vnfModel.commands != null) {\r
419                                 /*\r
420                                  * commands: {\r
421                                  *  internal_net_param_ntu: {\r
422                                  *              command: get_input,\r
423                                  *              displaName: internal_net_param_ntu,\r
424                                  *              inputName: vccfd1_internal_net_param_ntu // pointer to input key\r
425                                  * }\r
426                                  * If the input name (ptr) is one of instance_node_target,  naming_policy or vf_instance_name\r
427                                  * then ignore it\r
428                                  * \r
429                                  */\r
430                                 \r
431                                 for ( var cmd in vnfModel.commands ) {\r
432                                         var cmdObj = vnfModel.commands[cmd];\r
433                                         if ( cmdObj.inputName != null ) {\r
434                                                 // To Do: Make this list configurable\r
435                                                 switch (cmdObj.inputName) {\r
436                                                         case "instance_node_target":\r
437                                                                 break;\r
438                                                         case "naming_policy":\r
439                                                                 break;\r
440                                                         case "vf_instance_name":\r
441                                                                 break;\r
442                                                         default: \r
443                                                                 if (serviceModel.service != null && serviceModel.service.inputs != null &&\r
444                                                                                 serviceModel.service.inputs[cmdObj.inputName] != null ) {\r
445                                                                         vnfModelDisplayInputs[cmdObj.inputName] = (serviceModel.service.inputs[cmdObj.inputName]);\r
446                                                                         vnfModelDisplayInputs[cmdObj.inputName][PARAMETER.DISPLAY_NAME] = cmdObj.displayName;\r
447                                                                 }\r
448                                                 }\r
449                                                                 \r
450                                         }\r
451                                         \r
452                                 }\r
453                                 convertedAsdcModel.vnfs[vnfModel.uuid].displayInputs=vnfModelDisplayInputs;\r
454                         }\r
455                         \r
456                         for (var vfModuleCustomizationName in vnfModel.vfModules) {\r
457                                 var vfModuleModel = vnfModel.vfModules[vfModuleCustomizationName];\r
458                                 convertedAsdcModel.vnfs[vnfModel.uuid].vfModules[vfModuleModel.uuid] = vfModuleModel;\r
459                         }\r
460                         \r
461                         for (var volumeGroupCustomizationName in vnfModel.volumeGroups) {\r
462                                 var volumeGroupModel = vnfModel.volumeGroups[volumeGroupCustomizationName];\r
463                                 convertedAsdcModel.vnfs[vnfModel.uuid].volumeGroups[volumeGroupModel.uuid] = volumeGroupModel;\r
464                         }\r
465                 }\r
466                 //console.log ("convertedAsdcModel: "); console.log (JSON.stringify ( convertedAsdcModel, null, 4 ) );\r
467                 \r
468                 var completeDisplayInputs = {};\r
469                 \r
470                 for (var key in vnfModelDisplayInputs) {\r
471                         completeDisplayInputs[key] = vnfModelDisplayInputs[key];\r
472                 }\r
473                 for (var key in networkModelDisplayInputs) {\r
474                         completeDisplayInputs[key] = networkModelDisplayInputs[key];\r
475                 }\r
476                 \r
477                 convertedAsdcModel.completeDisplayInputs = completeDisplayInputs;\r
478                 // Need to collect all the model customization names (node template tag) and descriptions\r
479                 DataService.setResources (completeResources);\r
480                 $log.debug ("convertedAsdcModel: ", convertedAsdcModel);\r
481                 return (convertedAsdcModel);\r
482     };\r
483 \r
484     function hasContents(object) {\r
485         if (object === undefined || object === null || object === "") {\r
486             return false;\r
487         }\r
488         return true;\r
489     };\r
490     function isObjectEmpty(o) {\r
491         var len = 0;\r
492         if (hasContents(o)){\r
493             var keys = Object.keys(o);\r
494             len = keys.length;\r
495             if ( len == 0 ) {\r
496                 return true;\r
497             }\r
498             else {\r
499                 return false;\r
500             }\r
501         }\r
502         else {\r
503             return true;\r
504         }\r
505     };\r
506     function padZero(number) {\r
507         if (number < 10) {\r
508             return "0" + number;\r
509         } else {\r
510             return "" + number;\r
511         }\r
512     };\r
513 \r
514     var httpErrorHandler = function(response, status) {\r
515         $log.warn("UtilityService:httpErrorHandler: response:");\r
516         $log.warn(response);\r
517         $log.warn("UtilityService:httpErrorHandler: status:");\r
518         $log.warn(status);\r
519         if (angular.isFunction(_this.httpErrorHandler)) {\r
520             _this.httpErrorHandler(response, status);\r
521         }\r
522     };\r
523 \r
524     var startNextAsyncOperation = function() {\r
525         if (_this.asyncOperations.count < _this.asyncOperations.operationList.length) {\r
526             _this.asyncOperations.operationList[_this.asyncOperations.count++]\r
527             ();\r
528         } else {\r
529             if (angular.isFunction(_this.asyncOperations.callbackFunction)) {\r
530                 _this.asyncOperations.callbackFunction();\r
531             }\r
532         }\r
533     };\r
534 \r
535     return {\r
536         setProperties : function(properties) {\r
537             _this.properties = properties;\r
538         },\r
539         getProperties : function() {\r
540             return _this.properties;\r
541         },\r
542         hasContents : hasContents,\r
543         checkUndefined : function(name, value) {\r
544             if (value === undefined) {\r
545                 throw {\r
546                     type : "undefinedObject",\r
547                     message : "undefined object: \"" + name + "\""\r
548                 };\r
549             }\r
550             return value;\r
551         },\r
552         jsonConcat : function (o1, o2) {\r
553             for (var key in o2) {\r
554                 o1[key] = o2[key];\r
555             }\r
556             return o1;\r
557         },\r
558         getCurrentTime : function() {\r
559             var time = new Date();\r
560             return padZero(time.getMonth() + 1) + "/"\r
561                 + padZero(time.getDate()) + "/"\r
562                 + (time.getFullYear() - 2000) + " "\r
563                 + padZero(time.getHours()) + ":"\r
564                 + padZero(time.getMinutes()) + ":"\r
565                 + padZero(time.getSeconds())\r
566         },\r
567         getHttpStatusText : function(statusCode) {\r
568             var statusMap = {\r
569                 "200" : "OK",\r
570                 "201" : "Created",\r
571                 "202" : "Accepted",\r
572                 "400" : "Bad Request",\r
573                 "401" : "Unauthorized",\r
574                 "404" : "Not Found",\r
575                 "405" : "Method Not Allowed",\r
576                 "409" : "Locked",\r
577                 "500" : "Internal Server Error",\r
578                 "503" : "Service Unavailable",\r
579                 "504" : "Gateway Timeout"\r
580             }\r
581 \r
582             if (status === undefined) {\r
583                 return "Undefined";\r
584             }\r
585 \r
586             var statusText = statusMap[statusCode];\r
587             if (statusText === undefined) {\r
588                 statusText = "Unknown";\r
589             }\r
590 \r
591             return statusText + " (" + statusCode + ")";\r
592         },\r
593         getHttpErrorMessage : function(response) {\r
594             var data = response.data;\r
595             if ((response.status >= 400 && response.status < 600) && hasContents(data.exception)) {\r
596                 var summary = "exception: " + data.exception;\r
597                 if (hasContents(data.message)) {\r
598                     summary += " message: " + data.message;\r
599                 }\r
600                 return summary;\r
601             }\r
602             if (response.status === 0 && response.statusText === "") {\r
603                                 /*\r
604                                  * This logic is somewhat "fuzzy". Potential (brainstorming)\r
605                                  * enhancements if users find the message unreliable include:\r
606                                  *\r
607                                  * A) SERVER TIMEOUT: perhaps a newer version of Angular can\r
608                                  * reliably determine timeouts.\r
609                                  *\r
610                                  * B) SERVER TIMEOUT: recording start / end times and using that\r
611                                  * to determine if timeout occured\r
612                                  *\r
613                                  * C) SESSION TIMEOUT "Potentially" examine cookies, although\r
614                                  * that may not be feasible if cookies are set to "httponly".\r
615                                  */\r
616                 if (data === null) {\r
617                     //return "possible server timeout";\r
618                     return "VID has timed out waiting for a response. To see status, close this popup and the screen will be refreshed automatically";\r
619                 }\r
620                 if (data === "") {\r
621                     return "Possible reasons include a session timeout or a server issue. "\r
622                         + "A session timeout might be resolved by refreshing the screen and re-logging in";\r
623                 }\r
624             }\r
625             var summary = "";\r
626             if (response.status !== undefined && response.status > 0) {\r
627                 summary = "status: " + response.status;\r
628             }\r
629             if (hasContents(response.statusText)) {\r
630                 if (summary !== "") {\r
631                     summary += " ";\r
632                 }\r
633                 summary += "message: " + response.statusText;\r
634             }\r
635             return summary;\r
636         },\r
637         setHttpErrorHandler : function(httpErrorHandler) {\r
638             _this.httpErrorHandler = httpErrorHandler;\r
639         },\r
640         runHttpErrorHandler : function(response, status) {\r
641             httpErrorHandler(response, status);\r
642         },\r
643         startAsyncOperations : function(operationList, callbackFunction) {\r
644             for (var i = 0; i < operationList.length; i++) {\r
645                 if (!angular.isFunction(operationList[i])) {\r
646                     throw "UtilityService:startAsyncOperations: invalid function: index: "\r
647                     + i;\r
648                 }\r
649             }\r
650             _this.asyncOperations = {\r
651                 operationList : operationList,\r
652                 callbackFunction : callbackFunction,\r
653                 count : 0\r
654             };\r
655             startNextAsyncOperation();\r
656         },\r
657         startNextAsyncOperation : startNextAsyncOperation,\r
658         stopAsyncOperations : function() {\r
659             _this.asyncOperations.count = _this.asyncOperations.operationList.length;\r
660         },\r
661         isObjectEmpty : isObjectEmpty,\r
662         convertModel : convertModel,\r
663         convertNewModel : convertNewModel,\r
664         convertOldModel : convertOldModel,\r
665         arrayContains : function (a, obj) {\r
666             var i = a.length;\r
667             if ( i > 0 ) {\r
668                 while (i--) {\r
669                     if (a[i] === obj) {\r
670                         return true;\r
671                     }\r
672                 }\r
673             }\r
674             return false;\r
675         }\r
676     }\r
677 }\r
678 \r
679 //app.factory("UtilityService", UtilityService);\r
680 appDS2.factory("UtilityService", [ "$log", "DataService", "PARAMETER", "_", UtilityService ]);\r