From 9623fb294a1b6f71436bd2bf7f081916fecf4a29 Mon Sep 17 00:00:00 2001 From: charitha Date: Fri, 6 Jul 2018 22:40:07 +0530 Subject: [PATCH 1/9] Fixed build issue due to okhttp --- .../pom.xml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.client/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.client/pom.xml index 2feaadeb14..64a849c767 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.client/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.client/pom.xml @@ -72,13 +72,18 @@ javax.xml, org.wso2.carbon.base, javax.net.ssl, - feign.okhttp; version=${github.openfeign.version}, - okhttp3, - org.apache.commons.lang + org.apache.commons.lang, + android.util;resolution:=optional, + javax.annotation;resolution:=optional, + javax.net;resolution:=optional, + javax.security.auth.x500;resolution:=optional, + okio;resolution:=optional, jsr311-api, - feign-jaxrs + feign-jaxrs, + feign-okhttp, + okhttp From bccb88ab22dac0912f9099a83ec85a99922872aa Mon Sep 17 00:00:00 2001 From: charitha Date: Sat, 7 Jul 2018 09:23:44 +0530 Subject: [PATCH 2/9] Fixed build issue due to okio --- .../org.wso2.carbon.apimgt.integration.client/pom.xml | 10 ++++++++-- pom.xml | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.client/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.client/pom.xml index 64a849c767..1ce1b4df31 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.client/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.client/pom.xml @@ -77,13 +77,15 @@ javax.annotation;resolution:=optional, javax.net;resolution:=optional, javax.security.auth.x500;resolution:=optional, - okio;resolution:=optional, + javax.crypto;resolution:=optional, + javax.crypto.spec;resolution:=optional jsr311-api, feign-jaxrs, feign-okhttp, - okhttp + okhttp, + okio @@ -122,6 +124,10 @@ com.squareup.okhttp3 okhttp + + com.squareup.okio + okio + io.github.openfeign feign-okhttp diff --git a/pom.xml b/pom.xml index d7c50f7fae..69b843008a 100644 --- a/pom.xml +++ b/pom.xml @@ -1243,6 +1243,11 @@ okhttp ${squareup.okhttp3.version} + + com.squareup.okio + okio + ${okio.version} + io.github.openfeign feign-okhttp @@ -1982,6 +1987,7 @@ 1.3 2.3.1 3.8.1 + 1.13.0 9.3.1 1.1.1 1.2 From 2bfd598c67e9b62c8c25e67a972ebc1225448fc2 Mon Sep 17 00:00:00 2001 From: charitha Date: Wed, 11 Jul 2018 10:28:14 +0530 Subject: [PATCH 3/9] Add location extraction from device properties and deice type specific location retrieval --- .../service/api/GeoLocationBasedService.java | 4 ++ .../impl/GeoLocationBasedServiceImpl.java | 3 +- .../impl/GeoLocationBasedServiceImplTest.java | 9 ++-- .../carbon/device/mgt/core/dao/DeviceDAO.java | 10 ++-- .../core/dao/impl/AbstractDeviceDAOImpl.java | 12 +++-- .../DeviceManagementProviderService.java | 2 +- .../DeviceManagementProviderServiceImpl.java | 49 +++++++++++++++++-- .../impl/GeoLocationBasedServiceImpl.java | 2 +- .../impl/GeoLocationBasedServiceImplTest.java | 5 +- 9 files changed, 74 insertions(+), 22 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GeoLocationBasedService.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GeoLocationBasedService.java index aa84f83071..0fbe424cdf 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GeoLocationBasedService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GeoLocationBasedService.java @@ -198,6 +198,10 @@ public interface GeoLocationBasedService { response = Response.class) }) Response getGeoDeviceLocations( + @ApiParam( + name = "deviceType", + value = "Optional Device type name.") + @QueryParam("deviceType") String deviceType, @ApiParam( name = "minLat", value = "Define the minimum latitude of the geofence.", diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java index 89f7c1aa7a..7244f00587 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java @@ -125,6 +125,7 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { @Consumes("application/json") @Produces("application/json") public Response getGeoDeviceLocations( + @QueryParam("deviceType") String deviceType, @QueryParam("minLat") double minLat, @QueryParam("maxLat") double maxLat, @QueryParam("minLong") double minLong, @@ -138,7 +139,7 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { DeviceManagementProviderService deviceManagementService = DeviceMgtAPIUtils.getDeviceManagementService(); List geoClusters; try { - geoClusters = deviceManagementService.findGeoClusters(southWest, northEast, geohashLength); + geoClusters = deviceManagementService.findGeoClusters(deviceType, southWest, northEast, geohashLength); } catch (DeviceManagementException e) { String msg = "Error occurred while retrieving geo clusters "; log.error(msg, e); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java index ebd20ecbfe..b655b1095e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java @@ -1,6 +1,5 @@ package org.wso2.carbon.device.mgt.jaxrs.service.impl; - import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.BeforeClass; @@ -33,8 +32,8 @@ public class GeoLocationBasedServiceImplTest { "in the given map boundaries") public void testGetGeoDeviceLocations1() throws DeviceManagementException { Mockito.doReturn(new ArrayList()).when(deviceManagementProviderService) - .findGeoClusters(Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); - Response response = geoLocationBasedService.getGeoDeviceLocations(0.4, 15, 75.6, + .findGeoClusters(null, Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); + Response response = geoLocationBasedService.getGeoDeviceLocations(null, 0.4, 15, 75.6, 90.1, 6); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(), "getGeoDeviceLocations request failed with valid parameters"); @@ -51,8 +50,8 @@ public class GeoLocationBasedServiceImplTest { new GeoCoordinate(9.8, 84.7), new GeoCoordinate(11.1, 88.1), 4, "t1gd", "swerty12s", "android", "1234")); Mockito.doReturn(geoClusters).when(deviceManagementProviderService) - .findGeoClusters(Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); - Response response = geoLocationBasedService.getGeoDeviceLocations(0.4, 15, 75.6, + .findGeoClusters(null, Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); + Response response = geoLocationBasedService.getGeoDeviceLocations(null, 0.4, 15, 75.6, 90.1, 6); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(), "getGeoDeviceLocations request failed with valid parameters"); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceDAO.java index b4247966f9..b1f2ffb043 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/DeviceDAO.java @@ -402,11 +402,13 @@ public interface DeviceDAO { * This method is used to retrieve the details of geoclusters formed relatively to the zoom level and map * boundaries. * - * @param southWest the coordinates of southWest corner of the map. - * @param northEast the coordinates of northEast corner of the map. - * @param tenantId tenant id. + * @param deviceType Optional device type name. + * @param southWest the coordinates of southWest corner of the map. + * @param northEast the coordinates of northEast corner of the map. + * @param tenantId tenant id. * @return returns a list of enrolment info objects. */ - List findGeoClusters(GeoCoordinate southWest, GeoCoordinate northEast, int geohashLength,int tenantId) throws DeviceManagementDAOException; + List findGeoClusters(String deviceType, GeoCoordinate southWest, GeoCoordinate northEast, + int geohashLength,int tenantId) throws DeviceManagementDAOException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java index 0e97c24d8b..2d0d877c03 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/AbstractDeviceDAOImpl.java @@ -1062,7 +1062,7 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { return tenants; } - public List findGeoClusters(GeoCoordinate southWest, GeoCoordinate northEast, + public List findGeoClusters(String deviceType, GeoCoordinate southWest, GeoCoordinate northEast, int geohashLength, int tenantId) throws DeviceManagementDAOException { Connection conn; PreparedStatement stmt = null; @@ -1082,8 +1082,11 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { "WHERE DEVICE_LOCATION.LATITUDE BETWEEN ? AND ? AND " + "DEVICE_LOCATION.LONGITUDE BETWEEN ? AND ? AND " + "DEVICE.TENANT_ID=? AND " + - "DEVICE.ID=DEVICE_LOCATION.DEVICE_ID AND DEVICE.DEVICE_TYPE_ID=DEVICE_TYPE.ID" + - " GROUP BY GEOHASH_PREFIX"; + "DEVICE.ID=DEVICE_LOCATION.DEVICE_ID AND DEVICE.DEVICE_TYPE_ID=DEVICE_TYPE.ID"; + if (deviceType != null && !deviceType.isEmpty()) { + sql += " AND DEVICE_TYPE.NAME=?"; + } + sql += " GROUP BY GEOHASH_PREFIX"; stmt = conn.prepareStatement(sql); stmt.setInt(1, geohashLength); stmt.setDouble(2, southWest.getLatitude()); @@ -1091,6 +1094,9 @@ public abstract class AbstractDeviceDAOImpl implements DeviceDAO { stmt.setDouble(4, southWest.getLongitude()); stmt.setDouble(5, northEast.getLongitude()); stmt.setDouble(6,tenantId); + if (deviceType != null && !deviceType.isEmpty()) { + stmt.setString(7, deviceType); + } rs = stmt.executeQuery(); while (rs.next()) { double latitude = rs.getDouble("LATITUDE"); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java index 864b962528..7117b9bd18 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderService.java @@ -625,6 +625,6 @@ public interface DeviceManagementProviderService { List getDeviceEnrolledTenants() throws DeviceManagementException; - List findGeoClusters(GeoCoordinate southWest, GeoCoordinate northEast, + List findGeoClusters(String deviceType, GeoCoordinate southWest, GeoCoordinate northEast, int geohashLength) throws DeviceManagementException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java index 798b9b74de..e87711e7ab 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java @@ -67,8 +67,10 @@ import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.DeviceManagementDAOFactory; import org.wso2.carbon.device.mgt.core.dao.DeviceTypeDAO; import org.wso2.carbon.device.mgt.core.dao.EnrollmentDAO; +import org.wso2.carbon.device.mgt.core.device.details.mgt.DeviceInformationManager; import org.wso2.carbon.device.mgt.core.device.details.mgt.dao.DeviceDetailsDAO; import org.wso2.carbon.device.mgt.core.device.details.mgt.dao.DeviceDetailsMgtDAOException; +import org.wso2.carbon.device.mgt.core.device.details.mgt.impl.DeviceInformationManagerImpl; import org.wso2.carbon.device.mgt.core.dto.DeviceType; import org.wso2.carbon.device.mgt.core.dto.DeviceTypeServiceIdentifier; import org.wso2.carbon.device.mgt.core.geo.GeoCluster; @@ -297,10 +299,10 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv addDeviceToGroups(deviceIdentifier, device.getEnrolmentInfo().getOwnership()); addInitialOperations(deviceIdentifier, device.getType()); } + extractDeviceLocationToUpdate(device); return status; } - @Override public boolean modifyEnrollment(Device device) throws DeviceManagementException { if (device == null) { @@ -352,6 +354,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv } finally { DeviceManagementDAOFactory.closeConnection(); } + extractDeviceLocationToUpdate(device); return status; } @@ -2614,13 +2617,18 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv } @Override - public List findGeoClusters(GeoCoordinate southWest, GeoCoordinate northEast, int geohashLength) throws DeviceManagementException { + public List findGeoClusters(String deviceType, GeoCoordinate southWest, GeoCoordinate northEast, + int geohashLength) throws DeviceManagementException { if (log.isDebugEnabled()) { - log.debug("get information about geo clusters"); + if (deviceType == null || deviceType.isEmpty()) { + log.debug("get information about geo clusters."); + } else { + log.debug("get information about geo clusters for device type: " + deviceType); + } } try { DeviceManagementDAOFactory.openConnection(); - return deviceDAO.findGeoClusters(southWest, northEast, geohashLength, this.getTenantId()); + return deviceDAO.findGeoClusters(deviceType, southWest, northEast, geohashLength, this.getTenantId()); } catch (DeviceManagementDAOException e) { String msg = "Error occurred while retrieving the geo clusters."; log.error(msg, e); @@ -2637,4 +2645,37 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv DeviceManagementDAOFactory.closeConnection(); } } + + private void extractDeviceLocationToUpdate(Device device) { + List properties = device.getProperties(); + if (properties != null) { + String latitude = null; + String longitude = null; + for (Device.Property p : properties) { + if (p.getName().equalsIgnoreCase("latitude")) { + latitude = p.getValue(); + } + if (p.getName().equalsIgnoreCase("longitude")) { + longitude = p.getValue(); + } + } + if (latitude != null && longitude != null && !latitude.isEmpty() && !longitude.isEmpty()) { + DeviceLocation deviceLocation = new DeviceLocation(); + deviceLocation.setDeviceId(device.getId()); + deviceLocation.setDeviceIdentifier(new DeviceIdentifier(device.getDeviceIdentifier(), + device.getType())); + try { + deviceLocation.setLatitude(Double.parseDouble(latitude)); + deviceLocation.setLongitude(Double.parseDouble(longitude)); + DeviceInformationManager deviceInformationManager = new DeviceInformationManagerImpl(); + deviceInformationManager.addDeviceLocation(deviceLocation); + } catch (Exception e) { + //We are not failing the execution since this is not critical for the functionality. But logging as + // an error for reference. + log.error("Exception occurred while trying to add device location.", e); + } + } + } + } + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java index 34fbaae517..7c865b9778 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java @@ -138,7 +138,7 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { DeviceManagementProviderService deviceManagementService = DeviceMgtAPIUtils.getDeviceManagementService(); List geoClusters; try { - geoClusters = deviceManagementService.findGeoClusters(southWest, northEast, geohashLength); + geoClusters = deviceManagementService.findGeoClusters(null, southWest, northEast, geohashLength); } catch (DeviceManagementException e) { String msg = "Error occurred while retrieving geo clusters "; log.error(msg, e); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java index 0d33938c09..d320a626b4 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java @@ -19,7 +19,6 @@ package org.wso2.carbon.device.mgt.jaxrs.service.impl; - import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.BeforeClass; @@ -52,7 +51,7 @@ public class GeoLocationBasedServiceImplTest { "in the given map boundaries") public void testGetGeoDeviceLocations1() throws DeviceManagementException { Mockito.doReturn(new ArrayList()).when(deviceManagementProviderService) - .findGeoClusters(Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); + .findGeoClusters(null, Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); Response response = geoLocationBasedService.getGeoDeviceLocations(0.4, 15, 75.6, 90.1, 6); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(), @@ -70,7 +69,7 @@ public class GeoLocationBasedServiceImplTest { new GeoCoordinate(9.8, 84.7), new GeoCoordinate(11.1, 88.1), 4, "t1gd", "swerty12s", "android", "1234")); Mockito.doReturn(geoClusters).when(deviceManagementProviderService) - .findGeoClusters(Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); + .findGeoClusters(null,Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); Response response = geoLocationBasedService.getGeoDeviceLocations(0.4, 15, 75.6, 90.1, 6); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(), From ead01f837d7e7360cba92ac37d0730b37012c2ab Mon Sep 17 00:00:00 2001 From: charitha Date: Thu, 26 Jul 2018 12:23:47 +0530 Subject: [PATCH 4/9] Fixed issue in Geo fencing --- .../impl/GeoLocationBasedServiceImpl.java | 99 ++- .../mgt/common/DeviceManagementConstants.java | 2 +- .../service/GeoLocationProviderService.java | 18 +- .../GeoLocationProviderServiceImpl.java | 81 ++- .../GeoLocationProviderServiceTest.java | 72 +-- .../cdmf.unit.geo-dashboard/geo-dashboard.hbs | 2 +- .../public/js/websocket.js | 2 +- .../cdmf.unit.geo-devices/geo-devices.hbs | 71 +-- .../public/js/websocket.js | 32 +- .../service/api/GeoLocationBasedService.java | 550 ----------------- .../impl/GeoLocationBasedServiceImpl.java | 565 ------------------ .../src/main/webapp/WEB-INF/cxf-servlet.xml | 2 - .../impl/GeoLocationBasedServiceImplTest.java | 78 --- 13 files changed, 175 insertions(+), 1399 deletions(-) delete mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GeoLocationBasedService.java delete mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java delete mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java index 7244f00587..a8811e5418 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java @@ -29,6 +29,7 @@ import org.wso2.carbon.analytics.dataservice.commons.SortType; import org.wso2.carbon.analytics.datasource.commons.Record; import org.wso2.carbon.analytics.datasource.commons.exception.AnalyticsException; import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementConstants.GeoServices; import org.wso2.carbon.device.mgt.common.DeviceManagementException; @@ -163,17 +164,20 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); } - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - DeviceIdentifier identifier = new DeviceIdentifier(); identifier.setId(deviceId); identifier.setType(deviceType); + Device device = DeviceMgtAPIUtils.getDeviceManagementService().getDevice(identifier, false); + if (device == null || device.getEnrolmentInfo() == null) { + if (log.isDebugEnabled()) { + log.debug("Device not found: " + identifier.toString()); + } + return Response.status(Response.Status.NOT_FOUND.getStatusCode()).build(); + } + GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - geoService.createGeoAlert(alert, identifier, alertType); + geoService.createGeoAlert(alert, identifier, alertType, device.getEnrolmentInfo().getOwner()); return Response.ok().build(); } catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) { String error = "Error occurred while creating the geo alert for " + deviceType + " with id: " + deviceId; @@ -181,7 +185,12 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); } catch (AlertAlreadyExistException e) { String error = "A geo alert with this name already exists."; - log.error(error,e); + log.error(error, e); + return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); + } catch (DeviceManagementException e) { + String error = "Error occurred while retrieving the device enrollment info of " + + deviceType + " with id: " + deviceId; + log.error(error, e); return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); } } @@ -202,7 +211,7 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); } catch (AlertAlreadyExistException e) { String error = "A geo alert with this name already exists."; - log.error(error,e); + log.error(error, e); return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); } } @@ -222,17 +231,20 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); } - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - DeviceIdentifier identifier = new DeviceIdentifier(); identifier.setId(deviceId); identifier.setType(deviceType); + Device device = DeviceMgtAPIUtils.getDeviceManagementService().getDevice(identifier, false); + if (device == null || device.getEnrolmentInfo() == null) { + if (log.isDebugEnabled()) { + log.debug("Device not found: " + identifier.toString()); + } + return Response.status(Response.Status.NOT_FOUND.getStatusCode()).build(); + } + GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - geoService.updateGeoAlert(alert, identifier, alertType); + geoService.updateGeoAlert(alert, identifier, alertType, device.getEnrolmentInfo().getOwner()); return Response.ok().build(); } catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) { String error = "Error occurred while creating the geo alert for " + deviceType + " with id: " + deviceId; @@ -240,7 +252,12 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); } catch (AlertAlreadyExistException e) { String error = "A geo alert with this name already exists."; - log.error(error,e); + log.error(error, e); + return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); + } catch (DeviceManagementException e) { + String error = "Error occurred while retrieving the device enrollment info of " + + deviceType + " with id: " + deviceId; + log.error(error, e); return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); } } @@ -260,7 +277,7 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); } catch (AlertAlreadyExistException e) { String error = "A geo alert with this name already exists."; - log.error(error,e); + log.error(error, e); return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); } } @@ -280,22 +297,30 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); } - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - DeviceIdentifier identifier = new DeviceIdentifier(); identifier.setId(deviceId); identifier.setType(deviceType); + Device device = DeviceMgtAPIUtils.getDeviceManagementService().getDevice(identifier, false); + if (device == null || device.getEnrolmentInfo() == null) { + if (log.isDebugEnabled()) { + log.debug("Device not found: " + identifier.toString()); + } + return Response.status(Response.Status.NOT_FOUND.getStatusCode()).build(); + } + GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - geoService.removeGeoAlert(alertType, identifier, queryName); + geoService.removeGeoAlert(alertType, identifier, queryName, device.getEnrolmentInfo().getOwner()); return Response.ok().build(); } catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) { String error = "Error occurred while removing the geo alert for " + deviceType + " with id: " + deviceId; log.error(error, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); + } catch (DeviceManagementException e) { + String error = "Error occurred while retrieving the device enrollment info of " + + deviceType + " with id: " + deviceId; + log.error(error, e); + return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); } } @@ -329,34 +354,37 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); } - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - DeviceIdentifier identifier = new DeviceIdentifier(); identifier.setId(deviceId); identifier.setType(deviceType); + Device device = DeviceMgtAPIUtils.getDeviceManagementService().getDevice(identifier, false); + if (device == null || device.getEnrolmentInfo() == null) { + if (log.isDebugEnabled()) { + log.debug("Device not found: " + identifier.toString()); + } + return Response.status(Response.Status.NOT_FOUND.getStatusCode()).build(); + } + GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); if (GeoServices.ALERT_TYPE_WITHIN.equals(alertType)) { - List alerts = geoService.getWithinAlerts(identifier); + List alerts = geoService.getWithinAlerts(identifier, device.getEnrolmentInfo().getOwner()); return Response.ok().entity(alerts).build(); } else if (GeoServices.ALERT_TYPE_EXIT.equals(alertType)) { - List alerts = geoService.getExitAlerts(identifier); + List alerts = geoService.getExitAlerts(identifier, device.getEnrolmentInfo().getOwner()); return Response.ok().entity(alerts).build(); } else if (GeoServices.ALERT_TYPE_SPEED.equals(alertType)) { - String result = geoService.getSpeedAlerts(identifier); + String result = geoService.getSpeedAlerts(identifier, device.getEnrolmentInfo().getOwner()); return Response.ok().entity(result).build(); } else if (GeoServices.ALERT_TYPE_PROXIMITY.equals(alertType)) { - String result = geoService.getProximityAlerts(identifier); + String result = geoService.getProximityAlerts(identifier, device.getEnrolmentInfo().getOwner()); return Response.ok().entity(result).build(); } else if (GeoServices.ALERT_TYPE_STATIONARY.equals(alertType)) { - List alerts = geoService.getStationaryAlerts(identifier); + List alerts = geoService.getStationaryAlerts(identifier, device.getEnrolmentInfo().getOwner()); return Response.ok().entity(alerts).build(); } else if (GeoServices.ALERT_TYPE_TRAFFIC.equals(alertType)) { - List alerts = geoService.getTrafficAlerts(identifier); + List alerts = geoService.getTrafficAlerts(identifier, device.getEnrolmentInfo().getOwner()); return Response.ok().entity(alerts).build(); } return null; @@ -364,6 +392,11 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { String error = "Error occurred while getting the geo alerts for " + deviceType + " with id: " + deviceId; log.error(error, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); + } catch (DeviceManagementException e) { + String error = "Error occurred while retrieving the device enrollment info of " + + deviceType + " with id: " + deviceId; + log.error(error, e); + return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceManagementConstants.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceManagementConstants.java index 3aa85254f8..e5b1183673 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceManagementConstants.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceManagementConstants.java @@ -105,7 +105,7 @@ public final class DeviceManagementConstants { public static final String ALERT_TYPE_PROXIMITY = "Proximity"; public static final String ALERT_TYPE_STATIONARY = "Stationery"; public static final String ALERT_TYPE_TRAFFIC = "Traffic"; - public static final String REGISTRY_PATH_FOR_ALERTS = "/_system/governance/geo/alerts/"; + public static final String REGISTRY_PATH_FOR_ALERTS = "/geo/alerts/"; public static final String PROXIMITY_DISTANCE = "proximityDistance"; public static final String PROXIMITY_TIME = "proximityTime"; public static final String STATIONARY_NAME = "stationeryName"; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/geo/service/GeoLocationProviderService.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/geo/service/GeoLocationProviderService.java index 92bd4e0d2f..f58fb8d0c6 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/geo/service/GeoLocationProviderService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/geo/service/GeoLocationProviderService.java @@ -28,45 +28,45 @@ import java.util.List; */ public interface GeoLocationProviderService { - List getWithinAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException; + List getWithinAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException; List getWithinAlerts() throws GeoLocationBasedServiceException; - List getExitAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException; + List getExitAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException; List getExitAlerts() throws GeoLocationBasedServiceException; - boolean createGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType) + boolean createGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType, String owner) throws GeoLocationBasedServiceException, AlertAlreadyExistException; boolean createGeoAlert(Alert alert, String alertType) throws GeoLocationBasedServiceException,AlertAlreadyExistException; - boolean updateGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType) + boolean updateGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType, String owner) throws GeoLocationBasedServiceException, AlertAlreadyExistException; boolean updateGeoAlert(Alert alert, String alertType) throws GeoLocationBasedServiceException,AlertAlreadyExistException; - boolean removeGeoAlert(String alertType, DeviceIdentifier identifier, String queryName) + boolean removeGeoAlert(String alertType, DeviceIdentifier identifier, String queryName, String owner) throws GeoLocationBasedServiceException; boolean removeGeoAlert(String alertType, String queryName) throws GeoLocationBasedServiceException; - String getSpeedAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException; + String getSpeedAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException; String getSpeedAlerts() throws GeoLocationBasedServiceException; - String getProximityAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException; + String getProximityAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException; String getProximityAlerts() throws GeoLocationBasedServiceException; - List getStationaryAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException; + List getStationaryAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException; List getStationaryAlerts() throws GeoLocationBasedServiceException; - List getTrafficAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException; + List getTrafficAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException; List getTrafficAlerts() throws GeoLocationBasedServiceException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java index 6be4f67488..1fd4700b39 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java @@ -55,7 +55,6 @@ import org.wso2.carbon.registry.api.Resource; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; -import javax.persistence.EntityExistsException; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -114,16 +113,16 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic private static final String SSLV3 = "SSLv3"; @Override - public List getWithinAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException { + public List getWithinAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException { Registry registry = getGovernanceRegistry(); String registryPath = GeoServices.REGISTRY_PATH_FOR_ALERTS + - GeoServices.ALERT_TYPE_WITHIN + "/" + identifier.getId() + "/"; + GeoServices.ALERT_TYPE_WITHIN + "/" + owner + "/" + identifier.getId() + "/"; Resource resource; try { resource = registry.get(registryPath); } catch (RegistryException e) { - log.error("Error while reading the registry path: " + registryPath); + log.error("Error while reading the registry path: " + registryPath + ". Error: " + e.getMessage()); return null; } @@ -171,7 +170,7 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic try { resource = registry.get(registryPath); } catch (RegistryException e) { - log.error("Error while reading the registry path: " + registryPath); + log.error("Error while reading the registry path: " + registryPath + ". Error: " + e.getMessage()); return Collections.emptyList(); } @@ -209,16 +208,16 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } @Override - public List getExitAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException { + public List getExitAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException { Registry registry = getGovernanceRegistry(); String registryPath = GeoServices.REGISTRY_PATH_FOR_ALERTS + - GeoServices.ALERT_TYPE_EXIT + "/" + identifier.getId() + "/"; + GeoServices.ALERT_TYPE_EXIT + "/" + owner + "/" + identifier.getId() + "/"; Resource resource; try { resource = registry.get(registryPath); } catch (RegistryException e) { - log.error("Error while reading the registry path: " + registryPath); + log.error("Error while reading the registry path: " + registryPath + ". Error: " + e.getMessage()); return null; } @@ -266,7 +265,7 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic try { resource = registry.get(registryPath); } catch (RegistryException e) { - log.error("Error while reading the registry path: " + registryPath); + log.error("Error while reading the registry path: " + registryPath + ". Error: " + e.getMessage()); return Collections.emptyList(); } @@ -304,9 +303,9 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } @Override - public boolean createGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType) + public boolean createGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType, String owner) throws GeoLocationBasedServiceException, AlertAlreadyExistException { - return saveGeoAlert(alert, identifier, alertType, false); + return saveGeoAlert(alert, identifier, alertType, false, owner); } @Override @@ -316,9 +315,9 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } @Override - public boolean updateGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType) + public boolean updateGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType, String owner) throws GeoLocationBasedServiceException, AlertAlreadyExistException { - return saveGeoAlert(alert, identifier, alertType, true); + return saveGeoAlert(alert, identifier, alertType, true, owner); } @Override @@ -327,7 +326,7 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic return saveGeoAlert(alert, alertType, true); } - public boolean saveGeoAlert(Alert alert, String alertType, boolean isUpdate) + private boolean saveGeoAlert(Alert alert, String alertType, boolean isUpdate) throws GeoLocationBasedServiceException,AlertAlreadyExistException { Type type = new TypeToken>() { @@ -434,7 +433,7 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } - public boolean saveGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType, boolean isUpdate) + private boolean saveGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType, boolean isUpdate, String owner) throws GeoLocationBasedServiceException, AlertAlreadyExistException { Type type = new TypeToken>() { @@ -483,8 +482,7 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic try { ExecutionPlanConfigurationDto[] allActiveExecutionPlanConfigs = null; String activeExecutionPlan = null; - String executionPlanName = getExecutionPlanName(alertType, alert.getQueryName(), - identifier.getId()); + String executionPlanName = getExecutionPlanName(alertType, alert.getQueryName(), identifier.getId(), owner); eventprocessorStub = getEventProcessorAdminServiceStub(); String parsedTemplate = parseTemplate(alertType, parseMap); String validationResponse = eventprocessorStub.validateExecutionPlan(parsedTemplate); @@ -507,7 +505,7 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic + executionPlanName); } } - updateRegistry(getRegistryPath(alertType, identifier, alert.getQueryName()), identifier, content, + updateRegistry(getRegistryPath(alertType, identifier, alert.getQueryName(), owner), identifier, content, options); eventprocessorStub.deployExecutionPlan(parsedTemplate); } @@ -545,27 +543,27 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } } - private String getRegistryPath(String alertType, DeviceIdentifier identifier, String queryName) + private String getRegistryPath(String alertType, DeviceIdentifier identifier, String queryName, String owner) throws GeoLocationBasedServiceException { String path = ""; if (GeoServices.ALERT_TYPE_WITHIN.equals(alertType)) { path = GeoServices.REGISTRY_PATH_FOR_ALERTS + GeoServices.ALERT_TYPE_WITHIN + - "/" + identifier.getId() + "/" + queryName; + "/" + owner + "/" + identifier.getId() + "/" + queryName; } else if (GeoServices.ALERT_TYPE_EXIT.equals(alertType)) { path = GeoServices.REGISTRY_PATH_FOR_ALERTS + GeoServices.ALERT_TYPE_EXIT + - "/" + identifier.getId() + "/" + queryName; + "/" + owner + "/" + identifier.getId() + "/" + queryName; } else if (GeoServices.ALERT_TYPE_SPEED.equals(alertType)) { path = GeoServices.REGISTRY_PATH_FOR_ALERTS + GeoServices.ALERT_TYPE_SPEED + - "/" + identifier.getId(); + "/" + owner + "/" + identifier.getId(); } else if (GeoServices.ALERT_TYPE_PROXIMITY.equals(alertType)) { path = GeoServices.REGISTRY_PATH_FOR_ALERTS + GeoServices.ALERT_TYPE_PROXIMITY + - "/" + identifier.getId() + "/" + queryName; + "/" + owner + "/" + identifier.getId() + "/" + queryName; } else if (GeoServices.ALERT_TYPE_STATIONARY.equals(alertType)) { path = GeoServices.REGISTRY_PATH_FOR_ALERTS + GeoServices.ALERT_TYPE_STATIONARY + - "/" + identifier.getId() + "/" + queryName; + "/" + owner + "/" + identifier.getId() + "/" + queryName; } else if (GeoServices.ALERT_TYPE_TRAFFIC.equals(alertType)) { path = GeoServices.REGISTRY_PATH_FOR_ALERTS + GeoServices.ALERT_TYPE_TRAFFIC + - "/" + identifier.getId() + "/" + queryName; + "/" + owner + "/" + identifier.getId() + "/" + queryName; } else { throw new GeoLocationBasedServiceException( "Unrecognized execution plan type: " + alertType); @@ -601,11 +599,11 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic return path; } - private String getExecutionPlanName(String alertType, String queryName, String deviceId) { + private String getExecutionPlanName(String alertType, String queryName, String deviceId, String owner) { if ("Traffic".equals(alertType)) { return "Geo-ExecutionPlan-Traffic_" + queryName + "_alert"; } else { - return "Geo-ExecutionPlan-" + alertType + "_" + queryName + "---_" + deviceId + "_alert"; + return "Geo-ExecutionPlan-" + alertType + "_" + queryName + "---_" + owner + "_" + deviceId + "_alert"; } } @@ -621,10 +619,10 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } @Override - public boolean removeGeoAlert(String alertType, DeviceIdentifier identifier, String queryName) + public boolean removeGeoAlert(String alertType, DeviceIdentifier identifier, String queryName, String owner) throws GeoLocationBasedServiceException { - removeFromRegistry(alertType, identifier, queryName); - String executionPlanName = getExecutionPlanName(alertType, queryName, identifier.getId()); + removeFromRegistry(alertType, identifier, queryName, owner); + String executionPlanName = getExecutionPlanName(alertType, queryName, identifier.getId(), owner); EventProcessorAdminServiceStub eventprocessorStub = null; try { eventprocessorStub = getEventProcessorAdminServiceStub(); @@ -674,11 +672,11 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } } - private void removeFromRegistry(String alertType, DeviceIdentifier identifier, String queryName) + private void removeFromRegistry(String alertType, DeviceIdentifier identifier, String queryName, String owner) throws GeoLocationBasedServiceException { String path = "unknown"; try { - path = getRegistryPath(alertType, identifier, queryName); + path = getRegistryPath(alertType, identifier, queryName, owner); getGovernanceRegistry().delete(path); } catch (RegistryException e) { throw new GeoLocationBasedServiceException( @@ -746,11 +744,11 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } @Override - public String getSpeedAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException { + public String getSpeedAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException { try { Registry registry = getGovernanceRegistry(); Resource resource = registry.get(GeoServices.REGISTRY_PATH_FOR_ALERTS + - GeoServices.ALERT_TYPE_SPEED + "/" + identifier.getId()); + GeoServices.ALERT_TYPE_SPEED + "/" + owner + "/" + identifier.getId()); if (resource == null) { return "{'content': false}"; } @@ -782,12 +780,11 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } @Override - public String getProximityAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException { + public String getProximityAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException { try { Registry registry = getGovernanceRegistry(); - Resource resource = registry.get(GeoServices.REGISTRY_PATH_FOR_ALERTS + - GeoServices.ALERT_TYPE_PROXIMITY - + "/" + identifier.getId()); + Resource resource = registry.get(GeoServices.REGISTRY_PATH_FOR_ALERTS + GeoServices.ALERT_TYPE_PROXIMITY + + "/" + owner + "/" + identifier.getId()); if (resource != null) { Properties props = resource.getProperties(); @@ -830,11 +827,11 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic @Override - public List getStationaryAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException { + public List getStationaryAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException { Registry registry = getGovernanceRegistry(); String registryPath = GeoServices.REGISTRY_PATH_FOR_ALERTS + - GeoServices.ALERT_TYPE_STATIONARY + "/" + identifier.getId() + "/"; + GeoServices.ALERT_TYPE_STATIONARY + "/" + owner + "/" + identifier.getId() + "/"; Resource resource; try { resource = registry.get(registryPath); @@ -933,10 +930,10 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } @Override - public List getTrafficAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException { + public List getTrafficAlerts(DeviceIdentifier identifier, String owner) throws GeoLocationBasedServiceException { Registry registry = getGovernanceRegistry(); String registryPath = GeoServices.REGISTRY_PATH_FOR_ALERTS + - GeoServices.ALERT_TYPE_STATIONARY + "/" + identifier.getId() + "/"; + GeoServices.ALERT_TYPE_STATIONARY + "/" + owner + "/" + identifier.getId() + "/"; Resource resource; try { resource = registry.get(registryPath); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceTest.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceTest.java index 73222074c5..1e0916d079 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceTest.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceTest.java @@ -19,21 +19,17 @@ package org.wso2.carbon.device.mgt.core.geo.service; -import org.apache.axis2.AxisFault; import org.mockito.Mockito; - import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.geo.service.Alert; import org.wso2.carbon.device.mgt.common.geo.service.AlertAlreadyExistException; import org.wso2.carbon.device.mgt.common.geo.service.GeoFence; import org.wso2.carbon.device.mgt.common.geo.service.GeoLocationBasedServiceException; -import org.wso2.carbon.device.mgt.common.geo.service.AlertAlreadyExistException; import org.wso2.carbon.device.mgt.core.TestDeviceManagementService; import org.wso2.carbon.device.mgt.core.common.TestDataHolder; import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; @@ -59,70 +55,76 @@ public class GeoLocationProviderServiceTest { private static final String SAMPLE_STATIONARY_TIME = "1500"; private static final String SAMPLE_FLUCTUATION_RADIUS = "2000"; - private EventProcessorAdminServiceStub mockEventProcessorAdminServiceStub; private GeoLocationProviderServiceImpl geoLocationProviderServiceImpl; private ExecutionPlanConfigurationDto[] mockExecutionPlanConfigurationDto = new ExecutionPlanConfigurationDto[1]; - + private Device device; + @BeforeClass public void init() throws Exception { initMocks(); - enrollDevice(); + device = enrollDevice(); } - @Test (description = "Create a sample geo exit-alert with relevant details.") + @Test(description = "Create a sample geo exit-alert with relevant details.") public void createGeoExitAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { - Boolean result = geoLocationProviderServiceImpl. - createGeoAlert(getExitAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_EXIT); + Boolean result = geoLocationProviderServiceImpl. + createGeoAlert(getExitAlert(), getDeviceIdentifier(), + DeviceManagementConstants.GeoServices.ALERT_TYPE_EXIT, device.getEnrolmentInfo().getOwner()); Assert.assertEquals(result, Boolean.TRUE); } - @Test (description = "Create a sample geo within-alert with relevant details.") + @Test(description = "Create a sample geo within-alert with relevant details.") public void createGeoWithinAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { - Boolean result = geoLocationProviderServiceImpl. - createGeoAlert(getWithinAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_WITHIN); + Boolean result = geoLocationProviderServiceImpl. + createGeoAlert(getWithinAlert(), getDeviceIdentifier(), + DeviceManagementConstants.GeoServices.ALERT_TYPE_WITHIN, device.getEnrolmentInfo().getOwner()); Assert.assertEquals(result, Boolean.TRUE); } - @Test (description = "Create a sample geo proximity-alert with relevant details.") + @Test(description = "Create a sample geo proximity-alert with relevant details.") public void createGeoProximityAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. - createGeoAlert(getProximityAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_PROXIMITY); + createGeoAlert(getProximityAlert(), getDeviceIdentifier(), + DeviceManagementConstants.GeoServices.ALERT_TYPE_PROXIMITY, device.getEnrolmentInfo().getOwner()); Assert.assertEquals(result, Boolean.TRUE); } - @Test (description = "Create a sample geo speed-alert with relevant details.") + @Test(description = "Create a sample geo speed-alert with relevant details.") public void createGeoSpeedAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. - createGeoAlert(getSpeedAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_SPEED); + createGeoAlert(getSpeedAlert(), getDeviceIdentifier(), + DeviceManagementConstants.GeoServices.ALERT_TYPE_SPEED, device.getEnrolmentInfo().getOwner()); Assert.assertEquals(result, Boolean.TRUE); } - @Test (description = "Create a sample geo stationary-alert with relevant details.") + @Test(description = "Create a sample geo stationary-alert with relevant details.") public void createGeoStationaryAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. - createGeoAlert(getStationaryAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_STATIONARY); + createGeoAlert(getStationaryAlert(), getDeviceIdentifier(), + DeviceManagementConstants.GeoServices.ALERT_TYPE_STATIONARY, device.getEnrolmentInfo().getOwner()); Assert.assertEquals(result, Boolean.TRUE); } - @Test (description = "Create a sample geo traffic-alert with relevant details.") + @Test(description = "Create a sample geo traffic-alert with relevant details.") public void createGeoTrafficAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. - createGeoAlert(getTrafficAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_TRAFFIC); + createGeoAlert(getTrafficAlert(), getDeviceIdentifier(), + DeviceManagementConstants.GeoServices.ALERT_TYPE_TRAFFIC, device.getEnrolmentInfo().getOwner()); Assert.assertEquals(result, Boolean.TRUE); } @Test(dependsOnMethods = "createGeoSpeedAlert", description = "retrieve saved geo speed-alert.") public void getGeoSpeedAlerts() throws GeoLocationBasedServiceException { String result; - result = geoLocationProviderServiceImpl.getSpeedAlerts(getDeviceIdentifier()); + result = geoLocationProviderServiceImpl.getSpeedAlerts(getDeviceIdentifier(), device.getEnrolmentInfo().getOwner()); Assert.assertNotNull(result); Assert.assertEquals(result, "{'speedLimit':" + SAMPLE_SPEED_ALERT_VALUE + "}"); } - @Test(dependsOnMethods = "createGeoTrafficAlert" , description = "retrieve saved geo exit-alert.") + @Test(dependsOnMethods = "createGeoTrafficAlert", description = "retrieve saved geo exit-alert.") public void getGeoTrafficAlerts() throws GeoLocationBasedServiceException { List geoFences; - geoFences = geoLocationProviderServiceImpl.getTrafficAlerts(getDeviceIdentifier()); + geoFences = geoLocationProviderServiceImpl.getTrafficAlerts(getDeviceIdentifier(), device.getEnrolmentInfo().getOwner()); Assert.assertNotNull(geoFences); GeoFence geoFenceNode = geoFences.get(0); Assert.assertEquals(geoFenceNode.getGeoJson(), "{\n" + @@ -133,7 +135,7 @@ public class GeoLocationProviderServiceTest { @Test(dependsOnMethods = "createGeoStationaryAlert", description = "retrieve saved geo stationary-alert.") public void getGeoStationaryAlerts() throws GeoLocationBasedServiceException { List geoFences; - geoFences = geoLocationProviderServiceImpl.getStationaryAlerts(getDeviceIdentifier()); + geoFences = geoLocationProviderServiceImpl.getStationaryAlerts(getDeviceIdentifier(), device.getEnrolmentInfo().getOwner()); Assert.assertNotNull(geoFences); GeoFence geoFenceNode = geoFences.get(0); Assert.assertEquals(geoFenceNode.getAreaName(), SAMPLE_AREA_NAME); @@ -142,7 +144,7 @@ public class GeoLocationProviderServiceTest { } private void initMocks() throws JWTClientException, RemoteException { - mockEventProcessorAdminServiceStub = Mockito.mock(EventProcessorAdminServiceStub.class); + EventProcessorAdminServiceStub mockEventProcessorAdminServiceStub = Mockito.mock(EventProcessorAdminServiceStub.class); geoLocationProviderServiceImpl = Mockito.mock(GeoLocationProviderServiceImpl.class, Mockito.CALLS_REAL_METHODS); mockExecutionPlanConfigurationDto[0] = Mockito.mock(ExecutionPlanConfigurationDto.class); Mockito.doReturn(mockEventProcessorAdminServiceStub). @@ -156,8 +158,8 @@ public class GeoLocationProviderServiceTest { private DeviceIdentifier getDeviceIdentifier() { DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); - deviceIdentifier.setId("1234"); - deviceIdentifier.setType("TEST"); + deviceIdentifier.setId(device.getDeviceIdentifier()); + deviceIdentifier.setType(device.getType()); return deviceIdentifier; } @@ -200,7 +202,7 @@ public class GeoLocationProviderServiceTest { } private Alert getSpeedAlert() { - Alert alert = new Alert(); + Alert alert = new Alert(); alert.setDeviceId(DEVICE_ID); alert.setParseData("{\n" + " \"" + DeviceManagementConstants.GeoServices.GEO_FENCE_GEO_JSON + "\": \"" + SAMPLE_GEO_JSON + "\",\n" + @@ -226,7 +228,7 @@ public class GeoLocationProviderServiceTest { Alert alert = new Alert(); alert.setDeviceId(DEVICE_ID); alert.setParseData("{\n" + - " \"" + DeviceManagementConstants.GeoServices.GEO_FENCE_GEO_JSON +"\": \"" + SAMPLE_GEO_JSON + "\"\n" + + " \"" + DeviceManagementConstants.GeoServices.GEO_FENCE_GEO_JSON + "\": \"" + SAMPLE_GEO_JSON + "\"\n" + "}"); alert.setCustomName(SAMPLE_AREA_NAME); alert.setExecutionPlan("EXECUTION_PLAN"); @@ -234,7 +236,7 @@ public class GeoLocationProviderServiceTest { return alert; } - private void enrollDevice() throws Exception { + private Device enrollDevice() throws Exception { DeviceIdentifier deviceIdentifier = new DeviceIdentifier(DEVICE_ID, DEVICE_TYPE); Device device = TestDataHolder.generateDummyDeviceData(deviceIdentifier); DeviceManagementProviderService deviceMgtService = DeviceManagementDataHolder.getInstance(). @@ -245,9 +247,11 @@ public class GeoLocationProviderServiceTest { Device returnedDevice = deviceMgtService.getDevice(deviceIdentifier); - if (!returnedDevice.getDeviceIdentifier().equals(deviceIdentifier.getId())) { - throw new Exception("Incorrect device with ID - " + device.getDeviceIdentifier() + " returned!"); - } + if (!returnedDevice.getDeviceIdentifier().equals(deviceIdentifier.getId())) { + throw new Exception("Incorrect device with ID - " + device.getDeviceIdentifier() + " returned!"); } + + return returnedDevice; + } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/geo-dashboard.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/geo-dashboard.hbs index cb2a518ef6..fdb006aeb5 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/geo-dashboard.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/geo-dashboard.hbs @@ -522,7 +522,7 @@ {{#if geoServicesEnabled}}
Speed km/h
Heading
- + {{/if}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/websocket.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/websocket.js index dcc0b7d5cb..eb5a157252 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/websocket.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/websocket.js @@ -78,7 +78,7 @@ function initializeGeoLocation(geoFencingEnabled) { geoPublicUri = geoCharts.data("geo-public-uri"); webSocketURL = wsEndPoint + "iot.per.device.stream.geo.FusedSpatialEvent/1.0.0?" + "deviceId=" + deviceId + "&deviceType=" + deviceType + "&websocketToken=" + wsToken; - alertWebSocketURL = wsEndPoint + "iot.per.device.stream.geo.AlertsNotifications/1.0.0?" + alertWebSocketURL = wsEndPoint + "iot.per.device.stream.geo.AlertNotifications/1.0.0?" + "deviceId=" + deviceId + "&deviceType=" + deviceType + "&websocketToken=" + wsToken; $("#proximity_alert").hide(); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/geo-devices.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/geo-devices.hbs index bbcae34eea..63a861940d 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/geo-devices.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/geo-devices.hbs @@ -31,28 +31,14 @@
-{{#if geoServicesEnabled}} -
-
-
-{{/if}} +
- {{#if geoServicesEnabled}} -
-
-
- Alerts Stream  - Spatial Stream -
-
- {{else}} -
-
-
- {{/if}} +
+
+
@@ -891,10 +870,6 @@ {{js "js/typeahead.bundle.min.js" }} {{js "js/geo_remote.js" }} {{js "js/app.js" }} - {{js "js/geo_exit_fence.js" }} - {{js "js/geo_within.js" }} - {{js "js/geo_stationary.js" }} - {{js "js/geo_speed.js" }} {{!js "js/jquery/jquery-ui.min.js" }} @@ -913,46 +888,12 @@ {{js "js/geo_fencing.js" }} + {{/zone}} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/websocket.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/websocket.js index 83f0fbd0c3..d25e5dab81 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/websocket.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/websocket.js @@ -68,25 +68,21 @@ function initializeOnAlertWebSocket() { } function initializeGeoLocation(geoFencingEnabled) { - if (true) { - var geoCharts = $("#geo-charts"); - var wsEndPoint = geoCharts.data("ws-endpoint"); - wsToken = geoCharts.data("ws-token"); - geoPublicUri = geoCharts.data("geo-public-uri"); - geoPublicUri = geoCharts.data("geo-public-uri"); - webSocketURL = wsEndPoint + "iot.per.device.stream.geo.FusedSpatialEvent/1.0.0?" + "&websocketToken=" + wsToken; - alertWebSocketURL = wsEndPoint + "iot.per.device.stream.geo.AlertsNotifications/1.0.0?" + "&websocketToken=" + wsToken; - $("#proximity_alert").hide(); - - if (geoFencingEnabled) { - disconnect(); - initializeSpatialStreamWebSocket(); - initializeOnAlertWebSocket(); - } - initialLoad(geoFencingEnabled); - } else { - noty({text: 'Invalid Access! No device information provided to track!', type: 'error'}); + var geoCharts = $("#geo-charts"); + var wsEndPoint = geoCharts.data("ws-endpoint"); + wsToken = geoCharts.data("ws-token"); + geoPublicUri = geoCharts.data("geo-public-uri"); + geoPublicUri = geoCharts.data("geo-public-uri"); + webSocketURL = wsEndPoint + "iot.per.device.stream.geo.FusedSpatialEvent/1.0.0?" + "&websocketToken=" + wsToken; + alertWebSocketURL = wsEndPoint + "iot.per.device.stream.geo.AlertNotifications/1.0.0?" + "&websocketToken=" + wsToken; + $("#proximity_alert").hide(); + + if (geoFencingEnabled) { + disconnect(); + initializeSpatialStreamWebSocket(); + initializeOnAlertWebSocket(); } + initialLoad(geoFencingEnabled); } function disconnect(){ diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GeoLocationBasedService.java b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GeoLocationBasedService.java deleted file mode 100644 index 76796bbeb6..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GeoLocationBasedService.java +++ /dev/null @@ -1,550 +0,0 @@ -/* - * Copyright (c) 2017, 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. - */ - -package org.wso2.carbon.device.mgt.jaxrs.service.api; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Extension; -import io.swagger.annotations.ExtensionProperty; -import io.swagger.annotations.Info; -import io.swagger.annotations.ResponseHeader; -import io.swagger.annotations.SwaggerDefinition; -import io.swagger.annotations.Tag; -import org.wso2.carbon.apimgt.annotations.api.Scope; -import org.wso2.carbon.apimgt.annotations.api.Scopes; -import org.wso2.carbon.device.mgt.common.geo.service.Alert; -import org.wso2.carbon.device.mgt.jaxrs.util.Constants; - -import javax.validation.Valid; -import javax.validation.constraints.Size; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; - -@SwaggerDefinition( - info = @Info( - version = "0.9.0", - title = "", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = "name", value = "geo_services"), - @ExtensionProperty(name = "context", value = "/api/device-mgt/v0.9/geo-services"), - }) - } - ), - tags = { - @Tag(name = "device_management", description = "") - } -) -@Scopes( - scopes = { - @Scope( - name = "View Analytics", - description = "", - key = "perm:geo-service:analytics-view", - permissions = {"/device-mgt/devices/owning-device/view-analytics"} - ), - @Scope( - name = "Manage Alerts", - description = "", - key = "perm:geo-service:alerts-manage", - permissions = {"/device-mgt/devices/owning-device/manage-alerts"} - ) - } -) -@Path("/geo-services") -@Api(value = "Geo Service", - description = "This carries all the resources related to the geo service functionalities.") -public interface GeoLocationBasedService { - /** - * Retrieve Analytics for the device type - */ - @GET - @Path("stats/{deviceType}/{deviceId}") - @ApiOperation( - consumes = "application/json", - produces = "application/json", - httpMethod = "GET", - value = "Retrieve Analytics for the device type", - notes = "", - response = Response.class, - tags = "Geo Service Management", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:analytics-view") - }) - } - ) - @ApiResponses(value = { - @ApiResponse( - code = 200, - message = "OK.", - response = Response.class, - responseHeaders = { - @ResponseHeader( - name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "Last-Modified", - description = "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests."), - }), - @ApiResponse( - code = 400, - message = "Bad Request. \n Invalid Device Identifiers found.", - response = Response.class), - @ApiResponse( - code = 401, - message = "Unauthorized. \n Unauthorized request."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Error on retrieving stats", - response = Response.class) - }) - Response getGeoDeviceStats( - @ApiParam( - name = "deviceId", - value = "The registered device Id.", - required = true) - @PathParam("deviceId") String deviceId, - @ApiParam( - name = "device-type", - value = "The device type, such as ios, android or windows.", - required = true) - @PathParam("deviceType") - @Size(max = 45) - String deviceType, - @ApiParam( - name = "from", - value = "Get stats from what time", - required = true) - @QueryParam("from") long from, - @ApiParam( - name = "to", - value = "Get stats up to what time", - required = true) - @QueryParam("to") long to); - - /** - * Get data to show device locations in a map - */ - @GET - @Path("stats/device-locations") - @ApiOperation( - consumes = "application/json", - produces = "application/json", - httpMethod = "GET", - value = "Retrieve locations of devices", - notes = "", - response = Response.class, - tags = "Geo Service Management", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:analytics-view") - }) - } - ) - @ApiResponses(value = { - @ApiResponse( - code = 200, - message = "OK.", - response = Response.class, - responseHeaders = { - @ResponseHeader( - name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "Last-Modified", - description = "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests."), - }), - @ApiResponse( - code = 400, - message = "Bad Request. \n Invalid parameters found.", - response = Response.class), - @ApiResponse( - code = 401, - message = "Unauthorized. \n Unauthorized request."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Error on retrieving stats", - response = Response.class) - }) - Response getGeoDeviceLocations( - @ApiParam( - name = "minLat", - value = "minimum latitude", - required = true) - @QueryParam("minLat") double minLat, - @ApiParam( - name = "maxLat", - value = "maxmimum latitude", - required = true) - @QueryParam("maxLat") double maxLat, - @ApiParam( - name = "minLong", - value = "minimum longitude", - required = true) - @QueryParam("minLong") double minLong, - @ApiParam( - name = "maxLong", - value = "maximum longitudeude", - required = true) - @QueryParam("maxLong") double maxLong, - @ApiParam( - name = "zoom", - value = "zoom level", - required = true) - @QueryParam("zoom") int zoom); - - - /** - * Create Geo alerts - */ - @POST - @Path("alerts/{alertType}/{deviceType}/{deviceId}") - @ApiOperation( - consumes = "application/json", - produces = "application/json", - httpMethod = "GET", - value = "Create Geo alerts for the device", - notes = "", - response = Response.class, - tags = "Geo Service Management", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") - }) - } - ) - @ApiResponses(value = { - @ApiResponse( - code = 200, - message = "OK.", - response = Response.class, - responseHeaders = { - @ResponseHeader( - name = "Content-Type", - description = "The content type of the body") - }), - @ApiResponse( - code = 400, - message = "Bad Request. \n Invalid Device Identifiers found.", - response = Response.class), - @ApiResponse( - code = 401, - message = "Unauthorized. \n Unauthorized request."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Error on retrieving stats", - response = Response.class) - }) - Response createGeoAlerts( - @ApiParam( - name = "alert", - value = "The alert object", - required = true) - @Valid Alert alert, - @ApiParam( - name = "deviceId", - value = "The registered device Id.", - required = true) - @PathParam("deviceId") String deviceId, - @ApiParam( - name = "device-type", - value = "The device type, such as ios, android or windows.", - required = true) - @PathParam("deviceType") - @Size(max = 45) - String deviceType, - @ApiParam( - name = "alertType", - value = "The alert type, such as Within, Speed, Stationary", - required = true) - @PathParam("alertType") String alertType); - - /** - * Update Geo alerts - */ - @PUT - @Path("alerts/{alertType}/{deviceType}/{deviceId}") - @ApiOperation( - consumes = "application/json", - produces = "application/json", - httpMethod = "GET", - value = "Update Geo alerts for the device", - notes = "", - response = Response.class, - tags = "Geo Service Management", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") - }) - } - ) - @ApiResponses(value = { - @ApiResponse( - code = 200, - message = "OK.", - response = Response.class, - responseHeaders = { - @ResponseHeader( - name = "Content-Type", - description = "The content type of the body") - }), - @ApiResponse( - code = 400, - message = "Bad Request. \n Invalid Device Identifiers found.", - response = Response.class), - @ApiResponse( - code = 401, - message = "Unauthorized. \n Unauthorized request."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Error on retrieving stats", - response = Response.class) - }) - Response updateGeoAlerts( - @ApiParam( - name = "alert", - value = "The alert object", - required = true) - @Valid Alert alert, - @ApiParam( - name = "deviceId", - value = "The registered device Id.", - required = true) - @PathParam("deviceId") String deviceId, - @ApiParam( - name = "device-type", - value = "The device type, such as ios, android or windows.", - required = true) - @PathParam("deviceType") - @Size(max = 45) - String deviceType, - @ApiParam( - name = "alertType", - value = "The alert type, such as Within, Speed, Stationary", - required = true) - @PathParam("alertType") String alertType); - - /** - * Retrieve Geo alerts - */ - @GET - @Path("alerts/{alertType}/{deviceType}/{deviceId}") - @ApiOperation( - consumes = "application/json", - produces = "application/json", - httpMethod = "GET", - value = "Retrieve Geo alerts for the device", - notes = "", - response = Response.class, - tags = "Geo Service Management", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") - }) - } - ) - @ApiResponses(value = { - @ApiResponse( - code = 200, - message = "OK.", - response = Response.class, - responseHeaders = { - @ResponseHeader( - name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "Last-Modified", - description = "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests.") - }), - @ApiResponse( - code = 400, - message = "Bad Request. \n Invalid Device Identifiers found.", - response = Response.class), - @ApiResponse( - code = 401, - message = "Unauthorized. \n Unauthorized request."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Error on retrieving stats", - response = Response.class) - }) - Response getGeoAlerts( - @ApiParam( - name = "deviceId", - value = "The registered device Id.", - required = true) - @PathParam("deviceId") String deviceId, - @ApiParam( - name = "device-type", - value = "The device type, such as ios, android or windows.", - required = true) - @PathParam("deviceType") - @Size(max = 45) - String deviceType, - @ApiParam( - name = "alertType", - value = "The alert type, such as Within, Speed, Stationary", - required = true) - @PathParam("alertType") String alertType); - - /** - * Retrieve Geo alerts history - */ - @GET - @Path("alerts/history/{deviceType}/{deviceId}") - @ApiOperation( - consumes = "application/json", - produces = "application/json", - httpMethod = "GET", - value = "Retrieve Geo alerts history for the device", - notes = "", - response = Response.class, - tags = "Geo Service Management", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") - }) - } - ) - @ApiResponses(value = { - @ApiResponse( - code = 200, - message = "OK.", - response = Response.class, - responseHeaders = { - @ResponseHeader( - name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "Last-Modified", - description = "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests.") - }), - @ApiResponse( - code = 400, - message = "Bad Request. \n Invalid Device Identifiers found.", - response = Response.class), - @ApiResponse( - code = 401, - message = "Unauthorized. \n Unauthorized request."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Error on retrieving stats", - response = Response.class) - }) - Response getGeoAlertsHistory( - @ApiParam( - name = "deviceId", - value = "The registered device Id.", - required = true) - @PathParam("deviceId") String deviceId, - @ApiParam( - name = "device-type", - value = "The device type, such as ios, android or windows.", - required = true) - @PathParam("deviceType") - @Size(max = 45) - String deviceType, - @ApiParam( - name = "from", - value = "Get stats from what time", - required = true) - @QueryParam("from") long from, - @ApiParam( - name = "to", - value = "Get stats up to what time", - required = true) - @QueryParam("to") long to); - - @DELETE - @Path("alerts/{alertType}/{deviceType}/{deviceId}") - @ApiOperation( - consumes = "application/json", - produces = "application/json", - httpMethod = "DELETE", - value = "Deletes Geo alerts for the device", - notes = "", - response = Response.class, - tags = "Geo Service Management", - extensions = { - @Extension(properties = { - @ExtensionProperty(name = Constants.SCOPE, value = "perm:geo-service:alerts-manage") - }) - } - ) - @ApiResponses(value = { - @ApiResponse( - code = 200, - message = "OK.", - response = Response.class, - responseHeaders = { - @ResponseHeader( - name = "Content-Type", - description = "The content type of the body") - }), - @ApiResponse( - code = 400, - message = "Bad Request. \n Invalid Device Identifiers found.", - response = Response.class), - @ApiResponse( - code = 401, - message = "Unauthorized. \n Unauthorized request."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Error on retrieving stats", - response = Response.class) - }) - Response removeGeoAlerts( - @ApiParam( - name = "deviceId", - value = "The registered device Id.", - required = true) - @PathParam("deviceId") String deviceId, - @ApiParam( - name = "deviceType", - value = "The device type, such as ios, android or windows.", - required = true) - @PathParam("deviceType") String deviceType, - @ApiParam( - name = "alertType", - value = "The alert type, such as Within, Speed, Stationary", - required = true) - @PathParam("alertType") String alertType, - @ApiParam( - name = "queryName", - value = "The query name.", - required = true) - @QueryParam("queryName") String queryName); -} - diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java deleted file mode 100644 index 7c865b9778..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImpl.java +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright (c) 2017, 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. - */ - -package org.wso2.carbon.device.mgt.jaxrs.service.impl; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.analytics.api.AnalyticsDataAPI; -import org.wso2.carbon.analytics.api.AnalyticsDataAPIUtil; -import org.wso2.carbon.analytics.dataservice.commons.AnalyticsDataResponse; -import org.wso2.carbon.analytics.dataservice.commons.SearchResultEntry; -import org.wso2.carbon.analytics.dataservice.commons.SortByField; -import org.wso2.carbon.analytics.dataservice.commons.SortType; -import org.wso2.carbon.analytics.datasource.commons.Record; -import org.wso2.carbon.analytics.datasource.commons.exception.AnalyticsException; -import org.wso2.carbon.context.CarbonContext; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; -import org.wso2.carbon.device.mgt.common.DeviceManagementConstants.GeoServices; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.common.authorization.DeviceAccessAuthorizationException; -import org.wso2.carbon.device.mgt.common.geo.service.*; -import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroupConstants; -import org.wso2.carbon.device.mgt.core.geo.GeoCluster; -import org.wso2.carbon.device.mgt.core.geo.geoHash.GeoCoordinate; -import org.wso2.carbon.device.mgt.core.geo.geoHash.geoHashStrategy.GeoHashLengthStrategy; -import org.wso2.carbon.device.mgt.core.geo.geoHash.geoHashStrategy.ZoomGeoHashLengthStrategy; -import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; -import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; -import org.wso2.carbon.device.mgt.jaxrs.service.api.GeoLocationBasedService; -import org.wso2.carbon.device.mgt.jaxrs.util.Constants; -import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils; -import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtUtil; -import org.wso2.carbon.user.api.UserStoreException; -import org.wso2.carbon.utils.multitenancy.MultitenantUtils; - -import javax.ws.rs.*; -import javax.ws.rs.core.Response; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * The api for - */ -public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { - - private static Log log = LogFactory.getLog(GeoLocationBasedServiceImpl.class); - - @Path("stats/{deviceType}/{deviceId}") - @GET - @Consumes("application/json") - @Produces("application/json") - public Response getGeoDeviceStats(@PathParam("deviceId") String deviceId, - @PathParam("deviceType") String deviceType, - @QueryParam("from") long from, @QueryParam("to") long to) { - try { - if (!DeviceManagerUtil.isPublishLocationResponseEnabled()) { - return Response.status(Response.Status.BAD_REQUEST.getStatusCode()) - .entity("Unable to retrive Geo Device stats. Geo Data publishing does not enabled.").build(); - } - } catch (DeviceManagementException e) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).entity(e.getMessage()).build(); - } - String tableName = "IOT_PER_DEVICE_STREAM_GEO_FUSEDSPATIALEVENT"; - String fromDate = String.valueOf(from); - String toDate = String.valueOf(to); - String query = "id:" + deviceId + " AND type:" + deviceType; - if (from != 0 || to != 0) { - query += " AND timeStamp : [" + fromDate + " TO " + toDate + "]"; - } - try { - if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized( - new DeviceIdentifier(deviceId, deviceType), - DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) { - return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); - } - List sortByFields = new ArrayList<>(); - SortByField sortByField = new SortByField("timeStamp", SortType.ASC); - sortByFields.add(sortByField); - - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername()); - - try { - String tenantDomain = MultitenantUtils.getTenantDomain(authorizedUser); - int tenantId = DeviceMgtAPIUtils.getRealmService().getTenantManager().getTenantId(tenantDomain); - AnalyticsDataAPI analyticsDataAPI = DeviceMgtAPIUtils.getAnalyticsDataAPI(); - List searchResults = analyticsDataAPI.search(tenantId, tableName, query, - 0, - 100, - sortByFields); - List events = getEventBeans(analyticsDataAPI, tenantId, tableName, new ArrayList(), - searchResults); - return Response.ok().entity(events).build(); - } catch (AnalyticsException | UserStoreException e) { - log.error("Failed to perform search on table: " + tableName + " : " + e.getMessage(), e); - throw DeviceMgtUtil.buildBadRequestException( - Constants.ErrorMessages.STATUS_BAD_REQUEST_MESSAGE_DEFAULT); - } - } catch (DeviceAccessAuthorizationException e) { - log.error(e.getErrorMessage()); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build(); - } - } - - @Path("stats/device-locations") - @GET - @Consumes("application/json") - @Produces("application/json") - public Response getGeoDeviceLocations( - @QueryParam("minLat") double minLat, - @QueryParam("maxLat") double maxLat, - @QueryParam("minLong") double minLong, - @QueryParam("maxLong") double maxLong, - @QueryParam("zoom") int zoom) { - - GeoHashLengthStrategy geoHashLengthStrategy = new ZoomGeoHashLengthStrategy(); - GeoCoordinate southWest = new GeoCoordinate(minLat, minLong); - GeoCoordinate northEast = new GeoCoordinate(maxLat, maxLong); - int geohashLength = geoHashLengthStrategy.getGeohashLength(southWest, northEast, zoom); - DeviceManagementProviderService deviceManagementService = DeviceMgtAPIUtils.getDeviceManagementService(); - List geoClusters; - try { - geoClusters = deviceManagementService.findGeoClusters(null, southWest, northEast, geohashLength); - } catch (DeviceManagementException e) { - String msg = "Error occurred while retrieving geo clusters "; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build(); - } - return Response.ok().entity(geoClusters).build(); - - } - - @Path("alerts/{alertType}/{deviceType}/{deviceId}") - @POST - @Consumes("application/json") - @Produces("application/json") - public Response createGeoAlerts(Alert alert, @PathParam("deviceId") String deviceId, - @PathParam("deviceType") String deviceType, - @PathParam("alertType") String alertType) { - try { - if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized( - new DeviceIdentifier(deviceId, deviceType), - DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) { - return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); - } - - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - - DeviceIdentifier identifier = new DeviceIdentifier(); - identifier.setId(deviceId); - identifier.setType(deviceType); - - GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - geoService.createGeoAlert(alert, identifier, alertType); - return Response.ok().build(); - } catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) { - String error = "Error occurred while creating the geo alert for " + deviceType + " with id: " + deviceId; - log.error(error, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); - } catch (AlertAlreadyExistException e) { - String error = "A geo alert with this name already exists."; - log.error(error,e); - return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); - } - } - - - @Path("alerts/{alertType}") - @POST - @Consumes("application/json") - @Produces("application/json") - public Response createGeoAlertsForGeoClusters(Alert alert, @PathParam("alertType") String alertType) { - try { - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - - GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - geoService.createGeoAlert(alert, alertType); - return Response.ok().build(); - } catch (GeoLocationBasedServiceException e) { - String error = "Error occurred while creating " + alertType + " alert"; - log.error(error, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); - } catch (AlertAlreadyExistException e) { - String error = "A geo alert with this name already exists."; - log.error(error,e); - return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); - } - } - - - @Path("alerts/{alertType}/{deviceType}/{deviceId}") - @PUT - @Consumes("application/json") - @Produces("application/json") - public Response updateGeoAlerts(Alert alert, @PathParam("deviceId") String deviceId, - @PathParam("deviceType") String deviceType, - @PathParam("alertType") String alertType) { - try { - if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized( - new DeviceIdentifier(deviceId, deviceType), - DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) { - return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); - } - - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - - DeviceIdentifier identifier = new DeviceIdentifier(); - identifier.setId(deviceId); - identifier.setType(deviceType); - - GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - geoService.updateGeoAlert(alert, identifier, alertType); - return Response.ok().build(); - } catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) { - String error = "Error occurred while creating the geo alert for " + deviceType + " with id: " + deviceId; - log.error(error, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); - } catch (AlertAlreadyExistException e) { - String error = "A geo alert with this name already exists."; - log.error(error,e); - return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); - } - } - - @Path("alerts/{alertType}") - @PUT - @Consumes("application/json") - @Produces("application/json") - public Response updateGeoAlertsForGeoClusters(Alert alert, @PathParam("alertType") String alertType) { - try { - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - - GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - geoService.updateGeoAlert(alert, alertType); - return Response.ok().build(); - } catch (GeoLocationBasedServiceException e) { - String error = "Error occurred while updating the geo alert for geo clusters"; - log.error(error, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); - } catch (AlertAlreadyExistException e) { - String error = "A geo alert with this name already exists."; - log.error(error,e); - return Response.status(Response.Status.BAD_REQUEST).entity(error).build(); - } - } - - @Path("alerts/{alertType}/{deviceType}/{deviceId}") - @DELETE - @Consumes("application/json") - @Produces("application/json") - public Response removeGeoAlerts(@PathParam("deviceId") String deviceId, - @PathParam("deviceType") String deviceType, - @PathParam("alertType") String alertType, - @QueryParam("queryName") String queryName) { - try { - if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized( - new DeviceIdentifier(deviceId, deviceType), - DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) { - return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); - } - - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - - DeviceIdentifier identifier = new DeviceIdentifier(); - identifier.setId(deviceId); - identifier.setType(deviceType); - - GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - geoService.removeGeoAlert(alertType, identifier, queryName); - return Response.ok().build(); - } catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) { - String error = "Error occurred while removing the geo alert for " + deviceType + " with id: " + deviceId; - log.error(error, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); - } - } - - @Path("alerts/{alertType}") - @DELETE - @Consumes("application/json") - @Produces("application/json") - public Response removeGeoAlertsForGeoClusters(@PathParam("alertType") String alertType, @QueryParam("queryName") String queryName) { - try { - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - - GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - geoService.removeGeoAlert(alertType, queryName); - return Response.ok().build(); - } catch (GeoLocationBasedServiceException e) { - String error = "Error occurred while removing the geo alert for geo clusters"; - log.error(error, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); - } - } - - @Path("alerts/{alertType}/{deviceType}/{deviceId}") - @GET - @Consumes("application/json") - @Produces("application/json") - public Response getGeoAlerts(@PathParam("deviceId") String deviceId, - @PathParam("deviceType") String deviceType, - @PathParam("alertType") String alertType) { - try { - if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized( - new DeviceIdentifier(deviceId, deviceType), - DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) { - return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); - } - - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - - DeviceIdentifier identifier = new DeviceIdentifier(); - identifier.setId(deviceId); - identifier.setType(deviceType); - - GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - - if (GeoServices.ALERT_TYPE_WITHIN.equals(alertType)) { - List alerts = geoService.getWithinAlerts(identifier); - return Response.ok().entity(alerts).build(); - } else if (GeoServices.ALERT_TYPE_EXIT.equals(alertType)) { - List alerts = geoService.getExitAlerts(identifier); - return Response.ok().entity(alerts).build(); - } else if (GeoServices.ALERT_TYPE_SPEED.equals(alertType)) { - String result = geoService.getSpeedAlerts(identifier); - return Response.ok().entity(result).build(); - } else if (GeoServices.ALERT_TYPE_PROXIMITY.equals(alertType)) { - String result = geoService.getProximityAlerts(identifier); - return Response.ok().entity(result).build(); - } else if (GeoServices.ALERT_TYPE_STATIONARY.equals(alertType)) { - List alerts = geoService.getStationaryAlerts(identifier); - return Response.ok().entity(alerts).build(); - } else if (GeoServices.ALERT_TYPE_TRAFFIC.equals(alertType)) { - List alerts = geoService.getTrafficAlerts(identifier); - return Response.ok().entity(alerts).build(); - } - return null; - } catch (DeviceAccessAuthorizationException | GeoLocationBasedServiceException e) { - String error = "Error occurred while getting the geo alerts for " + deviceType + " with id: " + deviceId; - log.error(error, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); - } - } - - @Path("alerts/{alertType}") - @GET - @Consumes("application/json") - @Produces("application/json") - public Response getGeoAlertsForGeoClusters(@PathParam("alertType") String alertType) { - try { - - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername() - ); - - GeoLocationProviderService geoService = DeviceMgtAPIUtils.getGeoService(); - - if (GeoServices.ALERT_TYPE_WITHIN.equals(alertType)) { - List alerts = geoService.getWithinAlerts(); - return Response.ok().entity(alerts).build(); - } else if (GeoServices.ALERT_TYPE_EXIT.equals(alertType)) { - List alerts = geoService.getExitAlerts(); - return Response.ok().entity(alerts).build(); - } else if (GeoServices.ALERT_TYPE_SPEED.equals(alertType)) { - String result = geoService.getSpeedAlerts(); - return Response.ok().entity(result).build(); - } else if (GeoServices.ALERT_TYPE_PROXIMITY.equals(alertType)) { - String result = geoService.getProximityAlerts(); - return Response.ok().entity(result).build(); - } else if (GeoServices.ALERT_TYPE_STATIONARY.equals(alertType)) { - List alerts = geoService.getStationaryAlerts(); - return Response.ok().entity(alerts).build(); - } else if (GeoServices.ALERT_TYPE_TRAFFIC.equals(alertType)) { - List alerts = geoService.getTrafficAlerts(); - return Response.ok().entity(alerts).build(); - } - return null; - } catch (GeoLocationBasedServiceException e) { - String error = "Error occurred while getting the geo alerts for " + alertType + " alert"; - log.error(error, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error).build(); - } - } - - @Path("alerts/history/{deviceType}/{deviceId}") - @GET - @Consumes("application/json") - @Produces("application/json") - public Response getGeoAlertsHistory(@PathParam("deviceId") String deviceId, - @PathParam("deviceType") String deviceType, - @QueryParam("from") long from, @QueryParam("to") long to) { - String tableName = "IOT_PER_DEVICE_STREAM_GEO_ALERTNOTIFICATIONS"; - String fromDate = String.valueOf(from); - String toDate = String.valueOf(to); - String query = "id:" + deviceId + " AND type:" + deviceType; - if (from != 0 || to != 0) { - query += " AND timeStamp : [" + fromDate + " TO " + toDate + "]"; - } - try { - if (!DeviceMgtAPIUtils.getDeviceAccessAuthorizationService().isUserAuthorized( - new DeviceIdentifier(deviceId, deviceType), - DeviceGroupConstants.Permissions.DEFAULT_STATS_MONITOR_PERMISSIONS)) { - return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build(); - } - List sortByFields = new ArrayList<>(); - SortByField sortByField = new SortByField("timeStamp", SortType.ASC); - sortByFields.add(sortByField); - - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername()); - - try { - String tenantDomain = MultitenantUtils.getTenantDomain(authorizedUser); - int tenantId = DeviceMgtAPIUtils.getRealmService().getTenantManager().getTenantId(tenantDomain); - AnalyticsDataAPI analyticsDataAPI = DeviceMgtAPIUtils.getAnalyticsDataAPI(); - List searchResults = analyticsDataAPI.search(tenantId, tableName, query, - 0, - 100, - sortByFields); - List events = getEventBeans(analyticsDataAPI, tenantId, tableName, new ArrayList(), - searchResults); - return Response.ok().entity(events).build(); - } catch (AnalyticsException | UserStoreException e) { - log.error("Failed to perform search on table: " + tableName + " : " + e.getMessage(), e); - throw DeviceMgtUtil.buildBadRequestException( - Constants.ErrorMessages.STATUS_BAD_REQUEST_MESSAGE_DEFAULT); - } - } catch (DeviceAccessAuthorizationException e) { - log.error(e.getErrorMessage()); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build(); - } - } - - @Path("alerts/history") - @GET - @Consumes("application/json") - @Produces("application/json") - public Response getGeoAlertsHistoryForGeoClusters(@QueryParam("from") long from, @QueryParam("to") long to) { - String tableName = "IOT_PER_DEVICE_STREAM_GEO_ALERTNOTIFICATIONS"; - String fromDate = String.valueOf(from); - String toDate = String.valueOf(to); - String query = ""; - if (from != 0 || to != 0) { - query = "timeStamp : [" + fromDate + " TO " + toDate + "]"; - } - try { - List sortByFields = new ArrayList<>(); - SortByField sortByField = new SortByField("timeStamp", SortType.ASC); - sortByFields.add(sortByField); - - // this is the user who initiates the request - String authorizedUser = MultitenantUtils.getTenantAwareUsername( - CarbonContext.getThreadLocalCarbonContext().getUsername()); - - try { - String tenantDomain = MultitenantUtils.getTenantDomain(authorizedUser); - int tenantId = DeviceMgtAPIUtils.getRealmService().getTenantManager().getTenantId(tenantDomain); - AnalyticsDataAPI analyticsDataAPI = DeviceMgtAPIUtils.getAnalyticsDataAPI(); - List searchResults = analyticsDataAPI.search(tenantId, tableName, query, - 0, - 100, - sortByFields); - List events = getEventBeans(analyticsDataAPI, tenantId, tableName, new ArrayList(), - searchResults); - return Response.ok().entity(events).build(); - } catch (AnalyticsException | UserStoreException e) { - log.error("Failed to perform search on table: " + tableName + " : " + e.getMessage(), e); - throw DeviceMgtUtil.buildBadRequestException( - Constants.ErrorMessages.STATUS_BAD_REQUEST_MESSAGE_DEFAULT); - } - } catch (Exception e) { - log.error(e.getMessage()); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build(); - } - } - - private List getEventBeans(AnalyticsDataAPI analyticsDataAPI, int tenantId, String tableName, - List columns, - List searchResults) throws AnalyticsException { - List ids = getIds(searchResults); - List requiredColumns = (columns == null || columns.isEmpty()) ? null : columns; - AnalyticsDataResponse response = analyticsDataAPI.get(tenantId, tableName, 1, requiredColumns, ids); - List records = AnalyticsDataAPIUtil.listRecords(analyticsDataAPI, response); - Map eventBeanMap = getEventBeanKeyedWithIds(records); - return getSortedEventBeans(eventBeanMap, searchResults); - } - - private List getSortedEventBeans(Map eventBeanMap, - List searchResults) { - List sortedRecords = new ArrayList<>(); - for (SearchResultEntry entry : searchResults) { - sortedRecords.add(eventBeanMap.get(entry.getId())); - } - return sortedRecords; - } - - private Map getEventBeanKeyedWithIds(List records) { - Map eventBeanMap = new HashMap<>(); - for (Record record : records) { - Event event = getEventBean(record); - eventBeanMap.put(event.getId(), event); - } - return eventBeanMap; - } - - private List getIds(List searchResults) { - List ids = new ArrayList<>(); - if (searchResults != null) { - for (SearchResultEntry resultEntry : searchResults) { - ids.add(resultEntry.getId()); - } - } - return ids; - } - - private static Event getEventBean(Record record) { - Event eventBean = new Event(); - eventBean.setId(record.getId()); - eventBean.setTableName(record.getTableName()); - eventBean.setTimestamp(record.getTimestamp()); - eventBean.setValues(record.getValues()); - return eventBean; - } -} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/webapp/WEB-INF/cxf-servlet.xml b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/webapp/WEB-INF/cxf-servlet.xml index e4bea07957..06da04568e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/webapp/WEB-INF/cxf-servlet.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/main/webapp/WEB-INF/cxf-servlet.xml @@ -37,7 +37,6 @@ - @@ -81,7 +80,6 @@ - diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java deleted file mode 100644 index d320a626b4..0000000000 --- a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/src/test/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GeoLocationBasedServiceImplTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2017, 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. - * - */ - -package org.wso2.carbon.device.mgt.jaxrs.service.impl; - -import org.mockito.Mockito; -import org.testng.Assert; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; -import org.wso2.carbon.context.PrivilegedCarbonContext; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.core.geo.GeoCluster; -import org.wso2.carbon.device.mgt.core.geo.geoHash.GeoCoordinate; -import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; -import org.wso2.carbon.device.mgt.jaxrs.service.api.GeoLocationBasedService; - -import javax.ws.rs.core.Response; -import java.util.ArrayList; -import java.util.List; - -public class GeoLocationBasedServiceImplTest { - private DeviceManagementProviderService deviceManagementProviderService; - private PrivilegedCarbonContext context; - private GeoLocationBasedService geoLocationBasedService; - - @BeforeClass - public void init() { - deviceManagementProviderService = Mockito.mock(DeviceManagementProviderService.class); - geoLocationBasedService = new GeoLocationBasedServiceImpl(); - context = Mockito.mock(PrivilegedCarbonContext.class); - Mockito.doReturn("admin").when(context).getUsername(); - } - - @Test(description = "This method tests the behaviour of getGeoDeviceLocations when there are no devices" + - "in the given map boundaries") - public void testGetGeoDeviceLocations1() throws DeviceManagementException { - Mockito.doReturn(new ArrayList()).when(deviceManagementProviderService) - .findGeoClusters(null, Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); - Response response = geoLocationBasedService.getGeoDeviceLocations(0.4, 15, 75.6, - 90.1, 6); - Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(), - "getGeoDeviceLocations request failed with valid parameters"); - } - - @Test(description = "This method tests the behaviour of getGeoDeviceLocations when there are devices" + - "in the given map boundaries") - public void testGetGeoDeviceLocations2() throws DeviceManagementException { - List geoClusters = new ArrayList<>(); - geoClusters.add(new GeoCluster(new GeoCoordinate(1.5, 80.7), - new GeoCoordinate(1.1, 79.5), new GeoCoordinate(1.9, 82.1), 3, - "tb32", "aegtew234", "android", "1234")); - geoClusters.add(new GeoCluster(new GeoCoordinate(10.2, 86.1), - new GeoCoordinate(9.8, 84.7), new GeoCoordinate(11.1, 88.1), 4, - "t1gd", "swerty12s", "android", "1234")); - Mockito.doReturn(geoClusters).when(deviceManagementProviderService) - .findGeoClusters(null,Mockito.any(GeoCoordinate.class), Mockito.any(GeoCoordinate.class), Mockito.anyInt()); - Response response = geoLocationBasedService.getGeoDeviceLocations(0.4, 15, 75.6, - 90.1, 6); - Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(), - "getGeoDeviceLocations request failed with valid parameters"); - } -} From 919fedee207b604b68520d31ff62b0da10740ff4 Mon Sep 17 00:00:00 2001 From: charitha Date: Tue, 31 Jul 2018 16:00:12 +0530 Subject: [PATCH 5/9] Improved geo-fencing performance --- .../resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql | 5 +---- .../Geo-ExecutionPlan-Exit_alert_for_GeoClusters.siddhiql | 2 +- .../alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql | 2 +- ...o-ExecutionPlan-Proximity_alert_for_GeoClusters.siddhiql | 2 +- .../resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql | 5 +---- .../Geo-ExecutionPlan-Speed_alert_for_GeoClusters.siddhiql | 2 +- .../alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql | 2 +- ...-ExecutionPlan-Stationery_alert_for_GeoClusters.siddhiql | 2 +- .../alerts/Geo-ExecutionPlan-Within_alert.siddhiql | 5 +---- .../Geo-ExecutionPlan-Within_alert_for_GeoClusters.siddhiql | 2 +- .../app/units/cdmf.unit.geo-dashboard/geo-dashboard.hbs | 6 +++--- .../units/cdmf.unit.geo-dashboard/public/js/websocket.js | 2 +- 12 files changed, 14 insertions(+), 23 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql index ac6d350cf6..f4e47bb2fa 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql @@ -12,12 +12,9 @@ define stream dataIn (id string, latitude double, longitude double, timeStamp lo @Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string, state string, information string); -from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==false and id == "$deviceId"]#geodashboard:subscribe() +from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==false and id == "$deviceId"] select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is outside $areaName area!!!") as information insert into dataOut; from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")!=false and id == "$deviceId"] select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "NORMAL" as state, "" as information insert into dataOut; -from dataIn[id != "$deviceId"] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "NORMAL" as state, "" as information -insert into dataOut; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert_for_GeoClusters.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert_for_GeoClusters.siddhiql index 68fe23e0b8..71d5e10114 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert_for_GeoClusters.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert_for_GeoClusters.siddhiql @@ -12,7 +12,7 @@ define stream dataIn (id string, latitude double, longitude double, timeStamp lo @Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string, state string, information string); -from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==false]#geodashboard:subscribe() +from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==false] select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is outside $areaName area!!!") as information insert into dataOut; from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")!=false] diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql index fb64720391..58ac836c47 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql @@ -18,7 +18,7 @@ define table ProximityTable(id string, timeStamp long); @IndexBy('id') define table AlertsTable(id string , proximityWith string, eventId string); -from dataIn#geodashboard:subscribe() +from dataIn select id, latitude, longitude, timeStamp, type, speed, heading, eventId insert into initialStream; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert_for_GeoClusters.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert_for_GeoClusters.siddhiql index fb64720391..58ac836c47 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert_for_GeoClusters.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert_for_GeoClusters.siddhiql @@ -18,7 +18,7 @@ define table ProximityTable(id string, timeStamp long); @IndexBy('id') define table AlertsTable(id string , proximityWith string, eventId string); -from dataIn#geodashboard:subscribe() +from dataIn select id, latitude, longitude, timeStamp, type, speed, heading, eventId insert into initialStream; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql index 39c4a0b280..6cc4581394 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql @@ -12,12 +12,9 @@ define stream dataIn (id string, latitude double, longitude double, timeStamp lo @Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string, state string, information string); -from dataIn[speed >= $speedAlertValue and id == "$deviceId"]#geodashboard:subscribe() +from dataIn[speed >= $speedAlertValue and id == "$deviceId"] select id , latitude, longitude,timeStamp, type ,speed, heading ,eventId , "ALERTED" as state, str:concat(str:concat(str:concat(str:concat("Movement of ",type), " device "), id), " is not normal!!") as information insert into dataOut; from dataIn[speed < $speedAlertValue and id == "$deviceId"] select id , latitude, longitude,timeStamp, type ,speed, heading ,eventId , "NORMAL" as state, str:concat(str:concat(str:concat(str:concat("Movement of ",type), " device "), id), " is normal") as information insert into dataOut; -from dataIn[id != "$deviceId"] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "NORMAL" as state, "" as information -insert into dataOut; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert_for_GeoClusters.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert_for_GeoClusters.siddhiql index ba7a6d24d9..7ecd9948cd 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert_for_GeoClusters.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert_for_GeoClusters.siddhiql @@ -12,7 +12,7 @@ define stream dataIn (id string, latitude double, longitude double, timeStamp lo @Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string, state string, information string); -from dataIn[speed >= $speedAlertValue]#geodashboard:subscribe() +from dataIn[speed >= $speedAlertValue] select id , latitude, longitude,timeStamp, type ,speed, heading ,eventId , "ALERTED" as state, str:concat(str:concat(str:concat(str:concat("Movement of ",type), " device "), id), " is not normal!!") as information insert into dataOut; from dataIn[speed < $speedAlertValue] diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql index 6f0e8aac75..f29f50be68 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql @@ -19,7 +19,7 @@ define table StationeryTable(id string, timeStamp long); @IndexBy('id') define table AlertsTable(id string, stationary bool); -from dataIn#geodashboard:subscribe() +from dataIn select id, latitude, longitude, timeStamp, type, speed, heading, eventId,geo:within(longitude,latitude,"$geoFenceGeoJSON") as isWithin insert into innerStreamOne; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert_for_GeoClusters.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert_for_GeoClusters.siddhiql index 6f0e8aac75..f29f50be68 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert_for_GeoClusters.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert_for_GeoClusters.siddhiql @@ -19,7 +19,7 @@ define table StationeryTable(id string, timeStamp long); @IndexBy('id') define table AlertsTable(id string, stationary bool); -from dataIn#geodashboard:subscribe() +from dataIn select id, latitude, longitude, timeStamp, type, speed, heading, eventId,geo:within(longitude,latitude,"$geoFenceGeoJSON") as isWithin insert into innerStreamOne; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql index 38240e4937..f88e1a8d24 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql @@ -12,12 +12,9 @@ define stream dataIn (id string, latitude double, longitude double, timeStamp lo @Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string, state string, information string); -from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==true and id == "$deviceId"]#geodashboard:subscribe() +from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==true and id == "$deviceId"] select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "ALERTED" as state, str:concat(str:concat(str:concat(type," device "), id), " is in $areaName restricted area!!!") as information insert into dataOut; from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")!=true and id == "$deviceId"] select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "NORMAL" as state, "" as information insert into dataOut; -from dataIn[id != "$deviceId"] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "NORMAL" as state, "" as information -insert into dataOut; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert_for_GeoClusters.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert_for_GeoClusters.siddhiql index 67fa2df594..9c6862662f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert_for_GeoClusters.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert_for_GeoClusters.siddhiql @@ -12,7 +12,7 @@ define stream dataIn (id string, latitude double, longitude double, timeStamp lo @Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string, state string, information string); -from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==true]#geodashboard:subscribe() +from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==true] select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "ALERTED" as state, str:concat(str:concat(str:concat(type," device "), id), " is in $areaName restricted area!!!") as information insert into dataOut; from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")!=true] diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/geo-dashboard.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/geo-dashboard.hbs index fdb006aeb5..e2a5018d80 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/geo-dashboard.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/geo-dashboard.hbs @@ -521,10 +521,10 @@

{{#if geoServicesEnabled}}
Speed km/h
-
Heading
+ - - + + {{/if}}
diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/websocket.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/websocket.js index eb5a157252..5bc0c3d8a1 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/websocket.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/websocket.js @@ -214,7 +214,7 @@ SpatialObject.prototype.update = function (geoJSON) { this.popupTemplate.find('#information').html(this.information); this.popupTemplate.find('#speed').html(Math.round(this.speed * 10) / 10); - this.popupTemplate.find('#heading').html(angleToHeading(this.heading)); + // this.popupTemplate.find('#heading').html(angleToHeading(this.heading)); this.marker.setPopupContent(this.popupTemplate.html()) }; From 2a995deeb4ca1c590e8a9b08bf413312e69d55c7 Mon Sep 17 00:00:00 2001 From: charitha Date: Fri, 3 Aug 2018 22:31:24 +0530 Subject: [PATCH 6/9] Prevent duplicate alerts & added owner field --- .../mgt/common/DeviceManagementConstants.java | 2 + .../impl/DeviceInformationManagerImpl.java | 3 +- .../GeoLocationProviderServiceImpl.java | 7 ++- .../Geo-ExecutionPlan-Exit_alert.siddhiql | 31 +++++++--- ...Geo-ExecutionPlan-Proximity_alert.siddhiql | 56 +++++++++---------- ...n-Proximity_alert_for_GeoClusters.siddhiql | 2 +- .../Geo-ExecutionPlan-Speed_alert.siddhiql | 24 +++++--- ...nPlan-Speed_alert_for_GeoClusters.siddhiql | 2 +- ...eo-ExecutionPlan-Stationery_alert.siddhiql | 36 +++++++----- .../Geo-ExecutionPlan-Traffic_alert.siddhiql | 8 +-- .../Geo-ExecutionPlan-Within_alert.siddhiql | 31 +++++++--- .../public/js/geo_remote.js | 19 ------- .../public/js/geo_remote.js | 23 +------- 13 files changed, 131 insertions(+), 113 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceManagementConstants.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceManagementConstants.java index e5b1183673..f826aacb5f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceManagementConstants.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceManagementConstants.java @@ -113,6 +113,8 @@ public final class DeviceManagementConstants { public static final String FLUCTUATION_RADIUS = "fluctuationRadius"; public static final String QUERY_NAME = "queryName"; public static final String AREA_NAME = "areaName"; + public static final String EXECUTION_PLAN_NAME = "executionPlanName"; + public static final String DEVICE_OWNER = "owner"; public static final String GEO_FENCE_GEO_JSON = "geoFenceGeoJSON"; public static final String SPEED_ALERT_VALUE = "speedAlertValue"; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java index 8c9f357b19..f265509910 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/device/details/mgt/impl/DeviceInformationManagerImpl.java @@ -198,9 +198,8 @@ public class DeviceInformationManagerImpl implements DeviceInformationManager { deviceDAO.updateDevice(device, CarbonContext.getThreadLocalCarbonContext().getTenantId()); deviceDetailsDAO.deleteDeviceLocation(deviceLocation.getDeviceId(), device.getEnrolmentInfo().getId()); deviceDetailsDAO.addDeviceLocation(deviceLocation, device.getEnrolmentInfo().getId()); - //TODO: This has to be fixed with enrollment id or username should include in the stream def. if (DeviceManagerUtil.isPublishLocationResponseEnabled()) { - Object[] metaData = {device.getDeviceIdentifier(), device.getType()}; + Object[] metaData = {device.getDeviceIdentifier(), device.getEnrolmentInfo().getOwner(), device.getType()}; Object[] payload = new Object[]{ deviceLocation.getUpdatedTime().getTime(), deviceLocation.getLatitude(), diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java index 1fd4700b39..c5bcec41c2 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java @@ -376,6 +376,7 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic ExecutionPlanConfigurationDto[] allActiveExecutionPlanConfigs = null; String activeExecutionPlan = null; String executionPlanName = getExecutionPlanName(alertType, alert.getQueryName()); + parseMap.put(GeoServices.EXECUTION_PLAN_NAME, executionPlanName); eventprocessorStub = getEventProcessorAdminServiceStub(); String parsedTemplate = parseTemplateForGeoClusters(alertType, parseMap); String validationResponse = eventprocessorStub.validateExecutionPlan(parsedTemplate); @@ -483,6 +484,8 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic ExecutionPlanConfigurationDto[] allActiveExecutionPlanConfigs = null; String activeExecutionPlan = null; String executionPlanName = getExecutionPlanName(alertType, alert.getQueryName(), identifier.getId(), owner); + parseMap.put(GeoServices.EXECUTION_PLAN_NAME, executionPlanName); + parseMap.put(GeoServices.DEVICE_OWNER, owner); eventprocessorStub = getEventProcessorAdminServiceStub(); String parsedTemplate = parseTemplate(alertType, parseMap); String validationResponse = eventprocessorStub.validateExecutionPlan(parsedTemplate); @@ -600,8 +603,10 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } private String getExecutionPlanName(String alertType, String queryName, String deviceId, String owner) { - if ("Traffic".equals(alertType)) { + if (GeoServices.ALERT_TYPE_TRAFFIC.equals(alertType)) { return "Geo-ExecutionPlan-Traffic_" + queryName + "_alert"; + } else if (GeoServices.ALERT_TYPE_SPEED.equals(alertType)) { + return "Geo-ExecutionPlan-" + alertType + "---_" + owner + "_" + deviceId + "_alert"; } else { return "Geo-ExecutionPlan-" + alertType + "_" + queryName + "---_" + owner + "_" + deviceId + "_alert"; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql index f4e47bb2fa..982cb09cb3 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql @@ -7,14 +7,31 @@ /* define streams/tables and write queries here ... */ @Import('org.wso2.geo.StandardSpatialEvents:1.0.0') -define stream dataIn (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string); +define stream dataIn (id string, owner string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string); -@Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') -define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string, state string, information string); +@Export('iot.per.device.stream.geo.FusedSpatialEvent:1.0.0') +define stream dataOut (id string, owner string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, state string, information string, notify bool); -from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==false and id == "$deviceId"] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is outside $areaName area!!!") as information +@Export('iot.per.device.stream.geo.AlertNotifications:1.0.0') +define stream alertsOut (id string, owner string, state string, information string, timeStamp long, latitude double, longitude double, type string); + +/* Check if the device is within the geo fence. */ +from dataIn[id == "$deviceId" and owner == "$owner"] +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId, geo:within(longitude,latitude,"$geoFenceGeoJSON") as isWithin +insert into withinStream; + +from withinStream[isWithin == false] +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is outside $areaName area!!!") as information, true as notify insert into dataOut; -from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")!=false and id == "$deviceId"] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "NORMAL" as state, "" as information + +from withinStream[isWithin == true] +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "NORMAL" as state, "" as information, false as notify insert into dataOut; + +from every fs1=withinStream, fs2=withinStream[fs1.isWithin != isWithin] +select fs2.id, fs2.owner, fs2.latitude, fs2.longitude, fs2.timeStamp, fs2.type, fs2.speed, fs2.heading, fs2.eventId, fs2.isWithin +insert into crossedStream; + +from crossedStream[isWithin == false] +select id, owner, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is outside $areaName area!!!") as information, timeStamp, latitude, longitude, type +insert into alertsOut; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql index 58ac836c47..55a33c2438 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql @@ -1,5 +1,5 @@ /* Enter a unique ExecutionPlan */ -@Plan:name('Geo-ExecutionPlan-Proximity_alert') +@Plan:name('$executionPlanName') /* Enter a unique description for ExecutionPlan */ -- @Plan:description('ExecutionPlan') @@ -7,10 +7,10 @@ /* define streams/tables and write queries here ... */ @Import('org.wso2.geo.StandardSpatialEvents:1.0.0') -define stream dataIn (id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string ); +define stream dataIn (id string, owner string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string ); -@Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') -define stream dataOut ( id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string, state string, information string ); +@Export('iot.per.device.stream.geo.FusedSpatialEvent:1.0.0') +define stream dataOut (id string, owner string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, state string, information string, notify bool); @IndexBy('id') define table ProximityTable(id string, timeStamp long); @@ -19,11 +19,11 @@ define table ProximityTable(id string, timeStamp long); define table AlertsTable(id string , proximityWith string, eventId string); from dataIn -select id, latitude, longitude, timeStamp, type, speed, heading, eventId +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId insert into initialStream; from initialStream[type == 'STOP'] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "" as proximityInfo ,"false" as isProximity +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId , "" as proximityInfo ,"false" as isProximity insert into dataOutStream; from initialStream[type != 'STOP'] @@ -31,51 +31,51 @@ select * insert into objectInitialStream; from objectInitialStream#geo:proximity(id,longitude,latitude, $proximityDistance) -select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith insert into proxymityStream; from proxymityStream[AlertsTable.id == proxymityStream.id in AlertsTable] -select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,true as inAlertTable +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,true as inAlertTable insert into innerStreamOne; from proxymityStream[not(AlertsTable.id == proxymityStream.id in AlertsTable)] -select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,false as inAlertTable +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,false as inAlertTable insert into innerStreamOne; from proxymityStream[AlertsTable.id == proxymityStream.proximityWith in AlertsTable] -select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,true as inAlertTable +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId, inCloseProximity, proximityWith, true as inAlertTable insert into innerStreamSeven; from proxymityStream[not(AlertsTable.id == proxymityStream.proximityWith in AlertsTable)] -select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,false as inAlertTable +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,false as inAlertTable insert into innerStreamSeven; from innerStreamOne[inCloseProximity == true AND not(inAlertTable)] -select id,str:concat(",",proximityWith) as proximityWith , eventId +select id, owner, str:concat(",",proximityWith) as proximityWith , eventId insert into AlertsTable; from innerStreamSeven[inCloseProximity == true AND not(inAlertTable)] -select proximityWith as id,str:concat(",",id) as proximityWith , eventId +select proximityWith as id, owner, str:concat(",",id) as proximityWith , eventId insert into AlertsTable; from innerStreamOne[innerStreamOne.inCloseProximity == true AND inAlertTable]#window.length(0) join AlertsTable on innerStreamOne.id == AlertsTable.id -select innerStreamOne.id as id, str:concat(",", innerStreamOne.proximityWith, AlertsTable.proximityWith) as proximityWith, innerStreamOne.eventId as eventId +select innerStreamOne.id as id, innerStreamOne.owner as owner, str:concat(",", innerStreamOne.proximityWith, AlertsTable.proximityWith) as proximityWith, innerStreamOne.eventId as eventId insert into updateStream; from innerStreamSeven[innerStreamSeven.inCloseProximity == true AND inAlertTable]#window.length(0) join AlertsTable on innerStreamSeven.proximityWith == AlertsTable.id -select innerStreamSeven.proximityWith as id, str:concat(",", innerStreamSeven.id, AlertsTable.proximityWith) as proximityWith, innerStreamSeven.eventId as eventId +select innerStreamSeven.proximityWith as id, innerStreamSeven.owner as owner, str:concat(",", innerStreamSeven.id, AlertsTable.proximityWith) as proximityWith, innerStreamSeven.eventId as eventId insert into updateStream; from innerStreamOne[innerStreamOne.inCloseProximity == false AND inAlertTable]#window.length(0) join AlertsTable on innerStreamOne.id == AlertsTable.id -select innerStreamOne.id as id, str:replaceAll(AlertsTable.proximityWith, str:concat(",", innerStreamOne.proximityWith), "") as proximityWith, innerStreamOne.eventId as eventId +select innerStreamOne.id as id, innerStreamOne.owner as owner, str:replaceAll(AlertsTable.proximityWith, str:concat(",", innerStreamOne.proximityWith), "") as proximityWith, innerStreamOne.eventId as eventId insert into updateStream; from innerStreamSeven[innerStreamSeven.inCloseProximity == false AND inAlertTable]#window.length(0) join AlertsTable on innerStreamSeven.proximityWith == AlertsTable.id -select innerStreamSeven.proximityWith as id, str:replaceAll(AlertsTable.proximityWith, str:concat(",", innerStreamSeven.id), "") as proximityWith, innerStreamSeven.eventId as eventId +select innerStreamSeven.proximityWith as id, innerStreamSeven.owner as owner, str:replaceAll(AlertsTable.proximityWith, str:concat(",", innerStreamSeven.id), "") as proximityWith, innerStreamSeven.eventId as eventId insert into updateStream; from updateStream @@ -88,23 +88,23 @@ delete AlertsTable on id== AlertsTable.id; from objectInitialStream[AlertsTable.id == objectInitialStream.id in AlertsTable] -select id, latitude, longitude, timeStamp, type, speed, heading, eventId, true as inAlertTable +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId, true as inAlertTable insert into publishStream; from objectInitialStream[not(AlertsTable.id == objectInitialStream.id in AlertsTable)] -select id, latitude, longitude, timeStamp, type, speed, heading, eventId, false as inAlertTable +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId, false as inAlertTable insert into publishStream; from publishStream[inAlertTable == true]#window.length(0) join AlertsTable on publishStream.id== AlertsTable.id -select publishStream.id as id, publishStream.latitude as latitude, publishStream.longitude as longitude, publishStream.timeStamp as timeStamp, publishStream.type as type, publishStream.speed as speed, publishStream.heading as heading, publishStream.eventId as eventId, AlertsTable.proximityWith as proximityInfo +select publishStream.id as id, publishStream.owner as owner, publishStream.latitude as latitude, publishStream.longitude as longitude, publishStream.timeStamp as timeStamp, publishStream.type as type, publishStream.speed as speed, publishStream.heading as heading, publishStream.eventId as eventId, AlertsTable.proximityWith as proximityInfo insert into innerStreamTwo; from publishStream[inAlertTable == false] delete ProximityTable on ProximityTable.id==id; from publishStream[inAlertTable == false] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "" as proximityInfo ,"false" as isProximity +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId , "" as proximityInfo ,"false" as isProximity insert into dataOutStream; from innerStreamTwo[ProximityTable.id == innerStreamTwo.id in ProximityTable] @@ -112,29 +112,29 @@ insert into innerStreamThree; from innerStreamThree#window.length(0) join ProximityTable on innerStreamThree.id == ProximityTable.id -select innerStreamThree.id , innerStreamThree.latitude, innerStreamThree.longitude,innerStreamThree.timeStamp, innerStreamThree.type, innerStreamThree.speed, innerStreamThree.heading ,innerStreamThree.eventId, ProximityTable.timeStamp as storedTime, innerStreamThree.proximityInfo as proximityInfo +select innerStreamThree.id, innerStreamThree.owner, innerStreamThree.latitude, innerStreamThree.longitude,innerStreamThree.timeStamp, innerStreamThree.type, innerStreamThree.speed, innerStreamThree.heading ,innerStreamThree.eventId, ProximityTable.timeStamp as storedTime, innerStreamThree.proximityInfo as proximityInfo insert into innerStreamFour; from innerStreamFour[(timeStamp - storedTime) >= $proximityTime] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,proximityInfo,"true" as isProximity +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId ,proximityInfo, "true" as isProximity insert into dataOutStream; from innerStreamFour[(timeStamp - storedTime) < $proximityTime] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , proximityInfo ,"false" as isProximity +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId, proximityInfo, "false" as isProximity insert into dataOutStream; from innerStreamTwo[not(ProximityTable.id == innerStreamTwo.id in ProximityTable)] -select innerStreamTwo.id, innerStreamTwo.timeStamp +select innerStreamTwo.id, innerStreamTwo.owner, innerStreamTwo.timeStamp insert into ProximityTable; from innerStreamTwo[not(ProximityTable.id == innerStreamTwo.id in ProximityTable)] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "" as proximityInfo ,"false" as isProximity +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId , "" as proximityInfo ,"false" as isProximity insert into dataOutStream; from dataOutStream[isProximity == 'true'] -select id, latitude, longitude, timeStamp, type, speed, heading, eventId,"WARNING" as state,str:concat("Proximity with "," ",proximityInfo) as information +select id, owner, latitude, longitude, timeStamp, type, speed, heading, "WARNING" as state,str:concat("Proximity with "," ",proximityInfo) as information, true as notify insert into dataOut; from dataOutStream[isProximity == 'false'] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,"NORMAL" as state,"" as information +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "NORMAL" as state,"" as information, false as notify insert into dataOut; \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert_for_GeoClusters.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert_for_GeoClusters.siddhiql index 58ac836c47..73c5ac0616 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert_for_GeoClusters.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Proximity_alert_for_GeoClusters.siddhiql @@ -1,5 +1,5 @@ /* Enter a unique ExecutionPlan */ -@Plan:name('Geo-ExecutionPlan-Proximity_alert') +@Plan:name('$executionPlanName') /* Enter a unique description for ExecutionPlan */ -- @Plan:description('ExecutionPlan') diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql index 6cc4581394..022d915220 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql @@ -1,5 +1,5 @@ /* Enter a unique ExecutionPlan */ -@Plan:name('Geo-ExecutionPlan-Speed---$deviceId_alert') +@Plan:name('$executionPlanName') /* Enter a unique description for ExecutionPlan */ -- @Plan:description('ExecutionPlan') @@ -7,14 +7,22 @@ /* define streams/tables and write queries here ... */ @Import('org.wso2.geo.StandardSpatialEvents:1.0.0') -define stream dataIn (id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string); +define stream dataIn (id string, owner string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string); -@Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') -define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string, state string, information string); +@Export('iot.per.device.stream.geo.FusedSpatialEvent:1.0.0') +define stream dataOut (id string, owner string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, state string, information string, notify bool ); -from dataIn[speed >= $speedAlertValue and id == "$deviceId"] -select id , latitude, longitude,timeStamp, type ,speed, heading ,eventId , "ALERTED" as state, str:concat(str:concat(str:concat(str:concat("Movement of ",type), " device "), id), " is not normal!!") as information +@Export('iot.per.device.stream.geo.AlertNotifications:1.0.0') +define stream alertsOut (id string, owner string, state string, information string, timeStamp long, latitude double, longitude double, type string); + +from dataIn[speed >= $speedAlertValue and id == "$deviceId" and owner == "$owner"] +select id, owner, latitude, longitude, timeStamp, type, speed, heading, "ALERTED" as state, str:concat(str:concat(str:concat(str:concat("Speed of ",type), " device "), id), " is not normal!!") as information, true as notify insert into dataOut; -from dataIn[speed < $speedAlertValue and id == "$deviceId"] -select id , latitude, longitude,timeStamp, type ,speed, heading ,eventId , "NORMAL" as state, str:concat(str:concat(str:concat(str:concat("Movement of ",type), " device "), id), " is normal") as information + +from dataIn[speed < $speedAlertValue and id == "$deviceId" and owner == "$owner"] +select id, owner, latitude, longitude, timeStamp, type, speed, heading, "NORMAL" as state, str:concat(str:concat(str:concat(str:concat("Speed of ",type), " device "), id), " is normal") as information, false as notify insert into dataOut; + +from dataOut[notify == true] +select id, owner, state, information, timeStamp, latitude, longitude, type +insert into alertsOut; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert_for_GeoClusters.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert_for_GeoClusters.siddhiql index 7ecd9948cd..59973ad7ea 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert_for_GeoClusters.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert_for_GeoClusters.siddhiql @@ -1,5 +1,5 @@ /* Enter a unique ExecutionPlan */ -@Plan:name('Geo-ExecutionPlan-Speed---_alert') +@Plan:name('$executionPlanName') /* Enter a unique description for ExecutionPlan */ -- @Plan:description('ExecutionPlan') diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql index f29f50be68..00673bb203 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql @@ -7,11 +7,13 @@ /* define streams/tables and write queries here ... */ @Import('org.wso2.geo.StandardSpatialEvents:1.0.0') -define stream dataIn (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string); +define stream dataIn (id string, owner string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string); +@Export('iot.per.device.stream.geo.FusedSpatialEvent:1.0.0') +define stream dataOut (id string, owner string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, state string, information string, notify bool ); -@Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') -define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string, state string, information string); +@Export('iot.per.device.stream.geo.AlertNotifications:1.0.0') +define stream alertsOut (id string, owner string, state string, information string, timeStamp long, latitude double, longitude double, type string); @IndexBy('id') define table StationeryTable(id string, timeStamp long); @@ -20,18 +22,18 @@ define table StationeryTable(id string, timeStamp long); define table AlertsTable(id string, stationary bool); from dataIn -select id, latitude, longitude, timeStamp, type, speed, heading, eventId,geo:within(longitude,latitude,"$geoFenceGeoJSON") as isWithin +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId,geo:within(longitude,latitude,"$geoFenceGeoJSON") as isWithin insert into innerStreamOne; from innerStreamOne[isWithin == false] delete StationeryTable on StationeryTable.id==id; from innerStreamOne[isWithin == false] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "false" as isStationary +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId , "false" as isStationary insert into dataOutStream; from innerStreamOne[isWithin == true]#geo:stationary(id,longitude,latitude, $fluctuationRadius) -select id, latitude, longitude, timeStamp, type, speed, heading, eventId,stationary +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId,stationary insert into innerStreamTwo; from innerStreamTwo[innerStreamTwo.stationary == true] @@ -45,7 +47,7 @@ from innerStreamTwo[innerStreamTwo.stationary == false] delete StationeryTable on StationeryTable.id==id; from innerStreamOne[isWithin == true AND not(AlertsTable.id == innerStreamOne.id in AlertsTable)] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "false" as isStationary +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId , "false" as isStationary insert into dataOutStream; from innerStreamOne[isWithin == true AND AlertsTable.id == innerStreamOne.id in AlertsTable] @@ -53,7 +55,7 @@ insert into innerStreamThree; from innerStreamThree#window.length(0) join AlertsTable on innerStreamThree.id == AlertsTable.id -select innerStreamThree.id , innerStreamThree.latitude, innerStreamThree.longitude,innerStreamThree.timeStamp, innerStreamThree.type, innerStreamThree.speed, innerStreamThree.heading ,innerStreamThree.eventId +select innerStreamThree.id, innerStreamThree.owner, innerStreamThree.latitude, innerStreamThree.longitude,innerStreamThree.timeStamp, innerStreamThree.type, innerStreamThree.speed, innerStreamThree.heading ,innerStreamThree.eventId insert into innerStreamFour; from innerStreamFour[not(StationeryTable.id == innerStreamFour.id in StationeryTable)] @@ -61,7 +63,7 @@ select innerStreamFour.id, innerStreamFour.timeStamp insert into StationeryTable; from innerStreamOne[isWithin == true AND not(StationeryTable.id == innerStreamOne.id in StationeryTable)] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "false" as isStationary +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId , "false" as isStationary insert into dataOutStream; from innerStreamOne[isWithin == true AND StationeryTable.id == innerStreamOne.id in StationeryTable] @@ -69,21 +71,25 @@ insert into innerStreamFive; from innerStreamFive#window.length(0) join StationeryTable on innerStreamFive.id == StationeryTable.id -select innerStreamFive.id , innerStreamFive.latitude, innerStreamFive.longitude,innerStreamFive.timeStamp, innerStreamFive.type, innerStreamFive.speed, innerStreamFive.heading ,innerStreamFive.eventId, StationeryTable.timeStamp as storedTime +select innerStreamFive.id, innerStreamFive.owner, innerStreamFive.latitude, innerStreamFive.longitude,innerStreamFive.timeStamp, innerStreamFive.type, innerStreamFive.speed, innerStreamFive.heading ,innerStreamFive.eventId, StationeryTable.timeStamp as storedTime insert into innerStreamSix; from innerStreamSix[(timeStamp - storedTime) >= $stationeryTime] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,"true" as isStationary +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId ,"true" as isStationary insert into dataOutStream; from innerStreamSix[(timeStamp - storedTime) < $stationeryTime] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,"false" as isStationary +select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId ,"false" as isStationary insert into dataOutStream; from dataOutStream[isStationary == 'true'] -select id ,latitude, longitude,timeStamp, type, speed, heading ,eventId ,"ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id),"is in $stationeryName area!!!") as information +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id),"is in $stationeryName area!!!") as information, true as notify insert into dataOut; from dataOutStream[isStationary == 'false'] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,"NORMAL" as state,"" as information -insert into dataOut; \ No newline at end of file +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "NORMAL" as state,"" as information, false as notify +insert into dataOut; + +from dataOut[notify == true] +select id, owner, state, information, timeStamp, latitude, longitude, type +insert into alertsOut; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Traffic_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Traffic_alert.siddhiql index 5e6bb5b1a8..c5ce1187ee 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Traffic_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Traffic_alert.siddhiql @@ -7,11 +7,11 @@ /* define streams/tables and write queries here ... */ @Import('rawGeoStream:1.0.0') -define stream dataIn (id string, timeStamp long, geometry string, state string, information string); +define stream dataIn (id string, owner string, timeStamp long, geometry string, state string, information string); @Export('AlertsNotifications:1.0.0') -define stream dataOut (id string, state string, information string, timeStamp long, latitude double, longitude double); +define stream dataOut (id string, owner string, state string, information string, timeStamp long, latitude double, longitude double); -from dataIn[geo:intersects(geometry, "$geoFenceGeoJSON")==true and geodashboard:needToNotify(id, str:concat(information, state), "sendFirst") == true and id == $deviceId] -select id, state, str:concat("Traffic alert in $areaName. State: ", state, " ", information) as information, timeStamp, 0.0 as latitude, 0.0 as longitude +from dataIn[geo:intersects(geometry, "$geoFenceGeoJSON")==true and geodashboard:needToNotify(id, str:concat(information, state), "sendFirst") == true and id == "$deviceId" and owner == "$owner"] +select id, owner, state, str:concat("Traffic alert in $areaName. State: ", state, " ", information) as information, timeStamp, 0.0 as latitude, 0.0 as longitude insert into dataOut \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql index f88e1a8d24..2ce27e7f3b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql @@ -7,14 +7,31 @@ /* define streams/tables and write queries here ... */ @Import('org.wso2.geo.StandardSpatialEvents:1.0.0') -define stream dataIn (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string); +define stream dataIn (id string, owner string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string); -@Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') -define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string, state string, information string); +@Export('iot.per.device.stream.geo.FusedSpatialEvent:1.0.0') +define stream dataOut (id string, owner string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, state string, information string, notify bool ); -from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==true and id == "$deviceId"] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "ALERTED" as state, str:concat(str:concat(str:concat(type," device "), id), " is in $areaName restricted area!!!") as information +@Export('iot.per.device.stream.geo.AlertNotifications:1.0.0') +define stream alertsOut (id string, owner string, state string, information string, timeStamp long, latitude double, longitude double, type string); + +/* Check if the device is within the geo fence. */ +from dataIn[id == "$deviceId" and owner == "$owner"] +select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId, geo:within(longitude,latitude,"$geoFenceGeoJSON") as isWithin +insert into withinStream; + +from withinStream[isWithin == true] +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is in $areaName restricted area!!!") as information, true as notify insert into dataOut; -from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")!=true and id == "$deviceId"] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "NORMAL" as state, "" as information + +from withinStream[isWithin == false] +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "NORMAL" as state, "" as information, false as notify insert into dataOut; + +from every fs1=withinStream, fs2=withinStream[fs1.isWithin != isWithin] +select fs2.id, fs2.owner, fs2.latitude, fs2.longitude, fs2.timeStamp, fs2.type, fs2.speed, fs2.heading, fs2.eventId, fs2.isWithin +insert into crossedStream; + +from crossedStream[isWithin == true] +select id, owner, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is outside $areaName area!!!") as information, timeStamp, latitude, longitude, type +insert into alertsOut; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/geo_remote.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/geo_remote.js index b6e5cba7e3..136e455453 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/geo_remote.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/geo_remote.js @@ -248,7 +248,6 @@ function setWithinAlert(leafletId) { var data = { 'parseData': JSON.stringify({ 'geoFenceGeoJSON': selectedAreaGeoJson, - 'executionPlanName': createExecutionPlanName(queryName, "WithIn", deviceId), 'areaName': areaName, 'deviceId': deviceId }), @@ -307,7 +306,6 @@ function setExitAlert(leafletId) { var data = { 'parseData': JSON.stringify({ 'geoFenceGeoJSON': selectedAreaGeoJson, - 'executionPlanName': createExecutionPlanName(queryName, "Exit", deviceId), 'areaName': areaName, 'deviceId': deviceId }), @@ -379,7 +377,6 @@ function setStationeryAlert(leafletId) { var data = { 'parseData': JSON.stringify({ 'geoFenceGeoJSON': selectedProcessedAreaGeoJson, - 'executionPlanName': createExecutionPlanName(queryName, "Stationery", deviceId), 'stationeryName': stationeryName, 'stationeryTime': time, 'fluctuationRadius': fluctuationRadius @@ -492,7 +489,6 @@ function setTrafficAlert(leafletId) { var data = { 'parseData': JSON.stringify({ 'geoFenceGeoJSON': selectedProcessedAreaGeoJson, - 'executionPlanName': createExecutionPlanName(queryName, "Traffic", deviceId), 'areaName': areaName }), 'executionPlan': 'Traffic', @@ -634,21 +630,6 @@ function setProximityAlert() { } } -// TODO:this is not a remote call , move this to application.js -function createExecutionPlanName(queryName, id, deviceId) { - - if (id == "WithIn") { - 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 == "Exit") { - return 'Geo-ExecutionPlan-Exit' + (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") { - 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") { - 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) - } - -} - // TODO:this is not a remote call , move this to application.js function closeAll() { $('.modal').modal('hide'); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/geo_remote.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/geo_remote.js index af47b6db21..ce78a0a66b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/geo_remote.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-devices/public/js/geo_remote.js @@ -165,7 +165,9 @@ function setSpeedAlert() { noty({text: message, type: 'error'}); } else { data = { - 'parseData': JSON.stringify({'speedAlertValue': speedAlertValue, 'deviceId': deviceId}), // parseKey : parseValue pair , this key pair is replace with the key in the template file + 'parseData': JSON.stringify({ + 'speedAlertValue': speedAlertValue, + 'deviceId': deviceId}), // parseKey : parseValue pair , this key pair is replace with the key in the template file 'executionPlan': 'Speed', 'customName': null, 'cepAction': 'edit', @@ -221,7 +223,6 @@ function setWithinAlert(leafletId) { var data = { 'parseData': JSON.stringify({ 'geoFenceGeoJSON': selectedAreaGeoJson, - 'executionPlanName': createExecutionPlanName(queryName, "WithIn", deviceId), 'areaName': areaName, 'deviceId': deviceId }), @@ -280,7 +281,6 @@ function setExitAlert(leafletId) { var data = { 'parseData': JSON.stringify({ 'geoFenceGeoJSON': selectedAreaGeoJson, - 'executionPlanName': createExecutionPlanName(queryName, "Exit", deviceId), 'areaName': areaName, 'deviceId': deviceId }), @@ -352,7 +352,6 @@ function setStationeryAlert(leafletId) { var data = { 'parseData': JSON.stringify({ 'geoFenceGeoJSON': selectedProcessedAreaGeoJson, - 'executionPlanName': createExecutionPlanName(queryName, "Stationery", deviceId), 'stationeryName': stationeryName, 'stationeryTime': time, 'fluctuationRadius': fluctuationRadius @@ -427,7 +426,6 @@ function setTrafficAlert(leafletId) { var data = { 'parseData': JSON.stringify({ 'geoFenceGeoJSON': selectedProcessedAreaGeoJson, - 'executionPlanName': createExecutionPlanName(queryName, "Traffic", deviceId), 'areaName': areaName }), 'executionPlan': 'Traffic', @@ -569,21 +567,6 @@ function setProximityAlert() { } } -// TODO:this is not a remote call , move this to application.js -function createExecutionPlanName(queryName, id) { - - if (id == "WithIn") { - return 'Geo-ExecutionPlan-Within' + (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) - } else if (id == "Exit") { - return 'Geo-ExecutionPlan-Exit' + (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) - } 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) - } 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) - } - -} - // TODO:this is not a remote call , move this to application.js function closeAll() { $('.modal').modal('hide'); From 055d422e23a257163383766ec18b1bee301a873e Mon Sep 17 00:00:00 2001 From: charitha Date: Fri, 10 Aug 2018 15:26:04 +0530 Subject: [PATCH 7/9] Publish geo alerts to cdm notifications --- .../cdmf.unit.geo-dashboard/public/js/app.js | 22 +++++++++---------- .../src/main/resources/dbscripts/cdm/h2.sql | 6 ++--- .../main/resources/dbscripts/cdm/mssql.sql | 6 ++--- .../main/resources/dbscripts/cdm/mysql.sql | 6 ++--- .../main/resources/dbscripts/cdm/oracle.sql | 6 ++--- .../resources/dbscripts/cdm/postgresql.sql | 6 ++--- 6 files changed, 21 insertions(+), 31 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/app.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/app.js index 266433f1c4..805ec7a3ab 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/app.js +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.geo-dashboard/public/js/app.js @@ -122,10 +122,10 @@ function processAfterInitializationMap(geoFencingEnabled) { }; map.addControl(L.control.fullscreen({position: 'bottomright'})); - geoAlertsBar = L.control.geoAlerts({position: 'topright'}); - if (geoFencingEnabled) { - map.addControl(geoAlertsBar); - } + // geoAlertsBar = L.control.geoAlerts({position: 'topright'}); + // if (geoFencingEnabled) { + // map.addControl(geoAlertsBar); + // } groupedOverlays = { "Web Map Service layers": {} @@ -256,7 +256,7 @@ function focusOnSpatialObject(objectId) { // TODO: check the map._layersMaxZoom and set the zoom level accordingly spatialObject.marker.openPopup(); - getAlertsHistory(deviceType, deviceId, new Date($('#timeFromCal').val()).getTime(), new Date($('#timeToCal').val()).getTime()); + // getAlertsHistory(deviceType, deviceId, new Date($('#timeFromCal').val()).getTime(), new Date($('#timeToCal').val()).getTime()); spatialObject.drawPath(); if (speedGraphControl) { setTimeout(function () { @@ -435,11 +435,11 @@ function drawSpatialObject() { return true; } - if (geoFencingEnabled) { - var alertsFromDate = new Date(); - alertsFromDate.setHours(alertsFromDate.getHours() - 24); //last 24 hours - getAlertsHistory(deviceType, deviceId, alertsFromDate.valueOf(), toDate.valueOf()); - } + // if (geoFencingEnabled) { + // var alertsFromDate = new Date(); + // alertsFromDate.setHours(alertsFromDate.getHours() - 24); //last 24 hours + // getAlertsHistory(deviceType, deviceId, alertsFromDate.valueOf(), toDate.valueOf()); + // } setTimeout(function () { map.invalidateSize(); @@ -513,7 +513,7 @@ function focusOnHistorySpatialObject(objectId, timeFrom, timeTo) { // TODO: check the map._layersMaxZoom and set the zoom level accordingly spatialObject.marker.openPopup(); - getAlertsHistory(deviceType, deviceId, new Date($('#timeFromCal').val()).getTime(), new Date($('#timeToCal').val()).getTime()); + // getAlertsHistory(deviceType, deviceId, new Date($('#timeFromCal').val()).getTime(), new Date($('#timeToCal').val()).getTime()); spatialObject.drawPath(); if (speedGraphControl) { setTimeout(function () { diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql index 9601b77742..6117eff996 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/h2.sql @@ -396,16 +396,14 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_APPLICATION_MAPPING ( CREATE TABLE IF NOT EXISTS DM_NOTIFICATION ( NOTIFICATION_ID INTEGER AUTO_INCREMENT NOT NULL, DEVICE_ID INTEGER NOT NULL, - OPERATION_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NULL, TENANT_ID INTEGER NOT NULL, STATUS VARCHAR(10) NULL, DESCRIPTION VARCHAR(1000) NULL, LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, PRIMARY KEY (NOTIFICATION_ID), CONSTRAINT fk_dm_device_notification FOREIGN KEY (DEVICE_ID) REFERENCES - DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, - CONSTRAINT fk_dm_operation_notification FOREIGN KEY (OPERATION_ID) REFERENCES - DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION + DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION ); -- NOTIFICATION TABLE END -- diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql index 204fedd387..7d0427a304 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mssql.sql @@ -439,16 +439,14 @@ IF NOT EXISTS (SELECT * FROM SYS.OBJECTS WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[D CREATE TABLE DM_NOTIFICATION ( NOTIFICATION_ID INTEGER IDENTITY(1,1) NOT NULL, DEVICE_ID INTEGER NOT NULL, - OPERATION_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NULL, TENANT_ID INTEGER NOT NULL, STATUS VARCHAR(10) NULL, DESCRIPTION VARCHAR(1000) NULL, LAST_UPDATED_TIMESTAMP DATETIME2 NOT NULL, PRIMARY KEY (NOTIFICATION_ID), CONSTRAINT FL_DM_NOTIFICATION FOREIGN KEY (DEVICE_ID) REFERENCES - DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, - CONSTRAINT FK_DM_OPERATION_NOTIFICATION FOREIGN KEY (OPERATION_ID) REFERENCES - DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION + DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION ); -- NOTIFICATION TABLE END -- diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql index b79a23f79e..ce2379f621 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/mysql.sql @@ -454,16 +454,14 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_GROUP_POLICY ( CREATE TABLE IF NOT EXISTS DM_NOTIFICATION ( NOTIFICATION_ID INTEGER AUTO_INCREMENT NOT NULL, DEVICE_ID INTEGER NOT NULL, - OPERATION_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NULL, TENANT_ID INTEGER NOT NULL, STATUS VARCHAR(10) NULL, DESCRIPTION VARCHAR(1000) NULL, LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, PRIMARY KEY (NOTIFICATION_ID), CONSTRAINT fk_dm_device_notification FOREIGN KEY (DEVICE_ID) REFERENCES - DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, - CONSTRAINT fk_dm_operation_notification FOREIGN KEY (OPERATION_ID) REFERENCES - DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION + DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION )ENGINE = InnoDB; -- END NOTIFICATION TABLES -- diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql index cc89ec76f3..c0007256b8 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/oracle.sql @@ -749,16 +749,14 @@ WHEN (NEW.ID IS NULL) CREATE TABLE DM_NOTIFICATION ( NOTIFICATION_ID NUMBER(10) NOT NULL, DEVICE_ID NUMBER(10) NOT NULL, - OPERATION_ID NUMBER(10) NOT NULL, + OPERATION_ID NUMBER(10) NULL, TENANT_ID NUMBER(10) NOT NULL, STATUS VARCHAR2(10) NULL, DESCRIPTION VARCHAR2(1000) NULL, LAST_UPDATED_TIMESTAMP TIMESTAMP(0) NOT NULL, CONSTRAINT PK_DM_NOTIFICATION PRIMARY KEY (NOTIFICATION_ID), CONSTRAINT FK_DM_DEVICE_NOTIFICATION FOREIGN KEY (DEVICE_ID) REFERENCES - DM_DEVICE (ID), - CONSTRAINT FK_DM_OPERATION_NOTIFICATION FOREIGN KEY (OPERATION_ID) REFERENCES - DM_OPERATION (ID) + DM_DEVICE (ID) ) / diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql index 7f74ab5246..83a85c6bb2 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/src/main/resources/dbscripts/cdm/postgresql.sql @@ -397,15 +397,13 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_GROUP_POLICY ( CREATE TABLE IF NOT EXISTS DM_NOTIFICATION ( NOTIFICATION_ID BIGSERIAL NOT NULL PRIMARY KEY, DEVICE_ID INTEGER NOT NULL, - OPERATION_ID INTEGER NOT NULL, + OPERATION_ID INTEGER NULL, TENANT_ID INTEGER NOT NULL, STATUS VARCHAR(10) NULL, DESCRIPTION VARCHAR(1000) NULL, LAST_UPDATED_TIMESTAMP TIMESTAMP NOT NULL, CONSTRAINT fk_dm_device_notification FOREIGN KEY (DEVICE_ID) REFERENCES - DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, - CONSTRAINT fk_dm_operation_notification FOREIGN KEY (OPERATION_ID) REFERENCES - DM_OPERATION (ID) ON DELETE NO ACTION ON UPDATE NO ACTION + DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION ); -- NOTIFICATION TABLE END -- From 8c0869649abe5b2eb1a4edde3a826f9d1d956c6f Mon Sep 17 00:00:00 2001 From: charitha Date: Fri, 10 Aug 2018 19:37:05 +0530 Subject: [PATCH 8/9] Update alert messages to convey proper meaning --- .../resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql | 4 ++-- .../resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql | 4 ++-- .../alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql | 2 +- .../resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql index 982cb09cb3..1e72dd1d4b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Exit_alert.siddhiql @@ -21,7 +21,7 @@ select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId, insert into withinStream; from withinStream[isWithin == false] -select id, owner, latitude, longitude,timeStamp, type, speed, heading, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is outside $areaName area!!!") as information, true as notify +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "ALERTED" as state, str:concat("The ", type, " device `", id, "` of $owner is outside $areaName area!") as information, true as notify insert into dataOut; from withinStream[isWithin == true] @@ -33,5 +33,5 @@ select fs2.id, fs2.owner, fs2.latitude, fs2.longitude, fs2.timeStamp, fs2.type, insert into crossedStream; from crossedStream[isWithin == false] -select id, owner, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is outside $areaName area!!!") as information, timeStamp, latitude, longitude, type +select id, owner, "ALERTED" as state, str:concat("The ", type, " device `", id, "` of $owner is outside $areaName area!") as information, timeStamp, latitude, longitude, type insert into alertsOut; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql index 022d915220..2309f64df3 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql @@ -16,11 +16,11 @@ define stream dataOut (id string, owner string, latitude double, longitude doubl define stream alertsOut (id string, owner string, state string, information string, timeStamp long, latitude double, longitude double, type string); from dataIn[speed >= $speedAlertValue and id == "$deviceId" and owner == "$owner"] -select id, owner, latitude, longitude, timeStamp, type, speed, heading, "ALERTED" as state, str:concat(str:concat(str:concat(str:concat("Speed of ",type), " device "), id), " is not normal!!") as information, true as notify +select id, owner, latitude, longitude, timeStamp, type, speed, heading, "ALERTED" as state, str:concat("The ", type, " device `", id, "` of $owner is traveling at ", math:round(speed), "km/h and is exceeding the $speedAlertValuekm/h speed limit") as information, true as notify insert into dataOut; from dataIn[speed < $speedAlertValue and id == "$deviceId" and owner == "$owner"] -select id, owner, latitude, longitude, timeStamp, type, speed, heading, "NORMAL" as state, str:concat(str:concat(str:concat(str:concat("Speed of ",type), " device "), id), " is normal") as information, false as notify +select id, owner, latitude, longitude, timeStamp, type, speed, heading, "NORMAL" as state, str:concat("The ", type, " device `", id, "` of $owner is travailing at normal speed.") as information, false as notify insert into dataOut; from dataOut[notify == true] diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql index 00673bb203..4d8ef13577 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql @@ -83,7 +83,7 @@ select id, owner, latitude, longitude,timeStamp, type, speed, heading ,eventId , insert into dataOutStream; from dataOutStream[isStationary == 'true'] -select id, owner, latitude, longitude,timeStamp, type, speed, heading, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id),"is in $stationeryName area!!!") as information, true as notify +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "ALERTED" as state, str:concat("The ", type, " device `", id, "` of $owner is in $stationeryName area!") as information, true as notify insert into dataOut; from dataOutStream[isStationary == 'false'] diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql index 2ce27e7f3b..5a704f046e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Within_alert.siddhiql @@ -21,7 +21,7 @@ select id, owner, latitude, longitude, timeStamp, type, speed, heading, eventId, insert into withinStream; from withinStream[isWithin == true] -select id, owner, latitude, longitude,timeStamp, type, speed, heading, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is in $areaName restricted area!!!") as information, true as notify +select id, owner, latitude, longitude,timeStamp, type, speed, heading, "ALERTED" as state, str:concat("The ", type, " device `", id, "` of $owner is inside $areaName area!") as information, true as notify insert into dataOut; from withinStream[isWithin == false] @@ -33,5 +33,5 @@ select fs2.id, fs2.owner, fs2.latitude, fs2.longitude, fs2.timeStamp, fs2.type, insert into crossedStream; from crossedStream[isWithin == true] -select id, owner, "ALERTED" as state, str:concat(str:concat(str:concat(type," device "),id), " is outside $areaName area!!!") as information, timeStamp, latitude, longitude, type +select id, owner, "ALERTED" as state, str:concat("The ", type, " device `", id, "` of $owner is inside $areaName area!") as information, timeStamp, latitude, longitude, type insert into alertsOut; From d2940bf7a136518dbc7f10e4c5ce724767f7c9fe Mon Sep 17 00:00:00 2001 From: charitha Date: Mon, 13 Aug 2018 09:44:40 +0530 Subject: [PATCH 9/9] Refactoring --- .../DeviceManagementProviderServiceImpl.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java index e87711e7ab..d76b281e01 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/DeviceManagementProviderServiceImpl.java @@ -116,7 +116,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv this.pluginRepository = new DeviceManagementPluginRepository(); initDataAccessObjects(); /* Registering a listener to retrieve events when some device management service plugin is installed after - * the component is done getting initialized */ + * the component is done getting initialized */ DeviceManagementServiceComponent.registerPluginInitializationListener(this); } @@ -1457,7 +1457,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv if (DeviceManagerUtil.isPublishOperationResponseEnabled()) { List permittedOperations = DeviceManagerUtil.getEnabledOperationsForResponsePublish(); if (permittedOperations.contains(operation.getCode()) - || permittedOperations.contains("*")) { + || permittedOperations.contains("*")) { Object[] metaData = {deviceId.getId(), deviceId.getType()}; Object[] payload = new Object[]{ Calendar.getInstance().getTimeInMillis(), @@ -1531,7 +1531,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv } @Override - public List getOperationByActivityIds(List idList) throws OperationManagementException{ + public List getOperationByActivityIds(List idList) throws OperationManagementException { return DeviceManagementDataHolder.getInstance().getOperationManager().getOperationByActivityIds(idList); } @@ -2511,11 +2511,11 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv /** * Returns all the installed apps of the given device. */ - private List getInstalledApplications(Device device) throws DeviceManagementException { + private List getInstalledApplications(Device device) throws DeviceManagementException { if (log.isDebugEnabled()) { log.debug("Get installed applications of device: " + device.getId() + " of type '" + device.getType() + "'"); } - List applications = new ArrayList<>(); + List applications; try { DeviceManagementDAOFactory.openConnection(); applications = applicationDAO.getInstalledApplications(device.getId(), device.getEnrolmentInfo().getId()); @@ -2671,8 +2671,10 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv deviceInformationManager.addDeviceLocation(deviceLocation); } catch (Exception e) { //We are not failing the execution since this is not critical for the functionality. But logging as - // an error for reference. - log.error("Exception occurred while trying to add device location.", e); + // a warning for reference. + log.warn("Error occurred while trying to add '" + device.getType() + "' device '" + + device.getDeviceIdentifier() + "' (id:'" + device.getId() + "') location (lat:" + latitude + + ", lon:" + longitude + ") due to:" + e.getMessage()); } } }