1 define(['common/yangutils/yangutils.module'], function(yangUtils) {
\r
3 // In the yangui.module.js, this file is loader immediatly after
\r
4 // his module. So we don't need to register the services.
\r
6 yangUtils.factory('reqBuilder', function () {
\r
8 var namespace = 'flow-node-inventory';
\r
11 namespace: namespace,
\r
12 createObj: function() {
\r
16 createList: function() {
\r
20 insertObjToList: function(list, obj) {
\r
24 insertPropertyToObj: function(obj, propName, propData) {
\r
25 var data = propData ? propData : {},
\r
31 resultToString: function(obj) {
\r
32 return JSON.stringify(obj, null, 4);
\r
40 yangUtils.factory('nodeWrapper', function () {
\r
42 var comparePropToElemByName = function comparePropToElemByName(propName, elemName) {
\r
43 return propName.split(':')[1] === elemName; //TODO modify when namespace relations will be known
\r
48 wrap: function(node) {
\r
49 if(this.hasOwnProperty(node.type)) {
\r
50 this[node.type](node);
\r
54 wrapAll: function(node) {
\r
57 node.children.forEach(function(child) {
\r
58 self.wrapAll(child);
\r
62 leaf: function(node) {
\r
65 node.buildRequest = function(builder, req) {
\r
67 builder.insertPropertyToObj(req, node.label, node.value);
\r
74 node.fill = function(name, data) {
\r
75 var match = comparePropToElemByName(name, node.label);
\r
84 node.clear = function() {
\r
89 container: function(node) {
\r
90 node.expanded = false;
\r
92 node.toggleExpand = function() {
\r
93 node.expanded = !node.expanded;
\r
96 node.buildRequest = function(builder, req) {
\r
99 objToAdd = builder.createObj();
\r
101 if(node.children.length) {
\r
102 node.children.forEach(function(child) {
\r
103 var childAdded = child.buildRequest(builder, objToAdd);
\r
104 added = added || childAdded;
\r
111 builder.insertPropertyToObj(req, name, objToAdd);
\r
117 node.fill = function(name, data) {
\r
118 var match = comparePropToElemByName(name, node.label);
\r
120 if (match && node.children.length) {
\r
121 node.children.forEach(function(child) {
\r
122 for(var prop in data) {
\r
123 child.fill(prop, data[prop]);
\r
127 node.expanded = true;
\r
132 node.clear = function() {
\r
133 if (node.children.length) {
\r
134 node.children.forEach(function(child) {
\r
142 case: function(node) {
\r
143 node.buildRequest = function(builder, req) {
\r
146 node.children.forEach(function(child) {
\r
147 var childAdded = child.buildRequest(builder, req);
\r
148 added = added || childAdded;
\r
154 node.fill = function(name, data) {
\r
155 var filled = false;
\r
157 node.children.forEach(function(child) {
\r
158 var childFilled = child.fill(name, data);
\r
159 filled = filled || childFilled;
\r
165 node.clear = function() {
\r
166 node.children.forEach(function(child) {
\r
172 choice: function(node) {
\r
173 node.choice = null;
\r
174 node.buildRequest = function(builder, req) {
\r
178 added = node.choice.buildRequest(builder, req);
\r
184 node.fill = function(name, data) {
\r
185 var filled = false;
\r
187 node.children.forEach(function(child) {
\r
188 var childFilled = child.fill(name, data);
\r
191 node.choice = child;
\r
194 filled = filled || childFilled;
\r
203 node.clear = function() {
\r
205 node.choice.clear();
\r
206 node.choice = null;
\r
211 list: function(node) {
\r
213 node.listElems = [];
\r
214 node.actElement = null;
\r
215 node.needAddNewListElem = true;
\r
217 node.addListElem = function() {
\r
218 var copy = node.deepCopy();
\r
219 wrapper.wrapAll(copy);
\r
220 node.listElems.push(copy);
\r
221 node.needAddNewListElem = false;
\r
222 node.actElement = node.listElems[node.listElems.length - 1];
\r
225 node.removeListElem = function(elem) {
\r
226 node.listElems.splice(node.listElems.indexOf(elem), 1);
\r
227 if(node.listElems.length) {
\r
228 node.actElement = node.listElems[node.listElems.length - 1];
\r
230 node.actElement = null;
\r
234 var listElemBuildRequest = function(builder, req, node) {
\r
236 objToAdd = builder.createObj();
\r
238 node.children.forEach(function(child) {
\r
239 var childAdded = child.buildRequest(builder, objToAdd);
\r
240 added = added || childAdded;
\r
244 builder.insertObjToList(req, objToAdd);
\r
250 var fillListElement = function(name, data, node) {
\r
251 var filled = false;
\r
253 node.children.forEach(function(child) {
\r
254 var childFilled = child.fill(name, data);
\r
255 filled = filled || childFilled;
\r
261 node.buildRequest = function(builder, req) {
\r
263 listToAdd = builder.createList();
\r
265 node.listElems.forEach(function(listElem) {
\r
266 var elemAdded = listElemBuildRequest(builder, listToAdd, listElem);
\r
267 added = added || elemAdded;
\r
271 builder.insertPropertyToObj(req, node.label, listToAdd);
\r
277 node.fill = function(name, array) { //data is array
\r
278 var match = comparePropToElemByName(name, node.label),
\r
282 for(var i in array) {
\r
283 node.addListElem();
\r
285 lastIndex = node.listElems.length - 1;
\r
286 for(var prop in array[i]) {
\r
287 node.needAddNewListElem = fillListElement( prop, array[i][prop], node.listElems[lastIndex]);
\r
294 node.clear = function() {
\r
295 while(node.listElems.length > 0) {
\r
296 node.listElems.pop();
\r
298 node.needAddNewListElem = true;
\r
306 yangUtils.factory('yinParser', function ($http, $timeout) {
\r
308 var path = './assets';
\r
309 var runningRequests = [];
\r
312 var spawnRequest = function(digest) {
\r
313 var id = digest+(reqId++).toString();
\r
314 runningRequests.push(id);
\r
315 // console.debug('adding request '+id+' total running requests = '+runningRequests.length);
\r
319 var removeRequest = function(id) {
\r
320 var index = runningRequests.indexOf(id);
\r
323 runningRequests.splice(index, 1);
\r
324 // console.debug('removing request '+id+' remaining requests = '+runningRequests.length);
\r
328 var waitFor = function waitFor(callback) {
\r
330 processes = runningRequests.length;
\r
332 // console.debug('waiting for '+t+ 'ms, for '+processes+', processes: '+(processes > 0));
\r
334 if(processes > 0) {
\r
335 $timeout(function() {
\r
343 var Node = function(id, name, type, module) {
\r
346 this.localeLabel = 'YANGUI_'+name.toUpperCase();
\r
348 this.module = module;
\r
349 this.children = [];
\r
351 this.deepCopy = function deepCopy() {
\r
352 var copy = new Node(this.id, this.label, this.type, this.module);
\r
353 this.children.forEach(function(child) {
\r
354 copy.children.push(child.deepCopy());
\r
361 var parentTag = function(xml){
\r
362 if (xml.get(0).tagName.toLowerCase() === 'module') {
\r
365 return parentTag(xml.parent());
\r
369 var parseYang = function parseYang(yinPath, callback) {
\r
372 runningRequests = [];
\r
375 $http.get(path+yinPath).success(function (data) {
\r
376 var rootModule = $($.parseXML(data).documentElement).attr('name');
\r
378 yangParser.reset();
\r
379 yangParser.setCurrentModule(rootModule);
\r
380 yangParser.parse(data, null);
\r
382 result = yangParser.rootNode;
\r
384 waitFor(function() {
\r
387 }).error(function () {
\r
388 console.warn('can\'t find module: '+yinPath);
\r
394 currentModule: null,
\r
398 reset: function() {
\r
399 this.rootNode = null;
\r
400 this.nodeIndex = 0;
\r
401 this.currentModule = null;
\r
403 setCurrentModule: function(module) {
\r
404 this.currentModule = module;
\r
406 createNewNode: function(name, type, parentNode) {
\r
407 var node = new Node(this.nodeIndex++, name, type, this.currentModule);
\r
409 if(this.nodeIndex===1) {
\r
410 this.rootNode = node;
\r
414 parentNode.children.push(node);
\r
420 parse: function(xml, parent) {
\r
423 $(xml).children().each(function() {
\r
424 var prop = this.tagName.toLowerCase();
\r
426 if(self.hasOwnProperty(prop)) {
\r
427 self[prop](this, parent);
\r
429 //self.parse(this, parent);
\r
434 leaf: function(xml, parent) {
\r
436 name = $(xml).attr('name');
\r
438 this.createNewNode(name, type, parent);
\r
441 container: function(xml, parent) {
\r
442 var type = 'container',
\r
443 name = $(xml).attr('name');
\r
445 if($(xml).children().length === 0) { //if empty add as element
\r
446 this.createNewNode(name, type, parent);
\r
449 var node = this.createNewNode(name, type, parent);
\r
450 this.parse(xml, node);
\r
454 choice: function(xml, parent) {
\r
455 var type = 'choice',
\r
456 name = $(xml).attr('name'),
\r
458 node = this.createNewNode(name, type, parent);
\r
460 $(xml).children('case').each(function() {
\r
461 self._case(this, node);
\r
465 _case: function(xml, parent) {
\r
467 name = $(xml).attr('name'),
\r
468 node = this.createNewNode(name, type, parent);
\r
470 this.parse(xml, node);
\r
473 list: function(xml, parent) {
\r
475 name = $(xml).attr('name'),
\r
476 node = this.createNewNode(name, type, parent);
\r
478 this.parse(xml, node);
\r
481 _grouping: function(xml, parent, groupingName) {
\r
484 $(xml).children('grouping[name=\''+groupingName+'\']').each(function() {
\r
485 self.parse(this, parent);
\r
489 uses: function(xml, parent) {
\r
492 name = $xml.attr('name'),
\r
493 names = name.split(':');
\r
495 if (names[1] === undefined) { //same module
\r
496 self._grouping(parentTag($xml), parent, names[0]);
\r
498 else { //different module
\r
499 $(parentTag($xml)).children('import').each(function() {
\r
500 var importTag = $(this);
\r
502 importTag.children('prefix[value=\''+names[0]+'\']').each(function() {
\r
503 var importTagModule = importTag.attr('module'),
\r
504 reqId = spawnRequest(importTagModule);
\r
506 $http.get(path+'/yang2xml/'+importTagModule+'.yang.xml').success(function (data) {
\r
507 self.setCurrentModule(importTagModule);
\r
508 self._grouping($.parseXML(data).documentElement, parent, names[1]);
\r
509 removeRequest(reqId);
\r
522 yangUtils.factory('yangUtils', function ($http, yinParser, nodeWrapper, reqBuilder) {
\r
526 utils.exportModulesLocales = function(modules) {
\r
528 localeNodes = ['leaf','list','container','choice'];
\r
530 var process = function process(node) {
\r
531 if(localeNodes.indexOf(node.type) >= 0 && obj.hasOwnProperty(node.localeLabel) === false) {
\r
532 obj[node.localeLabel] = node.label;
\r
535 node.children.forEach(function(child) {
\r
540 modules.forEach(function(module) {
\r
544 return JSON.stringify(obj, null, 4);
\r
547 utils.processModules = function(loadedModules, callback) {
\r
548 // console.info('loaded modules', loadedModules);
\r
549 loadedModules.module.forEach(function(module) {
\r
550 yinParser.parse('/yang2xml/'+module.name+'.yang.xml', function(node) {
\r
552 var copy = node.deepCopy();
\r
554 nodeWrapper.wrapAll(copy);
\r
561 utils.buildRequest = function(node) {
\r
562 var request = reqBuilder.createObj();
\r
563 node.buildRequest(reqBuilder, request);
\r
564 return request.flows; //TODO use REST API explorer when it will be available
\r
567 utils.getRequestString = function(node) {
\r
568 var request = reqBuilder.createObj(),
\r
571 node.buildRequest(reqBuilder, request);
\r
573 if(request && $.isEmptyObject(request) === false) {
\r
574 reqStr = reqBuilder.resultToString(request);
\r
579 utils.processNodes = function(invData) {
\r
582 invData.node.forEach(function(node) {
\r
583 nodes.push(node.id);
\r
588 utils.processFlows = function(nodeData) {
\r
591 nodeData['flow-node-inventory:table'].forEach(function(table) {
\r
592 var table_id = table['flow-node-inventory:id'];
\r
594 if(table.hasOwnProperty('flow-node-inventory:flow')) {
\r
595 table['flow-node-inventory:flow'].forEach(function(flow) {
\r
596 var flowOjb = { table: table_id };
\r
597 flowOjb.flow = flow['flow-node-inventory:id'];
\r
598 flowOjb.data = flow;
\r
599 flowOjb.label = 'table:'+flowOjb.table+' > flow:'+flowOjb.flow;
\r
600 flows.push(flowOjb);
\r