'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
'app.flows',
'app.container',
'app.networking',
+ 'app.yangui',
'app.common.nav',
'app.common.topbar',
'app.common.layout'];
--- /dev/null
+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
+++ /dev/null
-/*\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
--- /dev/null
+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
+++ /dev/null
-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
--- /dev/null
+define(['angularAMD'], function() {\r
+\r
+ var yangUtils = angular.module('app.common.yangUtils', []);\r
+\r
+ return yangUtils;\r
+});\r
--- /dev/null
+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