--- /dev/null
+// Copyright (c) 2018 Maen Artimy\r
+// \r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+// \r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+/**\r
+ * Definition of modules.\r
+ *\r
+ **/\r
+\r
+// Makes a GET request to the controller\r
+function BaseModule(command) {\r
+ var cmd = command;\r
+ var go = myGlobalObject;\r
+\r
+ var run = function(element) {\r
+ go.httpGetAsync(cmd, this.callback, element);\r
+ };\r
+\r
+ var callback = function(jsondata, element) {\r
+ console.log(element);\r
+ }\r
+\r
+ return {\r
+ callback: callback,\r
+ run: run\r
+ }\r
+}\r
+\r
+// Makes a POST request to the controller\r
+function BasePostModule(command) {\r
+ var cmd = command;\r
+ var go = myGlobalObject;\r
+ var idx;\r
+ var parm = "";\r
+\r
+ var dpInFilter = function (e, x) {\r
+ idx = x;\r
+ e.innerHTML ="Filter: <input class=\"filterInput\" size=20><button onClick=\"mainFilterFunc(this.parentElement,"+idx+")\">Send</button>";\r
+ };\r
+\r
+ var run = function(element) {\r
+ go.httpPostAsync(cmd, this.param, this.callback, element);\r
+ };\r
+\r
+ var callback = function(jsondata, element) {\r
+ console.log(element);\r
+ }\r
+\r
+ return {\r
+ idx: this.idx,\r
+ param: this.param,\r
+ dpInFilter: dpInFilter,\r
+ callback: callback,\r
+ run: run\r
+ }\r
+}\r
+\r
+function hc(myString) {\r
+ return myString.replace("_"," ").replace(/\b\w/g, l => l.toUpperCase())\r
+}\r
+\r
+// Populates the Switch ID card\r
+var dpList = function (jsondata, element) {\r
+ var switches = JSON.parse(jsondata);\r
+ var found = false;\r
+\r
+ //var html = "";\r
+ element.innerHTML = "";\r
+ var ul = document.createElement("ul");\r
+ ul.setAttribute("id", "swlist");\r
+ for(var s in switches) {\r
+ var num = +switches[s]; //("000000000000000" + switches[s].toString(16)).substr(-16);\r
+ //html += num + "<br>";\r
+\r
+ var li = document.createElement("li");\r
+ li.innerHTML = num;\r
+ if(switches[s] === myGlobalObject.dpid()) {\r
+ li.classList.add("selected");\r
+ found = true;\r
+ }\r
+ li.addEventListener("click", clickMe);\r
+ ul.appendChild(li);\r
+ }\r
+ element.appendChild(ul);\r
+ //element.innerHTML = html;\r
+ if (!found && document.getElementById("swlist").firstChild) {\r
+ var name = document.getElementById("swlist").firstChild.innerHTML\r
+ myGlobalObject.setDPID(name)\r
+ moduleManager.loadModules(views);\r
+ }\r
+};\r
+\r
+var dpStruct = function (jsondata, element) {\r
+ var jsonobj = JSON.parse(jsondata);\r
+ if(!jsonobj) return;\r
+ var switchName = Object.keys(jsonobj);\r
+ var struct = jsonobj[switchName];\r
+ var html = "";\r
+ for(var key in struct) {\r
+ html += hc(key) + " : " + struct[key] + "<br>";\r
+ }\r
+ element.innerHTML = html;\r
+};\r
+\r
+var dpTable = function (jsondata, element) {\r
+ var dispObj = function(obj) {\r
+ // JSON to string?\r
+ var str = "";\r
+ if(Array.isArray(obj)) {\r
+ for(var item in obj) {\r
+ if(obj[item] instanceof Object) {\r
+\r
+ } else {\r
+ str += obj[item].replace(":","=") + "<br>";\r
+ }\r
+ }\r
+ return str;\r
+ } else {\r
+ var allKeys = Object.keys(obj);\r
+ for(var key in allKeys) {\r
+ str += allKeys[key] + " = " + obj[allKeys[key]] + "<br>";\r
+ }\r
+ }\r
+ return str;\r
+ };\r
+\r
+ var jsonobj = JSON.parse(jsondata);\r
+ if(!jsonobj) return;\r
+\r
+ var switchName = Object.keys(jsonobj);\r
+\r
+ // extract the flows\r
+ var rows = jsonobj[switchName];\r
+\r
+ // get the headers\r
+ var col = [];\r
+ for (var c in rows[0]) {\r
+ col.push(c);\r
+ }\r
+ col.sort(); // A, B, C, ...\r
+ col.reverse(); // ..., C, B, A\r
+\r
+ // CREATE DYNAMIC TABLE.\r
+ var table = document.createElement("table");\r
+ //table.classList.add("fixed_headers");\r
+\r
+ // CREATE HTML TABLE HEADER ROW USING THE EXTRACTED HEADERS ABOVE.\r
+ var tr = table.insertRow(-1); // TABLE ROW.\r
+ for (var i = 0; i < col.length; i++) {\r
+ var th = document.createElement("th"); // TABLE HEADER.\r
+ th.innerHTML = col[i].replace("_","<br>");\r
+ tr.appendChild(th);\r
+ }\r
+\r
+ // ADD JSON DATA TO THE TABLE AS ROWS.\r
+ for (var i = 0; i < rows.length; i++) {\r
+ tr = table.insertRow(-1);\r
+ for (var j = 0; j < col.length; j++) {\r
+ var tabCell = tr.insertCell(-1);\r
+\r
+ if(typeof rows[i][col[j]] === 'object') {\r
+ //tabCell.innerHTML = dispObj(rows[i][col[j]]);\r
+ tabCell.innerHTML = JSON.stringify(rows[i][col[j]]);\r
+ } else {\r
+ tabCell.innerHTML = rows[i][col[j]];\r
+ }\r
+ }\r
+ }\r
+ element.innerHTML = "";\r
+ table.align = "center";\r
+ element.appendChild(table);\r
+}\r
+\r
+// Populate the cards with data\r
+var moduleManager = (function () {\r
+ var time = 15000; //10 sec\r
+ var myViews = [];\r
+\r
+ var loadModules = function(views) {\r
+ myViews.length = 0; // it is supposed to be the best way to clear an array\r
+ self.clearInterval();\r
+\r
+ for (var idx in views) {\r
+ if(views[idx].call) {\r
+ var card = document.getElementById(views[idx].id);\r
+ var container = card.childNodes.item(CONTAINER_IDX);\r
+\r
+ var myModule;\r
+ if(views[idx].post) {\r
+ myModule = new BasePostModule(views[idx].cmd);\r
+ var bar = card.childNodes.item(BAR_IDX);\r
+ myModule.dpInFilter(bar, idx);\r
+ } else {\r
+ myModule = new BaseModule(views[idx].cmd);\r
+ }\r
+ myModule.callback = views[idx].call;\r
+ myModule.run(container);\r
+ views[idx].module = myModule; // we need this to refresh\r
+ views[idx].container = container; // we need this to refresh\r
+\r
+ if(views[idx].ref) { // refresh is required\r
+ myViews.push(views[idx]);\r
+ };\r
+ }\r
+ }\r
+ //myViews = views;\r
+ };\r
+\r
+ var refreshModules = function() {\r
+ for (var idx in myViews) {\r
+ myViews[idx].module.run(myViews[idx].container);\r
+ }\r
+ }\r
+\r
+ var interval = self.setInterval(refreshModules,time);\r
+\r
+ var setInterval = function(newtime) {\r
+ time = newtime;\r
+ interval = self.setInterval(loadModules,time);\r
+ }\r
+\r
+ var getInterval = function() {\r
+ console.log(time);\r
+ }\r
+\r
+ return {\r
+ setInterval: setInterval,\r
+ loadModules: loadModules\r
+ }\r
+})();\r
+\r
+function clickMe(e) {\r
+ //console.log(e);\r
+ myGlobalObject.setDPID(e.currentTarget.innerHTML);\r
+ moduleManager.loadModules(views);\r
+}\r
+\r
+function mainFilterFunc(element, idx) {\r
+ var str = element.getElementsByClassName("filterInput")[0].value;\r
+ views[idx].module.param = str;\r
+ views[idx].module.run(views[idx].container);\r
+}\r