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