http://git-wip-us.apache.org/repos/asf/stratos/blob/9c1fdc75/extensions/das/metering-service/capps/stratos-metering-service/Gadget_Member_Count/Member_Count/js/main.js ---------------------------------------------------------------------- diff --git a/extensions/das/metering-service/capps/stratos-metering-service/Gadget_Member_Count/Member_Count/js/main.js b/extensions/das/metering-service/capps/stratos-metering-service/Gadget_Member_Count/Member_Count/js/main.js new file mode 100644 index 0000000..d54087a --- /dev/null +++ b/extensions/das/metering-service/capps/stratos-metering-service/Gadget_Member_Count/Member_Count/js/main.js @@ -0,0 +1,167 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +var datasource, type, columns, filter, maxUpdateValue; + +var REFRESH_INTERVAL = 5000; +var dataLoaded = true; +var timeInterval = '30 Min'; +var applicationId = ''; +var clusterId = ''; + +//loading gadget configuration +datasource = gadgetConfig.datasource; +filter = gadgetConfig.filter; +type = gadgetConfig.type; +var counter = 0; +maxUpdateValue = gadgetConfig.maxUpdateValue; + +gadgets.HubSettings.onConnect = function () { + gadgets.Hub.subscribe('member-status-filter', function (topic, data) { + clusterId = data['clusterId']; + applicationId = data['applicationId']; + timeInterval = data['timeInterval']; + console.log("Member Filter Value:" + JSON.stringify(data)); + }); +}; + +//first, fetch datasource schema +getColumns(); + +//load data immediately +fetchData(drawChart); + +// then start periodic polling +setInterval(function () { + fetchData(drawChart); +}, REFRESH_INTERVAL); + + +function getColumns() { + columns = gadgetConfig.columns; +} + +function fetchData(callback) { + //if previous operation is not completed, DO NOT fetch data + if (!dataLoaded) { + console.log("Waiting for data..."); + return; + } + + var application = applicationId; + var cluster = clusterId; + var time = timeInterval; + + console.log("ApplicationId:" + application); + console.log("ClusterId:" + cluster); + console.log("Time interval:" + timeInterval); + + var request = { + tableName: datasource, + applicationId: application, + clusterId: cluster, + time: time + }; + $.ajax({ + url: "/portal/apis/member-count", + method: "GET", + data: request, + contentType: "application/json", + success: function (data) { + if (callback != null) { + callback(makeRows(JSON.parse(data))); + } + } + }); + dataLoaded = false; //setting the latch to locked position so that we block data fetching until we receive the response from backend +} + +function makeDataTable(data) { + var dataTable = new igviz.DataTable(); + if (columns.length > 0) { + columns.forEach(function (column) { + var type = "N"; + if (column.DATA_TYPE == "varchar" || column.DATA_TYPE == "VARCHAR") { + type = "C"; + } else if (column.DATA_TYPE == "TIME" || column.DATA_TYPE == "time") { + type = "T"; + } + dataTable.addColumn(column.COLUMN_NAME, type); + }); + } + data.forEach(function (row, index) { + for (var i = 0; i < row.length; i++) { + if (dataTable.metadata.types[i] == "N") { + data[index][i] = parseInt(data[index][i]); + } + } + }); + dataTable.addRows(data); + return dataTable; +} + +function makeRows(data) { + var rows = []; + for (var i = 0; i < data.length; i++) { + var record = data[i]; + var row = columns.map(function (column) { + return record[column.COLUMN_NAME]; + }); + rows.push(row); + } + return rows; +} + +function drawChart(data) { + var dataTable = makeDataTable(data); + gadgetConfig.chartConfig.width = $("#placeholder").width(); + gadgetConfig.chartConfig.height = $("#placeholder").height() - 65; + var chartType = gadgetConfig.chartConfig.chartType; + var xAxis = gadgetConfig.chartConfig.xAxis; + var chart; + jQuery("#noChart").html(""); + if (chartType === "bar" && dataTable.metadata.types[xAxis] === "N") { + dataTable.metadata.types[xAxis] = "C"; + } + + if (gadgetConfig.chartConfig.chartType === "tabular" || gadgetConfig.chartConfig.chartType === "singleNumber") { + gadgetConfig.chartConfig.height = $("#placeholder").height(); + chart = igviz.draw("#placeholder", gadgetConfig.chartConfig, dataTable); + chart.plot(dataTable.data); + + } else { + chart = igviz.setUp("#placeholder", gadgetConfig.chartConfig, dataTable); + chart.setXAxis({ + "labelAngle": -35, + "labelAlign": "right", + "labelDy": 0, + "labelDx": 0, + "titleDy": 25 + }) + .setYAxis({ + "titleDy": -30 + }); + chart.plot(dataTable.data); + } + //releasing the latch so that we can request data again from the backend. + dataLoaded = true; +} + +
http://git-wip-us.apache.org/repos/asf/stratos/blob/9c1fdc75/extensions/das/metering-service/capps/stratos-metering-service/Gadget_Member_Count/Member_Count/js/outputAdapterUiLibrary.js ---------------------------------------------------------------------- diff --git a/extensions/das/metering-service/capps/stratos-metering-service/Gadget_Member_Count/Member_Count/js/outputAdapterUiLibrary.js b/extensions/das/metering-service/capps/stratos-metering-service/Gadget_Member_Count/Member_Count/js/outputAdapterUiLibrary.js new file mode 100644 index 0000000..646b464 --- /dev/null +++ b/extensions/das/metering-service/capps/stratos-metering-service/Gadget_Member_Count/Member_Count/js/outputAdapterUiLibrary.js @@ -0,0 +1,275 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +var CONSTANTS = { + webAppName: 'outputui', + urlSeperator: '/', + urlGetParameter: '?lastUpdatedTime=', + tenantUrlAttribute: 't', + urlUnsecureTransportHttp: 'http://', + urlUnsecureTransportWebsocket: 'ws://', + urlSecureTransportWebsocket: 'wss://', + urlSecureTransportHttp: 'https://', + colon: ':', + defaultIntervalTime: 10 * 1000, + defaultUserDomain: 'carbon.super', + defaultHostName: 'localhost', + defaultNonsecurePortNumber: '9763', + defaultSecurePortNumber: '9443', + defaultMode: 'AUTO', + processModeHTTP: 'HTTP', + processModeWebSocket: 'WEBSOCKET', + processModeAuto: 'AUTO', + domain: 'carbon.super', + numThousand: 1000, + websocketTimeAppender: 400, + secureMode: 'SECURED' +}; + + +var websocket = null; +var webSocketUrl; +var httpUrl; +var cepHostName; +var cepPortNumber; +var isErrorOccured = false; +var lastUpdatedtime = -1; +var polingInterval; +var stream; +var streamVersion; +var firstPollingAttempt; +var processMode; +var onSuccessFunction; +var onErrorFunction; +var userDomainUrl = ""; +var terminateWebsocketInstance = false; +var pollingContinue = true; +var transportToBeUsedHttp; +var transportToBeUsedWebsocket; + +function subscribe(streamName, version, intervalTime, domain, + listeningFuncSuccessData, listeningFuncErrorData, cepHost, cepPort, mode, secureMode) { + + stopPollingProcesses(); + stream = streamName; + streamVersion = version; + onSuccessFunction = listeningFuncSuccessData; + onErrorFunction = listeningFuncErrorData; + + if (secureMode == CONSTANTS.secureMode) { + transportToBeUsedHttp = CONSTANTS.urlSecureTransportHttp; + transportToBeUsedWebsocket = CONSTANTS.urlSecureTransportWebsocket; + } else { + transportToBeUsedHttp = CONSTANTS.urlUnsecureTransportHttp; + transportToBeUsedWebsocket = CONSTANTS.urlUnsecureTransportWebsocket; + } + + if (intervalTime == null || intervalTime == "") { + polingInterval = CONSTANTS.defaultIntervalTime; + } else { + polingInterval = intervalTime * CONSTANTS.numThousand; + } + + if (domain == null || domain == "") { + domain = CONSTANTS.defaultUserDomain; + } + + if (cepHost == null || cepHost == "") { + cepHostName = CONSTANTS.defaultHostName; + } else { + cepHostName = cepHost; + } + + if (cepPort == null || cepPort == "") { + if (secureMode == CONSTANTS.secureMode) { + cepPortNumber = CONSTANTS.defaultSecurePortNumber; + } else { + cepPortNumber = CONSTANTS.defaultNonsecurePortNumber; + } + } else { + cepPortNumber = cepPort; + } + + if (mode == null || mode == "") { + processMode = CONSTANTS.defaultMode; + } else { + processMode = mode; + } + + if (domain != CONSTANTS.domain) { + userDomainUrl = CONSTANTS.tenantUrlAttribute + CONSTANTS.urlSeperator + domain + CONSTANTS.urlSeperator; + + } + webSocketUrl = transportToBeUsedWebsocket + cepHostName + CONSTANTS.colon + cepPortNumber + + CONSTANTS.urlSeperator + CONSTANTS.webAppName + CONSTANTS.urlSeperator + userDomainUrl + stream + + CONSTANTS.urlSeperator + streamVersion; + + if (processMode == CONSTANTS.processModeHTTP) { + firstPollingAttempt = true; + pollingContinue = true; + startPoll(); + } else { + initializeWebSocket(webSocketUrl); + } +} + + +/** + * Initializing Web Socket + */ +function initializeWebSocket(webSocketUrl) { + websocket = new WebSocket(webSocketUrl); + websocket.onopen = webSocketOnOpen; + websocket.onmessage = webSocketOnMessage; + websocket.onclose = webSocketOnClose; + websocket.onerror = webSocketOnError; +} + +/** + * Web socket On Open + */ + +var webSocketOnOpen = function () { + // alert("Successfully connected to "+webSocketUrl); + //onErrorFunction("Successfully connected to URL:" + webSocketUrl + "\n"); +}; + + +/** + * On server sends a message + */ +var webSocketOnMessage = function (evt) { + var event = evt.data; + var array = JSON.parse(event); + constructPayload(array); +}; + +/** + * On server close + */ +var webSocketOnClose = function (e) { + + if (isErrorOccured) { + if (processMode != CONSTANTS.processModeWebSocket) { + firstPollingAttempt = true; + pollingContinue = true; + startPoll(); + } + } else { + if (!terminateWebsocketInstance) { + waitForSocketConnection(websocket); + } else { + terminateWebsocketInstance = false; + } + + } +}; + +/** + * On server Error + */ +var webSocketOnError = function (err) { + var error = "Error: Cannot connect to Websocket URL:" + webSocketUrl + " .Hence closing the connection!"; + + onErrorFunction(error); + isErrorOccured = true; + +}; + +/** + * Gracefully increments the connection retry + */ +var waitTime = CONSTANTS.numThousand; +function waitForSocketConnection(socket, callback) { + setTimeout( + function () { + if (socket.readyState === 1) { + initializeWebSocket(webSocketUrl); + console.log("Connection is made"); + if (callback != null) { + callback(); + } + return; + } else { + websocket = new WebSocket(webSocketUrl); + waitTime += CONSTANTS.websocketTimeAppender; + waitForSocketConnection(websocket, callback); + } + }, waitTime); +} + +/** + * Polling to retrieve events from http request periodically + */ +function startPoll() { + + (function poll() { + setTimeout(function () { + httpUrl = transportToBeUsedHttp + cepHostName + CONSTANTS.colon + cepPortNumber + CONSTANTS.urlSeperator + + CONSTANTS.webAppName + CONSTANTS.urlSeperator + userDomainUrl + stream + CONSTANTS.urlSeperator + + streamVersion + CONSTANTS.urlGetParameter + lastUpdatedtime; + + $.getJSON(httpUrl, function (responseText) { + if (firstPollingAttempt) { + /*var data = $("textarea#idConsole").val(); + $("textarea#idConsole").val(data + "Successfully connected to HTTP.");*/ + firstPollingAttempt = false; + } + + var eventList = $.parseJSON(responseText.events); + if (eventList.length != 0) { + lastUpdatedtime = responseText.lastEventTime; + for (var i = 0; i < eventList.length; i++) { + var arr = eventList[i]; + constructPayload(arr); + } + } + if (pollingContinue) { + startPoll(); + } + }) + .fail(function (errorData) { + var errorData = JSON.parse(errorData.responseText); + onErrorFunction(errorData.error); + }); + }, polingInterval); + })() +} + +function stopPollingProcesses() { + + //stopping the Websocket + if (websocket != null) { + terminateWebsocketInstance = true; + websocket.onclose; + } + //stopping the HTTPS Request + pollingContinue = false; + +} + +function constructPayload(eventsArray) { + + var streamId = stream + CONSTANTS.colon + streamVersion; + var twoDimentionalArray = [eventsArray]; + onSuccessFunction(streamId, twoDimentionalArray); + +} \ No newline at end of file
