diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.annotations/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.annotations/pom.xml index 3f1f78ff08e..fa5407fb1ef 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.annotations/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.annotations/pom.xml @@ -22,13 +22,13 @@ apimgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.apimgt.annotations - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - API Management Annotations WSO2 Carbon - API Management Custom Annotation Module diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml index 3ed17629308..13011bee5a7 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.api/pom.xml @@ -21,12 +21,12 @@ apimgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT org.wso2.carbon.apimgt.application.extension.api war WSO2 Carbon - API Application Management API diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension/pom.xml index 9c9a6a9dcdd..0d5ad853c2e 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.application.extension/pom.xml @@ -22,12 +22,12 @@ apimgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT org.wso2.carbon.apimgt.application.extension bundle WSO2 Carbon - API Application Management diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/pom.xml index 392d178a943..e0d2a80f3ab 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/pom.xml @@ -21,13 +21,13 @@ apimgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.apimgt.handlers - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - API Security Handler Component WSO2 Carbon - API Management Security Handler Module 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 1ce1b4df310..305be35caf3 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 @@ -13,13 +13,13 @@ apimgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.apimgt.integration.client - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - API Management Integration Client WSO2 Carbon - API Management Integration Client diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.generated.client/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.generated.client/pom.xml index 508b41fbd26..3228cf0cbb2 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.generated.client/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.integration.generated.client/pom.xml @@ -13,13 +13,13 @@ apimgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.apimgt.integration.generated.client - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - API Management Integration Generated Client WSO2 Carbon - API Management Integration Client diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml index 82348deac17..5303d591427 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml @@ -22,13 +22,13 @@ apimgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.apimgt.webapp.publisher - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - API Management Webapp Publisher WSO2 Carbon - API Management Webapp Publisher diff --git a/components/apimgt-extensions/pom.xml b/components/apimgt-extensions/pom.xml index 5708a3154d5..d20c8473bf9 100644 --- a/components/apimgt-extensions/pom.xml +++ b/components/apimgt-extensions/pom.xml @@ -22,13 +22,13 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 apimgt-extensions - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - API Management Extensions Component http://wso2.org diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.api/pom.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.api/pom.xml index 71a3aca5ccb..29126989c18 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.api/pom.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.api/pom.xml @@ -22,7 +22,7 @@ certificate-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api/pom.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api/pom.xml index d7c02c7bf2f..c80f07328e3 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api/pom.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api/pom.xml @@ -22,7 +22,7 @@ certificate-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.v09.api/pom.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.v09.api/pom.xml index 2b7a2d70599..edc3b32e327 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.v09.api/pom.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.v09.api/pom.xml @@ -24,7 +24,7 @@ certificate-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml index 1885cbd43fc..3d7a1266cb4 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/pom.xml @@ -21,13 +21,13 @@ org.wso2.carbon.devicemgt certificate-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.certificate.mgt.core - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - Certificate Management Core WSO2 Carbon - Certificate Management Core diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.v09.api/pom.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.v09.api/pom.xml index 6ef981a36f4..15940151ee7 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.v09.api/pom.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.v09.api/pom.xml @@ -24,7 +24,7 @@ certificate-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/certificate-mgt/pom.xml b/components/certificate-mgt/pom.xml index a9417e66780..10b707df91e 100644 --- a/components/certificate-mgt/pom.xml +++ b/components/certificate-mgt/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 org.wso2.carbon.devicemgt certificate-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - Certificate Management Component http://wso2.org diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.device.type.deployer/pom.xml b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.device.type.deployer/pom.xml index d274fe10a2a..e55c1c3e940 100644 --- a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.device.type.deployer/pom.xml +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.device.type.deployer/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.pull.notification/pom.xml b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.pull.notification/pom.xml index e6d78bd4811..8e8b1b17ea4 100644 --- a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.pull.notification/pom.xml +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.pull.notification/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.fcm/pom.xml b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.fcm/pom.xml index 9256bc15b7b..a6f24589290 100644 --- a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.fcm/pom.xml +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.fcm/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.http/pom.xml b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.http/pom.xml index 43fd7f437ce..78c096b42fd 100644 --- a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.http/pom.xml +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.http/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/pom.xml b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/pom.xml index bfbba62b7c2..8cd5dd46ad3 100644 --- a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/pom.xml +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/pom.xml b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/pom.xml index be0daf87cf0..19c8ebc1dba 100644 --- a/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/pom.xml +++ b/components/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp/pom.xml @@ -22,7 +22,7 @@ device-mgt-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt-extensions/pom.xml b/components/device-mgt-extensions/pom.xml index 1920a9276df..210b35a182b 100644 --- a/components/device-mgt-extensions/pom.xml +++ b/components/device-mgt-extensions/pom.xml @@ -22,7 +22,7 @@ carbon-devicemgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher/pom.xml index 374f9d1ce6a..0ee75e622f7 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt device-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml index 369dd643a7e..4c3188d9300 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml @@ -22,7 +22,7 @@ device-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 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 7244f00587c..a8811e54186 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/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.common/pom.xml index 187d4885337..3d8ae161924 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/pom.xml @@ -21,7 +21,7 @@ device-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 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 3aa85254f80..f826aacb5f8 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"; @@ -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.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 92bd4e0d2f8..f58fb8d0c60 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/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml index 3e2f646b4c2..b9bff908bcc 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt device-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/ArchivalServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/ArchivalServiceImpl.java index b8ebd30a0e5..a4b8405d09d 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/ArchivalServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/ArchivalServiceImpl.java @@ -22,7 +22,9 @@ package org.wso2.carbon.device.mgt.core.archival; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.mgt.common.TransactionManagementException; +import org.wso2.carbon.device.mgt.core.archival.beans.*; import org.wso2.carbon.device.mgt.core.archival.dao.*; +import org.wso2.carbon.device.mgt.core.config.DeviceConfigurationManager; import java.sql.SQLException; import java.util.ArrayList; @@ -36,7 +38,13 @@ public class ArchivalServiceImpl implements ArchivalService { private ArchivalDAO archivalDAO; private DataDeletionDAO dataDeletionDAO; - private static int ITERATION_COUNT = 10000; + private static final int EXECUTION_BATCH_SIZE = + DeviceConfigurationManager.getInstance().getDeviceManagementConfig().getArchivalConfiguration() + .getArchivalTaskConfiguration().getBatchSize(); + + private static final boolean ARCHIVE_PENDING_OPERATIONS = + DeviceConfigurationManager.getInstance().getDeviceManagementConfig().getArchivalConfiguration() + .getArchivalTaskConfiguration().isArchivePendingOperations(); private String[] NOT_IN_PROGRESS_OPS = new String[]{"COMPLETED", "ERROR", "REPEATED"}; private String[] NOT_PENDING_OPS = new String[]{"COMPLETED", "ERROR", "REPEATED", "IN_PROGRESS"}; @@ -49,95 +57,188 @@ public class ArchivalServiceImpl implements ArchivalService { @Override public void archiveTransactionalRecords() throws ArchivalException { + List allOperations; + try { ArchivalSourceDAOFactory.openConnection(); ArchivalDestinationDAOFactory.openConnection(); - List allOperations = archivalDAO.getAllOperations(); - List pendingAndIPOperations = archivalDAO.getPendingAndInProgressOperations(); + if (log.isDebugEnabled()) { + log.debug("Fetching All Operations"); + } + allOperations = archivalDAO.getAllOperations(); + + if (log.isDebugEnabled()) { + log.debug("Fetching All Pending Operations"); + } + + + } catch (ArchivalDAOException e) { +// rollbackTransactions(); + String msg = "Rollback the get all operations and get all pending operations"; + log.error(msg, e); + throw new ArchivalException(msg, e); + } catch (SQLException e) { + String msg = "An error occurred while connecting to the archival database"; + log.error(msg, e); + throw new ArchivalException(msg, e); + } finally { + ArchivalSourceDAOFactory.closeConnection(); + ArchivalDestinationDAOFactory.closeConnection(); + } - log.info(allOperations.size() + " All Operations. " + pendingAndIPOperations.size() + - " P&IP Operations"); - //Get the diff of operations - Set setA = new HashSet<>(allOperations); - Set setB = new HashSet<>(pendingAndIPOperations); - setA.removeAll(setB); + List candidates = allOperations; + log.info(allOperations.size() + " All Operations."); + + if (!ARCHIVE_PENDING_OPERATIONS) { + try { + ArchivalSourceDAOFactory.openConnection(); + ArchivalDestinationDAOFactory.openConnection(); + List pendingAndIPOperations = archivalDAO.getPendingAndInProgressOperations(); + log.info(pendingAndIPOperations.size() +" P&IP Operations"); +// Get the diff of operations + candidates.removeAll(pendingAndIPOperations); + } catch (ArchivalDAOException e) { + String msg = "Error occurred while retrieving the pending operations"; + log.error(msg, e); + throw new ArchivalException(msg, e); + } catch (SQLException e) { + String msg = "An error occurred while connecting to the archival database"; + log.error(msg, e); + throw new ArchivalException(msg, e); + } finally { + ArchivalSourceDAOFactory.closeConnection(); + ArchivalDestinationDAOFactory.closeConnection(); + } + } - List candidates = new ArrayList<>(); - candidates.addAll(setA); + int total = candidates.size(); + int batches = calculateNumberOfBatches(total); + log.info(total + " Operations ready for archiving. " + batches + " iterations to be done."); + int batchSize = EXECUTION_BATCH_SIZE; + if (log.isDebugEnabled()) { + log.debug(total + " Operations ready for archiving. " + batches + " iterations to be done."); + log.debug(batchSize + " is the batch size"); + } - int total = candidates.size(); - int batches = calculateNumberOfBatches(total); - int batchSize = ITERATION_COUNT; + for (int i = 1; i <= batches; i++) { + int startIdx = batchSize * (i - 1); + int endIdx = batchSize * i; + if (i == batches) { + endIdx = startIdx + (total % batchSize); + } if (log.isDebugEnabled()) { - log.debug(total + " Operations ready for archiving. " + batches + " iterations to be done."); + log.debug("\n\n############ Iterating over batch " + i + "[" + + startIdx + "," + endIdx + "] #######"); } + List subList = candidates.subList(startIdx, endIdx); - beginTransactions(); - for (int i = 1; i <= batches; i++) { - int startIdx = batchSize * (i - 1); - int endIdx = batchSize * i; - if (i == batches) { - endIdx = startIdx + (total % batchSize); + if (log.isDebugEnabled()) { + log.debug("SubList size is: " + subList.size()); + if (subList.size() > 0) { + log.debug("First Element is: " + subList.get(0)); + log.debug("Last Element is: " + subList.get(subList.size() - 1)); } - if(log.isDebugEnabled()) { - log.debug("\n\n############ Iterating over batch " + i + "[" + - startIdx + "," + endIdx + "] #######"); + } + + if (log.isDebugEnabled()) { + for (Integer val : subList) { + if (log.isDebugEnabled()) { + log.debug("Sub List Element: " + val); + } } - List subList = candidates.subList(startIdx, endIdx); + } + + try { + beginTransactions(); prepareTempTable(subList); + commitTransactions(); + } catch (Exception e) { + rollbackTransactions(); + String msg = "Error occurred while preparing the operations."; + log.error(msg, e); + throw new ArchivalException(msg, e); + } finally { + ArchivalSourceDAOFactory.closeConnection(); + ArchivalDestinationDAOFactory.closeConnection(); + } + + List operationResponses = null; + List notification = null; + List commandOperations = null; + List profileOperations = null; + List enrollmentMapping = null; + List operations = null; + + try { + openConnection(); + operationResponses = archivalDAO.selectOperationResponses(); + notification = archivalDAO.selectNotifications(); + commandOperations = archivalDAO.selectCommandOperations(); + profileOperations = archivalDAO.selectProfileOperations(); + enrollmentMapping = archivalDAO.selectEnrolmentMappings(); + operations = archivalDAO.selectOperations(); + + } catch (Exception e) { + String msg = "Error occurred while retrieving data."; + log.error(msg, e); + throw new ArchivalException(msg, e); + } finally { + closeConnection(); + } + + try { + beginTransactions(); //Purge the largest table, DM_DEVICE_OPERATION_RESPONSE if (log.isDebugEnabled()) { - log.debug("## Purging operation responses"); + log.debug("## Archiving operation responses"); } - archivalDAO.moveOperationResponses(); + archivalDAO.moveOperationResponses(operationResponses); //Purge the notifications table, DM_NOTIFICATION if (log.isDebugEnabled()) { - log.debug("## Purging notifications"); + log.debug("## Archiving notifications"); } - archivalDAO.moveNotifications(); + archivalDAO.moveNotifications(notification); //Purge the command operations table, DM_COMMAND_OPERATION if (log.isDebugEnabled()) { - log.debug("## Purging command operations"); + log.debug("## Archiving command operations"); } - archivalDAO.moveCommandOperations(); + archivalDAO.moveCommandOperations(commandOperations); //Purge the profile operation table, DM_PROFILE_OPERATION if (log.isDebugEnabled()) { - log.debug("## Purging profile operations"); + log.debug("## Archiving profile operations"); } - archivalDAO.moveProfileOperations(); - - //Purge the config operation table, DM_CONFIG_OPERATION - if (log.isDebugEnabled()) { - log.debug("## Purging config operations"); - } - archivalDAO.moveConfigOperations(); + archivalDAO.moveProfileOperations(profileOperations); //Purge the enrolment mappings table, DM_ENROLMENT_OP_MAPPING if (log.isDebugEnabled()) { - log.debug("## Purging enrolment mappings"); + log.debug("## Archiving enrolment mappings"); } - archivalDAO.moveEnrolmentMappings(); + archivalDAO.moveEnrolmentMappings(enrollmentMapping); //Finally, purge the operations table, DM_OPERATION if (log.isDebugEnabled()) { - log.debug("## Purging operations"); + log.debug("## Archiving operations"); + } + archivalDAO.moveOperations(operations); + commitTransactions(); + if (log.isDebugEnabled()) { + log.debug("End of Iteration : " + i); } - archivalDAO.moveOperations(); + } catch (ArchivalDAOException e) { + rollbackTransactions(); + String msg = "Error occurred while trying to archive data to the six tables"; + log.error(msg, e); + throw new ArchivalException(msg, e); + } finally { + ArchivalSourceDAOFactory.closeConnection(); + ArchivalDestinationDAOFactory.closeConnection(); } - commitTransactions(); - } catch (ArchivalDAOException e) { - rollbackTransactions(); - throw new ArchivalException("An error occurred while data archival", e); - } catch (SQLException e) { - throw new ArchivalException("An error occurred while connecting to the archival database.", e); - } finally { - ArchivalSourceDAOFactory.closeConnection(); - ArchivalDestinationDAOFactory.closeConnection(); + } } @@ -147,6 +248,9 @@ public class ArchivalServiceImpl implements ArchivalService { log.debug("## Truncating the temporary table"); } archivalDAO.truncateOperationIDsForArchival(); + if (log.isDebugEnabled()) { + log.debug("## Inserting into the temporary table"); + } archivalDAO.copyOperationIDsForArchival(subList); } @@ -160,6 +264,28 @@ public class ArchivalServiceImpl implements ArchivalService { } } + private void openConnection() throws ArchivalException { + try { + ArchivalSourceDAOFactory.openConnection(); + } catch (SQLException e) { + String msg = "An error occurred during opening connection"; + log.error(msg, e); + throw new ArchivalException(msg, e); + } + + } + + private void closeConnection() throws ArchivalException { + try { + ArchivalSourceDAOFactory.closeConnection(); + } catch (Exception e) { + String msg = "An error occurred during opening connection"; + log.error(msg, e); + throw new ArchivalException(msg, e); + } + + } + private void commitTransactions() { ArchivalSourceDAOFactory.commitTransaction(); ArchivalDestinationDAOFactory.commitTransaction(); @@ -172,7 +298,7 @@ public class ArchivalServiceImpl implements ArchivalService { private int calculateNumberOfBatches(int total) { int batches = 0; - int batchSize = ITERATION_COUNT; + int batchSize = EXECUTION_BATCH_SIZE; if ((total % batchSize) > 0) { batches = (total / batchSize) + 1; } else { diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveCommandOperation.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveCommandOperation.java new file mode 100644 index 00000000000..f044a21fa47 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveCommandOperation.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018, 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.core.archival.beans; + +public class ArchiveCommandOperation { + + + private int operationId; + private int enabled; + + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } + + public int getEnabled() { + return enabled; + } + + public void setEnabled(int enabled) { + this.enabled = enabled; + } +} + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveEnrolmentOperationMap.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveEnrolmentOperationMap.java new file mode 100644 index 00000000000..c85b893f782 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveEnrolmentOperationMap.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018, 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.core.archival.beans; + +public class ArchiveEnrolmentOperationMap { + + + private int id; + private int enrolmentId; + private int operationId; + private String status; + private int createdTimestamp; + private int updatedTimestamp; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getEnrolmentId() { + return enrolmentId; + } + + public void setEnrolmentId(int enrolmentId) { + this.enrolmentId = enrolmentId; + } + + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public int getCreatedTimestamp() { + return createdTimestamp; + } + + public void setCreatedTimestamp(int createdTimestamp) { + this.createdTimestamp = createdTimestamp; + } + + public int getUpdatedTimestamp() { + return updatedTimestamp; + } + + public void setUpdatedTimestamp(int updatedTimestamp) { + this.updatedTimestamp = updatedTimestamp; + } +} + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveNotification.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveNotification.java new file mode 100644 index 00000000000..7c0ea9b044f --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveNotification.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018, 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.core.archival.beans; + +public class ArchiveNotification { + + + private int notificationId; + private int deviceId; + private int operationId; + private int tenantId; + private String status; + private String description; + + public int getNotificationId() { + return notificationId; + } + + public void setNotificationId(int notificationId) { + this.notificationId = notificationId; + } + + public int getDeviceId() { + return deviceId; + } + + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } + + public int getTenantId() { + return tenantId; + } + + public void setTenantId(int tenantId) { + this.tenantId = tenantId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveOperation.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveOperation.java new file mode 100644 index 00000000000..d62fcddceb6 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveOperation.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018, 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.core.archival.beans; + +import java.sql.Timestamp; + +public class ArchiveOperation { + + private int id; + private String type; + private Timestamp createdTimeStamp; + private Timestamp recievedTimeStamp; + private String operationCode; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Timestamp getCreatedTimeStamp() { + return createdTimeStamp; + } + + public void setCreatedTimeStamp(Timestamp createdTimeStamp) { + this.createdTimeStamp = createdTimeStamp; + } + + public Timestamp getRecievedTimeStamp() { + return recievedTimeStamp; + } + + public void setRecievedTimeStamp(Timestamp recievedTimeStamp) { + this.recievedTimeStamp = recievedTimeStamp; + } + + public String getOperationCode() { + return operationCode; + } + + public void setOperationCode(String operationCode) { + this.operationCode = operationCode; + } +} + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveOperationResponse.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveOperationResponse.java new file mode 100644 index 00000000000..ce4712382cf --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveOperationResponse.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018, 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.core.archival.beans; + +import java.sql.Timestamp; + +public class ArchiveOperationResponse { + + + private int id; + private int enrolmentId; + private int operationId; + private int enOpMapId; + private Object operationResponse; + private Timestamp receivedTimeStamp; + + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getEnrolmentId() { + return enrolmentId; + } + + public void setEnrolmentId(int enrolmentId) { + this.enrolmentId = enrolmentId; + } + + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } + + public int getEnOpMapId() { + return enOpMapId; + } + + public void setEnOpMapId(int enOpMapId) { + this.enOpMapId = enOpMapId; + } + + public Object getOperationResponse() { + return operationResponse; + } + + public void setOperationResponse(Object operationResponse) { + this.operationResponse = operationResponse; + } + + public Timestamp getReceivedTimeStamp() { + return receivedTimeStamp; + } + + public void setReceivedTimeStamp(Timestamp receivedTimeStamp) { + this.receivedTimeStamp = receivedTimeStamp; + } +} + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveProfileOperation.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveProfileOperation.java new file mode 100644 index 00000000000..add85dc2626 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/beans/ArchiveProfileOperation.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018, 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.core.archival.beans; + +public class ArchiveProfileOperation { + + + private int operationId; + private int enabled; + private Object operationDetails; + + public int getOperationId() { + return operationId; + } + + public void setOperationId(int operationId) { + this.operationId = operationId; + } + + public int getEnabled() { + return enabled; + } + + public void setEnabled(int enabled) { + this.enabled = enabled; + } + + public Object getOperationDetails() { + return operationDetails; + } + + public void setOperationDetails(Object operationDetails) { + this.operationDetails = operationDetails; + } +} + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/ArchivalDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/ArchivalDAO.java index 2c7063741d1..a360a8cfe52 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/ArchivalDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/ArchivalDAO.java @@ -18,6 +18,9 @@ package org.wso2.carbon.device.mgt.core.archival.dao; +import org.wso2.carbon.device.mgt.core.archival.beans.*; + +import java.sql.ResultSet; import java.util.List; /** @@ -33,19 +36,29 @@ public interface ArchivalDAO { void copyOperationIDsForArchival(List operationIds) throws ArchivalDAOException; - void moveOperationResponses() throws ArchivalDAOException; + List selectOperationResponses() throws ArchivalDAOException; + + void moveOperationResponses(List rs) throws ArchivalDAOException; + + List selectNotifications() throws ArchivalDAOException; + + void moveNotifications(List rs) throws ArchivalDAOException; + + List selectCommandOperations() throws ArchivalDAOException; + + void moveCommandOperations(List rs) throws ArchivalDAOException; - void moveNotifications() throws ArchivalDAOException; + List selectProfileOperations() throws ArchivalDAOException; - void moveCommandOperations() throws ArchivalDAOException; + void moveProfileOperations(List rs) throws ArchivalDAOException; - void moveProfileOperations() throws ArchivalDAOException; + List selectEnrolmentMappings() throws ArchivalDAOException; - void moveConfigOperations() throws ArchivalDAOException; + void moveEnrolmentMappings(List rs) throws ArchivalDAOException; - void moveEnrolmentMappings() throws ArchivalDAOException; + List selectOperations() throws ArchivalDAOException; - void moveOperations() throws ArchivalDAOException; + void moveOperations(List rs) throws ArchivalDAOException; void truncateOperationIDsForArchival() throws ArchivalDAOException; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/ArchivalDAOUtil.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/ArchivalDAOUtil.java index 084b815c3dc..a630ab8b542 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/ArchivalDAOUtil.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/ArchivalDAOUtil.java @@ -57,4 +57,14 @@ public class ArchivalDAOUtil { } } + + public static void cleanupResultSet(ResultSet rs) { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + log.warn("Error occurred while closing the result set", e); + } + } + } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/impl/ArchivalDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/impl/ArchivalDAOImpl.java index 73f44bacd6a..8763f866e0f 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/impl/ArchivalDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/impl/ArchivalDAOImpl.java @@ -20,11 +20,11 @@ package org.wso2.carbon.device.mgt.core.archival.dao.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.core.archival.beans.*; import org.wso2.carbon.device.mgt.core.archival.dao.*; import java.sql.*; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class ArchivalDAOImpl implements ArchivalDAO { @@ -55,21 +55,26 @@ public class ArchivalDAOImpl implements ArchivalDAO { ResultSet rs = null; try { Connection conn = ArchivalSourceDAOFactory.getConnection(); - String sql = "SELECT DISTINCT OPERATION_ID FROM DM_ENROLMENT_OP_MAPPING " + - "WHERE CREATED_TIMESTAMP BETWEEN DATE(TIMESTAMPADD(DAY, " + - this.retentionPeriod + ", NOW())) AND NOW()"; + String sql = "SELECT ID FROM DM_OPERATION WHERE CREATED_TIMESTAMP < (DATE_SUB(NOW(), INTERVAL " + + this.retentionPeriod + " DAY))"; stmt = this.createMemoryEfficientStatement(conn); rs = stmt.executeQuery(sql); + if (log.isDebugEnabled()) { + log.debug("Selected Operation Ids from Enrolment OP Mapping"); + } while (rs.next()) { - operationIds.add(rs.getInt("OPERATION_ID")); + operationIds.add(rs.getInt("ID")); } } catch (SQLException e) { - throw new ArchivalDAOException("An error occurred while getting a list operation Ids to archive", e); + String msg = "An error occurred while getting a list operation Ids to archive"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { ArchivalDAOUtil.cleanupResources(stmt, rs); } if (log.isDebugEnabled()) { log.debug(operationIds.size() + " operations found for the archival"); + log.debug(operationIds.size() + "[" + operationIds.get(0) + "," + operationIds.get(batchSize - 1) + "]"); } return operationIds; } @@ -81,22 +86,41 @@ public class ArchivalDAOImpl implements ArchivalDAO { ResultSet rs = null; try { Connection conn = ArchivalSourceDAOFactory.getConnection(); - String sql = "SELECT DISTINCT OPERATION_ID " + - " FROM DM_ENROLMENT_OP_MAPPING WHERE STATUS IN('PENDING', 'IN_PROGRESS') " + - " AND CREATED_TIMESTAMP BETWEEN DATE(TIMESTAMPADD(DAY, " + this.retentionPeriod +", NOW())) " + - "AND NOW()"; + String sql = "(SELECT DISTINCT\n" + + " OPERATION_ID\n" + + " FROM\n" + + " DM_ENROLMENT_OP_MAPPING\n" + + " WHERE\n" + + " STATUS = 'PENDING'\n" + + " AND CREATED_TIMESTAMP < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL " + + this.retentionPeriod + " DAY))) \n" + + " UNION ALL \n" + + "\t(SELECT DISTINCT\n" + + " OPERATION_ID\n" + + " FROM\n" + + " DM_ENROLMENT_OP_MAPPING\n" + + " WHERE\n" + + " STATUS = 'IN_PROGRESS'\n" + + " AND CREATED_TIMESTAMP < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL " + + "" + this.retentionPeriod + " DAY)))"; stmt = this.createMemoryEfficientStatement(conn); rs = stmt.executeQuery(sql); + if (log.isDebugEnabled()) { + log.debug("Selected Pending or In Progress Operation IDs"); + } while (rs.next()) { operationIds.add(rs.getInt("OPERATION_ID")); } } catch (SQLException e) { - throw new ArchivalDAOException("An error occurred while getting a list operation Ids to archive", e); + String msg = "An error occurred while getting a list pending or in progress operation Ids to archive"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { ArchivalDAOUtil.cleanupResources(stmt, rs); } if (log.isDebugEnabled()) { - log.debug(operationIds.size() + " PENDING and IN_PROFRESS operations found for the archival"); + log.debug(operationIds.size() + " operations found for the archival"); + log.debug(operationIds.size() + "[" + operationIds.get(0) + "," + operationIds.get(batchSize - 1) + "]"); } return operationIds; } @@ -123,44 +147,88 @@ public class ArchivalDAOImpl implements ArchivalDAO { log.debug(count + " Records copied to the temporary table."); } } catch (SQLException e) { - throw new ArchivalDAOException("Error while copying operation Ids for archival", e); + String msg = "Error while copying operation Ids for archival"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { ArchivalDAOUtil.cleanupResources(stmt); } } @Override - public void moveOperationResponses() throws ArchivalDAOException { + public List selectOperationResponses() throws ArchivalDAOException { Statement stmt = null; - PreparedStatement stmt2 = null; - Statement stmt3 = null; ResultSet rs = null; + + List operationResponses = new ArrayList<>(); try { Connection conn = ArchivalSourceDAOFactory.getConnection(); - String sql = "SELECT * FROM DM_DEVICE_OPERATION_RESPONSE WHERE OPERATION_ID IN " + - "(SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + String sql = "SELECT \n" + + " o.ID,\n" + + " o.ENROLMENT_ID,\n" + + " o.OPERATION_ID,\n" + + " o.EN_OP_MAP_ID,\n" + + " o.OPERATION_RESPONSE,\n" + + " o.RECEIVED_TIMESTAMP\n" + + "FROM\n" + + " DM_DEVICE_OPERATION_RESPONSE o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID;"; stmt = this.createMemoryEfficientStatement(conn); rs = stmt.executeQuery(sql); + while (rs.next()) { + ArchiveOperationResponse rep = new ArchiveOperationResponse(); + rep.setId(rs.getInt("ID")); + rep.setEnrolmentId(rs.getInt("ENROLMENT_ID")); + rep.setOperationId(rs.getInt("OPERATION_ID")); + rep.setOperationResponse(rs.getBytes("OPERATION_RESPONSE")); + rep.setReceivedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP")); + operationResponses.add(rep); + } + + if (log.isDebugEnabled()) { + log.debug("Selecting done for the Operation Response"); + } + + } catch (SQLException e) { + String msg = "Error occurred while archiving the operation responses"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); + } finally { + ArchivalDAOUtil.cleanupResources(stmt, rs); + } + + return operationResponses; + + } + + @Override + public void moveOperationResponses(List archiveOperationResponse) throws ArchivalDAOException { + PreparedStatement stmt2 = null; + Statement stmt3 = null; + try { + Connection conn = ArchivalSourceDAOFactory.getConnection(); + + Connection conn2 = ArchivalDestinationDAOFactory.getConnection(); - sql = "INSERT INTO DM_DEVICE_OPERATION_RESPONSE_ARCH VALUES(?, ?, ?, ?, ?,?,?)"; + String sql = "INSERT INTO DM_DEVICE_OPERATION_RESPONSE_ARCH VALUES(?, ?, ?, ?, ?,?)"; stmt2 = conn2.prepareStatement(sql); int count = 0; - while (rs.next()) { - stmt2.setInt(1, rs.getInt("ID")); - stmt2.setInt(2, rs.getInt("ENROLMENT_ID")); - stmt2.setInt(3, rs.getInt("OPERATION_ID")); - stmt2.setInt(4, rs.getInt("EN_OP_MAP_ID")); - stmt2.setBytes(5, rs.getBytes("OPERATION_RESPONSE")); - stmt2.setTimestamp(6, rs.getTimestamp("RECEIVED_TIMESTAMP")); - stmt2.setTimestamp(7, this.currentTimestamp); + for (ArchiveOperationResponse rs : archiveOperationResponse) { + stmt2.setInt(1, rs.getId()); + stmt2.setInt(2, rs.getEnrolmentId()); + stmt2.setInt(3, rs.getOperationId()); + stmt2.setBytes(4, (byte[]) rs.getOperationResponse()); + stmt2.setTimestamp(5, rs.getReceivedTimeStamp()); + stmt2.setTimestamp(6, this.currentTimestamp); stmt2.addBatch(); if (++count % batchSize == 0) { stmt2.executeBatch(); if (log.isDebugEnabled()) { - log.debug("Executing batch " + count); + log.debug("Executing Operation Responses batch " + count); } } } @@ -169,259 +237,382 @@ public class ArchivalDAOImpl implements ArchivalDAO { log.debug(count + " [OPERATION_RESPONSES] Records copied to the archival table. Starting deletion"); } //try the deletion now - sql = "DELETE FROM DM_DEVICE_OPERATION_RESPONSE WHERE OPERATION_ID IN (" + - " SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + sql = "DELETE o.* FROM DM_DEVICE_OPERATION_RESPONSE o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID \n" + + "WHERE\n" + + " o.OPERATION_ID = da.ID;"; stmt3 = conn.createStatement(); int affected = stmt3.executeUpdate(sql); if (log.isDebugEnabled()) { log.debug(affected + " Rows deleted"); } } catch (SQLException e) { - throw new ArchivalDAOException("Error occurred while moving operations ", e); + String msg = "Error occurred while archiving the operation responses"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { - ArchivalDAOUtil.cleanupResources(stmt, rs); ArchivalDAOUtil.cleanupResources(stmt2); ArchivalDAOUtil.cleanupResources(stmt3); } } @Override - public void moveNotifications() throws ArchivalDAOException { + public List selectNotifications() throws ArchivalDAOException { + Statement stmt = null; - PreparedStatement stmt2 = null; - Statement stmt3 = null; ResultSet rs = null; + List notifications = new ArrayList<>(); try { Connection conn = ArchivalSourceDAOFactory.getConnection(); - String sql = "SELECT * FROM DM_NOTIFICATION WHERE OPERATION_ID IN (SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + String sql = "SELECT \n" + + " o.NOTIFICATION_ID,\n" + + " o.DEVICE_ID,\n" + + " o.OPERATION_ID,\n" + + " o.TENANT_ID,\n" + + " o.STATUS,\n" + + " o.DESCRIPTION\n" + + "FROM\n" + + " DM_NOTIFICATION o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID;"; stmt = this.createMemoryEfficientStatement(conn); rs = stmt.executeQuery(sql); -// ArchivalDestinationDAOFactory.beginTransaction(); + while (rs.next()) { + + ArchiveNotification note = new ArchiveNotification(); + note.setNotificationId(rs.getInt("NOTIFICATION_ID")); + note.setDeviceId(rs.getInt("DEVICE_ID")); + note.setOperationId(rs.getInt("OPERATION_ID")); + note.setTenantId(rs.getInt("TENANT_ID")); + note.setStatus(rs.getString("STATUS")); + note.setDescription(rs.getString("DESCRIPTION")); + notifications.add(note); + } + + if (log.isDebugEnabled()) { + log.debug("Selecting done for the Notification"); + } + } catch (SQLException e) { + String msg = "Error occurred while archiving the notifications"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); + } finally { + ArchivalDAOUtil.cleanupResources(stmt, rs); + } + return notifications; + } + + + @Override + public void moveNotifications(List archiveNotifications) throws ArchivalDAOException { + Statement stmt = null; + PreparedStatement stmt2 = null; + Statement stmt3 = null; + try { + Connection conn = ArchivalSourceDAOFactory.getConnection(); Connection conn2 = ArchivalDestinationDAOFactory.getConnection(); - sql = "INSERT INTO DM_NOTIFICATION_ARCH VALUES(?, ?, ?, ?, ?, ?, ?)"; + String sql = "INSERT INTO DM_NOTIFICATION_ARCH VALUES(?, ?, ?, ?, ?, ?, ?)"; stmt2 = conn2.prepareStatement(sql); int count = 0; - while (rs.next()) { - stmt2.setInt(1, rs.getInt("NOTIFICATION_ID")); - stmt2.setInt(2, rs.getInt("DEVICE_ID")); - stmt2.setInt(3, rs.getInt("OPERATION_ID")); - stmt2.setInt(4, rs.getInt("TENANT_ID")); - stmt2.setString(5, rs.getString("STATUS")); - stmt2.setString(6, rs.getString("DESCRIPTION")); +// while (rs.next()) { + for (ArchiveNotification rs : archiveNotifications) { + stmt2.setInt(1, rs.getNotificationId()); + stmt2.setInt(2, rs.getDeviceId()); + stmt2.setInt(3, rs.getOperationId()); + stmt2.setInt(4, rs.getTenantId()); + stmt2.setString(5, rs.getStatus()); + stmt2.setString(6, rs.getDescription()); stmt2.setTimestamp(7, this.currentTimestamp); stmt2.addBatch(); if (++count % batchSize == 0) { stmt2.executeBatch(); + if (log.isDebugEnabled()) { + log.debug("Executing Notifications batch " + count); + } } } stmt2.executeBatch(); -// ArchivalDestinationDAOFactory.commitTransaction(); if (log.isDebugEnabled()) { log.debug(count + " [NOTIFICATIONS] Records copied to the archival table. Starting deletion"); } - sql = "DELETE FROM DM_NOTIFICATION" + - " WHERE OPERATION_ID IN (SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + sql = "DELETE o.* FROM DM_NOTIFICATION o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID \n" + + "WHERE\n" + + " o.OPERATION_ID = da.ID;"; stmt3 = conn.createStatement(); int affected = stmt3.executeUpdate(sql); if (log.isDebugEnabled()) { log.debug(affected + " Rows deleted"); } } catch (SQLException e) { - throw new ArchivalDAOException("Error occurred while moving notifications ", e); + String msg = "Error occurred while archiving the notifications"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { - ArchivalDAOUtil.cleanupResources(stmt, rs); ArchivalDAOUtil.cleanupResources(stmt2); ArchivalDAOUtil.cleanupResources(stmt3); } } @Override - public void moveCommandOperations() throws ArchivalDAOException { + public List selectCommandOperations() throws ArchivalDAOException { Statement stmt = null; - PreparedStatement stmt2 = null; - Statement stmt3 = null; ResultSet rs = null; + + List commandOperations = new ArrayList<>(); try { Connection conn = ArchivalSourceDAOFactory.getConnection(); - String sql = "SELECT * FROM DM_COMMAND_OPERATION WHERE OPERATION_ID IN " + - "(SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + String sql = "SELECT \n" + + " *\n" + + "FROM\n" + + " DM_COMMAND_OPERATION o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID;"; stmt = this.createMemoryEfficientStatement(conn); rs = stmt.executeQuery(sql); + while (rs.next()) { + ArchiveCommandOperation op = new ArchiveCommandOperation(); + op.setOperationId(rs.getInt("OPERATION_ID")); + op.setEnabled(rs.getInt("ENABLED")); + + commandOperations.add(op); + } + + if (log.isDebugEnabled()) { + log.debug("Selecting done for the Command Operation"); + } + } catch (SQLException e) { + String msg = "Error occurred while archiving the command operation"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); + } finally { + ArchivalDAOUtil.cleanupResources(stmt, rs); + } + return commandOperations; + } + + @Override + public void moveCommandOperations(List commandOperations) throws ArchivalDAOException { + Statement stmt = null; + PreparedStatement stmt2 = null; + Statement stmt3 = null; + try { + Connection conn = ArchivalSourceDAOFactory.getConnection(); Connection conn2 = ArchivalDestinationDAOFactory.getConnection(); - sql = "INSERT INTO DM_COMMAND_OPERATION_ARCH VALUES(?,?,?)"; + String sql = "INSERT INTO DM_COMMAND_OPERATION_ARCH VALUES(?,?,?)"; stmt2 = conn2.prepareStatement(sql); int count = 0; - while (rs.next()) { - stmt2.setInt(1, rs.getInt("OPERATION_ID")); - stmt2.setInt(2, rs.getInt("ENABLED")); + for (ArchiveCommandOperation rs : commandOperations) { + stmt2.setInt(1, rs.getOperationId()); + stmt2.setInt(2, rs.getEnabled()); stmt2.setTimestamp(3, this.currentTimestamp); stmt2.addBatch(); if (++count % batchSize == 0) { stmt2.executeBatch(); + if (log.isDebugEnabled()) { + log.debug("Executing Command Operations batch " + count); + } } } stmt2.executeBatch(); if (log.isDebugEnabled()) { log.debug(count + " [COMMAND_OPERATION] Records copied to the archival table. Starting deletion"); } - sql = "DELETE FROM DM_COMMAND_OPERATION" + - " WHERE OPERATION_ID IN (SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + sql = "DELETE o.* FROM DM_COMMAND_OPERATION o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID \n" + + "WHERE\n" + + " o.OPERATION_ID = da.ID;"; stmt3 = conn.createStatement(); int affected = stmt3.executeUpdate(sql); if (log.isDebugEnabled()) { log.debug(affected + " Rows deleted"); } } catch (SQLException e) { - throw new ArchivalDAOException("Error occurred while moving command operations", e); + String msg = "Error occurred while archiving the command operation"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { - ArchivalDAOUtil.cleanupResources(stmt, rs); ArchivalDAOUtil.cleanupResources(stmt2); ArchivalDAOUtil.cleanupResources(stmt3); } } @Override - public void moveProfileOperations() throws ArchivalDAOException { + public List selectProfileOperations() throws ArchivalDAOException { Statement stmt = null; - PreparedStatement stmt2 = null; - Statement stmt3 = null; ResultSet rs = null; + List profileOperations = new ArrayList<>(); try { Connection conn = ArchivalSourceDAOFactory.getConnection(); - String sql = "SELECT * FROM DM_PROFILE_OPERATION WHERE OPERATION_ID IN " + - "(SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + String sql = "SELECT \n" + + " *\n" + + "FROM\n" + + " DM_PROFILE_OPERATION o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID;"; stmt = this.createMemoryEfficientStatement(conn); rs = stmt.executeQuery(sql); - Connection conn2 = ArchivalDestinationDAOFactory.getConnection(); - - sql = "INSERT INTO DM_PROFILE_OPERATION_ARCH VALUES(?, ?, ?, ?)"; - stmt2 = conn2.prepareStatement(sql); - - int count = 0; while (rs.next()) { - stmt2.setInt(1, rs.getInt("OPERATION_ID")); - stmt2.setInt(2, rs.getInt("ENABLED")); - stmt2.setBytes(3, rs.getBytes("OPERATION_DETAILS")); - stmt2.setTimestamp(4,this.currentTimestamp ); - stmt2.addBatch(); + ArchiveProfileOperation op = new ArchiveProfileOperation(); + + op.setOperationId(rs.getInt("OPERATION_ID")); + op.setEnabled(rs.getInt("ENABLED")); + op.setOperationDetails(rs.getBytes("OPERATION_DETAILS")); + profileOperations.add(op); - if (++count % batchSize == 0) { - stmt2.executeBatch(); - } - } - stmt2.executeBatch(); - if (log.isDebugEnabled()) { - log.debug(count + " [PROFILE_OPERATION] Records copied to the archival table. Starting deletion"); } - sql = "DELETE FROM DM_PROFILE_OPERATION" + - " WHERE OPERATION_ID IN (SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; - stmt3 = conn.createStatement(); - int affected = stmt3.executeUpdate(sql); + if (log.isDebugEnabled()) { - log.debug(affected + " Rows deleted"); + log.debug("Selecting done for the Profile Operation"); } } catch (SQLException e) { - throw new ArchivalDAOException("Error occurred while moving profile operations", e); + String msg = "Error occurred while archiving the profile operation"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { ArchivalDAOUtil.cleanupResources(stmt, rs); - ArchivalDAOUtil.cleanupResources(stmt2); - ArchivalDAOUtil.cleanupResources(stmt3); } + return profileOperations; } @Override - public void moveConfigOperations() throws ArchivalDAOException { + public void moveProfileOperations(List profileOperations) throws ArchivalDAOException { Statement stmt = null; PreparedStatement stmt2 = null; Statement stmt3 = null; - ResultSet rs = null; try { Connection conn = ArchivalSourceDAOFactory.getConnection(); - String sql = "SELECT * FROM DM_CONFIG_OPERATION WHERE OPERATION_ID IN " + - "(SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; - stmt = this.createMemoryEfficientStatement(conn); - rs = stmt.executeQuery(sql); Connection conn2 = ArchivalDestinationDAOFactory.getConnection(); - sql = "INSERT INTO DM_CONFIG_OPERATION_ARCH VALUES(?, ?, ?, ?)"; + String sql = "INSERT INTO DM_PROFILE_OPERATION_ARCH VALUES(?, ?, ?, ?)"; stmt2 = conn2.prepareStatement(sql); int count = 0; - while (rs.next()) { - stmt2.setInt(1, rs.getInt("OPERATION_ID")); - stmt2.setBytes(2, rs.getBytes("OPERATION_CONFIG")); - stmt2.setInt(3, rs.getInt("ENABLED")); - stmt2.setTimestamp(4,this.currentTimestamp ); + for (ArchiveProfileOperation rs : profileOperations) { + stmt2.setInt(1, rs.getOperationId()); + stmt2.setInt(2, rs.getEnabled()); + stmt2.setBytes(3, (byte[]) rs.getOperationDetails()); + stmt2.setTimestamp(4, this.currentTimestamp); stmt2.addBatch(); if (++count % batchSize == 0) { stmt2.executeBatch(); + if (log.isDebugEnabled()) { + log.debug("Executing Profile Operations batch " + count); + } } } stmt2.executeBatch(); if (log.isDebugEnabled()) { - log.debug(count + " [CONFIG_OPERATION] Records copied to the archival table. Starting deletion"); + log.debug(count + " [PROFILE_OPERATION] Records copied to the archival table. Starting deletion"); } - sql = "DELETE FROM DM_CONFIG_OPERATION" + - " WHERE OPERATION_ID IN (SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + sql = "DELETE o.* FROM DM_PROFILE_OPERATION o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID \n" + + "WHERE\n" + + " o.OPERATION_ID = da.ID;"; stmt3 = conn.createStatement(); int affected = stmt3.executeUpdate(sql); if (log.isDebugEnabled()) { log.debug(affected + " Rows deleted"); } } catch (SQLException e) { - throw new ArchivalDAOException("Error occurred while moving config operations", e); + String msg = "Error occurred while archiving the profile operation"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { - ArchivalDAOUtil.cleanupResources(stmt, rs); ArchivalDAOUtil.cleanupResources(stmt2); ArchivalDAOUtil.cleanupResources(stmt3); } } @Override - public void moveEnrolmentMappings() throws ArchivalDAOException { + public List selectEnrolmentMappings() throws ArchivalDAOException { Statement stmt = null; - PreparedStatement stmt2 = null; - Statement stmt3 = null; ResultSet rs = null; + List operationMaps = new ArrayList<>(); try { Connection conn = ArchivalSourceDAOFactory.getConnection(); - String sql = "SELECT * FROM DM_ENROLMENT_OP_MAPPING WHERE OPERATION_ID IN " + - "(SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + String sql = "SELECT \n" + + " o.ID,\n" + + " o.ENROLMENT_ID,\n" + + " o.OPERATION_ID,\n" + + " o.STATUS,\n" + + " o.CREATED_TIMESTAMP,\n" + + " o.UPDATED_TIMESTAMP\n" + + "FROM\n" + + " DM_ENROLMENT_OP_MAPPING o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID;"; stmt = this.createMemoryEfficientStatement(conn); rs = stmt.executeQuery(sql); + while (rs.next()) { + + ArchiveEnrolmentOperationMap eom = new ArchiveEnrolmentOperationMap(); + eom.setId(rs.getInt("ID")); + eom.setEnrolmentId(rs.getInt("ENROLMENT_ID")); + eom.setOperationId(rs.getInt("OPERATION_ID")); + eom.setStatus(rs.getString("STATUS")); + eom.setCreatedTimestamp(rs.getInt("CREATED_TIMESTAMP")); + eom.setUpdatedTimestamp(rs.getInt("UPDATED_TIMESTAMP")); + operationMaps.add(eom); + } + + if (log.isDebugEnabled()) { + log.debug("Selecting done for the Enrolment OP Mapping"); + } + } catch (SQLException e) { + String msg = "Error occurred while archiving the enrolment op mappings"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); + } finally { + ArchivalDAOUtil.cleanupResources(stmt, rs); + } + + return operationMaps; + } + + @Override + public void moveEnrolmentMappings(List operationMaps) throws ArchivalDAOException { + Statement stmt = null; + PreparedStatement stmt2 = null; + Statement stmt3 = null; + try { + Connection conn = ArchivalSourceDAOFactory.getConnection(); Connection conn2 = ArchivalDestinationDAOFactory.getConnection(); - sql = "INSERT INTO DM_ENROLMENT_OP_MAPPING_ARCH VALUES(?, ?, ?, ?, ?, ?, ?,?)"; + String sql = "INSERT INTO DM_ENROLMENT_OP_MAPPING_ARCH VALUES(?, ?, ?, ?, ?, ?, ?)"; stmt2 = conn2.prepareStatement(sql); int count = 0; - while (rs.next()) { - stmt2.setInt(1, rs.getInt("ID")); - stmt2.setInt(2, rs.getInt("ENROLMENT_ID")); - stmt2.setInt(3, rs.getInt("OPERATION_ID")); - stmt2.setString(4, rs.getString("STATUS")); - stmt2.setString(5, rs.getString("PUSH_NOTIFICATION_STATUS")); - stmt2.setInt(6, rs.getInt("CREATED_TIMESTAMP")); - stmt2.setInt(7, rs.getInt("UPDATED_TIMESTAMP")); - stmt2.setTimestamp(8, this.currentTimestamp); + for (ArchiveEnrolmentOperationMap rs : operationMaps) { + stmt2.setInt(1, rs.getId()); + stmt2.setInt(2, rs.getEnrolmentId()); + stmt2.setInt(3, rs.getOperationId()); + stmt2.setString(4, rs.getStatus()); + stmt2.setInt(5, rs.getCreatedTimestamp()); + stmt2.setInt(6, rs.getUpdatedTimestamp()); + stmt2.setTimestamp(7, this.currentTimestamp); stmt2.addBatch(); if (++count % batchSize == 0) { stmt2.executeBatch(); if (log.isDebugEnabled()) { - log.debug("Executing batch " + count); + log.debug("Executing Enrolment Mappings batch " + count); } } } @@ -429,67 +620,119 @@ public class ArchivalDAOImpl implements ArchivalDAO { if (log.isDebugEnabled()) { log.debug(count + " [ENROLMENT_OP_MAPPING] Records copied to the archival table. Starting deletion"); } - sql = "DELETE FROM DM_ENROLMENT_OP_MAPPING WHERE OPERATION_ID IN (" + - "SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + sql = "DELETE o.* FROM DM_ENROLMENT_OP_MAPPING o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.OPERATION_ID = da.ID \n" + + "WHERE\n" + + " o.OPERATION_ID = da.ID;"; stmt3 = conn.createStatement(); int affected = stmt3.executeUpdate(sql); if (log.isDebugEnabled()) { log.debug(affected + " Rows deleted"); } } catch (SQLException e) { - throw new ArchivalDAOException("Error occurred while moving enrolment mappings", e); + String msg = "Error occurred while archiving the enrolment op mappings"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { - ArchivalDAOUtil.cleanupResources(stmt, rs); ArchivalDAOUtil.cleanupResources(stmt2); ArchivalDAOUtil.cleanupResources(stmt3); } } @Override - public void moveOperations() throws ArchivalDAOException { + public List selectOperations() throws ArchivalDAOException { Statement stmt = null; - PreparedStatement stmt2 = null; - Statement stmt3 = null; ResultSet rs = null; + List operations = new ArrayList<>(); try { Connection conn = ArchivalSourceDAOFactory.getConnection(); - String sql = "SELECT * FROM DM_OPERATION WHERE ID IN (SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + String sql = "SELECT \n" + + " o.ID,\n" + + " o.TYPE,\n" + + " o.CREATED_TIMESTAMP,\n" + + " o.RECEIVED_TIMESTAMP,\n" + + " o.OPERATION_CODE\n" + + "FROM\n" + + " DM_OPERATION o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.ID = da.ID;"; stmt = this.createMemoryEfficientStatement(conn); rs = stmt.executeQuery(sql); + while (rs.next()) { + + ArchiveOperation op = new ArchiveOperation(); + op.setId(rs.getInt("ID")); + op.setType(rs.getString("TYPE")); + op.setCreatedTimeStamp(rs.getTimestamp("CREATED_TIMESTAMP")); + op.setRecievedTimeStamp(rs.getTimestamp("RECEIVED_TIMESTAMP")); + op.setOperationCode(rs.getString("OPERATION_CODE")); + + operations.add(op); + + } + + if (log.isDebugEnabled()) { + log.debug("Selecting done for the Operation"); + } + } catch (SQLException e) { + String msg = "Error occurred while archiving the operations"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); + } finally { + ArchivalDAOUtil.cleanupResources(stmt, rs); + } + return operations; + } + + @Override + public void moveOperations(List operations) throws ArchivalDAOException { + Statement stmt = null; + PreparedStatement stmt2 = null; + Statement stmt3 = null; + try { + Connection conn = ArchivalSourceDAOFactory.getConnection(); Connection conn2 = ArchivalDestinationDAOFactory.getConnection(); - sql = "INSERT INTO DM_OPERATION_ARCH VALUES(?, ?, ?, ?, ?, ?)"; + String sql = "INSERT INTO DM_OPERATION_ARCH VALUES(?, ?, ?, ?, ?, ?)"; stmt2 = conn2.prepareStatement(sql); int count = 0; - while (rs.next()) { - stmt2.setInt(1, rs.getInt("ID")); - stmt2.setString(2, rs.getString("TYPE")); - stmt2.setTimestamp(3, rs.getTimestamp("CREATED_TIMESTAMP")); - stmt2.setTimestamp(4, rs.getTimestamp("RECEIVED_TIMESTAMP")); - stmt2.setString(5, rs.getString("OPERATION_CODE")); + for (ArchiveOperation rs : operations) { + stmt2.setInt(1, rs.getId()); + stmt2.setString(2, rs.getType()); + stmt2.setTimestamp(3, rs.getCreatedTimeStamp()); + stmt2.setTimestamp(4, rs.getRecievedTimeStamp()); + stmt2.setString(5, rs.getOperationCode()); stmt2.setTimestamp(6, this.currentTimestamp); stmt2.addBatch(); if (++count % batchSize == 0) { stmt2.executeBatch(); + if (log.isDebugEnabled()) { + log.debug("Final Execution of Operations batch " + count); + } } } stmt2.executeBatch(); if (log.isDebugEnabled()) { log.debug(count + " [OPERATIONS] Records copied to the archival table. Starting deletion"); } - sql = "DELETE FROM DM_OPERATION WHERE ID IN (" + - "SELECT ID FROM DM_ARCHIVED_OPERATIONS)"; + sql = "DELETE o.* FROM DM_OPERATION o\n" + + " INNER JOIN\n" + + " DM_ARCHIVED_OPERATIONS da ON o.ID = da.ID \n" + + "WHERE\n" + + " o.ID = da.ID;"; stmt3 = conn.createStatement(); int affected = stmt3.executeUpdate(sql); if (log.isDebugEnabled()) { log.debug(affected + " Rows deleted"); } } catch (SQLException e) { - throw new ArchivalDAOException("Error occurred while moving operations", e); + String msg = "Error occurred while archiving the operations"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { - ArchivalDAOUtil.cleanupResources(stmt, rs); ArchivalDAOUtil.cleanupResources(stmt2); ArchivalDAOUtil.cleanupResources(stmt3); } @@ -503,11 +746,13 @@ public class ArchivalDAOImpl implements ArchivalDAO { conn.setAutoCommit(false); String sql = "TRUNCATE DM_ARCHIVED_OPERATIONS"; stmt = conn.prepareStatement(sql); - stmt.addBatch(); - stmt.executeBatch(); + stmt.executeUpdate(); + conn.commit(); } catch (SQLException e) { - throw new ArchivalDAOException("Error occurred while truncating operation Ids", e); + String msg = "Error occurred while truncating operation Ids"; + log.error(msg, e); + throw new ArchivalDAOException(msg, e); } finally { ArchivalDAOUtil.cleanupResources(stmt); } @@ -519,4 +764,59 @@ public class ArchivalDAOImpl implements ArchivalDAO { return stmt; } -} + private String buildWhereClause(String[] statuses) { + StringBuilder whereClause = new StringBuilder("WHERE "); + for (int i = 0; i < statuses.length; i++) { + whereClause.append("STATUS ='"); + whereClause.append(statuses[i]); + whereClause.append("' "); + if (i != (statuses.length - 1)) + whereClause.append(" OR "); + } + return whereClause.toString(); + } + + private void copyOperationIDsForArchival() throws ArchivalDAOException { + PreparedStatement stmt = null; + Statement createStmt = null; + try { + Connection conn = ArchivalSourceDAOFactory.getConnection(); +// conn.setAutoCommit(false); +// String sql = "INSERT INTO DM_ARCHIVED_OPERATIONS(ID,CREATED_TIMESTAMP)" + +// " SELECT DISTINCT op.ID as OPERATION_ID, NOW()" + +// " FROM DM_ENROLMENT_OP_MAPPING AS opm" + +// " LEFT JOIN DM_OPERATION AS op ON opm.OPERATION_ID = op.ID" + +// " WHERE opm.STATUS='ERROR' OR opm.STATUS='COMPLETED'" + +// " AND op.RECEIVED_TIMESTAMP < DATE_SUB(NOW(), INTERVAL ? DAY);"; +// stmt = conn.prepareStatement(sql); +// stmt.setInt(1, this.retentionPeriod); +// stmt.addBatch(); +// stmt.executeBatch(); +// conn.commit(); + + //Create the temporary table first +// String sql = "CREATE TEMPORARY TABLE DM_ARCHIVED_OPERATIONS (ID INTEGER NOT NULL," + +// " CREATED_TIMESTAMP TIMESTAMP NOT NULL, PRIMARY KEY (ID))" ; +// createStmt = conn.createStatement(); +// createStmt.execute(sql); +// if(log.isDebugEnabled()) { +// log.debug("Temporary table DM_ARCHIVED_OPERATIONS has been created "); +// } + //Copy eligible operations into DM_ARCHIVED_OPERATIONS + String sql = "INSERT INTO DM_ARCHIVED_OPERATIONS(ID,CREATED_TIMESTAMP)" + + " SELECT DISTINCT OPERATION_ID, NOW()" + + " FROM DM_ENROLMENT_OP_MAPPING" + + " WHERE STATUS='ERROR' OR STATUS='COMPLETED' OR STATUS='REPEATED'" + + " AND CREATED_TIMESTAMP < DATE_SUB(NOW(), INTERVAL ? DAY)"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, this.retentionPeriod); + int affected = stmt.executeUpdate(); + log.info(affected + " Eligible operations found for archival"); + } catch (SQLException e) { + throw new ArchivalDAOException("Error occurred while copying operation Ids for archival", e); + } finally { + ArchivalDAOUtil.cleanupResources(stmt); + ArchivalDAOUtil.cleanupResources(createStmt); + } + } +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/impl/DataDeletionDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/impl/DataDeletionDAOImpl.java index dd900a178d7..35f339f1bf0 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/impl/DataDeletionDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/archival/dao/impl/DataDeletionDAOImpl.java @@ -21,10 +21,11 @@ package org.wso2.carbon.device.mgt.core.archival.dao.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.core.archival.dao.DataDeletionDAO; import org.wso2.carbon.device.mgt.core.archival.dao.ArchivalDAOException; import org.wso2.carbon.device.mgt.core.archival.dao.ArchivalDAOUtil; import org.wso2.carbon.device.mgt.core.archival.dao.ArchivalDestinationDAOFactory; -import org.wso2.carbon.device.mgt.core.archival.dao.DataDeletionDAO; +import org.wso2.carbon.device.mgt.core.task.impl.ArchivedDataDeletionTask; import java.sql.Connection; import java.sql.PreparedStatement; @@ -52,8 +53,7 @@ public class DataDeletionDAOImpl implements DataDeletionDAO { "WHERE ARCHIVED_AT < DATE_SUB(NOW(), INTERVAL ? DAY)"; stmt = conn.prepareStatement(sql); stmt.setInt(1, this.retentionPeriod); - stmt.addBatch(); - stmt.executeBatch(); + stmt.executeUpdate(); conn.commit(); } catch (SQLException e) { throw new ArchivalDAOException("Error occurred while deleting operation responses", e); @@ -72,8 +72,7 @@ public class DataDeletionDAOImpl implements DataDeletionDAO { " WHERE ARCHIVED_AT < DATE_SUB(NOW(), INTERVAL ? DAY)"; stmt = conn.prepareStatement(sql); stmt.setInt(1, this.retentionPeriod); - stmt.addBatch(); - stmt.executeBatch(); + stmt.executeUpdate(); conn.commit(); } catch (SQLException e) { throw new ArchivalDAOException("Error occurred while deleting notifications", e); @@ -92,8 +91,7 @@ public class DataDeletionDAOImpl implements DataDeletionDAO { " WHERE ARCHIVED_AT < DATE_SUB(NOW(), INTERVAL ? DAY)"; stmt = conn.prepareStatement(sql); stmt.setInt(1, this.retentionPeriod); - stmt.addBatch(); - stmt.executeBatch(); + stmt.executeUpdate(); conn.commit(); } catch (SQLException e) { throw new ArchivalDAOException("Error occurred while deleting command operations", e); @@ -112,8 +110,7 @@ public class DataDeletionDAOImpl implements DataDeletionDAO { " WHERE ARCHIVED_AT < DATE_SUB(NOW(), INTERVAL ? DAY)"; stmt = conn.prepareStatement(sql); stmt.setInt(1, this.retentionPeriod); - stmt.addBatch(); - stmt.executeBatch(); + stmt.executeUpdate(); conn.commit(); } catch (SQLException e) { throw new ArchivalDAOException("Error occurred while deleting profile operations", e); @@ -131,8 +128,7 @@ public class DataDeletionDAOImpl implements DataDeletionDAO { String sql = "DELETE FROM DM_ENROLMENT_OP_MAPPING_ARCH WHERE ARCHIVED_AT < DATE_SUB(NOW(), INTERVAL ? DAY)"; stmt = conn.prepareStatement(sql); stmt.setInt(1, this.retentionPeriod); - stmt.addBatch(); - stmt.executeBatch(); + stmt.executeUpdate(); conn.commit(); } catch (SQLException e) { throw new ArchivalDAOException("Error occurred while deleting enrolment mappings", e); @@ -150,8 +146,7 @@ public class DataDeletionDAOImpl implements DataDeletionDAO { String sql = "DELETE FROM DM_OPERATION_ARCH WHERE ARCHIVED_AT < DATE_SUB(NOW(), INTERVAL ? DAY)"; stmt = conn.prepareStatement(sql); stmt.setInt(1, this.retentionPeriod); - stmt.addBatch(); - stmt.executeBatch(); + stmt.executeUpdate(); conn.commit(); } catch (SQLException e) { throw new ArchivalDAOException("Error occurred while deleting operations", e); diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/archival/ArchivalTaskConfiguration.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/archival/ArchivalTaskConfiguration.java index 609172beb5e..382dc1d486d 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/archival/ArchivalTaskConfiguration.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/config/archival/ArchivalTaskConfiguration.java @@ -29,7 +29,7 @@ public class ArchivalTaskConfiguration { private int retentionPeriod; private int batchSize; private PurgingTaskConfiguration purgingTaskConfiguration; - private final int MULTIPLIER = -1; + private boolean archivePendingOperations; @XmlElement(name = "Enabled", required = true) public boolean isEnabled() { @@ -60,8 +60,7 @@ public class ArchivalTaskConfiguration { @XmlElement(name = "RetentionPeriod", required = true) public int getRetentionPeriod() { - // multiply by -1 to get the diff - return retentionPeriod * MULTIPLIER; + return retentionPeriod; } public void setRetentionPeriod(int retentionPeriod) { @@ -85,4 +84,13 @@ public class ArchivalTaskConfiguration { public void setBatchSize(int batchSize) { this.batchSize = batchSize; } + + @XmlElement(name ="ArchivePendingOperations") + public boolean isArchivePendingOperations() { + return archivePendingOperations; + } + + public void setArchivePendingOperations(boolean archivePendingOperations) { + this.archivePendingOperations = archivePendingOperations; + } } 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 8c9f357b19b..f2655099103 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 6be4f674886..c5bcec41c27 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>() { @@ -377,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); @@ -434,7 +434,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 +483,9 @@ 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); + 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); @@ -507,7 +508,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 +546,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 +602,13 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic return path; } - private String getExecutionPlanName(String alertType, String queryName, String deviceId) { - if ("Traffic".equals(alertType)) { + private String getExecutionPlanName(String alertType, String queryName, String deviceId, String owner) { + 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 + "---_" + deviceId + "_alert"; + return "Geo-ExecutionPlan-" + alertType + "_" + queryName + "---_" + owner + "_" + deviceId + "_alert"; } } @@ -621,10 +624,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 +677,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 +749,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 +785,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 +832,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 +935,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/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 e87711e7ab7..d76b281e019 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()); } } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/task/impl/ArchivedDataDeletionTask.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/task/impl/ArchivedDataDeletionTask.java index 4be24e4f3d1..3fff58debe9 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/task/impl/ArchivedDataDeletionTask.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/task/impl/ArchivedDataDeletionTask.java @@ -55,7 +55,7 @@ public class ArchivedDataDeletionTask implements Task { log.error("An error occurred while executing DataDeletionTask", e); } long endTime = System.nanoTime(); - long difference = (endTime - startTime) / 1000000 * 1000; + long difference = (endTime - startTime) / (1000000 * 1000); log.info("DataDeletionTask completed. Total execution time: " + difference + " seconds"); } } 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 ac6d350cf6f..1e72dd1d4b9 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,17 +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"]#geodashboard:subscribe() -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 +@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("The ", type, " device `", id, "` of $owner is outside $areaName area!") as information, true as notify insert into dataOut; -from dataIn[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("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-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 68fe23e0b8c..71d5e101144 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 fb64720391a..55a33c24388 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); @@ -18,12 +18,12 @@ define table ProximityTable(id string, timeStamp long); @IndexBy('id') define table AlertsTable(id string , proximityWith string, eventId string); -from dataIn#geodashboard:subscribe() -select id, latitude, longitude, timeStamp, type, speed, heading, eventId +from dataIn +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 fb64720391a..73c5ac06168 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') @@ -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 39c4a0b280e..2309f64df30 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,17 +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"]#geodashboard:subscribe() -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 +@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("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[id != "$deviceId"] -select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "NORMAL" as state, "" 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("The ", type, " device `", id, "` of $owner is travailing at normal speed.") 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 ba7a6d24d90..59973ad7ea9 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') @@ -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 6f0e8aac754..4d8ef135777 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); @@ -19,19 +21,19 @@ define table StationeryTable(id string, timeStamp long); @IndexBy('id') define table AlertsTable(id string, stationary bool); -from dataIn#geodashboard:subscribe() -select id, latitude, longitude, timeStamp, type, speed, heading, eventId,geo:within(longitude,latitude,"$geoFenceGeoJSON") as isWithin +from dataIn +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("The ", type, " device `", id, "` of $owner 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-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 6f0e8aac754..f29f50be68b 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-Traffic_alert.siddhiql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/resources/alerts/Geo-ExecutionPlan-Traffic_alert.siddhiql index 5e6bb5b1a8e..c5ce1187eeb 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 38240e49372..5a704f046ec 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,17 +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"]#geodashboard:subscribe() -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 +@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("The ", type, " device `", id, "` of $owner is inside $areaName area!") as information, true as notify insert into dataOut; -from dataIn[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("The ", type, " device `", id, "` of $owner is inside $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-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 67fa2df594f..9c6862662fd 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.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 73222074c5e..1e0916d079a 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.extensions/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml index bcbe372e47d..8e9d66ad6d2 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.extensions/pom.xml @@ -22,7 +22,7 @@ device-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.ui/pom.xml index b06e8fe900a..c62fa29d142 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/pom.xml @@ -22,7 +22,7 @@ device-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 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 cb2a518ef66..e2a5018d80d 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/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 266433f1c44..805ec7a3ab4 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/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 b6e5cba7e31..136e4554532 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-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 dcc0b7d5cbd..5bc0c3d8a1e 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(); @@ -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()) }; 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 bbcae34eea6..63a861940d4 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/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 af47b6db212..ce78a0a66b8 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'); 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 83f0fbd0c3f..d25e5dab81d 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.url.printer/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.url.printer/pom.xml index 664c0ffb727..b388c975bb9 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.url.printer/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.url.printer/pom.xml @@ -23,7 +23,7 @@ device-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/pom.xml index 8229807df92..9d24f026b96 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.v09.api/pom.xml @@ -22,7 +22,7 @@ device-mgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 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 76796bbeb64..00000000000 --- 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 index 7c865b97782..e69de29bb2d 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 @@ -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 e4bea07957f..06da04568e2 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 index d320a626b45..e69de29bb2d 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 @@ -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"); - } -} diff --git a/components/device-mgt/pom.xml b/components/device-mgt/pom.xml index a5300d2455a..7d3acb74230 100644 --- a/components/device-mgt/pom.xml +++ b/components/device-mgt/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml diff --git a/components/email-sender/org.wso2.carbon.email.sender.core/pom.xml b/components/email-sender/org.wso2.carbon.email.sender.core/pom.xml index a14c480612e..ee0bb80cf51 100644 --- a/components/email-sender/org.wso2.carbon.email.sender.core/pom.xml +++ b/components/email-sender/org.wso2.carbon.email.sender.core/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt email-sender - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/email-sender/pom.xml b/components/email-sender/pom.xml index f0935e5b600..57759597996 100644 --- a/components/email-sender/pom.xml +++ b/components/email-sender/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml diff --git a/components/identity-extensions/org.wso2.carbon.device.mgt.oauth.extensions/pom.xml b/components/identity-extensions/org.wso2.carbon.device.mgt.oauth.extensions/pom.xml index 0907782eab9..c447061dd96 100644 --- a/components/identity-extensions/org.wso2.carbon.device.mgt.oauth.extensions/pom.xml +++ b/components/identity-extensions/org.wso2.carbon.device.mgt.oauth.extensions/pom.xml @@ -22,13 +22,13 @@ org.wso2.carbon.devicemgt identity-extensions - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.oauth.extensions - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - OAuth Extensions http://wso2.org diff --git a/components/identity-extensions/org.wso2.carbon.identity.authenticator.backend.oauth/pom.xml b/components/identity-extensions/org.wso2.carbon.identity.authenticator.backend.oauth/pom.xml index 8e5dbae9186..e474b9c5989 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.authenticator.backend.oauth/pom.xml +++ b/components/identity-extensions/org.wso2.carbon.identity.authenticator.backend.oauth/pom.xml @@ -21,7 +21,7 @@ identity-extensions org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT 4.0.0 diff --git a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/pom.xml b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/pom.xml index b5e33ee5e4b..af47d48f255 100644 --- a/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/pom.xml +++ b/components/identity-extensions/org.wso2.carbon.identity.jwt.client.extension/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt identity-extensions - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/components/identity-extensions/pom.xml b/components/identity-extensions/pom.xml index e62ebc0dcb5..824472bdac0 100644 --- a/components/identity-extensions/pom.xml +++ b/components/identity-extensions/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml diff --git a/components/policy-mgt/org.wso2.carbon.complex.policy.decision.point/pom.xml b/components/policy-mgt/org.wso2.carbon.complex.policy.decision.point/pom.xml index b2165a42d73..b711d7ad3a1 100644 --- a/components/policy-mgt/org.wso2.carbon.complex.policy.decision.point/pom.xml +++ b/components/policy-mgt/org.wso2.carbon.complex.policy.decision.point/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt policy-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.devicemgt org.wso2.carbon.complex.policy.decision.point - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - Policy Decision Point WSO2 Carbon - Policy Decision Point diff --git a/components/policy-mgt/org.wso2.carbon.policy.decision.point/pom.xml b/components/policy-mgt/org.wso2.carbon.policy.decision.point/pom.xml index c6ef6ec145b..aff10f11c54 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.decision.point/pom.xml +++ b/components/policy-mgt/org.wso2.carbon.policy.decision.point/pom.xml @@ -3,14 +3,14 @@ org.wso2.carbon.devicemgt policy-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.devicemgt org.wso2.carbon.policy.decision.point - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - Policy Decision Point WSO2 Carbon - Policy Decision Point diff --git a/components/policy-mgt/org.wso2.carbon.policy.information.point/pom.xml b/components/policy-mgt/org.wso2.carbon.policy.information.point/pom.xml index d784b5e2720..c5ee305f71e 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.information.point/pom.xml +++ b/components/policy-mgt/org.wso2.carbon.policy.information.point/pom.xml @@ -3,7 +3,7 @@ org.wso2.carbon.devicemgt policy-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml @@ -11,7 +11,7 @@ 4.0.0 org.wso2.carbon.devicemgt org.wso2.carbon.policy.information.point - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - Policy Information Point WSO2 Carbon - Policy Information Point diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/pom.xml b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/pom.xml index 4c02f94cbfc..35a8fd1d7c0 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.common/pom.xml +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.common/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt policy-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.devicemgt org.wso2.carbon.policy.mgt.common - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - Policy Management Common WSO2 Carbon - Policy Management Common diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/pom.xml b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/pom.xml index 2e99d3b941f..477a6286896 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/pom.xml +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt policy-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.devicemgt org.wso2.carbon.policy.mgt.core - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - Policy Management Core WSO2 Carbon - Policy Management Core diff --git a/components/policy-mgt/pom.xml b/components/policy-mgt/pom.xml index ab160d7823b..098867ffe8b 100644 --- a/components/policy-mgt/pom.xml +++ b/components/policy-mgt/pom.xml @@ -23,13 +23,13 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 policy-mgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - Policy Management Component http://wso2.org diff --git a/components/test-coverage/pom.xml b/components/test-coverage/pom.xml index a3f52c726b5..652be53ba85 100644 --- a/components/test-coverage/pom.xml +++ b/components/test-coverage/pom.xml @@ -21,7 +21,7 @@ carbon-devicemgt org.wso2.carbon.devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/pom.xml b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/pom.xml index 684dedf42b2..1d74f3cd057 100644 --- a/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/pom.xml +++ b/components/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework/pom.xml @@ -21,14 +21,14 @@ org.wso2.carbon.devicemgt webapp-authenticator-framework - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.devicemgt org.wso2.carbon.webapp.authenticator.framework - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT bundle WSO2 Carbon - Web Application Authenticator Framework Bundle WSO2 Carbon - Web Application Authenticator Framework Bundle diff --git a/components/webapp-authenticator-framework/pom.xml b/components/webapp-authenticator-framework/pom.xml index bdc67dcf3a5..7ab9bbbcdb9 100644 --- a/components/webapp-authenticator-framework/pom.xml +++ b/components/webapp-authenticator-framework/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 org.wso2.carbon.devicemgt webapp-authenticator-framework - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - Webapp Authenticator Framework http://wso2.org diff --git a/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/pom.xml b/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/pom.xml index a259abdc5a7..c9387e91625 100644 --- a/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/pom.xml +++ b/features/apimgt-extensions/org.wso2.carbon.apimgt.application.extension.feature/pom.xml @@ -21,14 +21,14 @@ org.wso2.carbon.devicemgt apimgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.apimgt.application.extension.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - API Management Application Extension Feature http://wso2.org This feature contains an implementation of a api application registration, which takes care of subscription diff --git a/features/apimgt-extensions/org.wso2.carbon.apimgt.handler.server.feature/pom.xml b/features/apimgt-extensions/org.wso2.carbon.apimgt.handler.server.feature/pom.xml index 1f6725786d9..f0c340fa627 100644 --- a/features/apimgt-extensions/org.wso2.carbon.apimgt.handler.server.feature/pom.xml +++ b/features/apimgt-extensions/org.wso2.carbon.apimgt.handler.server.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt apimgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.apimgt.handler.server.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Device Management - APIM handler Server Feature http://wso2.org This feature contains the handler for the api authentications diff --git a/features/apimgt-extensions/org.wso2.carbon.apimgt.integration.client.feature/pom.xml b/features/apimgt-extensions/org.wso2.carbon.apimgt.integration.client.feature/pom.xml index 1c372296cd1..228a7d76010 100644 --- a/features/apimgt-extensions/org.wso2.carbon.apimgt.integration.client.feature/pom.xml +++ b/features/apimgt-extensions/org.wso2.carbon.apimgt.integration.client.feature/pom.xml @@ -21,13 +21,13 @@ org.wso2.carbon.devicemgt apimgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.apimgt.integration.client.feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - APIM Integration Client Feature http://wso2.org diff --git a/features/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher.feature/pom.xml b/features/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher.feature/pom.xml index e8835177cbc..c989fe938e9 100644 --- a/features/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher.feature/pom.xml +++ b/features/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher.feature/pom.xml @@ -21,14 +21,14 @@ org.wso2.carbon.devicemgt apimgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.apimgt.webapp.publisher.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - API Management Webapp Publisher Feature http://wso2.org This feature contains an implementation of a Tomcat lifecycle listener, which takes care of publishing diff --git a/features/apimgt-extensions/pom.xml b/features/apimgt-extensions/pom.xml index d4a4437f815..040e4bd8ff8 100644 --- a/features/apimgt-extensions/pom.xml +++ b/features/apimgt-extensions/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 org.wso2.carbon.devicemgt apimgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - API Management Extensions Feature http://wso2.org diff --git a/features/certificate-mgt/org.wso2.carbon.certificate.mgt.api.feature/pom.xml b/features/certificate-mgt/org.wso2.carbon.certificate.mgt.api.feature/pom.xml index 00d94f1640a..42034b53937 100644 --- a/features/certificate-mgt/org.wso2.carbon.certificate.mgt.api.feature/pom.xml +++ b/features/certificate-mgt/org.wso2.carbon.certificate.mgt.api.feature/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt certificate-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/features/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api.feature/pom.xml b/features/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api.feature/pom.xml index 885ee348124..12539c6ce74 100644 --- a/features/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api.feature/pom.xml +++ b/features/certificate-mgt/org.wso2.carbon.certificate.mgt.cert.admin.api.feature/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt certificate-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/features/certificate-mgt/org.wso2.carbon.certificate.mgt.server.feature/pom.xml b/features/certificate-mgt/org.wso2.carbon.certificate.mgt.server.feature/pom.xml index f09444cd36c..95b90c42f12 100644 --- a/features/certificate-mgt/org.wso2.carbon.certificate.mgt.server.feature/pom.xml +++ b/features/certificate-mgt/org.wso2.carbon.certificate.mgt.server.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt certificate-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.certificate.mgt.server.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Certificate Management Server Feature http://wso2.org This feature contains the core bundles required for back-end Certificate Management functionality diff --git a/features/certificate-mgt/pom.xml b/features/certificate-mgt/pom.xml index 84536f7efa6..95b476c7c4e 100644 --- a/features/certificate-mgt/pom.xml +++ b/features/certificate-mgt/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 org.wso2.carbon.devicemgt certificate-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - Certificate Management Feature http://wso2.org diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.device.type.deployer.feature/pom.xml b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.device.type.deployer.feature/pom.xml index 180520dba79..285bfa5c287 100644 --- a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.device.type.deployer.feature/pom.xml +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.device.type.deployer.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt device-mgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.extensions.device.type.deployer.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Device Type Deployer Feature http://wso2.org WSO2 Carbon - Device Type Deployer Feature diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.fcm.feature/pom.xml b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.fcm.feature/pom.xml index 9c8a0b39080..4cf92ba7f3c 100644 --- a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.fcm.feature/pom.xml +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.fcm.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt device-mgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.extensions.push.notification.provider.fcm.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - FCM Based Push Notification Provider Feature http://wso2.org WSO2 Carbon - MQTT Based Push Notification Provider Feature diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.http.feature/pom.xml b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.http.feature/pom.xml index ef11596c408..06ec1fe5e87 100644 --- a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.http.feature/pom.xml +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.http.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt device-mgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.extensions.push.notification.provider.http.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - MQTT Based Push Notification Provider Feature http://wso2.org WSO2 Carbon - MQTT Based Push Notification Provider Feature diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/pom.xml b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/pom.xml index 1cce7f4b697..9e0fff0524c 100644 --- a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/pom.xml +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt device-mgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.extensions.push.notification.provider.mqtt.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - MQTT Based Push Notification Provider Feature http://wso2.org WSO2 Carbon - MQTT Based Push Notification Provider Feature diff --git a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/pom.xml b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/pom.xml index 48b4f7a91d6..df860eed797 100644 --- a/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/pom.xml +++ b/features/device-mgt-extensions/org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt device-mgt-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.extensions.push.notification.provider.xmpp.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - XMPP Based Push Notification Provider Feature http://wso2.org WSO2 Carbon - XMPP Based Push Notification Provider Feature diff --git a/features/device-mgt-extensions/pom.xml b/features/device-mgt-extensions/pom.xml index f533e7c6c75..58a2c369045 100644 --- a/features/device-mgt-extensions/pom.xml +++ b/features/device-mgt-extensions/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher.feature/pom.xml b/features/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher.feature/pom.xml index 796ff03ae47..03a59b295b4 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher.feature/pom.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.analytics.data.publisher.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt device-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.analytics.data.publisher.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Device Management Server Feature http://wso2.org This feature contains bundles related to device analytics data publisher diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.api.feature/pom.xml b/features/device-mgt/org.wso2.carbon.device.mgt.api.feature/pom.xml index 7103a4b1282..4c4e0e71555 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.api.feature/pom.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.api.feature/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt device-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/pom.xml b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/pom.xml index 2c6f4e2f3d4..2ad533f87a5 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/pom.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.basics.feature/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt device-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 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 9601b77742b..6117eff9965 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 204fedd387a..7d0427a3043 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 b79a23f79ef..ce2379f6211 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 cc89ec76f38..c0007256b83 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 7f74ab5246e..83a85c6bb2f 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 -- diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.extensions.feature/pom.xml b/features/device-mgt/org.wso2.carbon.device.mgt.extensions.feature/pom.xml index ac9574b7a74..b6bb0d9acd9 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.extensions.feature/pom.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.extensions.feature/pom.xml @@ -4,14 +4,14 @@ org.wso2.carbon.devicemgt device-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.extensions.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Device Management Extensions Feature http://wso2.org This feature contains common extensions used by key device management functionalities diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.feature/pom.xml b/features/device-mgt/org.wso2.carbon.device.mgt.feature/pom.xml index 444b29606d2..1d9e5d0a52e 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.feature/pom.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.feature/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt device-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/pom.xml b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/pom.xml index 20044a5268d..17cba364aae 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/pom.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt device-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.server.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Device Management Server Feature http://wso2.org This feature contains the core bundles required for Back-end Device Management functionality diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/pom.xml b/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/pom.xml index b4467a93595..97cffc24bcc 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/pom.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.ui.feature/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt device-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml diff --git a/features/device-mgt/pom.xml b/features/device-mgt/pom.xml index 477cb7939fe..0e452b671e0 100644 --- a/features/device-mgt/pom.xml +++ b/features/device-mgt/pom.xml @@ -22,7 +22,7 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml diff --git a/features/email-sender/org.wso2.carbon.email.sender.feature/pom.xml b/features/email-sender/org.wso2.carbon.email.sender.feature/pom.xml index 824646ae65a..a635497959c 100644 --- a/features/email-sender/org.wso2.carbon.email.sender.feature/pom.xml +++ b/features/email-sender/org.wso2.carbon.email.sender.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt email-sender-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.email.sender.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Email Sender Feature http://wso2.org This feature contains the core bundles required for email sender related functionality diff --git a/features/email-sender/pom.xml b/features/email-sender/pom.xml index b04d56e7ba1..f18305f3a23 100644 --- a/features/email-sender/pom.xml +++ b/features/email-sender/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 org.wso2.carbon.devicemgt email-sender-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - Email Sender Feature http://wso2.org diff --git a/features/jwt-client/org.wso2.carbon.identity.jwt.client.extension.feature/pom.xml b/features/jwt-client/org.wso2.carbon.identity.jwt.client.extension.feature/pom.xml index a260f735635..a96ab32da9b 100644 --- a/features/jwt-client/org.wso2.carbon.identity.jwt.client.extension.feature/pom.xml +++ b/features/jwt-client/org.wso2.carbon.identity.jwt.client.extension.feature/pom.xml @@ -23,14 +23,14 @@ org.wso2.carbon.devicemgt jwt-client-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.identity.jwt.client.extension.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - JWT Client Feature http://wso2.org This feature contains jwt client implementation from which we can get a access token using the jwt diff --git a/features/jwt-client/pom.xml b/features/jwt-client/pom.xml index d2a6393af5d..c493877b86d 100644 --- a/features/jwt-client/pom.xml +++ b/features/jwt-client/pom.xml @@ -23,13 +23,13 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 jwt-client-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - JWT Client Extension Feature http://wso2.org diff --git a/features/oauth-extensions/org.wso2.carbon.device.mgt.oauth.extensions.feature/pom.xml b/features/oauth-extensions/org.wso2.carbon.device.mgt.oauth.extensions.feature/pom.xml index dbc3870ea62..15990faa34e 100644 --- a/features/oauth-extensions/org.wso2.carbon.device.mgt.oauth.extensions.feature/pom.xml +++ b/features/oauth-extensions/org.wso2.carbon.device.mgt.oauth.extensions.feature/pom.xml @@ -23,14 +23,14 @@ org.wso2.carbon.devicemgt oauth-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.device.mgt.oauth.extensions.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Device Mgt OAuth Extensions Feature http://wso2.org This feature contains devicemgt related OAuth extensions diff --git a/features/oauth-extensions/pom.xml b/features/oauth-extensions/pom.xml index 92d6b162c93..abdb1b3b727 100644 --- a/features/oauth-extensions/pom.xml +++ b/features/oauth-extensions/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 org.wso2.carbon.devicemgt oauth-extensions-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - Device Management OAuth Extensions Feature http://wso2.org diff --git a/features/policy-mgt/org.wso2.carbon.policy.mgt.server.feature/pom.xml b/features/policy-mgt/org.wso2.carbon.policy.mgt.server.feature/pom.xml index 780b815aef0..40afdb270bc 100644 --- a/features/policy-mgt/org.wso2.carbon.policy.mgt.server.feature/pom.xml +++ b/features/policy-mgt/org.wso2.carbon.policy.mgt.server.feature/pom.xml @@ -23,14 +23,14 @@ org.wso2.carbon.devicemgt policy-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.policy.mgt.server.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Policy Management Server Feature http://wso2.org This feature contains the core bundles required for Back-end Device Management functionality diff --git a/features/policy-mgt/pom.xml b/features/policy-mgt/pom.xml index fc51a0c8f93..1dc5e4cae44 100644 --- a/features/policy-mgt/pom.xml +++ b/features/policy-mgt/pom.xml @@ -23,14 +23,14 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 org.wso2.carbon.devicemgt policy-mgt-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - Policy Management Feature http://wso2.org diff --git a/features/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework.server.feature/pom.xml b/features/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework.server.feature/pom.xml index 2069d185fa0..13af1169b3b 100644 --- a/features/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework.server.feature/pom.xml +++ b/features/webapp-authenticator-framework/org.wso2.carbon.webapp.authenticator.framework.server.feature/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt webapp-authenticator-framework-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../pom.xml 4.0.0 org.wso2.carbon.webapp.authenticator.framework.server.feature pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Webapp Authenticator Framework Server Feature http://wso2.org This feature contains the core bundles required for Back-end Device Management functionality diff --git a/features/webapp-authenticator-framework/pom.xml b/features/webapp-authenticator-framework/pom.xml index 7f20797a3f9..3ec975b906e 100644 --- a/features/webapp-authenticator-framework/pom.xml +++ b/features/webapp-authenticator-framework/pom.xml @@ -22,14 +22,14 @@ org.wso2.carbon.devicemgt carbon-devicemgt - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT ../../pom.xml 4.0.0 org.wso2.carbon.devicemgt webapp-authenticator-framework-feature - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT pom WSO2 Carbon - Webapp Authenticator Framework Feature http://wso2.org diff --git a/pom.xml b/pom.xml index 42fa2bb9ddc..98f4e5e634b 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ org.wso2.carbon.devicemgt carbon-devicemgt pom - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT WSO2 Carbon - Device Management - Parent http://wso2.org WSO2 Connected Device Manager Components @@ -1952,7 +1952,7 @@ 1.2.11.wso2v10 - 3.1.31-SNAPSHOT + 3.1.33-SNAPSHOT 4.6.21