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