Split the modularity patch into smaller pieces. Add the yangui module 36/9336/4
authorMaxime Millette-Coulombe <mmcoulombe@inocybe.com>
Fri, 25 Jul 2014 21:36:58 +0000 (17:36 -0400)
committerMaxime Millette-Coulombe <mmcoulombe@inocybe.com>
Fri, 8 Aug 2014 21:30:46 +0000 (17:30 -0400)
Change-Id: I5575fdd3533d82cf46ea3d33b4cf246415dbaa35
Signed-off-by: Maxime Millette-Coulombe <mmcoulombe@inocybe.com>
src/app/app.module.js
src/app/yangui/yangui.controller.js [new file with mode: 0644]
src/app/yangui/yangui.js [deleted file]
src/app/yangui/yangui.module.js [new file with mode: 0644]
src/common/yangutils/yangutils.js [deleted file]
src/common/yangutils/yangutils.module.js [new file with mode: 0644]
src/common/yangutils/yangutils.services.js [new file with mode: 0644]

index a469408e741881459a163091d7eb9b4ddce19cde..e7104ebef883d0162e163d55aa12b7dadf2755e4 100644 (file)
@@ -17,6 +17,7 @@ var module = [
   'app/flow/flows.module',
   'app/container/container.module',
   'app/network/network.module',
+  'app/yangui/yangui.module',
   'common/navigation/navigation.module',
   'common/topbar/topbar.module',
   'common/layout/layout.module']; //needed module
@@ -34,6 +35,7 @@ var e = [
   'app.flows',
   'app.container',
   'app.networking',
+  'app.yangui',
   'app.common.nav',
   'app.common.topbar',
   'app.common.layout'];
diff --git a/src/app/yangui/yangui.controller.js b/src/app/yangui/yangui.controller.js
new file mode 100644 (file)
index 0000000..76a736a
--- /dev/null
@@ -0,0 +1,201 @@
+define(['app/yangui/yangui.module', 'app/yangui/yangui.services'], function(yangui) {\r
+\r
+  yangui.register.controller('yanguiCtrl', ['$scope', '$http', 'YangUiRestangular', 'yangUtils', function ($scope, $http, Restangular, yangUtils) {\r
+      $scope.currentPath = './assets/views/yangui';\r
+      $scope.host = '127.0.0.1';\r
+      $scope.port = '9999';\r
+\r
+      var requestSuccessCallback = function() {\r
+          $scope.statusMsg = 'SEND_SUCCESS';\r
+      };\r
+\r
+      var requestErrorCallback = function() {\r
+          $scope.statusMsg = 'SEND_ERROR';\r
+      };\r
+\r
+      var loadModules = function loadModules() {\r
+          $scope.nodeModules = [];\r
+          Restangular.all('modules').getList().then(function(modulesRawData) {\r
+              yangUtils.processModules(modulesRawData.modules, function(node) {\r
+                  $scope.nodeModules.push(node);\r
+              });\r
+          });\r
+      };\r
+\r
+      var loadNodes = function loadNodes() {\r
+          //TODO change when module discovery will be implemented\r
+          $scope.devices = [];\r
+          Restangular.all('operational').all('opendaylight-inventory:nodes').getList().then(function(inventoryRawData) {\r
+              $scope.devices = yangUtils.processNodes(inventoryRawData.nodes);\r
+          });\r
+      };\r
+\r
+      var loadFlows = function loadFlows() {\r
+          $scope.flows = [];\r
+          if($scope.selDevice) {\r
+              //TODO change when module discovery will be implemented\r
+              Restangular.all('config').all('opendaylight-inventory:nodes').one('node', $scope.selDevice).get().then(function(nodeRawData) {\r
+                  $scope.flows = yangUtils.processFlows(nodeRawData.node[0]);\r
+              });\r
+          }\r
+      };\r
+\r
+      var sendFlow = function sendFlow() {\r
+          if($scope.selDevice && $scope.selModule) {\r
+              var requestData = yangUtils.buildRequest($scope.selModule),\r
+                  flowId = requestData.flow[0].id,\r
+                  tableId = requestData.flow[0].table_id;\r
+\r
+              if(requestData) {\r
+                  //TODO change when module discovery will be implemented\r
+                  var request = Restangular.all('config').all('opendaylight-inventory:nodes').one('node',$scope.selDevice).one('table',tableId).one('flow',flowId);\r
+\r
+                  request.customPUT(requestData).then(function() {\r
+                      requestSuccessCallback();\r
+                  }, function(response) {\r
+                      requestErrorCallback();\r
+                  });\r
+              }\r
+          }\r
+      };\r
+\r
+      var deleteFlow = function deleteFlow() {\r
+          if($scope.selDevice && $scope.selFlow) {\r
+              var flowId = $scope.selFlow.flow,\r
+                  tableId = $scope.selFlow.table,\r
+                  //TODO change when module discovery will be implemented\r
+                  request = Restangular.all('config').all('opendaylight-inventory:nodes').one('node',$scope.selDevice).one('table',tableId).one('flow',flowId);\r
+\r
+              request.remove().then(function() {\r
+                  requestSuccessCallback();\r
+              }, function(response) {\r
+                  requestErrorCallback();\r
+              });\r
+          }\r
+      };\r
+\r
+      $scope.dismissStatus = function() {\r
+          $scope.statusMsg = null;\r
+      };\r
+\r
+      $scope.loadController = function() {\r
+          $scope.nodeModules = [];\r
+          $scope.flows = [];\r
+          $scope.devices = [];\r
+          $scope.showPreview = true;\r
+          $scope.previewValue = '';\r
+\r
+          loadModules();\r
+          loadNodes();\r
+      };\r
+\r
+      $scope.getAPIs = function() {\r
+          //TODO load api when cross domain issue with Restconf API explorer will be closed\r
+\r
+          // Restangular.all('config').all('opendaylight-inventory:nodes').one('node', 'openflow:1').one('table', '1').one('flow', '1').get().then(function(flowData) {\r
+          //     console.info('flowData:',flowData);\r
+          // });\r
+          console.info(yangUtils.exportModulesLocales($scope.nodeModules));\r
+      };\r
+\r
+      $scope.getData = function() {\r
+          loadFlows();\r
+      };\r
+\r
+      $scope.fill = function() {\r
+          if($scope.selFlow && $scope.selModule) {\r
+              //TODO when rest api explorer will be available do it by it\r
+              var data = {'flow-node-inventory:flow': [$scope.selFlow.data]},\r
+                  name = 'flow-node-inventory:flows';\r
+\r
+              $scope.selModule.clear();\r
+              $scope.selModule.fill(name, data);\r
+              $scope.preview();\r
+          }\r
+      };\r
+\r
+      $scope.delete = function() {\r
+          deleteFlow();\r
+          // loadFlows();\r
+          $scope.preview();\r
+      };\r
+\r
+      $scope.clear = function() {\r
+          if($scope.selModule) {\r
+              $scope.selModule.clear();\r
+              $scope.preview();\r
+          }\r
+      };\r
+\r
+      $scope.send = function() {\r
+          sendFlow();\r
+          // loadFlows();\r
+      };\r
+\r
+      $scope.preview = function() {\r
+          if($scope.showPreview && $scope.selModule) {\r
+              $scope.previewValue = yangUtils.getRequestString($scope.selModule);\r
+          } else {\r
+              $scope.previewValue = '';\r
+          }\r
+\r
+          $scope.previewVisible = ($scope.showPreview && $scope.previewValue);\r
+      };\r
+\r
+      $scope.loadController();\r
+  }]);\r
+\r
+  yangui.register.controller('leafCtrl', function ($scope) {\r
+      $scope.parentNode = $scope.node;\r
+\r
+      $scope.changed = function() {\r
+          $scope.preview();\r
+      };\r
+  });\r
+\r
+  yangui.register.controller('containerCtrl', function ($scope) {\r
+      $scope.parentNode = $scope.node;\r
+      var node = $scope.node;\r
+      $scope.toggleExpanded = function() {\r
+          node.expanded = !node.expanded;\r
+      };\r
+  });\r
+\r
+  yangui.register.controller('caseCtrl', function ($scope) {\r
+      $scope.parentNode = $scope.node;\r
+      var node = $scope.node;\r
+      $scope.empty = (node.children.length === 0 || (node.children.length === 1 && node.children[0].children.length ===0));\r
+  });\r
+\r
+  yangui.register.controller('choiceCtrl', function ($scope) {\r
+      $scope.parentNode = $scope.node;\r
+\r
+  });\r
+\r
+\r
+  yangui.register.controller('listCtrl', function ($scope) {\r
+      $scope.parentNode = $scope.node;\r
+      $scope.actElement = null;\r
+      var node = $scope.node;\r
+\r
+      $scope.setActElement = function setActElement(elem) {\r
+          $scope.parentNode.actElement = elem;\r
+      };\r
+\r
+      $scope.addListElem = function addListElem() {\r
+          node.addListElem();\r
+      };\r
+\r
+      $scope.removeListElem = function removeListElem(elem) {\r
+          node.removeListElem(elem);\r
+      };\r
+\r
+      $scope.isElemActive = function isElemActive(elem) {\r
+          var match = (elem === $scope.parentNode.actElement);\r
+          return (match ? 'active' : '');\r
+      };\r
+\r
+      //node.addListElem(); //creating loop errors\r
+  });\r
+\r
+});\r
diff --git a/src/app/yangui/yangui.js b/src/app/yangui/yangui.js
deleted file mode 100644 (file)
index 1f3ab73..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-/*\r
- * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-\r
-angular.module('console.yangui', ['common.yangUtils'])\r
-\r
-    \r
-\r
-.config(function ($stateProvider) {\r
-    var access = routingConfig.accessLevels;\r
-    $stateProvider.state('yangui', {\r
-        url: '/yangui',\r
-        abstract: true,\r
-        templateUrl: 'yangui/root.tpl.html'\r
-    });\r
-\r
-    $stateProvider.state('yangui.index', {\r
-        url: '/index',\r
-        access: access.admin,\r
-        views: {\r
-            '': {\r
-                controller: 'yanguiCtrl',\r
-                templateUrl: 'yangui/index.tpl.html'\r
-            }\r
-        }\r
-    });\r
-})\r
-\r
-.controller('yanguiCtrl', ['$scope', '$http', '$timeout', 'Restangular', 'yangUtils', function ($scope, $http, $timeout, Restangular, yangUtils) {\r
-    $scope.currentPath = './assets/views/yangui';\r
-    $scope.host = '127.0.0.1';\r
-    $scope.port = '9999';\r
-    $scope.status = {\r
-        type: 'noreq',\r
-        msg: null\r
-    };\r
-\r
-    var requestWorkingCallback = function() {\r
-        $scope.status = {\r
-            isWorking: true,\r
-            type: 'warning',\r
-            msg: 'SEND_OPER_WAIT'\r
-        };\r
-    };\r
-\r
-    var requestOperErrorCallback = function() {\r
-        $scope.status = {\r
-            type: 'danger',\r
-            msg: 'SEND_OPER_ERROR'\r
-        };\r
-    };\r
-\r
-    var requestSuccessCallback = function() {\r
-        $scope.status = {\r
-            type: 'success',\r
-            msg: 'SEND_SUCCESS'\r
-        };\r
-    };\r
-\r
-    var requestErrorCallback = function() {\r
-        $scope.status = {\r
-            type: 'danger',\r
-            msg: 'SEND_ERROR'\r
-        };\r
-    };\r
-\r
-    var loadModules = function() {\r
-        $scope.nodeModules = [];\r
-        Restangular.all('modules').getList().then(function(modulesRawData) {\r
-            // console.info('modules raw:',modulesRawData);\r
-            yangUtils.processModules(modulesRawData.modules, function(node) {\r
-                $scope.nodeModules.push(node);\r
-            });\r
-        });\r
-    };\r
-\r
-    var loadNodes = function loadNodes() {\r
-        //TODO change when module discovery will be implemented\r
-        $scope.devices = [];\r
-        Restangular.all('operational').all('opendaylight-inventory:nodes').getList().then(function(inventoryRawData) {\r
-            $scope.devices = yangUtils.processNodes(inventoryRawData.nodes);\r
-        });\r
-    };\r
-\r
-    var loadFlows = function loadFlows() {\r
-        $scope.flows = [];\r
-        if($scope.selDevice) { \r
-            //TODO change when module discovery will be implemented\r
-            Restangular.all('config').all('opendaylight-inventory:nodes').one('node', $scope.selDevice).get().then(function(nodeRawData) {\r
-                $scope.flows = yangUtils.processFlows(nodeRawData.node[0]);\r
-            });\r
-        }\r
-    };\r
-\r
-    var sendFlow = function sendFlow() {\r
-        if($scope.selDevice && $scope.selModule) {\r
-            var requestData = yangUtils.buildRequest($scope.selModule),\r
-                flowId = requestData.flow[0].id,\r
-                tableId = requestData.flow[0].table_id;\r
-\r
-            if(requestData) {\r
-                //TODO change when module discovery will be implemented\r
-                var request = Restangular.all('config').all('opendaylight-inventory:nodes').one('node',$scope.selDevice).one('table',tableId).one('flow',flowId);\r
-\r
-                request.customPUT(requestData).then(function() {\r
-                    requestWorkingCallback();\r
-                    yangUtils.checkOperational($scope.selDevice, requestData.flow[0], requestSuccessCallback, requestOperErrorCallback);\r
-                }, function() {\r
-                    requestErrorCallback();\r
-                });\r
-            }\r
-        }\r
-    };\r
-\r
-    var deleteFlow = function deleteFlow() {\r
-        if($scope.selDevice && $scope.selFlow) {\r
-            var flowId = $scope.selFlow.flow,\r
-                tableId = $scope.selFlow.table,\r
-                //TODO change when module discovery will be implemented\r
-                request = Restangular.all('config').all('opendaylight-inventory:nodes').one('node',$scope.selDevice).one('table',tableId).one('flow',flowId);\r
-\r
-            request.remove().then(function() {\r
-                $scope.selFlow = null;\r
-                requestSuccessCallback();\r
-            }, function() {\r
-                requestErrorCallback();\r
-            });\r
-        }\r
-    };\r
-\r
-    $scope.dismissStatus = function() {\r
-        $scope.status = {};\r
-    };\r
-\r
-    $scope.loadController = function() {\r
-        $scope.nodeModules = [];\r
-        $scope.flows = [];\r
-        $scope.devices = [];\r
-        $scope.showPreview = true;\r
-        $scope.previewValue = '';\r
-\r
-        loadModules();\r
-        loadNodes();\r
-    };\r
-\r
-    $scope.getAPIs = function() {\r
-        //TODO load api when cross domain issue with Restconf API explorer will be closed\r
-\r
-        // Restangular.all('config').all('opendaylight-inventory:nodes').one('node', 'openflow:1').one('table', '1').one('flow', '1').get().then(function(flowData) {\r
-        //     console.info('flowData:',flowData);\r
-        // });\r
-        console.info(yangUtils.exportModulesLocales($scope.nodeModules));\r
-    };\r
-\r
-    $scope.getData = function() {\r
-        loadFlows();\r
-    };\r
-\r
-    $scope.fill = function() {\r
-        if($scope.selFlow && $scope.selModule) {\r
-            //TODO when rest api explorer will be available do it by it\r
-            var data = {'flow-node-inventory:flow': [$scope.selFlow.data]},\r
-                name = 'flow-node-inventory:flows';\r
-            \r
-            $scope.selModule.clear();\r
-            $scope.selModule.fill(name, data); \r
-            $scope.preview();\r
-        }\r
-    };\r
-\r
-    $scope.delete = function() {\r
-        deleteFlow();\r
-        // loadFlows();\r
-        $scope.preview();\r
-    };\r
-\r
-    $scope.clear = function() {\r
-        if($scope.selModule) {\r
-            $scope.selModule.clear();\r
-            $scope.preview();\r
-        }\r
-    };\r
-\r
-    $scope.send = function() {\r
-        sendFlow();\r
-        // loadFlows();\r
-    };\r
-\r
-    $scope.preview = function() {\r
-        if($scope.showPreview && $scope.selModule) {\r
-            $scope.previewValue = yangUtils.getRequestString($scope.selModule);\r
-        } else {\r
-            $scope.previewValue = '';\r
-        }\r
-\r
-        $scope.previewVisible = ($scope.showPreview && $scope.previewValue);\r
-    };\r
-\r
-    $scope.__test = {\r
-        loadModules: loadModules,\r
-        loadNodes: loadNodes,\r
-        loadFlows: loadFlows,\r
-        sendFlow: sendFlow,\r
-        deleteFlow: deleteFlow\r
-    };\r
-\r
-    $scope.loadController();\r
-}])\r
-\r
-.controller('leafCtrl', function ($scope) {\r
-    $scope.parentNode = $scope.node;\r
-\r
-    $scope.changed = function() {\r
-        $scope.preview();\r
-    };\r
-})\r
-\r
-.controller('containerCtrl', function ($scope) {\r
-    $scope.parentNode = $scope.node;\r
-    var node = $scope.node;\r
-    $scope.toggleExpanded = function() {\r
-        node.expanded = !node.expanded;\r
-    };\r
-})\r
-\r
-.controller('caseCtrl', function ($scope) {\r
-    $scope.parentNode = $scope.node;\r
-    var node = $scope.node;\r
-    $scope.empty = (node.children.length === 0 || (node.children.length === 1 && node.children[0].children.length ===0));\r
-})\r
-\r
-.controller('choiceCtrl', function ($scope) {\r
-    $scope.parentNode = $scope.node;\r
-\r
-})\r
-\r
-\r
-.controller('listCtrl', function ($scope) {\r
-    $scope.parentNode = $scope.node;\r
-    $scope.actElement = null;\r
-    var node = $scope.node;\r
-    \r
-    $scope.setActElement = function setActElement(elem) {\r
-        $scope.parentNode.actElement = elem;\r
-    };\r
-\r
-    $scope.addListElem = function addListElem() {\r
-        node.addListElem();\r
-    };\r
-\r
-    $scope.removeListElem = function removeListElem(elem) {\r
-        node.removeListElem(elem);\r
-        // $scope.preview();\r
-    };\r
-\r
-    $scope.isElemActive = function isElemActive(elem) {\r
-        var match = (elem === $scope.parentNode.actElement);\r
-        return (match ? 'active' : '');\r
-    };\r
-});
\ No newline at end of file
diff --git a/src/app/yangui/yangui.module.js b/src/app/yangui/yangui.module.js
new file mode 100644 (file)
index 0000000..4699145
--- /dev/null
@@ -0,0 +1,56 @@
+define(['angularAMD', 'app/routingConfig', 'common/yangutils/yangutils.services','ui-bootstrap', 'Restangular'], function() {\r
+\r
+  var yangui = angular.module('app.yangui', ['ui.router.state','app.core', 'app.common.yangUtils', 'ui.bootstrap', 'restangular']);\r
+\r
+\r
+  yangui.config(function ($stateProvider, $compileProvider, $controllerProvider, $provide, $translateProvider, NavHelperProvider) {\r
+\r
+    $translateProvider.useStaticFilesLoader({\r
+      prefix: 'assets/data/locale-',\r
+      suffix: '.json'\r
+    });\r
+\r
+    yangui.register = {\r
+      directive : $compileProvider.directive,\r
+      controller : $controllerProvider.register,\r
+      factory : $provide.factory,\r
+      service : $provide.service\r
+    };\r
+\r
+    NavHelperProvider.addControllerUrl('app/yangui/yangui.controller');\r
+    NavHelperProvider.addToMenu('yangui', {\r
+      "link": "#/yangui/index",\r
+      "active": "main.yangui",\r
+      "title": "Yang UI",\r
+      "icon": "icon-level-down",\r
+      "page": {\r
+        "title": "Yang UI",\r
+        "description": "Yang UI"\r
+      }\r
+    });\r
+\r
+    var access = routingConfig.accessLevels;\r
+      $stateProvider.state('main.yangui', {\r
+          url: 'yangui',\r
+          abstract: true,\r
+          views : {\r
+            'content' : {\r
+              templateUrl: 'src/app/yangui/root.tpl.html'\r
+            }\r
+          }\r
+      });\r
+\r
+      $stateProvider.state('main.yangui.index', {\r
+          url: '/index',\r
+          access: access.admin,\r
+          views: {\r
+              '': {\r
+                  controller: 'yanguiCtrl',\r
+                  templateUrl: 'src/app/yangui/index.tpl.html'\r
+              }\r
+          }\r
+      });\r
+  });\r
+\r
+  return yangui;\r
+});\r
diff --git a/src/common/yangutils/yangutils.js b/src/common/yangutils/yangutils.js
deleted file mode 100644 (file)
index e4f1248..0000000
+++ /dev/null
@@ -1,669 +0,0 @@
-angular.module('common.yangUtils', [])\r
-.factory('reqBuilder', function () {\r
-\r
-    var namespace = 'flow-node-inventory';\r
-\r
-    var builder = {\r
-        namespace: namespace,\r
-        createObj: function() {\r
-            return {};\r
-        },\r
-\r
-        createList: function() {\r
-            return [];\r
-        },\r
-\r
-        insertObjToList: function(list, obj) {\r
-            list.push(obj);\r
-        },\r
-\r
-        insertPropertyToObj: function(obj, propName, propData) {\r
-            var data = propData ? propData : {},\r
-                name = propName;\r
-\r
-            obj[name] = data;\r
-        },\r
-\r
-        resultToString: function(obj) {\r
-            return JSON.stringify(obj, null, 4);\r
-        }\r
-    };\r
-\r
-    return builder;\r
-\r
-})\r
-\r
-.factory('nodeWrapper', function () {\r
-\r
-    var comparePropToElemByName = function comparePropToElemByName(propName, elemName) {\r
-        return propName.split(':')[1] === elemName; //TODO modify when namespace relations will be known\r
-    };\r
-\r
-    var wrapper = {\r
-\r
-        wrap: function(node) {\r
-            if(this.hasOwnProperty(node.type)) {\r
-                this[node.type](node);\r
-            }\r
-        },\r
-\r
-        wrapAll: function(node) {\r
-            var self = this;\r
-            self.wrap(node);\r
-            node.children.forEach(function(child) {\r
-                self.wrapAll(child);\r
-            });\r
-        },\r
-\r
-        leaf: function(node) {\r
-            node.value = '';\r
-\r
-            node.buildRequest = function(builder, req) {\r
-                var valueStr = '';\r
-\r
-                try {\r
-                    valueStr = node.value.toString();\r
-                } catch(e) {\r
-                    console.warn('cannot convert value',node.value);\r
-                }\r
-\r
-                if(valueStr) {\r
-                    builder.insertPropertyToObj(req, node.label, valueStr);\r
-                    return true;\r
-                }\r
-                return false;\r
-            };\r
-\r
-            node.fill = function(name, data) {\r
-                var match = comparePropToElemByName(name, node.label);\r
-\r
-                if(match) {\r
-                    node.value = data;\r
-                }\r
-\r
-                return match;\r
-            };\r
-\r
-            node.clear = function() {\r
-                node.value = '';\r
-            };\r
-        },\r
-        \r
-        container: function(node) {\r
-            node.expanded = false;\r
-\r
-            node.toggleExpand = function() {\r
-                node.expanded = !node.expanded;\r
-            };\r
-\r
-            node.buildRequest = function(builder, req) {\r
-                var added = false,\r
-                    name = node.label,\r
-                    objToAdd = builder.createObj();\r
-                \r
-                if(node.children.length) {\r
-                    node.children.forEach(function(child) {  \r
-                        var childAdded = child.buildRequest(builder, objToAdd);\r
-                        added = added || childAdded;\r
-                    });\r
-                } else {\r
-                    added = true;\r
-                }\r
-\r
-                if(added) {\r
-                    builder.insertPropertyToObj(req, name, objToAdd);\r
-                }\r
-\r
-                return added;\r
-            };\r
-\r
-            node.fill = function(name, data) {\r
-                var match = comparePropToElemByName(name, node.label);\r
-\r
-                if (match && node.children.length) {\r
-                    node.children.forEach(function(child) {\r
-                        for(var prop in data) {\r
-                            child.fill(prop, data[prop]);\r
-                        }\r
-                    });\r
-\r
-                    node.expanded = true;\r
-                }\r
-                return match;\r
-            };\r
-\r
-            node.clear = function() {\r
-                if (node.children.length) {\r
-                    node.children.forEach(function(child) {\r
-                        child.clear();\r
-                    });\r
-                }\r
-            };\r
-            \r
-        },\r
-\r
-        case: function(node) {\r
-            node.buildRequest = function(builder, req) {\r
-                var added = false;\r
-\r
-                node.children.forEach(function(child) {\r
-                    var childAdded = child.buildRequest(builder, req);\r
-                    added = added || childAdded;\r
-                });\r
-\r
-                return added;\r
-            };\r
-\r
-            node.fill = function(name, data) {\r
-                var filled = false;\r
-\r
-                node.children.forEach(function(child) {\r
-                    var childFilled = child.fill(name, data);\r
-                    filled = filled || childFilled;\r
-                });\r
-\r
-                return filled;\r
-            };\r
-\r
-            node.clear = function() {\r
-                node.children.forEach(function(child) {\r
-                    child.clear();\r
-                });\r
-            };\r
-        },\r
-\r
-        choice: function(node) {\r
-            node.choice = null;\r
-            node.buildRequest = function(builder, req) {\r
-                var added;\r
-\r
-                if(node.choice) {\r
-                    added = node.choice.buildRequest(builder, req);\r
-                }\r
-\r
-                return added;\r
-            };\r
-\r
-            node.fill = function(name, data) {\r
-                var filled = false;\r
-                \r
-                node.children.forEach(function(child) {\r
-                    var childFilled = child.fill(name, data);\r
-\r
-                    if(childFilled) {\r
-                        node.choice = child;\r
-                    }\r
-\r
-                    filled = filled || childFilled;\r
-                    if(filled) {\r
-                        return false;\r
-                    }\r
-                });\r
-\r
-                return filled;\r
-            };\r
-\r
-            node.clear = function() {\r
-                if(node.choice) {\r
-                    node.choice.clear();\r
-                    node.choice = null;\r
-                }\r
-            };\r
-        },\r
-\r
-        list: function(node) {\r
-\r
-            node.listElems = [];\r
-            node.actElement = null;\r
-            node.needAddNewListElem = true;\r
-\r
-            node.addListElem = function() {\r
-                var copy = node.deepCopy();\r
-                wrapper._listElem(copy);\r
-                node.listElems.push(copy);\r
-                node.needAddNewListElem = false;\r
-                node.actElement = node.listElems[node.listElems.length - 1];\r
-            };\r
-\r
-            node.removeListElem = function(elem) {\r
-                node.listElems.splice(node.listElems.indexOf(elem), 1);\r
-                if(node.listElems.length) {\r
-                    node.actElement = node.listElems[node.listElems.length - 1];\r
-                } else {\r
-                    node.actElement = null;\r
-                }\r
-            };\r
-\r
-            node.buildRequest = function(builder, req) {\r
-                var added = false,\r
-                    listToAdd = builder.createList();\r
-\r
-                node.listElems.forEach(function(listElem) {\r
-                    var elemAdded = listElem.listElemBuildRequest(builder, listToAdd);\r
-                    added = added || elemAdded;\r
-                });\r
-\r
-                if(added) {\r
-                    builder.insertPropertyToObj(req, node.label, listToAdd);\r
-                }\r
-\r
-                return added;\r
-            };\r
-\r
-            node.fill = function(name, array) { //data is array\r
-                var match = comparePropToElemByName(name, node.label),\r
-                    lastIndex;\r
-\r
-                if(match) {\r
-                    for(var i in array) {\r
-                        node.addListElem();\r
-\r
-                        lastIndex = node.listElems.length - 1;\r
-                        for(var prop in array[i]) {\r
-                            node.needAddNewListElem = node.listElems[lastIndex].fillListElement( prop, array[i][prop]);\r
-                        }\r
-                    }\r
-                }\r
-                return match;\r
-            };\r
-\r
-            node.clear = function() {\r
-                while(node.listElems.length > 0) {\r
-                    node.listElems.pop();\r
-                }\r
-                node.needAddNewListElem = true;\r
-            };\r
-        },\r
-\r
-        _listElem: function(node) {\r
-            node.listElemBuildRequest = function(builder, req) {\r
-                var added = false,\r
-                    objToAdd = builder.createObj();\r
-\r
-                node.children.forEach(function(child) {\r
-                    var childAdded = child.buildRequest(builder, objToAdd);\r
-                    added = added || childAdded;\r
-                });\r
-\r
-                if(added) {\r
-                    builder.insertObjToList(req, objToAdd);\r
-                }\r
-\r
-                return added;\r
-            };\r
-\r
-            node.fillListElement = function(name, data) {\r
-                var filled = false;\r
-\r
-                node.children.forEach(function(child) {\r
-                    var childFilled = child.fill(name, data);\r
-                    filled = filled || childFilled;\r
-                });\r
-                \r
-                return filled;\r
-            };\r
-\r
-            node.children.forEach(function(child) {\r
-                wrapper.wrapAll(child);\r
-            });\r
-        }\r
-    };\r
-\r
-    wrapper.__test = {\r
-        comparePropToElemByName: comparePropToElemByName\r
-    };\r
-\r
-    return wrapper;\r
-})\r
-\r
-.factory('yinParser', function ($http, $timeout) {\r
-\r
-    var path = './assets';\r
-    var runningRequests = [];\r
-    var reqId = 0;\r
-\r
-    var spawnRequest = function(digest) {\r
-        var id = digest+(reqId++).toString();\r
-        runningRequests.push(id);\r
-        // console.debug('adding request '+id+' total running requests  = '+runningRequests.length);\r
-        return id;\r
-    };\r
-\r
-    var removeRequest = function(id) {\r
-        var index = runningRequests.indexOf(id);\r
-\r
-        if (index > -1) {\r
-            runningRequests.splice(index, 1);\r
-            // console.debug('removing request '+id+' remaining requests = '+runningRequests.length);\r
-        }\r
-    };\r
-\r
-    var waitFor = function waitFor(callback) {\r
-        var t = 10,\r
-            processes = runningRequests.length;\r
-\r
-        // console.debug('waiting for '+t+ 'ms, for '+processes+', processes: '+(processes > 0));\r
-\r
-        if(processes > 0) {\r
-            $timeout(function() { \r
-                waitFor(callback); \r
-            }, t);\r
-        } else {\r
-            callback();\r
-        }\r
-    };\r
-\r
-    var Node = function(id, name, type, module) {\r
-        this.id = id;\r
-        this.label = name;\r
-        this.localeLabel = 'YANGUI_'+name.toUpperCase();\r
-        this.type = type;\r
-        this.module = module;\r
-        this.children = [];\r
-\r
-        this.deepCopy = function deepCopy() {\r
-            var copy = new Node(this.id, this.label, this.type, this.module);\r
-            this.children.forEach(function(child) {\r
-                copy.children.push(child.deepCopy());\r
-            });\r
-            return copy;\r
-        };\r
-\r
-    };\r
-\r
-    var parentTag = function(xml){\r
-        if (xml.get(0).tagName.toLowerCase() === 'module') {\r
-            return xml.get(0);\r
-        } else {\r
-            return parentTag(xml.parent());\r
-        }\r
-    };\r
-\r
-    var parseYang = function parseYang(yinPath, callback) {\r
-        var result = null;\r
-\r
-        runningRequests = [];\r
-        reqId = 0; \r
-\r
-        $http.get(path+yinPath).success(function (data) {\r
-            var rootModule = $($.parseXML(data).documentElement).attr('name');\r
-\r
-            yangParser.reset();\r
-            yangParser.setCurrentModule(rootModule);\r
-            yangParser.parse(data, null);\r
-\r
-            result = yangParser.rootNode;\r
-\r
-            waitFor(function() {\r
-                callback(result);\r
-            });\r
-        }).error(function () {\r
-            console.warn('can\'t find module: '+yinPath);\r
-            return null;\r
-        });\r
-    };\r
-\r
-    var yangParser = {\r
-        currentModule: null,\r
-        rootNode: null,\r
-        nodeIndex: 0,\r
-\r
-        reset: function() {\r
-            this.rootNode = null;\r
-            this.nodeIndex = 0;\r
-            this.currentModule = null;\r
-        },\r
-        setCurrentModule: function(module) {\r
-            this.currentModule = module;\r
-        },\r
-        createNewNode: function(name, type, parentNode) {\r
-            var node = new Node(this.nodeIndex++, name, type, this.currentModule);\r
-            \r
-            if(this.nodeIndex===1) {\r
-                this.rootNode = node;\r
-            }\r
-            \r
-            if(parentNode) {\r
-                parentNode.children.push(node);\r
-            }\r
-            \r
-            return node;\r
-        },\r
-\r
-        parse: function(xml, parent) {\r
-            var self = this;\r
-            \r
-            $(xml).children().each(function() {                \r
-                var prop = this.tagName.toLowerCase();\r
-\r
-                if(self.hasOwnProperty(prop)) {\r
-                    self[prop](this, parent);\r
-                } else {\r
-                    //self.parse(this, parent);\r
-                }\r
-            });\r
-        },\r
-        \r
-        leaf: function(xml, parent) {\r
-            var type = 'leaf',\r
-                name = $(xml).attr('name');\r
-            \r
-            this.createNewNode(name, type, parent);\r
-        },\r
-        \r
-        container: function(xml, parent) {   \r
-            var type = 'container',\r
-                name = $(xml).attr('name');\r
-            \r
-            if($(xml).children().length === 0) { //if empty add as element\r
-                this.createNewNode(name, type, parent);\r
-            }\r
-            else {\r
-                var node = this.createNewNode(name, type, parent);\r
-                this.parse(xml, node);\r
-            }\r
-        },\r
-        \r
-        choice: function(xml, parent) {\r
-            var type = 'choice',\r
-                name = $(xml).attr('name'),\r
-                self = this,\r
-                node = this.createNewNode(name, type, parent);\r
-\r
-            $(xml).children('case').each(function() {\r
-                self._case(this, node);\r
-            });\r
-        },\r
-        \r
-        _case: function(xml, parent) {\r
-            var type = 'case',\r
-                name = $(xml).attr('name'),\r
-                node = this.createNewNode(name, type, parent);\r
-\r
-            this.parse(xml, node);\r
-        },\r
-        \r
-        list: function(xml, parent) {\r
-            var type = 'list',\r
-                name = $(xml).attr('name'),\r
-                node = this.createNewNode(name, type, parent);\r
-            \r
-            this.parse(xml, node);\r
-        },\r
-                \r
-        _grouping: function(xml, parent, groupingName) {\r
-            var self = this;\r
-\r
-            $(xml).children('grouping[name=\''+groupingName+'\']').each(function() {\r
-                self.parse(this, parent);\r
-            });\r
-        },\r
-        \r
-        uses: function(xml, parent) {  \r
-            var self = this,\r
-                $xml = $(xml),\r
-                name = $xml.attr('name'),\r
-                names = name.split(':');\r
-            \r
-            if (names[1] === undefined) { //same module\r
-                self._grouping(parentTag($xml), parent, names[0]);            \r
-            }\r
-            else { //different module\r
-                $(parentTag($xml)).children('import').each(function() {\r
-                    var importTag = $(this);\r
-                    \r
-                    importTag.children('prefix[value=\''+names[0]+'\']').each(function() {\r
-                        var importTagModule = importTag.attr('module'),\r
-                            reqId = spawnRequest(importTagModule);\r
-\r
-                        // console.info('spawning request', reqId);\r
-\r
-                        $http.get(path+'/yang2xml/'+importTagModule+'.yang.xml').success(function (data) {\r
-                            self.setCurrentModule(importTagModule);\r
-                            self._grouping($.parseXML(data).documentElement, parent, names[1]);\r
-                            // console.info('removing request', reqId);\r
-                            removeRequest(reqId);\r
-                        });\r
-                    });\r
-                });\r
-            }\r
-        }\r
-    };\r
-\r
-    return {\r
-        parse: parseYang,\r
-        __test: {\r
-            path: path,\r
-            spawnRequest: spawnRequest,\r
-            removeRequest: removeRequest,\r
-            waitFor: waitFor,\r
-            runningRequests: runningRequests,\r
-            reqId: reqId,\r
-            parseYang: parseYang,\r
-            parentTag: parentTag,\r
-            yangParser: yangParser\r
-        }\r
-    };\r
-})\r
-\r
-.factory('yangUtils', function ($http, yinParser, nodeWrapper, reqBuilder, $timeout) {\r
-\r
-    var utils = {};\r
-\r
-    utils.exportModulesLocales = function(modules) {\r
-        var obj = {},\r
-            localeNodes = ['leaf','list','container','choice'];\r
-\r
-        var process = function process(node) {\r
-            if(localeNodes.indexOf(node.type) >= 0 && obj.hasOwnProperty(node.localeLabel) === false) {\r
-                obj[node.localeLabel] = node.label;\r
-            }\r
-\r
-            node.children.forEach(function(child) {\r
-                process(child);\r
-            });\r
-        };\r
-\r
-        modules.forEach(function(module) {\r
-            process(module);\r
-        });\r
-\r
-        return JSON.stringify(obj, null, 4);\r
-    };\r
-\r
-    utils.processModules = function(loadedModules, callback) {\r
-        // console.info('loaded modules', loadedModules);\r
-        loadedModules.module.forEach(function(module) {\r
-            yinParser.parse('/yang2xml/'+module.name+'.yang.xml', function(node) {\r
-                if(node) {\r
-                    var copy = node.deepCopy();\r
-\r
-                    nodeWrapper.wrapAll(copy);\r
-                    callback(copy);\r
-                }\r
-            });\r
-        });\r
-    };\r
-\r
-    utils.buildRequest = function(node) {\r
-        var request = reqBuilder.createObj();\r
-        node.buildRequest(reqBuilder, request);\r
-        return request.flows; //TODO use REST API explorer when it will be available\r
-    };\r
-\r
-    utils.getRequestString = function(node) {\r
-        var request = reqBuilder.createObj(),\r
-            reqStr = '';\r
-\r
-        node.buildRequest(reqBuilder, request);\r
-\r
-        if(request && $.isEmptyObject(request) === false) {\r
-            reqStr = reqBuilder.resultToString(request);\r
-        }\r
-        return reqStr;\r
-    };\r
-\r
-    utils.processNodes = function(invData) {\r
-        var nodes =[];\r
-\r
-        invData.node.forEach(function(node) {\r
-            nodes.push(node.id);\r
-        });\r
-        return nodes;\r
-    };\r
-\r
-    utils.processFlows = function(nodeData) {\r
-        var flows = [];\r
-\r
-        nodeData['flow-node-inventory:table'].forEach(function(table) {\r
-            var table_id = table['flow-node-inventory:id'];\r
-\r
-            if(table.hasOwnProperty('flow-node-inventory:flow')) {\r
-                table['flow-node-inventory:flow'].forEach(function(flow) {\r
-                    var flowOjb = { table: table_id };\r
-                    flowOjb.flow = flow['flow-node-inventory:id'];\r
-                    flowOjb.data = flow;\r
-                    flowOjb.label = 'table:'+flowOjb.table+' > flow:'+flowOjb.flow;\r
-                    flows.push(flowOjb);\r
-                });\r
-            }\r
-        });\r
-\r
-        return flows;\r
-    };\r
-\r
-\r
-    var flowInOperational = function(flowDataConf, flowDataOper) {\r
-        var operId = flowDataOper['flow-node-inventory:id'],\r
-            OperTable = flowDataOper['opendaylight-flow-statistics:flow-statistics']['opendaylight-flow-statistics:table_id'];\r
-\r
-        console.info(operId,' === ',flowDataConf.id,' && ',OperTable,' === ',flowDataConf.table_id,' ---> ',(operId === flowDataConf.id && OperTable === flowDataConf.table_id));\r
-        \r
-        return (operId === flowDataConf.id && OperTable === flowDataConf.table_id);\r
-    };\r
-\r
-    var operationalTO = 15000;\r
-\r
-    utils.checkOperational = function(device, flow, successCbk, errorCbk) {\r
-        // Restangular.all('operational').all('opendaylight-inventory:nodes').one('node',device).one('table',flow.table_id).one('flow',);\r
-\r
-        $timeout(function() {\r
-            $http.get('http://localhost:8080/restconf/operational/opendaylight-inventory:nodes/node/'+device+'/table/'+flow.table_id+'/flow/'+flow.id).then(function(nodeOperRawData) {\r
-                 if(flowInOperational(flow, nodeOperRawData['flow-node-inventory:flow'][0])) {\r
-                    successCbk();\r
-                } else {\r
-                    errorCbk();\r
-                }\r
-            }, function() {\r
-                errorCbk();\r
-            });\r
-        }, operationalTO);\r
-    };\r
-\r
-    utils.__test = {\r
-        flowInOperational: flowInOperational\r
-    };\r
-\r
-    return utils;\r
-\r
-});
\ No newline at end of file
diff --git a/src/common/yangutils/yangutils.module.js b/src/common/yangutils/yangutils.module.js
new file mode 100644 (file)
index 0000000..9ae857d
--- /dev/null
@@ -0,0 +1,6 @@
+define(['angularAMD'], function() {\r
+\r
+  var yangUtils = angular.module('app.common.yangUtils', []);\r
+\r
+  return yangUtils;\r
+});\r
diff --git a/src/common/yangutils/yangutils.services.js b/src/common/yangutils/yangutils.services.js
new file mode 100644 (file)
index 0000000..2b50385
--- /dev/null
@@ -0,0 +1,611 @@
+define(['common/yangutils/yangutils.module'], function(yangUtils) {\r
+\r
+  // In the yangui.module.js, this file is loader immediatly after\r
+  // his module. So we don't need to register the services.\r
+\r
+  yangUtils.factory('reqBuilder', function () {\r
+\r
+      var namespace = 'flow-node-inventory';\r
+\r
+      var builder = {\r
+          namespace: namespace,\r
+          createObj: function() {\r
+              return {};\r
+          },\r
+\r
+          createList: function() {\r
+              return [];\r
+          },\r
+\r
+          insertObjToList: function(list, obj) {\r
+              list.push(obj);\r
+          },\r
+\r
+          insertPropertyToObj: function(obj, propName, propData) {\r
+              var data = propData ? propData : {},\r
+                  name = propName;\r
+\r
+              obj[name] = data;\r
+          },\r
+\r
+          resultToString: function(obj) {\r
+              return JSON.stringify(obj, null, 4);\r
+          }\r
+      };\r
+\r
+      return builder;\r
+\r
+  });\r
+\r
+  yangUtils.factory('nodeWrapper', function () {\r
+\r
+      var comparePropToElemByName = function comparePropToElemByName(propName, elemName) {\r
+          return propName.split(':')[1] === elemName; //TODO modify when namespace relations will be known\r
+      };\r
+\r
+      var wrapper = {\r
+\r
+          wrap: function(node) {\r
+              if(this.hasOwnProperty(node.type)) {\r
+                  this[node.type](node);\r
+              }\r
+          },\r
+\r
+          wrapAll: function(node) {\r
+              var self = this;\r
+              self.wrap(node);\r
+              node.children.forEach(function(child) {\r
+                  self.wrapAll(child);\r
+              });\r
+          },\r
+\r
+          leaf: function(node) {\r
+              node.value = '';\r
+\r
+              node.buildRequest = function(builder, req) {\r
+                  if(node.value) {\r
+                      builder.insertPropertyToObj(req, node.label, node.value);\r
+                      return true;\r
+                  }\r
+\r
+                  return false;\r
+              };\r
+\r
+              node.fill = function(name, data) {\r
+                  var match = comparePropToElemByName(name, node.label);\r
+\r
+                  if(match) {\r
+                      node.value = data;\r
+                  }\r
+\r
+                  return match;\r
+              };\r
+\r
+              node.clear = function() {\r
+                  node.value = '';\r
+              };\r
+          },\r
+\r
+          container: function(node) {\r
+              node.expanded = false;\r
+\r
+              node.toggleExpand = function() {\r
+                  node.expanded = !node.expanded;\r
+              };\r
+\r
+              node.buildRequest = function(builder, req) {\r
+                  var added = false,\r
+                      name = node.label,\r
+                      objToAdd = builder.createObj();\r
+\r
+                  if(node.children.length) {\r
+                      node.children.forEach(function(child) {\r
+                          var childAdded = child.buildRequest(builder, objToAdd);\r
+                          added = added || childAdded;\r
+                      });\r
+                  } else {\r
+                      added = true;\r
+                  }\r
+\r
+                  if(added) {\r
+                      builder.insertPropertyToObj(req, name, objToAdd);\r
+                  }\r
+\r
+                  return added;\r
+              };\r
+\r
+              node.fill = function(name, data) {\r
+                  var match = comparePropToElemByName(name, node.label);\r
+\r
+                  if (match && node.children.length) {\r
+                      node.children.forEach(function(child) {\r
+                          for(var prop in data) {\r
+                              child.fill(prop, data[prop]);\r
+                          }\r
+                      });\r
+\r
+                      node.expanded = true;\r
+                  }\r
+                  return match;\r
+              };\r
+\r
+              node.clear = function() {\r
+                  if (node.children.length) {\r
+                      node.children.forEach(function(child) {\r
+                          child.clear();\r
+                      });\r
+                  }\r
+              };\r
+\r
+          },\r
+\r
+          case: function(node) {\r
+              node.buildRequest = function(builder, req) {\r
+                  var added = false;\r
+\r
+                  node.children.forEach(function(child) {\r
+                      var childAdded = child.buildRequest(builder, req);\r
+                      added = added || childAdded;\r
+                  });\r
+\r
+                  return added;\r
+              };\r
+\r
+              node.fill = function(name, data) {\r
+                  var filled = false;\r
+\r
+                  node.children.forEach(function(child) {\r
+                      var childFilled = child.fill(name, data);\r
+                      filled = filled || childFilled;\r
+                  });\r
+\r
+                  return filled;\r
+              };\r
+\r
+              node.clear = function() {\r
+                  node.children.forEach(function(child) {\r
+                      child.clear();\r
+                  });\r
+              };\r
+          },\r
+\r
+          choice: function(node) {\r
+              node.choice = null;\r
+              node.buildRequest = function(builder, req) {\r
+                  var added;\r
+\r
+                  if(node.choice) {\r
+                      added = node.choice.buildRequest(builder, req);\r
+                  }\r
+\r
+                  return added;\r
+              };\r
+\r
+              node.fill = function(name, data) {\r
+                  var filled = false;\r
+\r
+                  node.children.forEach(function(child) {\r
+                      var childFilled = child.fill(name, data);\r
+\r
+                      if(childFilled) {\r
+                          node.choice = child;\r
+                      }\r
+\r
+                      filled = filled || childFilled;\r
+                      if(filled) {\r
+                          return false;\r
+                      }\r
+                  });\r
+\r
+                  return filled;\r
+              };\r
+\r
+              node.clear = function() {\r
+                  if(node.choice) {\r
+                      node.choice.clear();\r
+                      node.choice = null;\r
+                  }\r
+              };\r
+          },\r
+\r
+          list: function(node) {\r
+\r
+              node.listElems = [];\r
+              node.actElement = null;\r
+              node.needAddNewListElem = true;\r
+\r
+              node.addListElem = function() {\r
+                  var copy = node.deepCopy();\r
+                  wrapper.wrapAll(copy);\r
+                  node.listElems.push(copy);\r
+                  node.needAddNewListElem = false;\r
+                  node.actElement = node.listElems[node.listElems.length - 1];\r
+              };\r
+\r
+              node.removeListElem = function(elem) {\r
+                  node.listElems.splice(node.listElems.indexOf(elem), 1);\r
+                  if(node.listElems.length) {\r
+                      node.actElement = node.listElems[node.listElems.length - 1];\r
+                  } else {\r
+                      node.actElement = null;\r
+                  }\r
+              };\r
+\r
+              var listElemBuildRequest = function(builder, req, node) {\r
+                  var added = false,\r
+                      objToAdd = builder.createObj();\r
+\r
+                  node.children.forEach(function(child) {\r
+                      var childAdded = child.buildRequest(builder, objToAdd);\r
+                      added = added || childAdded;\r
+                  });\r
+\r
+                  if(added) {\r
+                      builder.insertObjToList(req, objToAdd);\r
+                  }\r
+\r
+                  return added;\r
+              };\r
+\r
+              var fillListElement = function(name, data, node) {\r
+                  var filled = false;\r
+\r
+                  node.children.forEach(function(child) {\r
+                      var childFilled = child.fill(name, data);\r
+                      filled = filled || childFilled;\r
+                  });\r
+\r
+                  return filled;\r
+              };\r
+\r
+              node.buildRequest = function(builder, req) {\r
+                  var added = false,\r
+                      listToAdd = builder.createList();\r
+\r
+                  node.listElems.forEach(function(listElem) {\r
+                      var elemAdded = listElemBuildRequest(builder, listToAdd, listElem);\r
+                      added = added || elemAdded;\r
+                  });\r
+\r
+                  if(added) {\r
+                      builder.insertPropertyToObj(req, node.label, listToAdd);\r
+                  }\r
+\r
+                  return added;\r
+              };\r
+\r
+              node.fill = function(name, array) { //data is array\r
+                  var match = comparePropToElemByName(name, node.label),\r
+                      lastIndex;\r
+\r
+                  if(match) {\r
+                      for(var i in array) {\r
+                          node.addListElem();\r
+\r
+                          lastIndex = node.listElems.length - 1;\r
+                          for(var prop in array[i]) {\r
+                              node.needAddNewListElem = fillListElement( prop, array[i][prop], node.listElems[lastIndex]);\r
+                          }\r
+                      }\r
+                  }\r
+                  return match;\r
+              };\r
+\r
+              node.clear = function() {\r
+                  while(node.listElems.length > 0) {\r
+                      node.listElems.pop();\r
+                  }\r
+                  node.needAddNewListElem = true;\r
+              };\r
+          }\r
+      };\r
+\r
+      return wrapper;\r
+  });\r
+\r
+  yangUtils.factory('yinParser', function ($http, $timeout) {\r
+\r
+      var path = './assets';\r
+      var runningRequests = [];\r
+      var reqId = 0;\r
+\r
+      var spawnRequest = function(digest) {\r
+          var id = digest+(reqId++).toString();\r
+          runningRequests.push(id);\r
+          // console.debug('adding request '+id+' total running requests  = '+runningRequests.length);\r
+          return id;\r
+      };\r
+\r
+      var removeRequest = function(id) {\r
+          var index = runningRequests.indexOf(id);\r
+\r
+          if (index > -1) {\r
+              runningRequests.splice(index, 1);\r
+              // console.debug('removing request '+id+' remaining requests = '+runningRequests.length);\r
+          }\r
+      };\r
+\r
+      var waitFor = function waitFor(callback) {\r
+          var t = 10,\r
+              processes = runningRequests.length;\r
+\r
+          // console.debug('waiting for '+t+ 'ms, for '+processes+', processes: '+(processes > 0));\r
+\r
+          if(processes > 0) {\r
+              $timeout(function() {\r
+                  waitFor(callback);\r
+              }, t);\r
+          } else {\r
+              callback();\r
+          }\r
+      };\r
+\r
+      var Node = function(id, name, type, module) {\r
+          this.id = id;\r
+          this.label = name;\r
+          this.localeLabel = 'YANGUI_'+name.toUpperCase();\r
+          this.type = type;\r
+          this.module = module;\r
+          this.children = [];\r
+\r
+          this.deepCopy = function deepCopy() {\r
+              var copy = new Node(this.id, this.label, this.type, this.module);\r
+              this.children.forEach(function(child) {\r
+                  copy.children.push(child.deepCopy());\r
+              });\r
+              return copy;\r
+          };\r
+\r
+      };\r
+\r
+      var parentTag = function(xml){\r
+          if (xml.get(0).tagName.toLowerCase() === 'module') {\r
+              return xml.get(0);\r
+          } else {\r
+              return parentTag(xml.parent());\r
+          }\r
+      };\r
+\r
+      var parseYang = function parseYang(yinPath, callback) {\r
+          var result = null;\r
+\r
+          runningRequests = [];\r
+          reqId = 0;\r
+\r
+          $http.get(path+yinPath).success(function (data) {\r
+              var rootModule = $($.parseXML(data).documentElement).attr('name');\r
+\r
+              yangParser.reset();\r
+              yangParser.setCurrentModule(rootModule);\r
+              yangParser.parse(data, null);\r
+\r
+              result = yangParser.rootNode;\r
+\r
+              waitFor(function() {\r
+                  callback(result);\r
+              });\r
+          }).error(function () {\r
+              console.warn('can\'t find module: '+yinPath);\r
+              return null;\r
+          });\r
+      };\r
+\r
+      var yangParser = {\r
+          currentModule: null,\r
+          rootNode: null,\r
+          nodeIndex: 0,\r
+\r
+          reset: function() {\r
+              this.rootNode = null;\r
+              this.nodeIndex = 0;\r
+              this.currentModule = null;\r
+          },\r
+          setCurrentModule: function(module) {\r
+              this.currentModule = module;\r
+          },\r
+          createNewNode: function(name, type, parentNode) {\r
+              var node = new Node(this.nodeIndex++, name, type, this.currentModule);\r
+\r
+              if(this.nodeIndex===1) {\r
+                  this.rootNode = node;\r
+              }\r
+\r
+              if(parentNode) {\r
+                  parentNode.children.push(node);\r
+              }\r
+\r
+              return node;\r
+          },\r
+\r
+          parse: function(xml, parent) {\r
+              var self = this;\r
+\r
+              $(xml).children().each(function() {\r
+                  var prop = this.tagName.toLowerCase();\r
+\r
+                  if(self.hasOwnProperty(prop)) {\r
+                      self[prop](this, parent);\r
+                  } else {\r
+                      //self.parse(this, parent);\r
+                  }\r
+              });\r
+          },\r
+\r
+          leaf: function(xml, parent) {\r
+              var type = 'leaf',\r
+                  name = $(xml).attr('name');\r
+\r
+              this.createNewNode(name, type, parent);\r
+          },\r
+\r
+          container: function(xml, parent) {\r
+              var type = 'container',\r
+                  name = $(xml).attr('name');\r
+\r
+              if($(xml).children().length === 0) { //if empty add as element\r
+                  this.createNewNode(name, type, parent);\r
+              }\r
+              else {\r
+                  var node = this.createNewNode(name, type, parent);\r
+                  this.parse(xml, node);\r
+              }\r
+          },\r
+\r
+          choice: function(xml, parent) {\r
+              var type = 'choice',\r
+                  name = $(xml).attr('name'),\r
+                  self = this,\r
+                  node = this.createNewNode(name, type, parent);\r
+\r
+              $(xml).children('case').each(function() {\r
+                  self._case(this, node);\r
+              });\r
+          },\r
+\r
+          _case: function(xml, parent) {\r
+              var type = 'case',\r
+                  name = $(xml).attr('name'),\r
+                  node = this.createNewNode(name, type, parent);\r
+\r
+              this.parse(xml, node);\r
+          },\r
+\r
+          list: function(xml, parent) {\r
+              var type = 'list',\r
+                  name = $(xml).attr('name'),\r
+                  node = this.createNewNode(name, type, parent);\r
+\r
+              this.parse(xml, node);\r
+          },\r
+\r
+          _grouping: function(xml, parent, groupingName) {\r
+              var self = this;\r
+\r
+              $(xml).children('grouping[name=\''+groupingName+'\']').each(function() {\r
+                  self.parse(this, parent);\r
+              });\r
+          },\r
+\r
+          uses: function(xml, parent) {\r
+              var self = this,\r
+                  $xml = $(xml),\r
+                  name = $xml.attr('name'),\r
+                  names = name.split(':');\r
+\r
+              if (names[1] === undefined) { //same module\r
+                  self._grouping(parentTag($xml), parent, names[0]);\r
+              }\r
+              else { //different module\r
+                  $(parentTag($xml)).children('import').each(function() {\r
+                      var importTag = $(this);\r
+\r
+                      importTag.children('prefix[value=\''+names[0]+'\']').each(function() {\r
+                          var importTagModule = importTag.attr('module'),\r
+                              reqId = spawnRequest(importTagModule);\r
+\r
+                          $http.get(path+'/yang2xml/'+importTagModule+'.yang.xml').success(function (data) {\r
+                              self.setCurrentModule(importTagModule);\r
+                              self._grouping($.parseXML(data).documentElement, parent, names[1]);\r
+                              removeRequest(reqId);\r
+                          });\r
+                      });\r
+                  });\r
+              }\r
+          }\r
+      };\r
+\r
+      return {\r
+          parse: parseYang\r
+      };\r
+  });\r
+\r
+  yangUtils.factory('yangUtils', function ($http, yinParser, nodeWrapper, reqBuilder) {\r
+\r
+      var utils = {};\r
+\r
+      utils.exportModulesLocales = function(modules) {\r
+          var obj = {},\r
+              localeNodes = ['leaf','list','container','choice'];\r
+\r
+          var process = function process(node) {\r
+              if(localeNodes.indexOf(node.type) >= 0 && obj.hasOwnProperty(node.localeLabel) === false) {\r
+                  obj[node.localeLabel] = node.label;\r
+              }\r
+\r
+              node.children.forEach(function(child) {\r
+                  process(child);\r
+              });\r
+          };\r
+\r
+          modules.forEach(function(module) {\r
+              process(module);\r
+          });\r
+\r
+          return JSON.stringify(obj, null, 4);\r
+      };\r
+\r
+      utils.processModules = function(loadedModules, callback) {\r
+          // console.info('loaded modules', loadedModules);\r
+          loadedModules.module.forEach(function(module) {\r
+              yinParser.parse('/yang2xml/'+module.name+'.yang.xml', function(node) {\r
+                  if(node) {\r
+                      var copy = node.deepCopy();\r
+\r
+                      nodeWrapper.wrapAll(copy);\r
+                      callback(copy);\r
+                  }\r
+              });\r
+          });\r
+      };\r
+\r
+      utils.buildRequest = function(node) {\r
+          var request = reqBuilder.createObj();\r
+          node.buildRequest(reqBuilder, request);\r
+          return request.flows; //TODO use REST API explorer when it will be available\r
+      };\r
+\r
+      utils.getRequestString = function(node) {\r
+          var request = reqBuilder.createObj(),\r
+              reqStr = '';\r
+\r
+          node.buildRequest(reqBuilder, request);\r
+\r
+          if(request && $.isEmptyObject(request) === false) {\r
+              reqStr = reqBuilder.resultToString(request);\r
+          }\r
+          return reqStr;\r
+      };\r
+\r
+      utils.processNodes = function(invData) {\r
+          var nodes =[];\r
+\r
+          invData.node.forEach(function(node) {\r
+              nodes.push(node.id);\r
+          });\r
+          return nodes;\r
+      };\r
+\r
+      utils.processFlows = function(nodeData) {\r
+          var flows = [];\r
+\r
+          nodeData['flow-node-inventory:table'].forEach(function(table) {\r
+              var table_id = table['flow-node-inventory:id'];\r
+\r
+              if(table.hasOwnProperty('flow-node-inventory:flow')) {\r
+                  table['flow-node-inventory:flow'].forEach(function(flow) {\r
+                      var flowOjb = { table: table_id };\r
+                      flowOjb.flow = flow['flow-node-inventory:id'];\r
+                      flowOjb.data = flow;\r
+                      flowOjb.label = 'table:'+flowOjb.table+' > flow:'+flowOjb.flow;\r
+                      flows.push(flowOjb);\r
+                  });\r
+              }\r
+          });\r
+\r
+          return flows;\r
+      };\r
+\r
+      return utils;\r
+\r
+  });\r
+});\r