Merge branch 'release-3.0.x' of https://github.com/wso2/carbon-device-mgt-plugins into release-3.0.x

This commit is contained in:
Rasika Perera 2016-12-16 12:43:55 +05:30
commit a08e58a574
87 changed files with 4859 additions and 483 deletions

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
~
~ WSO2 Inc. 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
<artifactId>iot-analytics</artifactId>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>org.wso2.carbon.iot.das.rest.api</artifactId>
<name>WSO2 Carbon - IoT Server REST API</name>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
<executions>
<execution>
<id>generate-scr-descriptor</id>
<goals>
<goal>scr</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${project.artifactId}</Bundle-Name>
<Private-Package>
</Private-Package>
<Export-Package>
</Export-Package>
<Import-Package>
</Import-Package>
<DynamicImport-Package>*</DynamicImport-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,69 @@
<!--~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
~
~ WSO2 Inc. 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.-->
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="viewWithinAlert" >
<form role="form" style="width: auto">
<div class="form-group">
<label class="text-info">Query name</label>
<div id="viewQueryName" class="well well-sm"></div>
<label class="text-info">Area name</label>
<div id="viewAreaName" class="well well-sm"></div>
</div>
<div>
<div class="btn-group btn-group-sm btn-group-justified">
<div class="btn-group">
<a id="exportGeoJson" download="geoJson.json" href="#" onclick="exportToGeoJSON(this,JSON.stringify(map._layers[$(this).attr('leaflet_id')].toGeoJSON(),null, '\t'))" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="Export selected area as a geoJson file">Export</a>
</div>
<div class="btn-group">
<a id="hideViewFence" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="Hide this fence" onclick="map.removeLayer(map._layers[$(this).attr('leaflet_id')])" >Hide</a>
</div>
</div>
</div>
</form>
</div>
<div id="viewStationeryAlert" >
<form role="form" style="width: auto">
<div class="form-group">
<label class="text-info">Query name</label>
<div id="viewQueryName" class="well well-sm"></div>
<label class="text-info">Stationery name</label>
<div id="viewAreaName" class="well well-sm"></div>
<label class="text-info">Stationery time(Seconds)</label>
<div id="viewAreaTime" class="well well-sm"></div>
</div>
<div>
<div class="btn-group btn-group-sm btn-group-justified">
<div class="btn-group">
<a id="exportGeoJson" download="geoJson.json" href="#" onclick="exportToGeoJSON(this,JSON.stringify(map._layers[$(this).attr('leaflet_id')].toGeoJSON(),null, '\t'))" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="Export selected area as a geoJson file">Export</a>
</div>
<div class="btn-group">
<a id="hideViewFence" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="Hide this fence" onclick="map.removeLayer(map._layers[$(this).attr('leaflet_id')])" >Hide</a>
</div>
</div>
</div>
</form>
</div>
</body>
</html>

View File

@ -0,0 +1,37 @@
<%
/*
~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
~
~ WSO2 Inc. 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 DATA_SOURCE_NAME = "WSO2_GEO_DB";
var EXECUTION_PLAN_TYPE_SPEED = "Speed";
var EXECUTION_PLAN_TYPE_WITHIN = "Within";
var EXECUTION_PLAN_TYPE_PROXIMITY = "Proximity";
var EXECUTION_PLAN_TYPE_STATIONARY = "Stationery";
var EXECUTION_PLAN_TYPE_TRAFFIC = "Traffic";
var REGISTRY_PATH_FOR_ALERTS = "/_system/governance/geo/alerts/";
var GET_METHOD = "get";
var QUERY_NAME = "queryName";
var AREA_NAME = "areaName";
var CREATED_TIME = "createdTime";
var GEO_JSON = "geoJson";
var PROXIMITY_DISTANCE = "proximityDistance";
var PROXIMITY_TIME = "proximityTime";
var STATIONARY_NAME = "stationeryName";
var STATIONARY_TIME = "stationeryTime";
var FLUCTUATION_RADIUS = "fluctuationRadius";
%>

View File

@ -0,0 +1,40 @@
<%
/**
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.
*
*/
(function () {
response.contentType = 'application/json';
var action = request.getParameter("action");
var id = request.getParameter("id");
var type = request.getParameter("type");
var timeFrom = request.getParameter("timeFrom");
var timeTo = request.getParameter("timeTo");
var providerAPI = require('js/batch-provider-api.js');
if (action === 'getSchema') {
print(providerAPI.getSchema());
return;
} else if(action === 'getData'){
print(providerAPI.getData(id, type, timeFrom, timeTo));
return;
}
}());
%>

View File

@ -17,104 +17,138 @@
~ under the License. ~ under the License.
*/ */
var log = new Log(); var log = new Log();
var dataStore = require('../include/commons.jag').dataStore; var method = request.getMethod();
var verb = request.getMethod();
var resourceName = request.getParameter('name'); var resourceName = request.getParameter('name');
var webService = request.getParameter('service'); var webService = request.getParameter('service');
if(webService) { if(webService) {
response.contentType = 'application/json'; response.contentType = 'application/json';
response.characterEncoding = 'UTF-8'; response.characterEncoding = 'UTF-8';
response.content = { resource : get(resourceName) }; response.content = { resource : get(resourceName) };
} }
function get(name){ function getRegistry () {
if(name == 'within'){ var carbon = require("carbon");
try{ var server = new carbon.server.Server();
var res = dataStore.get("geo/alerts/within/"); return new carbon.registry.Registry(server, {
} system: true
catch(e){ });
log.info(e.message); }
if (method === "GET") {
var constants = require("constants.jag");
var executionPlanType = request.getParameter("executionPlanType");
var deviceId = request.getParameter("deviceId");
response.content = get(executionPlanType, deviceId);
response.contentType = "application/json";
}
function get(executionPlanType, deviceId){
var resource = null;
var fence = {};
var registry = getRegistry();
if(executionPlanType == constants.EXECUTION_PLAN_TYPE_WITHIN){
try {
resource = registry.get(constants.REGISTRY_PATH_FOR_ALERTS + constants.EXECUTION_PLAN_TYPE_WITHIN +
"/" + deviceId + "/");
} catch(e){
log.error(e.message);
return false; return false;
} }
var allFences = []; var allFences = [];
for each (var resource in res.getChildren()) { if (resource) {
var fence = {}; for each(var res in resource.content) {
try{ var childResource = registry.get(res);
fence['geoJson'] = JSON.parse(dataStore.get(resource).content.replace(/'/g, '"')); var properties = registry.properties(res);
fence['queryName'] = dataStore.get(resource).getProperty('queryName'); fence = {};
fence['areaName'] = dataStore.get(resource).getProperty('areaName'); try {
fence['createdTime'] = dataStore.get(resource).createdTime.toString(); fence[constants.GEO_JSON] = JSON.parse(childResource.content);
allFences.push(fence); fence[constants.QUERY_NAME] = properties[constants.QUERY_NAME][0];
} fence[constants.AREA_NAME] = properties[constants.AREA_NAME][0];
catch(e){ fence[constants.CREATED_TIME] = childResource.created.time.toString();
log.info("Error: "+e+'\n'); allFences.push(fence);
}
catch (e) {
log.error("Error: " + e + '\n');
}
} }
} }
return allFences; return allFences;
} else if(name == 'speed'){ } else if(executionPlanType == constants.EXECUTION_PLAN_TYPE_SPEED){
var resource;
try{ try{
resource = dataStore.get(name+'.json'); resource = registry.get(constants.REGISTRY_PATH_FOR_ALERTS + constants
}catch(e){ .EXECUTION_PLAN_TYPE_SPEED + "/" + deviceId );
} catch(e){
resource = {'content': false}; resource = {'content': false};
} }
log.info("DEBUG:***** name = "+name); if (log.isDebugEnabled()) {
log.info("DEBUG:***** resource.content = "+resource.content); log.info("DEBUG:***** name = " + executionPlanType);
log.info("DEBUG:***** resource.content = " + resource.content);
}
return JSON.parse(resource.content); return JSON.parse(resource.content);
} else if(name == 'proximity'){ } else if(executionPlanType == constants.EXECUTION_PLAN_TYPE_PROXIMITY){
var result; var result;
try{ try{
var resource = dataStore.get("/geo/alerts/proximity/proximity.json"); resource = registry.properties(constants.REGISTRY_PATH_FOR_ALERTS + constants.EXECUTION_PLAN_TYPE_PROXIMITY +
result={proximityDistance: resource.getProperty("proximityDistance"), proximityTime: resource.getProperty("proximityTime")}; "/" + deviceId);
result = {
proximityDistance: resource[constants.PROXIMITY_DISTANCE],
proximityTime: resource[constants.PROXIMITY_TIME]
};
}catch(e){ }catch(e){
result = {'content': false}; result = {'content': false};
} }
return result; return result;
} else if(name == 'stationery'){ } else if(executionPlanType == constants.EXECUTION_PLAN_TYPE_STATIONARY){
var res;
try{ try{
res = dataStore.get("geo/alerts/stationery/"); resource = registry.get(constants.REGISTRY_PATH_FOR_ALERTS + constants.EXECUTION_PLAN_TYPE_STATIONARY +
"/" + deviceId);
} }
catch(e){ catch(e){
log.info(e.message); log.info(e.message);
return false; return false;
} }
var allFences = []; var allFences = [];
for each (var resource in res.getChildren()) {
var fence = {}; if (resource) {
try{ for each(var res in resource.content) {
fence['geoJson'] = JSON.parse(dataStore.get(resource).content.replace(/'/g, '"')); var fence = {};
fence['queryName'] = dataStore.get(resource).getProperty('queryName'); var childResource = registry.get(res);
fence['areaName'] = dataStore.get(resource).getProperty('stationeryName'); var properties = registry.properties(res);
fence['stationeryTime'] = dataStore.get(resource).getProperty('stationeryTime'); try {
fence['fluctuationRadius'] = dataStore.get(resource).getProperty('fluctuationRadius'); fence[constants.GEO_JSON] = JSON.parse(childResource.content);
fence['createdTime'] = dataStore.get(resource).createdTime.toString(); fence[constants.QUERY_NAME] = properties[constants.QUERY_NAME][0];
allFences.push(fence); fence[constants.AREA_NAME] = properties[constants.STATIONARY_NAME][0];
} fence[constants.STATIONARY_TIME] = properties[constants.STATIONARY_TIME][0];
catch(e){ fence[constants.FLUCTUATION_RADIUS] = properties[constants.FLUCTUATION_RADIUS][0];
log.info("Error: "+e+'\n'); fence[constants.CREATED_TIME] = childResource.created.time.toString();
allFences.push(fence);
} catch (e) {
log.error("Error: " + e + '\n');
}
} }
} }
return allFences; return allFences;
} else if( name == 'traffic'){ } else if( executionPlanType == constants.EXECUTION_PLAN_TYPE_TRAFFIC){
try{ try{
var res = dataStore.get("geo/alerts/traffic/"); resource = registry.get(constants.REGISTRY_PATH_FOR_ALERTS + constants.EXECUTION_PLAN_TYPE_TRAFFIC +
"/" + deviceId + "/");
} }
catch(e){ catch(e){
log.info(e.message); log.info(e.message);
return false; return false;
} }
var allFences = []; var allFences = [];
for each (var resource in res.getChildren()) { for each (var res in resource.content) {
var fence = {}; var fence = {};
var childResource = registry.get(res);
var properties = registry.properties(res);
try{ try{
fence['geoJson'] = JSON.parse(dataStore.get(resource).content.replace(/'/g, '"')); fence[constants.GEO_JSON] = JSON.parse(childResource.content);
fence['queryName'] = dataStore.get(resource).getProperty('queryName'); fence[constants.QUERY_NAME] = properties[constants.QUERY_NAME][0];
fence['areaName'] = dataStore.get(resource).getProperty('areaName'); fence[constants.AREA_NAME] = properties[constants.AREA_NAME][0];
fence['createdTime'] = dataStore.get(resource).createdTime.toString(); fence[constants.CREATED.TIME] = childResource.created.time.toString();
allFences.push(fence); allFences.push(fence);
} }
catch(e){ catch(e){
@ -123,7 +157,6 @@ function get(name){
} }
return allFences; return allFences;
} }
} }
%> %>

View File

@ -17,14 +17,11 @@
~ under the License. ~ under the License.
*/ */
var db = require("../include/database.jag"); var constants = require("constants.jag");
var configuration = require('../conf/database.json'); var db = new Database(constants.DATA_SOURCE_NAME);
var log = new Log(); var log = new Log();
var db = new Database("jdbc:h2:repository/database/WSO2_GEO",configuration.username,configuration.password);
var objectId = request.getParameter("objectId"); var objectId = request.getParameter("objectId");
var getHistory = "SELECT * FROM alerts_history WHERE id = \'" + objectId + "\' ORDER BY timeStamp DESC LIMIT 50";
var getHistory = "SELECT * FROM alerts_history WHERE id = \'"+objectId+"\' ORDER BY timeStamp DESC LIMIT 50";
try{ try{
var history = db.query(getHistory); var history = db.query(getHistory);
@ -38,5 +35,4 @@ catch(e){
finally{ finally{
db.close(); db.close();
} }
%> %>

View File

@ -0,0 +1,150 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed 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 getConfig, validate, getMode, getSchema, getData, registerCallBackforPush;
(function () {
var PROVIDERS_LOCATION = '/extensions/providers/';
var PROVIDER_NAME = 'batch';
var TYPE = "type";
var TABLE_NAME = "tableName";
var HTTPS_TRANSPORT = "https";
var CONTENT_TYPE_JSON = "application/json";
var AUTHORIZATION_HEADER = "Authorization";
var USER_TOKEN = "user";
var TENANT_DOMAIN = "domain";
var CONST_AT = "@";
var USERNAME = "username";
var HTTP_USER_NOT_AUTHENTICATED = 403;
var JS_MAX_VALUE = "9007199254740992";
var JS_MIN_VALUE = "-9007199254740992";
var tableName = "ORG_WSO2_GEO_FUSEDSPATIALEVENT";
var typeMap = {
"bool": "string",
"boolean": "string",
"string": "string",
"int": "number",
"integer": "number",
"long": "number",
"double": "number",
"float": "number",
"time": "time"
};
var log = new Log();
var carbon = require('carbon');
var configs = require('/configs/designer.json');
var utils = require('/modules/utils.js');
var JSUtils = Packages.org.wso2.carbon.analytics.jsservice.Utils;
var AnalyticsCachedJSServiceConnector = Packages.org.wso2.carbon.analytics.jsservice.AnalyticsCachedJSServiceConnector;
var AnalyticsCache = Packages.org.wso2.carbon.analytics.jsservice.AnalyticsCachedJSServiceConnector.AnalyticsCache;
var cacheTimeoutSeconds = 5;
var loggedInUser = null;
if (configs.cacheTimeoutSeconds) {
cacheTimeoutSeconds = parseInt(configs.cacheTimeoutSeconds);
}
var cacheSizeBytes = 1024 * 1024 * 1024; // 1GB
if (configs.cacheSizeBytes) {
cacheSizeBytes = parseInt(configs.cacheSizeBytes);
}
response.contentType = CONTENT_TYPE_JSON;
var authParam = request.getHeader(AUTHORIZATION_HEADER);
if (authParam != null) {
credentials = JSUtils.authenticate(authParam);
loggedInUser = credentials[0];
} else {
var token = session.get(USER_TOKEN);
if (token != null) {
loggedInUser = token[USERNAME] + CONST_AT + token[TENANT_DOMAIN];
} else {
log.error("user is not authenticated!");
response.status = HTTP_USER_NOT_AUTHENTICATED;
print('{ "status": "Failed", "message": "User is not authenticated." }');
return;
}
}
var cache = application.get("AnalyticsWebServiceCache");
if (cache == null) {
cache = new AnalyticsCache(cacheTimeoutSeconds, cacheSizeBytes);
application.put("AnalyticsWebServiceCache", cache);
}
var connector = new AnalyticsCachedJSServiceConnector(cache);
/**
* returns an array of column names & types
* @param providerConfig
*/
getSchema = function () {
var schema = [];
var result = connector.getTableSchema(loggedInUser, tableName).getMessage();
result = JSON.parse(result);
var columns = result.columns;
Object.getOwnPropertyNames(columns).forEach(function (name, idx, array) {
var type = "ordinal";
if (columns[name]['type']) {
type = columns[name]['type'];
}
schema.push({
fieldName: name,
fieldType: typeMap[type.toLowerCase()]
});
});
// log.info(schema);
return schema;
};
/**
* returns the actual data
* @param providerConfig
* @param limit
*/
getData = function (deviceId, deviceType, fromTime, toTime) {
var luceneQuery = "timeStamp:[" + fromTime + " TO " + toTime + "]";
var limit = 100;
var result;
//if there's a filter present, we should perform a Lucene search instead of reading the table
if (luceneQuery) {
luceneQuery = 'id:"' + deviceId + '" AND type:"' + deviceType + '" AND ' + luceneQuery;
var filter = {
"query": luceneQuery,
"start": 0,
"count": limit
};
result = connector.search(loggedInUser, tableName, stringify(filter)).getMessage();
} else {
var from = JS_MIN_VALUE;
var to = JS_MAX_VALUE;
result = connector.getRecordsByRange(loggedInUser, tableName, from, to, 0, limit, null).getMessage();
}
result = JSON.parse(result);
var data = [];
for (var i = 0; i < result.length; i++) {
var values = result[i].values;
data.push(values);
}
return data;
};
}());

View File

@ -48,9 +48,6 @@
} }
</style> </style>
</head> </head>
<%
var get = require('../get_alerts.jag').get;
%>
<body> <body>
<div class="modal-header" <div class="modal-header"
style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);"> style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);">
@ -67,12 +64,12 @@ var get = require('../get_alerts.jag').get;
<div class="col-md-10 col-md-offset-1"> <div class="col-md-10 col-md-offset-1">
<form class="form-inline" role="form"> <form class="form-inline" role="form">
<div class="input-group input-group-sm"> <div class="input-group input-group-sm">
<input type="text" id="proximityDistance" class="form-control" placeholder="Distance" value="<%= get('proximity').proximityDistance %>"> <input type="text" id="proximityDistance" class="form-control" placeholder="Distance" >
<span class="input-group-addon">m</span> <span class="input-group-addon">m</span>
</div> </div>
<div class="input-group input-group-sm"> <div class="input-group input-group-sm">
<input autofocus="enable" id="proximityTime" type="number" class="form-control" <input autofocus="enable" id="proximityTime" type="number" class="form-control"
placeholder="Close time in S" value="<%= get('proximity').proximityTime %>"> placeholder="Close time in S" >
<span class="input-group-addon">Seconds</span> <span class="input-group-addon">Seconds</span>
</div> </div>
</form> </form>

View File

@ -21,11 +21,6 @@
<title></title> <title></title>
</head> </head>
<body> <body>
<%
var log = new Log();
var get = require('../get_alerts.jag').get;
%>
<div class="modal-header" style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);"> <div class="modal-header" style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);">
<button class="close" type="button" data-dismiss="modal" aria-hidden="true">&times;</button> <button class="close" type="button" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title"> <h4 class="modal-title">
@ -38,7 +33,7 @@ var get = require('../get_alerts.jag').get;
<div class="col-md-6 col-md-offset-3"> <div class="col-md-6 col-md-offset-3">
<div class="input-group input-group-sm"> <div class="input-group input-group-sm">
<input autofocus="enable" id="speedAlertValue" type="number" class="form-control" <input autofocus="enable" id="speedAlertValue" type="number" class="form-control"
placeholder="Speed alert value " value="<%= get('speed').speedLimit %>"> placeholder="Speed alert value " >
<span class="input-group-addon">km/h</span> <span class="input-group-addon">km/h</span>
</div> </div>
</div> </div>
@ -48,5 +43,6 @@ var get = require('../get_alerts.jag').get;
</div> </div>
</div> </div>
</div> </div>
<script src="/portal/store/carbon.super/fs/gadget/geo-dashboard/js/geo_speed.js"></script>
</body> </body>
</html> </html>

View File

@ -24,18 +24,10 @@
</style> </style>
<script> <script>
$(".removeGeoFence").tooltip();
$('.viewGeoFenceRow td:not(:last-child)').click(function () {
viewFence(this.parentElement,'Stationery');
});
</script> </script>
</head> </head>
<body> <body>
<%
var get = require('../get_alerts.jag').get;
%>
<div class="modal-header" style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);"> <div class="modal-header" style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);">
<button class="close" type="button" data-dismiss="modal" aria-hidden="true">&times;</button> <button class="close" type="button" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title"> <h4 class="modal-title">
@ -47,7 +39,7 @@ var get = require('../get_alerts.jag').get;
<div class="row"> <div class="row">
<p class="text-info text-center">View current fences</p> <p class="text-info text-center">View current fences</p>
<div class=""> <div class="">
<table class="table table-hover"> <table class="table table-hover" id = "stationary-alert-table">
<thead> <thead>
<tr > <tr >
<th>Stationery Name</th> <th>Stationery Name</th>
@ -59,32 +51,9 @@ var get = require('../get_alerts.jag').get;
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<% <div class="alert alert-danger fence-not-exist" role="alert">
var alerts = get('stationery'); <strong>Oh snap!</strong> Can't find any geo-fence areas,please draw a new area or try again.
</div>
if(alerts){
for each(var alert in alerts){
%>
<tr class="viewGeoFenceRow" style="cursor: pointer" data-stationeryTime='<%= alert
.stationeryTime %>' data-fluctuationRadius='<%= alert.fluctuationRadius %>' data-areaName='<%= alert.areaName %>' data-queryName='<%= alert.queryName %>' data-geoJson='<%= alert.geoJson %>'>
<td><%= alert.areaName %></td>
<td><%= alert.stationeryTime %></td>
<td><%= alert.fluctuationRadius %>
<td><%= alert.queryName %></td>
<td><%= alert.createdTime %></td>
<td onClick="removeGeoFence(this.parentElement,'Stationery')" class="removeGeoFence" data-toggle="tooltip" title="Remove fence" ><i class="fa fa-trash-o"></i></td>
</tr>
<%
}
} else{
%>
<div class="alert alert-danger" role="alert">
<strong>Oh snap!</strong> Can't find any geo-fence areas,please draw a new area or try again.
</div>
<%
}
%>
</tbody> </tbody>
</table> </table>
</div> </div>
@ -101,5 +70,6 @@ var get = require('../get_alerts.jag').get;
</div> </div>
</div> </div>
</div> </div>
<script src="/portal/store/carbon.super/fs/gadget/geo-dashboard/js/geo_stationary.js"></script>
</body> </body>
</html> </html>

View File

@ -33,9 +33,6 @@
</script> </script>
</head> </head>
<body> <body>
<%
var get = require('../get_alerts.jag').get;
%>
<div class="modal-header" style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);"> <div class="modal-header" style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);">
<button class="close" type="button" data-dismiss="modal" aria-hidden="true">&times;</button> <button class="close" type="button" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title"> <h4 class="modal-title">

View File

@ -22,20 +22,8 @@
<style> <style>
.fa-trash-o:hover{color:red;} .fa-trash-o:hover{color:red;}
</style> </style>
<script>
$(".removeGeoFence").tooltip();
$('.viewGeoFenceRow td:not(:last-child)').click(function () {
viewFence(this.parentElement,'WithIn');
});
</script>
</head> </head>
<body> <body>
<%
var get = require('../get_alerts.jag').get;
%>
<div class="modal-header" style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);"> <div class="modal-header" style="cursor: move;background: #f9f9f9;-webkit-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);-moz-box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);box-shadow: inset 0px 0px 14px 1px rgba(0,0,0,0.2);">
<button class="close" type="button" data-dismiss="modal" aria-hidden="true">&times;</button> <button class="close" type="button" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title"> <h4 class="modal-title">
@ -45,9 +33,9 @@ var get = require('../get_alerts.jag').get;
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<p class="text-info text-center">View current fences</p> <p class="text-info text-center fence-not-exist">View current fences</p>
<div class=""> <div class="">
<table class="table table-hover"> <table class="table table-hover" id ="within-alert">
<thead> <thead>
<tr > <tr >
<th>Fence Name</th> <th>Fence Name</th>
@ -57,29 +45,10 @@ var get = require('../get_alerts.jag').get;
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<div class="alert alert-danger fence-not-exist" role="alert">
<%
var alerts = get('within');
if(alerts){
for each(var alert in alerts){
%>
<tr class="viewGeoFenceRow" style="cursor: pointer" data-areaName='<%= alert.areaName %>' data-queryName='<%= alert.queryName %>' data-geoJson='<%= alert.geoJson %>'>
<td><%= alert.areaName %></td>
<td><%= alert.queryName %></td>
<td><%= alert.createdTime %></td>
<td onClick="removeGeoFence(this.parentElement,'WithIn')" class="removeGeoFence" data-toggle="tooltip" title="Remove fence" ><i class="fa fa-trash-o"></i></td>
</tr>
<%
}
}
else{
%>
<div class="alert alert-danger" role="alert">
<strong>Oh snap!</strong> Can't find any geo-fence areas,please draw a new area or try again. <strong>Oh snap!</strong> Can't find any geo-fence areas,please draw a new area or try again.
</div> </div>
<%
}
%>
</tbody> </tbody>
</table> </table>
</div> </div>
@ -96,5 +65,6 @@ var get = require('../get_alerts.jag').get;
</div> </div>
</div> </div>
</div> </div>
<script src="/portal/store/carbon.super/fs/gadget/geo-dashboard/js/geo_within.js"></script>
</body> </body>
</html> </html>

View File

@ -31,8 +31,6 @@ var eventProcessorOption = eventsProcessorServiceClient.getOptions();
eventProcessorOption.setManageSession(true); eventProcessorOption.setManageSession(true);
eventProcessorOption.setProperty(HTTPConstants.COOKIE_STRING, session.get('authToken')); eventProcessorOption.setProperty(HTTPConstants.COOKIE_STRING, session.get('authToken'));
var cepInfo = require('../include/commons.jag').cepInfo;
var removeAlert = require('../include/store_alerts.jag').remove; var removeAlert = require('../include/store_alerts.jag').remove;
var ws = require('ws'); var ws = require('ws');
var process = require("process"), host = process.getProperty('server.host'), var process = require("process"), host = process.getProperty('server.host'),

View File

@ -32,8 +32,6 @@ var eventsProcessorServiceClient = eventprocessorStub._getServiceClient();
var eventProcessorOption = eventsProcessorServiceClient.getOptions(); var eventProcessorOption = eventsProcessorServiceClient.getOptions();
eventProcessorOption.setManageSession(true); eventProcessorOption.setManageSession(true);
eventProcessorOption.setProperty(HTTPConstants.COOKIE_STRING, session.get('authToken')); eventProcessorOption.setProperty(HTTPConstants.COOKIE_STRING, session.get('authToken'));
var escapeSiddhiql = require('../include/commons.jag').escapeSiddhiql;
var storeAlerts = require('../include/store_alerts.jag').store; // TODO: change to js var storeAlerts = require('../include/store_alerts.jag').store; // TODO: change to js
var ws = require('ws'); var ws = require('ws');
var process = require("process"), host = process.getProperty('server.host'), var process = require("process"), host = process.getProperty('server.host'),
@ -90,7 +88,7 @@ if (verb == "POST") {
} else if (executionPlan == 'Traffic') { } else if (executionPlan == 'Traffic') {
var resourceContents = parseDataJson.geoFenceGeoJSON; var resourceContents = parseDataJson.geoFenceGeoJSON;
} }
storeAlerts(parseKey, resourceContents, executionPlan, optionalArgs, deviceId); storeAlerts(resourceContents, executionPlan, optionalArgs, deviceId);
var payload; var payload;
if (cepAction == "edit") { if (cepAction == "edit") {

View File

@ -21,11 +21,11 @@
* Get all available tile servers from RDB via HTTP GET, Insert new tile servers information via HTTP POST request * Get all available tile servers from RDB via HTTP GET, Insert new tile servers information via HTTP POST request
*/ */
var configuration = require('../conf/database.json'); var constants = require("constants.jag");
var db = new Database(constants.DATA_SOURCE_NAME);
var log = new Log(); var log = new Log();
//Sample create table query create table tileServers (serverId int NOT NULL AUTO_INCREMENT, url varchar(255) NOT NULL, name varchar(255), PRIMARY KEY (serverID)); //Sample create table query create table tileServers (serverId int NOT NULL AUTO_INCREMENT, url varchar(255) NOT NULL, name varchar(255), PRIMARY KEY (serverID));
var tableName = "tileservers"; var tableName = "tileservers";
var db = new Database("jdbc:h2:repository/database/WSO2_GEO",configuration.username,configuration.password);
if(request.getMethod() == "GET"){ if(request.getMethod() == "GET"){
@ -46,7 +46,9 @@ if(request.getMethod() == "GET"){
var getAllTileServers = "select * from tileServers"; var getAllTileServers = "select * from tileServers";
try{ try{
var allTileServers = db.query(getAllTileServers); var allTileServers = db.query(getAllTileServers);
log.info(allTileServers); if (log.isDebugEnabled) {
log.debug(allTileServers);
}
response.contentType = "application/json"; response.contentType = "application/json";
response.characterEncoding = "UTF-8"; response.characterEncoding = "UTF-8";
response.content = allTileServers; response.content = allTileServers;
@ -73,8 +75,9 @@ else if(request.getMethod() == "POST"){
var insertTileServer ="INSERT INTO tileServers (url, name, subdomains, attribution, maxzoom) VALUES('"+ url +"', '"+ name +"', '"+ subdomains +"', '"+ attribution +"', '"+ maxzoom +"' );"; var insertTileServer ="INSERT INTO tileServers (url, name, subdomains, attribution, maxzoom) VALUES('"+ url +"', '"+ name +"', '"+ subdomains +"', '"+ attribution +"', '"+ maxzoom +"' );";
try{ try{
db.query(insertTileServer); db.query(insertTileServer);
log.info(name + ' tile server added successfully!'); if (log.isDebugEnabled()) {
print(name + ' tile server added successfully!'); log.debug(name + ' tile server added successfully!');
}
} }
catch(e){ catch(e){
log.error(e.toString()); log.error(e.toString());

View File

@ -21,11 +21,10 @@
* Get all available tile servers from RDB via HTTP GET, Insert new tile servers information via HTTP POST request * Get all available tile servers from RDB via HTTP GET, Insert new tile servers information via HTTP POST request
*/ */
var configuration = require('../conf/database.json'); var constants = require("constants.jag");
var db = new Database(constants.DATA_SOURCE_NAME);
var log = new Log(); var log = new Log();
var tableName = "webMapService"; var tableName = "webMapService";
var db = new Database("jdbc:h2:repository/database/WSO2_GEO",configuration.username,configuration.password);
if(request.getMethod() == "GET"){ if(request.getMethod() == "GET"){
@ -47,7 +46,9 @@ if(request.getMethod() == "GET"){
var getAllWmsEndPoints = "select * from webMapService"; var getAllWmsEndPoints = "select * from webMapService";
try{ try{
var allWmsEndPoints = db.query(getAllWmsEndPoints); var allWmsEndPoints = db.query(getAllWmsEndPoints);
log.info(allWmsEndPoints); if (log.isDebugEnabled()) {
log.debug(allWmsEndPoints);
}
response.contentType = "application/json"; response.contentType = "application/json";
response.characterEncoding = "UTF-8"; response.characterEncoding = "UTF-8";
response.content = allWmsEndPoints; response.content = allWmsEndPoints;
@ -74,8 +75,9 @@ else if(request.getMethod() == "POST"){
var insertWmsEndPoint ="INSERT INTO webMapService (serviceUrl, name, layers, version, format) VALUES('"+ serviceEndPoint +"', '"+ serviceName +"', '"+ layers +"', '"+ wmsVersion +"', '"+ outputFormat +"' );"; var insertWmsEndPoint ="INSERT INTO webMapService (serviceUrl, name, layers, version, format) VALUES('"+ serviceEndPoint +"', '"+ serviceName +"', '"+ layers +"', '"+ wmsVersion +"', '"+ outputFormat +"' );";
try{ try{
db.query(insertWmsEndPoint); db.query(insertWmsEndPoint);
log.info(serviceName + ' wms service added successfully!'); if (log.isDebugEnabled()) {
print(serviceName + 'added successfully!'); log.info(serviceName + ' wms service added successfully!');
}
} }
catch(e){ catch(e){
log.error(e.toString()); log.error(e.toString());
@ -102,7 +104,6 @@ function logToFile(message){
message = file.write(message); message = file.write(message);
file.close(); file.close();
} }
%> %>

View File

@ -0,0 +1,27 @@
.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
.ui-timepicker-div dl { text-align: left; }
.ui-timepicker-div dl dt { float: left; clear:left; padding: 0 0 0 5px; }
.ui-timepicker-div dl dd { margin: 0 10px 10px 40%; }
.ui-timepicker-div td { font-size: 90%; }
.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
.ui-timepicker-div .ui_tpicker_unit_hide{ display: none; }
.ui-timepicker-rtl{ direction: rtl; }
.ui-timepicker-rtl dl { text-align: right; padding: 0 5px 0 0; }
.ui-timepicker-rtl dl dt{ float: right; clear: right; }
.ui-timepicker-rtl dl dd { margin: 0 40% 10px 10px; }
/* Shortened version style */
.ui-timepicker-div.ui-timepicker-oneLine { padding-right: 2px; }
.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time,
.ui-timepicker-div.ui-timepicker-oneLine dt { display: none; }
.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label { display: block; padding-top: 2px; }
.ui-timepicker-div.ui-timepicker-oneLine dl { text-align: right; }
.ui-timepicker-div.ui-timepicker-oneLine dl dd,
.ui-timepicker-div.ui-timepicker-oneLine dl dd > div { display:inline-block; margin:0; }
.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before,
.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before { content:':'; display:inline-block; }
.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before,
.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before { content:'.'; display:inline-block; }
.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide,
.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{ display: none; }

View File

@ -0,0 +1,5 @@
/*! jQuery Timepicker Addon - v1.5.3 - 2015-04-19
* http://trentrichardson.com/examples/timepicker
* Copyright (c) 2015 Trent Richardson; Licensed MIT */
.ui-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-timepicker-div dl{text-align:left}.ui-timepicker-div dl dt{float:left;clear:left;padding:0 0 0 5px}.ui-timepicker-div dl dd{margin:0 10px 10px 40%}.ui-timepicker-div td{font-size:90%}.ui-tpicker-grid-label{background:0 0;border:0;margin:0;padding:0}.ui-timepicker-div .ui_tpicker_unit_hide{display:none}.ui-timepicker-rtl{direction:rtl}.ui-timepicker-rtl dl{text-align:right;padding:0 5px 0 0}.ui-timepicker-rtl dl dt{float:right;clear:right}.ui-timepicker-rtl dl dd{margin:0 40% 10px 10px}.ui-timepicker-div.ui-timepicker-oneLine{padding-right:2px}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time,.ui-timepicker-div.ui-timepicker-oneLine dt{display:none}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label{display:block;padding-top:2px}.ui-timepicker-div.ui-timepicker-oneLine dl{text-align:right}.ui-timepicker-div.ui-timepicker-oneLine dl dd,.ui-timepicker-div.ui-timepicker-oneLine dl dd>div{display:inline-block;margin:0}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before{content:':';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before{content:'.';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide,.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{display:none}

View File

@ -79,3 +79,9 @@
box-shadow: 0 5px 15px rgba(0,0,0,.5); box-shadow: 0 5px 15px rgba(0,0,0,.5);
} }
.ui-dialog .ui-dialog-title {
word-break: keep-all !important;
word-wrap: normal !important;
white-space: normal !important;
}

View File

@ -17,7 +17,7 @@
*/ */
/*html, body {*/ /*html, body {*/
/*height: 100%;*/ /*height: 100%;*/
/*}*/ /*}*/
#map { #map {
@ -31,4 +31,4 @@
.leaflet-control-attribution.leaflet-control { .leaflet-control-attribution.leaflet-control {
font-size: 8px; font-size: 8px;
} }

View File

@ -28,12 +28,4 @@ var escapeSiddhiql = function (s) {
return XML_CHAR_MAP[ch]; return XML_CHAR_MAP[ch];
}); });
}; };
var cepInfo = function () {
var configuration = require("../conf/cep_info.json");
return configuration;
};
// TODO: move to new datastore api
var dataStore = new MetadataStore("admin", "admin");
%> %>

View File

@ -1,20 +0,0 @@
<%
/*
~ Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
~
~ WSO2 Inc. 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 configuration = require('../conf/database.json');
%>

View File

@ -18,133 +18,148 @@
*/ */
// TODO: change the name of this jaggery file even thoe it says 'store_alerts' it is actually removing the alerts from the data store as well o.O wired // TODO: change the name of this jaggery file even thoe it says 'store_alerts' it is actually removing the alerts from the data store as well o.O wired
var dataStore = require('../include/commons.jag').dataStore;
var log = new Log(); var log = new Log();
var deviceIdSeperator = "---"; var constants = require("../controllers/constants.jag");
function store(parameterKeyName, resourceContents, executionPlan, optional, deviceId) { var getRegistry = function() {
log.info("DEBUG:*** resourceContents:" + resourceContents); var carbon = require("carbon");
if (executionPlan == "Speed") { var server = new carbon.server.Server();
var currentLimit; return new carbon.registry.Registry(server, {
var speedFile = "speed" + deviceIdSeperator + ".json"; system: true
try { });
currentLimit = dataStore.get(speedFile); };
/**
* Get the registry path to save the alert
* @param {String} alert_type Type of the alert
* @param {String} id Id of the device
* @param {String} optional /optional identity
* @return {String} Registry Path to save teh alert
* */
var registryPath = function (alert_type, id, optional) {
if (alert_type && id ) {
if (alert_type === constants.EXECUTION_PLAN_TYPE_SPEED || alert_type === constants
.EXECUTION_PLAN_TYPE_PROXIMITY) {
return constants.REGISTRY_PATH_FOR_ALERTS + alert_type + "/" + id;
} else {
return constants.REGISTRY_PATH_FOR_ALERTS + alert_type + "/" + id + "/" + optional;
} }
catch (e) { } else {
log.info("DEBUG:*** Catch error:" + e.message); throw "Alert type and ID are mandatory field to generate the relevant registry path";
currentLimit = dataStore.newResource();
currentLimit.mediaType = 'application/json';
currentLimit.description = "User define speed limit for display alerts.";
}
currentLimit.content = String('{"speedLimit": ' + resourceContents + '}');
dataStore.put(speedFile, currentLimit);
log.info("DEBUG:*** Current speed limit set to:" + currentLimit.content);
} }
else if (executionPlan == "Within") { };
try {
var res = dataStore.get("geo/alerts/within");
}
catch (e) {
var geo = dataStore.newCollection();
var alerts = dataStore.newCollection();
var within = dataStore.newCollection();
dataStore.put("geo", geo);
dataStore.put("alerts", alerts);
dataStore.put("within", within);
}
log.info("DEBUG:****** resourceContents = " + String('{"geoJson": ' + resourceContents + '}'));
var resource = dataStore.newResource();
resource.addProperty("queryName", optional.queryName);
resource.addProperty("areaName", optional.customName);
resource.mediaType = 'application/json';
resource.content = String(resourceContents);
dataStore.put(String("geo/alerts/within/" + optional.queryName + deviceIdSeperator + deviceId + ".json"), resource);
} else if (executionPlan == "Proximity") {
try {
var res = dataStore.get("geo/alerts/proximity");
}
catch (e) {
var geo = dataStore.newCollection();
var alerts = dataStore.newCollection();
var proximity = dataStore.newCollection();
dataStore.put("geo", geo);
dataStore.put("alerts", alerts);
dataStore.put("proximity", proximity);
}
log.info("DEBUG:****** resourceContents = " + resourceContents);
var resource = dataStore.newResource();
resource.addProperty("proximityDistance", resourceContents.proximityDistance);
resource.addProperty("proximityTime", resourceContents.proximityTime);
dataStore.put(String("geo/alerts/proximity/" + optional.executionPlan + deviceIdSeperator + deviceId + ".json"), resource);
} else if (executionPlan == "Stationery") {
try {
var res = dataStore.get("geo/alerts/stationery");
}
catch (e) {
var geo = dataStore.newCollection();
var alerts = dataStore.newCollection();
var stationery = dataStore.newCollection();
dataStore.put("geo", geo);
dataStore.put("alerts", alerts);
dataStore.put("stationery", stationery);
}
log.info("DEBUG:****** resourceContents = " + resourceContents.geoFenceGeoJSON);
var resource = dataStore.newResource();
resource.addProperty("queryName", optional.queryName);
resource.addProperty("stationeryName", optional.customName);
resource.addProperty("stationeryTime", resourceContents.stationeryTime);
resource.addProperty("fluctuationRadius", resourceContents.fluctuationRadius);
resource.content = String(resourceContents.geoFenceGeoJSON);
dataStore.put(String("geo/alerts/stationery/" + optional.queryName + deviceIdSeperator + deviceId + ".json"), resource);
} else if (executionPlan == "Traffic") {
try {
var res = dataStore.get("geo/alerts/traffic");
}
catch (e) {
var geo = dataStore.newCollection();
var alerts = dataStore.newCollection();
var traffic = dataStore.newCollection();
dataStore.put("geo", geo);
dataStore.put("alerts", alerts);
dataStore.put("traffic", traffic);
}
log.info("DEBUG:****** resourceContents = " + resourceContents.geoFenceGeoJSON);
var resource = dataStore.newResource();
resource.addProperty("queryName", optional.queryName);
resource.addProperty("areaName", optional.customName);
resource.content = String(resourceContents);
dataStore.put(String("geo/alerts/traffic/" + optional.queryName + deviceIdSeperator + deviceId + ".json"), resource);
/**
* To store the alerts for visualizing purposes
* @param resourceContents Value that need to saved
* @param executionPlan Type of the execution plan
* @param optional Optional parameters that are only specific to particular device types
* @param deviceId Id of the device
*/
function store(resourceContents, executionPlan, optional, deviceId) {
var registry = getRegistry();
var pathToAddAlert = "";
if (log.isDebugEnabled()) {
log.debug("DEBUG:*** resourceContents:" + resourceContents);
}
if (executionPlan === constants.EXECUTION_PLAN_TYPE_SPEED) {
pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_SPEED, deviceId);
registry.put(pathToAddAlert, {
content: '{"speedLimit": ' + resourceContents + '}',
mediaType: 'application/json'
});
if (log.isDebugEnabled()) {
log.debug("DEBUG:*** Current speed limit set to:" + currentLimit.content);
}
}
else if (executionPlan === constants.EXECUTION_PLAN_TYPE_WITHIN) {
pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_WITHIN, deviceId, optional.queryName);
if (log.isDebugEnabled()) {
log.debug("DEBUG:****** resourceContents = " + String('{"geoJson": ' + resourceContents + '}'));
}
registry.put(pathToAddAlert, {
content: JSON.stringify(resourceContents),
mediaType: 'application/json',
properties : {
"queryName" : optional.queryName,
"areaName" : optional.customName
}
});
} else if (executionPlan === constants.EXECUTION_PLAN_TYPE_PROXIMITY) {
pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_PROXIMITY, deviceId);
if (log.isDebugEnabled()) {
log.debug("DEBUG:****** resourceContents = " + resourceContents);
}
registry.put(pathToAddAlert, {
content: "",
mediaType: 'application/json'
});
registry.addProperty(pathToAddAlert, "proximityDistance", resourceContents.proximityDistance);
registry.addProperty(pathToAddAlert, "proximityTime", resourceContents.proximityTime);
} else if (executionPlan === constants.EXECUTION_PLAN_TYPE_STATIONARY) {
pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_STATIONARY, deviceId, optional.queryName);
if (log.isDebugEnabled()) {
log.debug("DEBUG:****** resourceContents = " + resourceContents);
}
var registryResource = {
content: JSON.stringify(resourceContents.geoFenceGeoJSON),
mediaType: 'application/json',
properties: {
"queryName" : optional.queryName,
"stationeryName" : optional.customName,
"stationeryTime" : resourceContents.stationeryTime,
"fluctuationRadius" : resourceContents.fluctuationRadius
}
};
registry.put(pathToAddAlert, registryResource);
} else if (executionPlan === constants.EXECUTION_PLAN_TYPE_TRAFFIC) {
pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_TRAFFIC, deviceId, optional.queryName);
if (log.isDebugEnabled()) {
log.debug("DEBUG:****** resourceContents = " + resourceContents.geoFenceGeoJSON);
}
var registryResource = {
content: JSON.stringify(resourceContents),
mediaType: 'application/json',
properties: {
"queryName" : optional.queryName,
"stationeryName" : optional.customName,
"stationeryTime" : resourceContents.stationeryTime,
"fluctuationRadius" : resourceContents.fluctuationRadius
}
};
registry.put(pathToAddAlert, {
content: JSON.stringify(resourceContents),
mediaType: 'application/json',
properties: {
"queryName" : optional.queryName,
"areaName" : optional.customName
}
});
} }
} }
function remove(queryName, id, deviceId) { /**
* To remove the registry resource
* @param queryName Name of the query that need to be removed
* @param executionPlanType type of the execution plan that need to be removed
* @param deviceId Id of the device
*/
function remove(queryName, executionPlanType, deviceId) {
var path = ""; var path = "";
try { try {
if (id == "WithIn") { if (executionPlanType === constants.EXECUTION_PLAN_TYPE_SPEED || executionPlanType === constants.EXECUTION_PLAN_TYPE_PROXIMITY) {
path = "geo/alerts/within/" + queryName + deviceIdSeperator + deviceId + ".json"; path = registryPath(executionPlanType, deviceId);
} else if (id == "Stationery") { } else {
path = "geo/alerts/stationery/" + queryName + deviceIdSeperator + deviceId + ".json"; path = registryPath(executionPlanType, deviceId, queryName);
} else if (id == "Traffic") { }
path = "geo/alerts/traffic/" + queryName + deviceIdSeperator + deviceId + ".json"; getRegistry().remove(path);
if (log.isDebugEnabled()) {
log.debug("Resource is removed from the path" + path);
} }
log.info("DEBUG: path = " + path);
dataStore.remove(path);
} }
catch (e) { catch (e) {
log.info("The requested resource " + path + " was not found on this server. Thats all we know."); // Inspired by google 404 message log.error("The requested resource " + path + " was not found on this server.");
} }
} }
%> %>

View File

@ -102,7 +102,6 @@
<!-- Self javascript libraries (Order of the import is very important, changing the order might shadow some variables, append new script to bottom ) --> <!-- Self javascript libraries (Order of the import is very important, changing the order might shadow some variables, append new script to bottom ) -->
<!-- ** comment out below imports if using minimized wso2_geo.min library ** --> <!-- ** comment out below imports if using minimized wso2_geo.min library ** -->
<script src="js/application_options.js"></script> <script src="js/application_options.js"></script>
<script type="text/javascript"> <script type="text/javascript">
function reformatRadius(val){ function reformatRadius(val){
if(val != "" && !isNaN(val)){ if(val != "" && !isNaN(val)){
@ -136,6 +135,11 @@
<div class="navbar-collapse collapse" style="display:inline-block;"> <div class="navbar-collapse collapse" style="display:inline-block;">
<ul class="nav">
<li>
<button id='realTimeShow' type="submit" class="btn btn-primary" style="display:none;" onclick='enableRealTime()'>Return to Real Time View</button>
</li>
</ul>
<ul class="nav navbar-nav-left"> <ul class="nav navbar-nav-left">
<li class="hidden-xs"><a href="#left_side_pannel" data-uk-offcanvas> <li class="hidden-xs"><a href="#left_side_pannel" data-uk-offcanvas>
<i class="fa fa-list" style="color: #FF9900"></i></a> <i class="fa fa-list" style="color: #FF9900"></i></a>
@ -240,7 +244,7 @@
<ul class="uk-nav-sub"> <ul class="uk-nav-sub">
<li><a style="margin-left: 20%;" data-toggle="modal" href="/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/modals/speed_alert.jag" <li><a style="margin-left: 20%;" data-toggle="modal" href="/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/modals/speed_alert.jag"
data-target="#commonModal"><i class="fa fa-tachometer"></i> Speed alert</a></li> data-target="#commonModal"><i class="fa fa-tachometer"></i> Speed alert</a></li>
<li><a style="margin-left: 20%;" data-toggle="modal" href="/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/modals/proximity_alert.jag" <li id = "proximity_alert"><a style="margin-left: 20%;" data-toggle="modal" href="/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/modals/proximity_alert.jag"
data-target="#commonModal"><i class="fa fa-link"></i> Proximity alert</a></li> data-target="#commonModal"><i class="fa fa-link"></i> Proximity alert</a></li>
<li><a style="margin-left: 20%;" data-toggle="modal" href="/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/modals/stationery_alert.jag" <li><a style="margin-left: 20%;" data-toggle="modal" href="/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/modals/stationery_alert.jag"
data-target="#commonModal"><i class="fa fa-chain-broken"></i> Stationary alert</a></li> data-target="#commonModal"><i class="fa fa-chain-broken"></i> Stationary alert</a></li>
@ -254,10 +258,6 @@
<ul class="uk-nav-sub"> <ul class="uk-nav-sub">
<li><a style="margin-left: 20%;" data-toggle="modal" href="/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/modals/within_alert.jag" <li><a style="margin-left: 20%;" data-toggle="modal" href="/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/modals/within_alert.jag"
data-target="#commonModal"><i class="fa fa-square-o"></i> Within</a></li> data-target="#commonModal"><i class="fa fa-square-o"></i> Within</a></li>
<li><a style="margin-left: 20%;color: grey;cursor: not-allowed;"><i
class="fa fa-external-link-square"></i> Approaching</a></li>
<li><a style="margin-left: 20%;color: grey;cursor: not-allowed;"><i class="fa fa-minus"></i>
Cross</a></li>
</ul> </ul>
</li> </li>
@ -722,7 +722,17 @@
<p id="information" class="bg-primary" style="margin: 0px;padding: 0px;"></p> <p id="information" class="bg-primary" style="margin: 0px;padding: 0px;"></p>
<h6>Speed<span class="label label-primary pull-right"><span id="speed"></span> km/h</span></h6> <h6>Speed<span class="label label-primary pull-right"><span id="speed"></span> km/h</span></h6>
<h6>Heading<span id="heading" class="label label-primary pull-right"></span></h6> <h6>Heading<span id="heading" class="label label-primary pull-right"></span></h6>
<button type="button" class="btn btn-info btn-xs" onClick="focusOnSpatialObject(document.getElementById('objectId').innerHTML);return false;">History</button> <button type="button" class="btn btn-info btn-xs" onClick="focusOnSpatialObject(document.getElementById('objectId').innerHTML);return false;">Recent History</button>
<button type="button" class="btn btn-info btn-xs" onClick="popupDateRange();">Full History</button>
</div>
</div>
<div id="dateRangePopup">
<!--<h3 class="popover-title">ID <span id="objectId"></span></h3>-->
<div>
<label> From: <input id="timeFrom" type="text"> </label>
<label> To: <input id="timeTo" type="text"> </label>
<button type="button" class="btn btn-info btn-xs" onClick="focusOnHistorySpatialObject(document.getElementById('objectId').innerHTML, document.getElementById('timeFrom').value, document.getElementById('timeTo').value);return false;">Full History</button>
</div> </div>
</div> </div>

View File

@ -82,7 +82,7 @@ function initializeMap() {
map = L.map("map", { map = L.map("map", {
zoom: 14, zoom: 14,
center:[51.548525, 0.111749], center: [6.927078, 79.861243],
layers: [defaultOSM, defaultTFL], layers: [defaultOSM, defaultTFL],
zoomControl: false, zoomControl: false,
attributionControl: false, attributionControl: false,
@ -120,8 +120,6 @@ function initializeMap() {
} }
}); });
} }
/* Attribution control */ /* Attribution control */
@ -137,7 +135,7 @@ var attributionControl;
var groupedOverlays; var groupedOverlays;
var layerControl; var layerControl;
function processAfterInitializationMap(){ function processAfterInitializationMap() {
attributionControl = L.control({ attributionControl = L.control({
position: "bottomright" position: "bottomright"
}); });
@ -259,11 +257,12 @@ $('#searchbox').typeahead({
displayKey: 'value', displayKey: 'value',
source: substringMatcher() source: substringMatcher()
}).on('typeahead:selected', function ($e, datum) { }).on('typeahead:selected', function ($e, datum) {
objectId = datum['value']; objectId = datum['value'];
focusOnSpatialObject(objectId) focusOnSpatialObject(objectId)
}); });
var toggled = false; var toggled = false;
function focusOnSpatialObject(objectId) { function focusOnSpatialObject(objectId) {
console.log("Selecting" + objectId); console.log("Selecting" + objectId);
var spatialObject = currentSpatialObjects[objectId];// (local) var spatialObject = currentSpatialObjects[objectId];// (local)
@ -302,6 +301,110 @@ function focusOnSpatialObject(objectId) {
} }
var getProviderData = function (timeFrom, timeTo) {
var tableData;
$.ajax({
url: '/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/gadget-controller.jag?action=getData&id=' + deviceId + '&type=' + deviceType + '&timeFrom=' + timeFrom + '&timeTo=' + timeTo,
method: "GET",
contentType: "application/json",
async: false,
success: function (data) {
tableData = data;
}
});
return tableData;
};
function notifyError(message) {
$.UIkit.notify({
message: message,
status: 'warning',
timeout: ApplicationOptions.constance.NOTIFY_WARNING_TIMEOUT,
pos: 'bottom-left'
});
}
function enableRealTime() {
document.getElementById('realTimeShow').style.display = 'none';
spatialObject = currentSpatialObjects[selectedSpatialObject];
spatialObject.removePath();
spatialObject.marker.closePopup();
selectedSpatialObject = null;
clearFocus();
clearMap();
document.getElementById('objectInfo').style.display = 'none';
isBatchModeOn = false;
}
function focusOnHistorySpatialObject(objectId, timeFrom, timeTo) {
if (!timeFrom) {
notifyError('No start time provided to show history. Please provide a suitable value' + timeFrom);
} else if (!timeTo) {
notifyError('No end time provided to show history. Please provide a suitable value' + timeTo);
} else {
document.getElementById('realTimeShow').style.display = 'block';
isBatchModeOn = true;
clearFocus(); // Clear current focus if any
clearMap();
var tableData = getProviderData(timeFrom, timeTo);
for (var i = 0; i < tableData.length; i++) {
var data = tableData[i];
var geoMessage = {
"messageType": "Point",
"type": "Feature",
"id": data.id,
"deviceId": data.id,
"deviceType": data.type,
"properties": {
"speed": data.speed,
"heading": data.heading,
"state": data.state,
"information": data.information,
"notify": data.notify,
"type": data.type
},
"geometry": {
"type": "Point",
"coordinates": [data.longitude, data.latitude]
}
};
processPointMessage(geoMessage);
}
var spatialObject = currentSpatialObjects[objectId];// (local)
if (!spatialObject) {
$.UIkit.notify({
message: "Spatial Object <span style='color:red'>" + objectId + "</span> not in the Map!!",
status: 'warning',
timeout: ApplicationOptions.constance.NOTIFY_WARNING_TIMEOUT,
pos: 'top-center'
});
return false;
}
selectedSpatialObject = objectId; // (global) Why not use 'var' other than implicit declaration http://stackoverflow.com/questions/1470488/what-is-the-function-of-the-var-keyword-and-when-to-use-it-or-omit-it#answer-1471738
console.log("Selected " + objectId + " type " + spatialObject.type);
if (spatialObject.type == "area") {
spatialObject.focusOn(map);
return true;
}
map.setView(spatialObject.marker.getLatLng(), 15, {animate: true}); // TODO: check the map._layersMaxZoom and set the zoom level accordingly
$('#objectInfo').find('#objectInfoId').html(selectedSpatialObject);
spatialObject.marker.openPopup();
if (!toggled) {
$('#objectInfo').animate({width: 'toggle'}, 100);
toggled = true;
}
getAlertsHistory(objectId);
spatialObject.drawPath();
setTimeout(function () {
createChart();
chart.load({columns: [spatialObject.speedHistory.getArray()]});
}, 100);
$('#dateRangePopup').dialog('close');
}
}
// Unfocused on current searched spatial object // Unfocused on current searched spatial object
function clearFocus() { function clearFocus() {
if (selectedSpatialObject) { if (selectedSpatialObject) {

View File

@ -349,7 +349,7 @@ function updateDrawing(updatedGeoJson) {
} }
function viewFence(geoFenceElement,id) { function viewFence(geoFenceElement,id) {
var geoJson = JSON.parse($(geoFenceElement).attr('data-geoJson')); var geoJson = JSON.parse($(geoFenceElement).attr('data-geoJson').replace(/'/g, '"'));
var queryName = $(geoFenceElement).attr('data-queryName'); var queryName = $(geoFenceElement).attr('data-queryName');
var areaName = $(geoFenceElement).attr('data-areaName'); var areaName = $(geoFenceElement).attr('data-areaName');
var geometryShape; var geometryShape;
@ -382,7 +382,7 @@ function viewFence(geoFenceElement,id) {
var stationeryTime=$(geoFenceElement).attr('data-stationeryTime'); var stationeryTime=$(geoFenceElement).attr('data-stationeryTime');
$('#templateLoader').load("assets/html_templates/view_fence_popup.html #viewStationeryAlert", function () { $('#templateLoader').load("/portal/store/carbon.super/fs/gadget/geo-dashboard/assets/html_templates/view_fence_popup.html #viewStationeryAlert", function () {
var popupTemplate = $('#templateLoader').find('#viewStationeryAlert'); var popupTemplate = $('#templateLoader').find('#viewStationeryAlert');
popupTemplate.find('#exportGeoJson').attr('leaflet_id', geometryShape._leaflet_id); popupTemplate.find('#exportGeoJson').attr('leaflet_id', geometryShape._leaflet_id);
popupTemplate.find('#hideViewFence').attr('leaflet_id', geometryShape._leaflet_id); popupTemplate.find('#hideViewFence').attr('leaflet_id', geometryShape._leaflet_id);
@ -397,7 +397,7 @@ function viewFence(geoFenceElement,id) {
}); });
} else if(id=="WithIn"){ } else if(id=="WithIn"){
$('#templateLoader').load("assets/html_templates/view_fence_popup.html #viewWithinAlert", function () { $('#templateLoader').load("/portal/store/carbon.super/fs/gadget/geo-dashboard/assets/html_templates/view_fence_popup.html #viewWithinAlert", function () {
var popupTemplate = $('#templateLoader').find('#viewWithinAlert'); var popupTemplate = $('#templateLoader').find('#viewWithinAlert');
popupTemplate.find('#exportGeoJson').attr('leaflet_id', geometryShape._leaflet_id); popupTemplate.find('#exportGeoJson').attr('leaflet_id', geometryShape._leaflet_id);
popupTemplate.find('#hideViewFence').attr('leaflet_id', geometryShape._leaflet_id); popupTemplate.find('#hideViewFence').attr('leaflet_id', geometryShape._leaflet_id);

View File

@ -28,6 +28,12 @@ var proximityMap = L.map("proximityMap", {
var proximityDistance = $("#proximityDistance"); var proximityDistance = $("#proximityDistance");
var serverUrl = "/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/get_alerts.jag?executionPlanType=Proximity&deviceId=" + deviceId;
$.get(serverUrl, null, function (response) {
proximityDistance.val(response.proximityDistance);
$("#proximityTime").val(response.proximityTime);
});
L.grid({ L.grid({
redraw: 'move' redraw: 'move'
}).addTo(proximityMap); }).addTo(proximityMap);

View File

@ -595,7 +595,7 @@ function createExecutionPlanName(queryName, id, deviceId) {
return 'Geo-ExecutionPlan-Within' + (queryName ? '_' + queryName : '') + "---" + (deviceId ? '_' + deviceId : '') + '_alert'; // TODO: value of the `queryName` can't be empty, because it will cause name conflicts in CEP, have to do validation(check not empty String) return 'Geo-ExecutionPlan-Within' + (queryName ? '_' + queryName : '') + "---" + (deviceId ? '_' + deviceId : '') + '_alert'; // TODO: value of the `queryName` can't be empty, because it will cause name conflicts in CEP, have to do validation(check not empty String)
} }
else if (id == "Stationery") { else if (id == "Stationery") {
return 'Geo-ExecutionPlan-Stationery' + (queryName ? '_' + queryName : '') + '_alert'; // TODO: value of the `queryName` can't be empty, because it will cause name conflicts in CEP, have to do validation(check not empty String) return 'Geo-ExecutionPlan-Stationery' + (queryName ? '_' + queryName : '') + "---" + (deviceId ? '_' + deviceId : '') + '_alert'; // TODO: value of the `queryName` can't be empty, because it will cause name conflicts in CEP, have to do validation(check not empty String)
} }
else if (id == "Traffic") { else if (id == "Traffic") {
return 'Geo-ExecutionPlan-Traffic' + (queryName ? '_' + queryName : '') + '_alert'; // TODO: value of the `queryName` can't be empty, because it will cause name conflicts in CEP, have to do validation(check not empty String) return 'Geo-ExecutionPlan-Traffic' + (queryName ? '_' + queryName : '') + '_alert'; // TODO: value of the `queryName` can't be empty, because it will cause name conflicts in CEP, have to do validation(check not empty String)

View File

@ -0,0 +1,27 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.
*/
function setSpeed() {
var serverUrl = "/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/get_alerts.jag?executionPlanType=Speed&deviceId=" + deviceId;
$.get(serverUrl, null, function (response) {
if (response) {
$("#speedAlertValue").val(response.speedLimit);
}
});
}
setSpeed();

View File

@ -0,0 +1,44 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.
*/
function initStationaryAlert() {
var serverUrl = "/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/get_alerts.jag?executionPlanType=Stationery&deviceId=" + deviceId;
$(".removeGeoFence").tooltip();
$.get(serverUrl, null, function (response) {
if (response) {
$(".fence-not-exist").hide();
for (var index in response) {
var alert = response[index];
$("#stationary-alert-table > tbody").append(
"<tr class='viewGeoFenceRow'style='cursor: pointer' data-stationeryTime='" + alert.stationeryTime +
"'data-fluctuationRadius='" + alert.fluctuationRadius + "'data-areaName='" + alert.areaName +
"'data-queryName='" + alert.queryName + "'data-geoJson=" + alert.geoJson + ">" +
"<td>" + alert.areaName + "</td><td>" + alert.stationeryTime + "</td><td>" + alert.fluctuationRadius +
"<td>" + alert.queryName + "</td><td>" + alert.createdTime + "</td><td" +
" onClick=removeGeoFence(this.parentElement,'Stationery') data-toggle=" +
" 'tooltip' title='Remove fence' ><i class='fa fa-trash-o'></i></td></tr>")
}
} else{
$(".fence-not-exist").show();
}
$('.viewGeoFenceRow td:not(:last-child)').click(function () {
viewFence(this.parentElement,'Stationery');
});
});
}
initStationaryAlert();

View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.
*/
function initializeWithin() {
$(".removeGeoFence").tooltip();
var serverUrl = "/portal/store/carbon.super/fs/gadget/geo-dashboard/controllers/get_alerts.jag?executionPlanType=Within&deviceId=" + deviceId;
$.get(serverUrl, null, function (response) {
if (response) {
$(".fence-not-exist").hide();
for (var index in response) {
var alert = response[index];
$("#within-alert > tbody").append(
"<tr class='viewGeoFenceRow' style='cursor: pointer' data-areaName='" + alert.areaName +
"' data-queryName='" + alert.queryName + "'data-geoJson="+ alert.geoJson +"><td>" + alert.areaName + "</td>" +
"<td>" + alert.queryName + "</td><td>" + alert.createdTime + "</td>" +
"<td onClick=removeGeoFence(this.parentElement,'WithIn') class='removeGeoFence'" +
" data-toggle='tooltip' title='Remove fence' ><i class='fa fa-trash-o'></i></td></tr>");
}
} else{
$(".fence-not-exist").show();
}
$('.viewGeoFenceRow td:not(:last-child)').click(function () {
viewFence(this.parentElement,'WithIn');
});
});
}
initializeWithin();

View File

@ -29,6 +29,7 @@ var waitTime = 1000;
var webSocketURL, alertWebSocketURL, trafficStreamWebSocketURL; var webSocketURL, alertWebSocketURL, trafficStreamWebSocketURL;
var deviceId; var deviceId;
var deviceType; var deviceType;
var isBatchModeOn = false;
function processPointMessage(geoJsonFeature) { function processPointMessage(geoJsonFeature) {
if (geoJsonFeature.id in currentSpatialObjects) { if (geoJsonFeature.id in currentSpatialObjects) {
@ -72,6 +73,10 @@ function SpatialObject(json) {
return this; return this;
} }
function popupDateRange() {
$('#dateRangePopup').attr('title', 'Device ID - ' + deviceId + " Device Type - " + deviceType).dialog();
}
SpatialObject.prototype.update = function (geoJSON) { SpatialObject.prototype.update = function (geoJSON) {
this.latitude = geoJSON.geometry.coordinates[1]; this.latitude = geoJSON.geometry.coordinates[1];
this.longitude = geoJSON.geometry.coordinates[0]; this.longitude = geoJSON.geometry.coordinates[0];
@ -161,8 +166,18 @@ function angleToHeading(angle) {
SpatialObject.prototype.removeFromMap = function () { SpatialObject.prototype.removeFromMap = function () {
this.removePath(); this.removePath();
this.marker.closePopup(); this.marker.closePopup();
map.removeLayer(this.marker);
}; };
function clearMap() {
for (var spacialObject in currentSpatialObjects) {
console.log(spacialObject);
currentSpatialObjects[spacialObject].removePath();
currentSpatialObjects[spacialObject].removeFromMap();
}
currentSpatialObjects = {};
}
SpatialObject.prototype.createLineStringFeature = function (state, information, coordinates) { SpatialObject.prototype.createLineStringFeature = function (state, information, coordinates) {
return { return {
"type": "Feature", "type": "Feature",
@ -269,7 +284,6 @@ function processTrafficMessage(json) {
} }
function processAlertMessage(json) { function processAlertMessage(json) {
//console.log(json);
if (json.state != "NORMAL" && json.state != "MINIMAL") { if (json.state != "NORMAL" && json.state != "MINIMAL") {
console.log(json); console.log(json);
notifyAlert("Object ID: <span style='color: blue;cursor: pointer' onclick='focusOnSpatialObject(" + json.id + ")'>" + json.id + "</span> change state to: <span style='color: red'>" + json.state + "</span> Info : " + json.information); notifyAlert("Object ID: <span style='color: blue;cursor: pointer' onclick='focusOnSpatialObject(" + json.id + ")'>" + json.id + "</span> change state to: <span style='color: red'>" + json.state + "</span> Info : " + json.information);
@ -553,11 +567,13 @@ var webSocketOnAlertOpen = function () {
}; };
var webSocketOnAlertMessage = function processMessage(message) { var webSocketOnAlertMessage = function processMessage(message) {
var json = $.parseJSON(message.data); if (!isBatchModeOn) {
if (json.messageType == "Alert") { var json = $.parseJSON(message.data);
processAlertMessage(json); if (json.messageType == "Alert") {
} else { processAlertMessage(json);
console.log("Message type not supported."); } else {
console.log("Message type not supported.");
}
} }
}; };
@ -595,18 +611,19 @@ var webSocketOnOpen = function () {
}; };
var webSocketOnMessage = function (message) { var webSocketOnMessage = function (message) {
var json = $.parseJSON(message.data); if (!isBatchModeOn) {
if (json.messageType == "Point") { var json = $.parseJSON(message.data);
processPointMessage(json); if (json.messageType == "Point") {
} else if (json.messageType == "Prediction") { processPointMessage(json);
//processPredictionMessage(json); } else if (json.messageType == "Prediction") {
} else { //processPredictionMessage(json);
console.log("Message type not supported."); } else {
console.log("Message type not supported.");
}
} }
}; };
var webSocketOnClose = function (e) { var webSocketOnClose = function (e) {
if (websocket.get_opened()) { if (websocket.get_opened()) {
$.UIkit.notify({ $.UIkit.notify({
message: 'Connection lost with server!!', message: 'Connection lost with server!!',
@ -669,7 +686,7 @@ function initializeOnAlertWebSocket() {
function intializeWebsocketUrls() { function intializeWebsocketUrls() {
var username; var username;
wso2.gadgets.state.getGlobalState(function(state) { wso2.gadgets.state.getGlobalState(function (state) {
deviceId = state.device.id; deviceId = state.device.id;
deviceType = state.device.type; deviceType = state.device.type;
if (deviceId && deviceType) { if (deviceId && deviceType) {
@ -688,7 +705,8 @@ function intializeWebsocketUrls() {
ApplicationOptions.constance.PATH_SEPARATOR + ApplicationOptions.constance ApplicationOptions.constance.PATH_SEPARATOR + ApplicationOptions.constance
.CEP_ON_ALERT_WEB_SOCKET_OUTPUT_ADAPTOR_NAME + ApplicationOptions.constance.PATH_SEPARATOR + ApplicationOptions.constance.VERSION .CEP_ON_ALERT_WEB_SOCKET_OUTPUT_ADAPTOR_NAME + ApplicationOptions.constance.PATH_SEPARATOR + ApplicationOptions.constance.VERSION
+ "?deviceId=" + deviceId + "&deviceType=" + deviceType; + "?deviceId=" + deviceId + "&deviceType=" + deviceType;
document.cookie = "websocket-token=f98d6142-e988-3c7f-a8c9-7e6d74da7113; path=/"; document.cookie = "websocket-token=619e6170-10e8-31f0-904b-b7770d53e545; path=/";
$("#proximity_alert").hide();
initializeWebSocket(); initializeWebSocket();
initializeOnAlertWebSocket(); initializeOnAlertWebSocket();
}); });
@ -705,7 +723,6 @@ function intializeWebsocketUrls() {
} }
intializeWebsocketUrls(); intializeWebsocketUrls();

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<artifact name="Geo-EventSink-FusedStream" version="1.0.0" type="analytics/eventstore" serverRole="GeoDashboard">
<file>org_wso2_geo_FusedSpatialEvent.xml</file>
</artifact>

View File

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EventStoreConfiguration>
<TableSchema>
<ColumnDefinition>
<Name>id</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>true</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>STRING</Type>
</ColumnDefinition>
<ColumnDefinition>
<Name>latitude</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>false</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>DOUBLE</Type>
</ColumnDefinition>
<ColumnDefinition>
<Name>longitude</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>false</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>DOUBLE</Type>
</ColumnDefinition>
<ColumnDefinition>
<Name>timeStamp</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>true</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>LONG</Type>
</ColumnDefinition>
<ColumnDefinition>
<Name>type</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>true</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>STRING</Type>
</ColumnDefinition>
<ColumnDefinition>
<Name>speed</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>false</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>FLOAT</Type>
</ColumnDefinition>
<ColumnDefinition>
<Name>heading</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>false</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>FLOAT</Type>
</ColumnDefinition>
<ColumnDefinition>
<Name>state</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>true</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>STRING</Type>
</ColumnDefinition>
<ColumnDefinition>
<Name>information</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>true</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>STRING</Type>
</ColumnDefinition>
<ColumnDefinition>
<Name>notify</Name>
<IsFacet>false</IsFacet>
<EnableIndexing>true</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey>
<EnableScoreParam>false</EnableScoreParam>
<Type>BOOLEAN</Type>
</ColumnDefinition>
</TableSchema>
<Source>
<StreamId>org.wso2.geo.FusedSpatialEvent:1.0.0</StreamId>
</Source>
<MergeSchema>false</MergeSchema>
<RecordStoreName>EVENT_STORE</RecordStoreName>
</EventStoreConfiguration>

View File

@ -9,7 +9,7 @@
"type": "Feature", "type": "Feature",
"id": {{id}}, "id": {{id}},
"deviceId": {{id}}, "deviceId": {{id}},
"deviceType" : "{{type}}", "deviceType" : {{type}},
"state": {{state}}, "state": {{state}},
"information": {{information}}, "information": {{information}},
"longitude" : {{longitude}}, "longitude" : {{longitude}},

View File

@ -27,6 +27,7 @@
<dependency artifact="ThemeGeoDashboard" version="1.0.0" include="true" serverRole="GeoDashboard"/> <dependency artifact="ThemeGeoDashboard" version="1.0.0" include="true" serverRole="GeoDashboard"/>
<!-- CEP Artifacts --> <!-- CEP Artifacts -->
<dependency artifact="Geo-Dashboard-Http-Receiver" version="1.0.0" include="true" serverRole="GeoDashboard"/> <dependency artifact="Geo-Dashboard-Http-Receiver" version="1.0.0" include="true" serverRole="GeoDashboard"/>
<dependency artifact="Geo-EventSink-FusedStream" version="1.0.0" include="true" serverRole="GeoDashboard"/>
<dependency artifact="Geo-ExecutionPlan-EventsFusionGenerateNotifications" version="1.0.0" include="true" serverRole="GeoDashboard"/> <dependency artifact="Geo-ExecutionPlan-EventsFusionGenerateNotifications" version="1.0.0" include="true" serverRole="GeoDashboard"/>
<dependency artifact="Geo-ExecutionPlan-InputStandardizer" version="1.0.0" include="true" serverRole="GeoDashboard"/> <dependency artifact="Geo-ExecutionPlan-InputStandardizer" version="1.0.0" include="true" serverRole="GeoDashboard"/>
<dependency artifact="Geo-ExecutionPlan-Pass_through" version="1.0.0" include="true" serverRole="GeoDashboard"/> <dependency artifact="Geo-ExecutionPlan-Pass_through" version="1.0.0" include="true" serverRole="GeoDashboard"/>

View File

@ -18,8 +18,6 @@
package org.wso2.carbon.iot.android.sense.event.streams.data; package org.wso2.carbon.iot.android.sense.event.streams.data;
import java.util.Date;
public class NetworkData { public class NetworkData {
//Mobile or Wifi //Mobile or Wifi

View File

@ -33,7 +33,6 @@ public class SmsDataReceiver extends BroadcastReceiver {
final Bundle bundle = intent.getExtras(); final Bundle bundle = intent.getExtras();
if (bundle != null) { if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus"); final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++) { for (int i = 0; i < pdusObj.length; i++) {

View File

@ -148,6 +148,7 @@ public class SenseDataReceiverManager {
smsDataReceiver = new SmsDataReceiver(); smsDataReceiver = new SmsDataReceiver();
IntentFilter intentFilter = new IntentFilter(); IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Telephony.Sms.Intents.SMS_RECEIVED_ACTION); intentFilter.addAction(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
intentFilter.addAction(Telephony.Sms.Intents.SMS_DELIVER_ACTION);
context.registerReceiver(smsDataReceiver, intentFilter); context.registerReceiver(smsDataReceiver, intentFilter);
} }
} }

View File

@ -1,5 +1,5 @@
/* Enter a unique ExecutionPlan */ /* Enter a unique ExecutionPlan */
@Plan:name('Andriod-Audio-Filter-ExecutionPlan') @Plan:name('Android-Audio-Filter-ExecutionPlan')
/* Enter a unique description for ExecutionPlan */ /* Enter a unique description for ExecutionPlan */
@Plan:description('This converts the true/false params of the orgininal stream into ON/OFF') @Plan:description('This converts the true/false params of the orgininal stream into ON/OFF')
@ -9,7 +9,7 @@
@Import('org.wso2.iot.android.audio:1.0.0') @Import('org.wso2.iot.android.audio:1.0.0')
define stream AudioStream (meta_owner string, meta_deviceId string, meta_timestamp long, audio_playing bool, headset_on bool, music_volume int); define stream AudioStream (meta_owner string, meta_deviceId string, meta_timestamp long, audio_playing bool, headset_on bool, music_volume int);
@Export('org.wso2.iot.andriod.filtered.audio:1.0.0') @Export('org.wso2.iot.android.filtered.audio:1.0.0')
define stream FilteredAudioStream (meta_owner string, meta_deviceId string, meta_timestamp long, audio string, headset string, music_volume int); define stream FilteredAudioStream (meta_owner string, meta_deviceId string, meta_timestamp long, audio string, headset string, music_volume int);
from AudioStream select meta_owner, meta_deviceId, meta_timestamp, ifThenElse(audio_playing, 'ON', 'OFF') as audio, from AudioStream select meta_owner, meta_deviceId, meta_timestamp, ifThenElse(audio_playing, 'ON', 'OFF') as audio,

View File

@ -17,7 +17,8 @@
~ under the License. ~ under the License.
--> -->
<artifact name= "android_andriod_audio_filter_executionplan" version="1.0.0" type="event/execution-plan" serverRole="DataAnalyticsServer"> <artifact name= "android_android_audio_filter_executionplan" version="1.0.0" type="event/execution-plan"
<file>Andriod-Audio-Filter-ExecutionPlan.siddhiql</file> serverRole="DataAnalyticsServer">
<file>Android-Audio-Filter-ExecutionPlan.siddhiql</file>
</artifact> </artifact>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Analytics> <Analytics>
<Editable>true</Editable> <Editable>true</Editable>
<Name>AndriodCallScript</Name> <Name>AndroidBatteryScript</Name>
<Script> CREATE TEMPORARY TABLE AndroidBatteryData USING CarbonAnalytics OPTIONS(tableName <Script> CREATE TEMPORARY TABLE AndroidBatteryData USING CarbonAnalytics OPTIONS(tableName
"ORG_WSO2_IOT_ANDROID_BATTERY_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_BATTERY_STATS, DAY"); "ORG_WSO2_IOT_ANDROID_BATTERY_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_BATTERY_STATS, DAY");
@ -11,7 +11,7 @@
timestamp STRING", primaryKeys "year, month, day, deviceId, owner, type", mergeSchema "false"); timestamp STRING", primaryKeys "year, month, day, deviceId, owner, type", mergeSchema "false");
INSERT INTO TABLE Android_Battery_Stat_Per_Day INSERT INTO TABLE Android_Battery_Stat_Per_Day
SELECT meta_owner as owner, meta_deviceId as deviceId, type, avg(level) as level, year, month, day, SELECT meta_owner as owner, meta_deviceId as deviceId, type, sum(level) as level, year, month, day,
getDateStartingTime(year, month, day) as timestamp getDateStartingTime(year, month, day) as timestamp
FROM AndroidBatteryData FROM AndroidBatteryData
GROUP BY year, month, day, meta_deviceId, meta_owner, type ORDER BY timestamp DESC; GROUP BY year, month, day, meta_deviceId, meta_owner, type ORDER BY timestamp DESC;

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Analytics> <Analytics>
<Editable>true</Editable> <Editable>true</Editable>
<Name>AndriodCallScript</Name> <Name>AndroidCallScript</Name>
<Script> CREATE TEMPORARY TABLE AndroidCallData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_CALL_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_CALL_STATS, DAY"); <Script> CREATE TEMPORARY TABLE AndroidCallData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_CALL_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_CALL_STATS, DAY");
CREATE TEMPORARY TABLE Android_Call_Stat_Per_Day USING CarbonAnalytics CREATE TEMPORARY TABLE Android_Call_Stat_Per_Day USING CarbonAnalytics

View File

@ -18,6 +18,6 @@
--> -->
<artifact name= "android_call_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer"> <artifact name= "android_call_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer">
<file>AndriodCallScript.xml</file> <file>AndroidCallScript.xml</file>
</artifact> </artifact>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Analytics> <Analytics>
<Editable>true</Editable> <Editable>true</Editable>
<Name>AndriodDataScript</Name> <Name>AndroidDataScript</Name>
<Script> CREATE TEMPORARY TABLE AndroidDataData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_DATA_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_DATA_STATS, DAY"); <Script> CREATE TEMPORARY TABLE AndroidDataData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_DATA_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_DATA_STATS, DAY");
CREATE TEMPORARY TABLE Android_Data_Stat_Per_Day USING CarbonAnalytics CREATE TEMPORARY TABLE Android_Data_Stat_Per_Day USING CarbonAnalytics

View File

@ -18,6 +18,6 @@
--> -->
<artifact name= "android_data_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer"> <artifact name= "android_data_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer">
<file>AndriodDataScript.xml</file> <file>AndroidDataScript.xml</file>
</artifact> </artifact>

View File

@ -10,6 +10,6 @@
"limit": "1", "limit": "1",
"provider-name": "batch", "provider-name": "batch",
"query": "meta_username: \"admin\" AND id: \"123456\"", "query": "meta_username: \"admin\" AND id: \"123456\"",
"tableName": "ORG_WSO2_IOT_ANDRIOD_DEVICE_DETAILS" "tableName": "ORG_WSO2_IOT_ANDROID_DEVICE_DETAILS"
} }
} }

View File

@ -93,8 +93,8 @@ $(function () {
if (deviceDetails.hasOwnProperty('meta_username')){ if (deviceDetails.hasOwnProperty('meta_username')){
deviceDetailsTable += getDeviceDetailTableEntry('Owner:', deviceDetails.meta_username) deviceDetailsTable += getDeviceDetailTableEntry('Owner:', deviceDetails.meta_username)
} }
if (deviceDetails.hasOwnProperty('andriod_version')){ if (deviceDetails.hasOwnProperty('android_version')){
deviceDetailsTable += getDeviceDetailTableEntry('Andriod Version:', deviceDetails.andriod_version) deviceDetailsTable += getDeviceDetailTableEntry('Android Version:', deviceDetails.android_version)
} }
if (deviceDetails.hasOwnProperty('memory')){ if (deviceDetails.hasOwnProperty('memory')){
deviceDetailsTable += getDeviceDetailTableEntry('Memory:', deviceDetails.memory) deviceDetailsTable += getDeviceDetailTableEntry('Memory:', deviceDetails.memory)

View File

@ -18,6 +18,6 @@
--> -->
<artifact name= "android_device_details_event_sink" version="1.0.0" type="analytics/eventstore" serverRole="DataAnalyticsServer"> <artifact name= "android_device_details_event_sink" version="1.0.0" type="analytics/eventstore" serverRole="DataAnalyticsServer">
<file>org_wso2_iot_andriod_device_details.xml</file> <file>org_wso2_iot_android_device_details.xml</file>
</artifact> </artifact>

View File

@ -10,7 +10,7 @@
<Type>STRING</Type> <Type>STRING</Type>
</ColumnDefinition> </ColumnDefinition>
<ColumnDefinition> <ColumnDefinition>
<Name>andriod_version</Name> <Name>android_version</Name>
<IsFacet>false</IsFacet> <IsFacet>false</IsFacet>
<EnableIndexing>false</EnableIndexing> <EnableIndexing>false</EnableIndexing>
<IsPrimaryKey>false</IsPrimaryKey> <IsPrimaryKey>false</IsPrimaryKey>
@ -83,7 +83,7 @@
</ColumnDefinition> </ColumnDefinition>
</TableSchema> </TableSchema>
<Source> <Source>
<StreamId>org.wso2.iot.andriod.device.details:1.0.0</StreamId> <StreamId>org.wso2.iot.android.device.details:1.0.0</StreamId>
</Source> </Source>
<MergeSchema>false</MergeSchema> <MergeSchema>false</MergeSchema>
<RecordStoreName>EVENT_STORE</RecordStoreName> <RecordStoreName>EVENT_STORE</RecordStoreName>

View File

@ -18,6 +18,6 @@
--> -->
<artifact name= "android_device_details_streams" version="1.0.0" type="event/stream" serverRole="DataAnalyticsServer"> <artifact name= "android_device_details_streams" version="1.0.0" type="event/stream" serverRole="DataAnalyticsServer">
<file>org.wso2.iot.andriod.device.details_1.0.0.json</file> <file>org.wso2.iot.android.device.details_1.0.0.json</file>
</artifact> </artifact>

View File

@ -1,8 +1,8 @@
{ {
"name": "org.wso2.iot.andriod.device.details", "name": "org.wso2.iot.android.device.details",
"version": "1.0.0", "version": "1.0.0",
"nickName": "", "nickName": "",
"description": "Details of the Andriod Device", "description": "Details of the Android Device",
"metaData": [ "metaData": [
{ {
"name": "username", "name": "username",
@ -11,7 +11,7 @@
], ],
"payloadData": [ "payloadData": [
{ {
"name": "andriod_version", "name": "android_version",
"type": "STRING" "type": "STRING"
}, },
{ {

View File

@ -18,6 +18,6 @@
--> -->
<artifact name="android_filtered_audio_streams" version="1.0.0" type="event/stream" serverRole="DataAnalyticsServer"> <artifact name="android_filtered_audio_streams" version="1.0.0" type="event/stream" serverRole="DataAnalyticsServer">
<file>org.wso2.iot.andriod.filtered.audio_1.0.0.json</file> <file>org.wso2.iot.android.filtered.audio_1.0.0.json</file>
</artifact> </artifact>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<eventPublisher name="org.wso2.iot.android.filtered.audio.ui.publisher" <eventPublisher name="org.wso2.iot.android.filtered.audio.ui.publisher"
processing="enable" statistics="disable" trace="disable" xmlns="http://wso2.org/carbon/eventpublisher"> processing="enable" statistics="disable" trace="disable" xmlns="http://wso2.org/carbon/eventpublisher">
<from streamName="org.wso2.iot.andriod.filtered.audio" version="1.0.0"/> <from streamName="org.wso2.iot.android.filtered.audio" version="1.0.0"/>
<mapping customMapping="disable" type="wso2event"/> <mapping customMapping="disable" type="wso2event"/>
<to eventAdapterType="ui"/> <to eventAdapterType="ui"/>
</eventPublisher> </eventPublisher>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Analytics> <Analytics>
<Editable>true</Editable> <Editable>true</Editable>
<Name>AndriodFrequentContactsScript</Name> <Name>AndroidFrequentContactsScript</Name>
<Script> CREATE TEMPORARY TABLE AndroidFrequentCallData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_CALL_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_CALL_STATS, DAY"); <Script> CREATE TEMPORARY TABLE AndroidFrequentCallData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_CALL_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_CALL_STATS, DAY");
CREATE TEMPORARY TABLE AndroidFrequentSmsData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_SMS_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_SMS_STATS, DAY"); CREATE TEMPORARY TABLE AndroidFrequentSmsData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_SMS_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_SMS_STATS, DAY");

View File

@ -18,6 +18,6 @@
--> -->
<artifact name= "android_frequentcontacts_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer"> <artifact name= "android_frequentcontacts_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer">
<file>AndriodFrequentContactsScript.xml</file> <file>AndroidFrequentContactsScript.xml</file>
</artifact> </artifact>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Analytics> <Analytics>
<Editable>true</Editable> <Editable>true</Editable>
<Name>Android_Sense_Script</Name> <Name>HeadsetScript</Name>
<Script>CREATE TEMPORARY TABLE AndroidHeadsetData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_HEADSET_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_HEADSET_STATS, DAY"); <Script>CREATE TEMPORARY TABLE AndroidHeadsetData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_HEADSET_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_HEADSET_STATS, DAY");
CREATE TEMPORARY TABLE Android_Headset_Stat_Per_Day USING CarbonAnalytics CREATE TEMPORARY TABLE Android_Headset_Stat_Per_Day USING CarbonAnalytics

View File

@ -17,7 +17,7 @@
~ under the License. ~ under the License.
--> -->
<artifact name= "android_sense_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer"> <artifact name= "android_headset_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer">
<file>Android_Sense_Script.xml</file> <file>HeadsetScript.xml</file>
</artifact> </artifact>

View File

@ -1,6 +1,6 @@
{ {
"provider-conf": { "provider-conf": {
"streamName": "org.wso2.iot.andriod.filtered.audio:1.0.0", "streamName": "org.wso2.iot.android.filtered.audio:1.0.0",
"provider-name": "realtime" "provider-name": "realtime"
}, },
"chart-conf": { "chart-conf": {

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Analytics> <Analytics>
<Editable>true</Editable> <Editable>true</Editable>
<Name>AndriodScreenScript</Name> <Name>AndroidScreenScript</Name>
<Script> CREATE TEMPORARY TABLE AndroidScreenData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_SCREEN_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_SCREEN_STATS, DAY"); <Script> CREATE TEMPORARY TABLE AndroidScreenData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_SCREEN_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_SCREEN_STATS, DAY");
CREATE TEMPORARY TABLE Android_Screen_Stat_Per_Day USING CarbonAnalytics CREATE TEMPORARY TABLE Android_Screen_Stat_Per_Day USING CarbonAnalytics

View File

@ -18,6 +18,6 @@
--> -->
<artifact name= "android_screen_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer"> <artifact name= "android_screen_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer">
<file>AndriodScreenScript.xml</file> <file>AndroidScreenScript.xml</file>
</artifact> </artifact>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Analytics> <Analytics>
<Editable>true</Editable> <Editable>true</Editable>
<Name>AndriodSmsScript</Name> <Name>AndroidSmsScript</Name>
<Script> CREATE TEMPORARY TABLE AndroidSmsData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_SMS_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_SMS_STATS, DAY"); <Script> CREATE TEMPORARY TABLE AndroidSmsData USING CarbonAnalytics OPTIONS(tableName "ORG_WSO2_IOT_ANDROID_SMS_STATS", incrementalParams "ORG_WSO2_IOT_ANDROID_SMS_STATS, DAY");
CREATE TEMPORARY TABLE Android_Sms_Stat_Per_Day USING CarbonAnalytics CREATE TEMPORARY TABLE Android_Sms_Stat_Per_Day USING CarbonAnalytics
@ -15,5 +15,7 @@
FROM AndroidSmsData FROM AndroidSmsData
GROUP BY year, month, day, meta_deviceId, meta_owner, type ORDER BY timestamp DESC; GROUP BY year, month, day, meta_deviceId, meta_owner, type ORDER BY timestamp DESC;
INCREMENTAL_TABLE_COMMIT ORG_WSO2_IOT_ANDROID_SMS_STATS; </Script> INCREMENTAL_TABLE_COMMIT ORG_WSO2_IOT_ANDROID_SMS_STATS;
</Script>
<CronExpression>0 0/5 * * * ?</CronExpression>
</Analytics> </Analytics>

View File

@ -18,6 +18,6 @@
--> -->
<artifact name= "android_sms_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer"> <artifact name= "android_sms_script" version="1.0.0" type="analytics/spark" serverRole="DataAnalyticsServer">
<file>AndriodSmsScript.xml</file> <file>AndroidSmsScript.xml</file>
</artifact> </artifact>

View File

@ -18,7 +18,7 @@
--> -->
<artifacts> <artifacts>
<artifact name="android_analytics" version="1.0.0" type="carbon/application"> <artifact name="androidsense" version="1.0.0" type="carbon/application">
<dependency artifact="android_active_stack_chart_gadget" version="1.0.0" include="true" <dependency artifact="android_active_stack_chart_gadget" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_active_time_chart_gadget" version="1.0.0" include="true" <dependency artifact="android_active_time_chart_gadget" version="1.0.0" include="true"
@ -32,7 +32,7 @@
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_activity_streams" version="1.0.0" include="true" <dependency artifact="android_activity_streams" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_andriod_audio_filter_executionplan" version="1.0.0" include="true" <dependency artifact="android_android_audio_filter_executionplan" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_android_activity_executionplan" version="1.0.0" include="true" <dependency artifact="android_android_activity_executionplan" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
@ -54,22 +54,20 @@
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_audio_script" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/> <dependency artifact="android_audio_script" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
<dependency artifact="android_audio_streams" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/> <dependency artifact="android_audio_streams" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_level_chart_gadget" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_history_chart_gadget" version="1.0.0" include="true" <dependency artifact="android_battery_history_chart_gadget" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_percentage_chart_gadget" version="1.0.0" include="true" <dependency artifact="android_battery_percentage_chart_gadget" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_script" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/> <!--<dependency artifact="android_battery_script" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>-->
<dependency artifact="android_battery_stats_event_sink" version="1.0.0" include="true" <dependency artifact="android_battery_stats_event_sink" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_stats_streams" version="1.0.0" include="true" <dependency artifact="android_battery_stats_streams" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_streams" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_ui_event_publisher" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_stats_ui_event_publisher" version="1.0.0" include="true" <dependency artifact="android_battery_stats_ui_event_publisher" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_ui_event_publisher" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/>
<dependency artifact="android_battery_streams" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
<dependency artifact="android_call_script" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/> <dependency artifact="android_call_script" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
<dependency artifact="android_call_stats_event_sink" version="1.0.0" include="true" <dependency artifact="android_call_stats_event_sink" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
@ -162,7 +160,7 @@
<dependency artifact="android_screen_ui_event_publisher" version="1.0.0" include="true" <dependency artifact="android_screen_ui_event_publisher" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>
<dependency artifact="android_sense_dashboard" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/> <dependency artifact="android_sense_dashboard" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
<dependency artifact="android_sense_script" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/> <dependency artifact="android_headset_script" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
<dependency artifact="android_sense_streams" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/> <dependency artifact="android_sense_streams" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
<dependency artifact="android_sms_chart_gadget" version="1.0.0" include="true" <dependency artifact="android_sms_chart_gadget" version="1.0.0" include="true"
serverRole="DataAnalyticsServer"/> serverRole="DataAnalyticsServer"/>

View File

@ -147,15 +147,15 @@
<hr> <hr>
<ul class="list-unstyled"> <ul class="list-unstyled">
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">01</span> <span class="badge">01</span>
Connect Android device to network. Connect Android device to network.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">02</span> <span class="badge">02</span>
Start Android Sense app in your device. Start Android Sense app in your device.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">03</span> <span class="badge">03</span>
Fill login form with the credentials. Fill login form with the credentials.
<i>(Use server URL as [ https://&lt;WSO2_IoT_SERVER_HOST&gt;:&lt; <i>(Use server URL as [ https://&lt;WSO2_IoT_SERVER_HOST&gt;:&lt;
HTTPS_SERVER_PORT&gt; ] and click on HTTPS_SERVER_PORT&gt; ] and click on
@ -169,7 +169,7 @@
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">04</span> <span class="badge">04</span>
Once the device is enrolled, click on <strong>[+]</strong> button to Once the device is enrolled, click on <strong>[+]</strong> button to
select the sensors. select the sensors.
<a href="{{@unit.publicUri}}/images/selectSensorView.png" target="_blank" <a href="{{@unit.publicUri}}/images/selectSensorView.png" target="_blank"
@ -178,7 +178,7 @@
</a> </a>
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">05</span> <span class="badge">05</span>
Click on <i>[Publish data]</i> button to publish sensor readings to Click on <i>[Publish data]</i> button to publish sensor readings to
IoT server. IoT server.
<a href="{{@unit.publicUri}}/images/publishDataView.png" target="_blank" <a href="{{@unit.publicUri}}/images/publishDataView.png" target="_blank"
@ -190,41 +190,47 @@
<br> <br>
</div> </div>
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 padding-double"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 padding-double">
<h3 class="uppercase">Try Out</h3> <div class="row">
<hr> <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 padding-double">
<ul class="list-unstyled"> <h3 class="uppercase">Try Out</h3>
<li class="padding-top-double"> <hr>
<span class="fw-stack fw-lg margin-right"> <ul class="list-unstyled">
<li class="padding-top-double">
<span class="fw-stack margin-right">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>
<i class="fw fw-right-arrow fw-stack-1x"></i> <i class="fw fw-right-arrow fw-stack-1x"></i>
</span> </span>
You can view all your connected devices You can view all your connected devices
<a href="{{@app.context}}/devices">[Device Management]</a> page. <a href="{{@app.context}}/devices">[Device Management]</a> page.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="fw-stack fw-lg margin-right"> <span class="fw-stack margin-right">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>
<i class="fw fw-right-arrow fw-stack-1x"></i> <i class="fw fw-right-arrow fw-stack-1x"></i>
</span> </span>
You can select any one of your connected devices for available You can select any one of your connected devices for available
operations and Real-Time data monitoring. operations and Real-Time data monitoring.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="fw-stack fw-lg margin-right"> <span class="fw-stack margin-right">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>
<i class="fw fw-right-arrow fw-stack-1x"></i> <i class="fw fw-right-arrow fw-stack-1x"></i>
</span> For historical analytics of sensor data navigate to device </span> For historical analytics of sensor data navigate to device
analytics page. analytics page.
</li> </li>
</ul> </ul>
<br/> <br/>
<p class="grey margin-top">Click on the image to zoom</p> </div>
<center> <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 padding-double">
<a href="{{@unit.publicUri}}/images/myDevices_analytics.png" target="_blank"> <p class="grey margin-top">Click on the image to zoom</p>
<img src="{{@unit.publicUri}}/images/myDevices_analytics.png" class="img-responsive"> <center>
</a> <a href="{{@unit.publicUri}}/images/myDevices_analytics.png" target="_blank">
</center> <img src="{{@unit.publicUri}}/images/myDevices_analytics.png" class="img-responsive">
</a>
</center>
</div>
</div>
</div> </div>
<div id="qr-code-modal" data-enrollment-url="{{hostName}}{{@unit.publicUri}}/asset/androidsense.apk" class="hidden"> <div id="qr-code-modal" data-enrollment-url="{{hostName}}{{@unit.publicUri}}/asset/androidsense.apk" class="hidden">

View File

@ -196,11 +196,11 @@
<hr> <hr>
<ul class="list-unstyled"> <ul class="list-unstyled">
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">01</span> <span class="badge">01</span>
Wifi-Shield mounted onto the Arduino-UNO board Wifi-Shield mounted onto the Arduino-UNO board
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">02</span> <span class="badge">02</span>
Connect LED bulb to arduino as follows Connect LED bulb to arduino as follows
<br/><br/> <br/><br/>
<a href="{{@unit.publicUri}}/images/schematicsGuide.png" target="_blank"> <a href="{{@unit.publicUri}}/images/schematicsGuide.png" target="_blank">
@ -210,20 +210,20 @@
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">03</span> <span class="badge">03</span>
Download Arduino-Sketch from [Download Sketch] link above. Download Arduino-Sketch from [Download Sketch] link above.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">04</span> <span class="badge">04</span>
Unzip the downloaded Arduino Agent Unzip the downloaded Arduino Agent
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">05</span> <span class="badge">05</span>
Create a folder called "ArduinoBoardSketch" and move all source files Create a folder called "ArduinoBoardSketch" and move all source files
inside inside
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">06</span> <span class="badge">06</span>
Open ArduinoBoardSketch.h and provide appropriate values for Open ArduinoBoardSketch.h and provide appropriate values for
<i>[WLAN_SSID]</i>, <i>[WLAN_SSID]</i>,
<i>[WLAN_PASS]</i>, <i>[WLAN_PASS]</i>,
@ -233,19 +233,19 @@
variables according to your network. variables according to your network.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">07</span> <span class="badge">07</span>
Burn the sketch onto your Arduino board and let the program run. Burn the sketch onto your Arduino board and let the program run.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="fw-stack fw-lg margin-right"> <span class="fw-stack margin-right">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>
<i class="fw fw-right-arrow fw-stack-1x"></i> <i class="fw fw-right-arrow fw-stack-1x"></i>
</span> </span>
Arduino will publish it's internal temperature to WSO2-IoT-Server Arduino will publish it's internal temperature to WSO2-IoT-Server
<br/><br/> <br/><br/>
<span class="fw-stack fw-lg margin-right"> <span class="fw-stack margin-right">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>
<i class="fw fw-right-arrow fw-stack-1x"></i> <i class="fw fw-right-arrow fw-stack-1x"></i>
</span> </span>
@ -256,36 +256,38 @@
</div> </div>
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 padding-double"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 padding-double">
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 padding-double"> <div class="row">
<h3 class="uppercase">Try Out</h3> <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 padding-double">
<hr> <h3 class="uppercase">Try Out</h3>
<ul class="list-unstyled"> <hr>
<li class="padding-top-double"> <ul class="list-unstyled">
<span class="circle">01</span> <li class="padding-top-double">
You can view all your connected devices at <span class="badge">01</span>
<a href="{{@app.context}}/devices">[Device Management]</a> page. You can view all your connected devices at
</li> <a href="{{@app.context}}/devices">[Device Management]</a> page.
<li class="padding-top-double"> </li>
<span class="circle">02</span> <li class="padding-top-double">
Select one of connected devices and check for available control <span class="badge">02</span>
operations and monitor Real-Time data. Select one of connected devices and check for available control
</li> operations and monitor Real-Time data.
<li class="padding-top-double"> </li>
<span class="circle">03</span> <li class="padding-top-double">
You can also view analytics of the data published to IoT-Server by <span class="badge">03</span>
navigating to Device Analytics page. You can also view analytics of the data published to IoT-Server by
</li> navigating to Device Analytics page.
</ul> </li>
<br/> </ul>
</div> <br/>
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 padding-double"> </div>
<p class="grey margin-top">Click on the image to zoom</p> <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 padding-double">
<center> <p class="grey margin-top">Click on the image to zoom</p>
<a href="{{@unit.publicUri}}/images/myDevices_analytics.png" target="_blank"> <center>
<img src="{{@unit.publicUri}}/images/myDevices_analytics.png" <a href="{{@unit.publicUri}}/images/myDevices_analytics.png" target="_blank">
class="img-responsive"> <img src="{{@unit.publicUri}}/images/myDevices_analytics.png"
</a> class="img-responsive">
</center> </a>
</center>
</div>
</div> </div>
</div> </div>

View File

@ -192,31 +192,31 @@
<hr> <hr>
<ul class="list-unstyled"> <ul class="list-unstyled">
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">01</span> <span class="badge">01</span>
Connect RaspberryPi, DHT11 Temperature sensor and LED as per the Connect RaspberryPi, DHT11 Temperature sensor and LED as per the
schematic below. schematic below.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">02</span> <span class="badge">02</span>
Ensure your RaspberryPi Board can connect to Internet. Ensure your RaspberryPi Board can connect to Internet.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">03</span> <span class="badge">03</span>
Download RaspberryPi Agent via [Download Agent] button above. Download RaspberryPi Agent via [Download Agent] button above.
(Alternatively you can use the "curl" command to directly download the Agent to your (Alternatively you can use the "curl" command to directly download the Agent to your
RaspberryPi.) RaspberryPi.)
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">04</span> <span class="badge">04</span>
Copy downloaded Agent into your RaspberryPi. Copy downloaded Agent into your RaspberryPi.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">05</span> <span class="badge">05</span>
Unzip the downloaded Agent and start terminal to run below commands. Unzip the downloaded Agent and start terminal to run below commands.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="fw-stack fw-lg margin-right"> <span class="fw-stack margin-right">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>
<i class="fw fw-right-arrow fw-stack-1x"></i> <i class="fw fw-right-arrow fw-stack-1x"></i>
</span> </span>
@ -225,7 +225,7 @@
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="fw-stack fw-lg margin-right"> <span class="fw-stack margin-right">
<i class="fw fw-ring fw-stack-2x"></i> <i class="fw fw-ring fw-stack-2x"></i>
<i class="fw fw-right-arrow fw-stack-1x"></i> <i class="fw fw-right-arrow fw-stack-1x"></i>
</span> </span>
@ -251,17 +251,17 @@
<hr> <hr>
<ul class="list-unstyled"> <ul class="list-unstyled">
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">01</span> <span class="badge">01</span>
You can view all your connected devices at You can view all your connected devices at
<a href="{{@app.context}}/devices">[Device Management]</a> page. <a href="{{@app.context}}/devices">[Device Management]</a> page.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">02</span> <span class="badge">02</span>
Select one of connected devices and check for available control Select one of connected devices and check for available control
operations and monitor Real-Time data. operations and monitor Real-Time data.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">03</span> <span class="badge">03</span>
You can also view analytics of the data published to IoT-Server by You can also view analytics of the data published to IoT-Server by
navigating to Device Analytics page. navigating to Device Analytics page.
</li> </li>

View File

@ -205,19 +205,15 @@
<hr> <hr>
<ul class="list-unstyled"> <ul class="list-unstyled">
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">01</span> <span class="badge">01</span>
Download your VirtualFireAlarm using [Download Agent] button above.
</li>
<li class="padding-top-double">
<span class="circle">02</span>
Unzip the downloaded Agent. Unzip the downloaded Agent.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">03</span> <span class="badge">02</span>
Move into the unzipped Agent folder in the terminal. Move into the unzipped Agent folder in the terminal.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">04</span> <span class="badge">03</span>
Unzip the downloaded Agent and start terminal to run this command: [sh Unzip the downloaded Agent and start terminal to run this command: [sh
start-device.sh] start-device.sh]
</li> </li>
@ -240,17 +236,17 @@
<hr> <hr>
<ul class="list-unstyled"> <ul class="list-unstyled">
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">01</span> <span class="badge">01</span>
You can view all your connected devices at You can view all your connected devices at
<a href="{{@app.context}}/devices">[Device Management]</a> page. <a href="{{@app.context}}/devices">[Device Management]</a> page.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">02</span> <span class="badge">02</span>
Select one of connected devices and check for available control Select one of connected devices and check for available control
operations and monitor Real-Time data. operations and monitor Real-Time data.
</li> </li>
<li class="padding-top-double"> <li class="padding-top-double">
<span class="circle">03</span> <span class="badge">03</span>
You can also view analytics of the data published to IoT-Server by You can also view analytics of the data published to IoT-Server by
navigating to Device Analytics page. navigating to Device Analytics page.
</li> </li>

View File

@ -76,6 +76,7 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
.target(ApiApplicationRegistrationService.class, .target(ApiApplicationRegistrationService.class,
deviceMgtServerUrl + API_APPLICATION_REGISTRATION_CONTEXT); deviceMgtServerUrl + API_APPLICATION_REGISTRATION_CONTEXT);
} }
@Override @Override
public void apply(RequestTemplate template) { public void apply(RequestTemplate template) {
if (tokenInfo == null) { if (tokenInfo == null) {
@ -95,9 +96,11 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
tokenInfo = tokenIssuerService.getToken(PASSWORD_GRANT_TYPE, username, password); tokenInfo = tokenIssuerService.getToken(PASSWORD_GRANT_TYPE, username, password);
tokenInfo.setExpires_in(System.currentTimeMillis() + tokenInfo.getExpires_in()); tokenInfo.setExpires_in(System.currentTimeMillis() + tokenInfo.getExpires_in());
} }
if (System.currentTimeMillis() + refreshTimeOffset > tokenInfo.getExpires_in()) { synchronized(tokenInfo) {
tokenInfo = tokenIssuerService.getToken(REFRESH_GRANT_TYPE, tokenInfo.getRefresh_token()); if (System.currentTimeMillis() + refreshTimeOffset > tokenInfo.getExpires_in()) {
tokenInfo.setExpires_in(System.currentTimeMillis() + tokenInfo.getExpires_in()); tokenInfo = tokenIssuerService.getToken(REFRESH_GRANT_TYPE, tokenInfo.getRefresh_token());
tokenInfo.setExpires_in(System.currentTimeMillis() + tokenInfo.getExpires_in());
}
} }
String headerValue = "Bearer " + tokenInfo.getAccess_token(); String headerValue = "Bearer " + tokenInfo.getAccess_token();
template.header("Authorization", headerValue); template.header("Authorization", headerValue);

View File

@ -37,6 +37,26 @@
<br/><br/> <br/><br/>
</div> </div>
<div class="col-xs-12 col-sm-12 col-md-8 col-lg-12 padding-double grey-bg">
<h3 class="uppercase">Prepare</h3><hr>
<ul class="list-unstyled">
<li class="padding-top-double"><span class="badge">01</span> Download Device Agent into your Android Mobile.</li>
<li><span class="badge">02</span> Install Agent APK file.</li>
<li><span class="badge">03</span> Configure Agent App</li>
</ul>
<br>
</div>
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 padding-double">
<p class="grey margin-top">Click on the image to zoom</p>
<center>
<a href="{{@unit.publicUri}}/images/android_device.png" target="_blank">
<img src="{{@unit.publicUri}}/images/android_device.png" class="img-responsive">
</a>
</center>
</div>
<br/> <br/>
{{#zone "topCss"}} {{#zone "topCss"}}
@ -45,4 +65,4 @@
{{#zone "bottomJs"}} {{#zone "bottomJs"}}
{{js "js/type-view.js"}} {{js "js/type-view.js"}}
{{/zone}} {{/zone}}