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 a87a8ba984..487b367b63 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 @@ -178,6 +178,10 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { 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(); } } @@ -211,6 +215,10 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { 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(); } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/geo/service/AlertAlreadyExistException.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/geo/service/AlertAlreadyExistException.java new file mode 100644 index 0000000000..5380aee042 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/geo/service/AlertAlreadyExistException.java @@ -0,0 +1,41 @@ +/* + * 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.common.geo.service; + +/** + * Custom exception class for geo alert definition operations. + */ + +public class AlertAlreadyExistException extends Exception { + + private static final long serialVersionUID = 4709355511911265093L; + private String errorMessage; + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public AlertAlreadyExistException(String msg) { + super(msg); + setErrorMessage(msg); + } +} \ No newline at end of file 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 d8375ab583..4c9e02f158 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 @@ -33,10 +33,10 @@ public interface GeoLocationProviderService { List getExitAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException; boolean createGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType) - throws GeoLocationBasedServiceException; + throws GeoLocationBasedServiceException, AlertAlreadyExistException; boolean updateGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType) - throws GeoLocationBasedServiceException; + throws GeoLocationBasedServiceException, AlertAlreadyExistException; boolean removeGeoAlert(String alertType, DeviceIdentifier identifier, String queryName) throws GeoLocationBasedServiceException; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java index 9110299009..f888d7c32c 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 @@ -41,8 +41,10 @@ import org.wso2.carbon.device.mgt.common.geo.service.Alert; import org.wso2.carbon.device.mgt.common.geo.service.GeoFence; import org.wso2.carbon.device.mgt.common.geo.service.GeoLocationProviderService; 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.internal.DeviceManagementDataHolder; import org.wso2.carbon.event.processor.stub.EventProcessorAdminServiceStub; +import org.wso2.carbon.event.processor.stub.types.ExecutionPlanConfigurationDto; import org.wso2.carbon.identity.jwt.client.extension.JWTClient; import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException; import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService; @@ -207,18 +209,18 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic @Override public boolean createGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType) - throws GeoLocationBasedServiceException { + throws GeoLocationBasedServiceException, AlertAlreadyExistException { return saveGeoAlert(alert, identifier, alertType, false); } @Override public boolean updateGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType) - throws GeoLocationBasedServiceException { + throws GeoLocationBasedServiceException, AlertAlreadyExistException { return saveGeoAlert(alert, identifier, alertType, true); } public boolean saveGeoAlert(Alert alert, DeviceIdentifier identifier, String alertType, boolean isUpdate) - throws GeoLocationBasedServiceException { + throws GeoLocationBasedServiceException, AlertAlreadyExistException { Type type = new TypeToken>() { }.getType(); @@ -260,23 +262,38 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic "Unrecognized execution plan type: " + alertType + " while creating geo alert"); } - //persist alert in registry - updateRegistry(getRegistryPath(alertType, identifier, alert.getQueryName()), identifier, content, - options); - //deploy alert into event processor EventProcessorAdminServiceStub eventprocessorStub = null; String action = (isUpdate ? "updating" : "creating"); try { + ExecutionPlanConfigurationDto[] allActiveExecutionPlanConfigs = null; + String activeExecutionPlan = null; + String executionPlanName = getExecutionPlanName(alertType, alert.getQueryName(), + identifier.getId()); eventprocessorStub = getEventProcessorAdminServiceStub(); String parsedTemplate = parseTemplate(alertType, parseMap); String validationResponse = eventprocessorStub.validateExecutionPlan(parsedTemplate); if (validationResponse.equals("success")) { + allActiveExecutionPlanConfigs = eventprocessorStub.getAllActiveExecutionPlanConfigurations(); if (isUpdate) { - String executionPlanName = getExecutionPlanName(alertType, alert.getQueryName(), - identifier.getId()); - eventprocessorStub.editActiveExecutionPlan(parsedTemplate, executionPlanName); + for (ExecutionPlanConfigurationDto activeExectionPlanConfig:allActiveExecutionPlanConfigs) { + activeExecutionPlan = activeExectionPlanConfig.getExecutionPlan(); + if (activeExecutionPlan.contains(executionPlanName)) { + eventprocessorStub.editActiveExecutionPlan(parsedTemplate, executionPlanName); + return true; + } + } + eventprocessorStub.deployExecutionPlan(parsedTemplate); } else { + for (ExecutionPlanConfigurationDto activeExectionPlanConfig:allActiveExecutionPlanConfigs) { + activeExecutionPlan = activeExectionPlanConfig.getExecutionPlan(); + if (activeExecutionPlan.contains(executionPlanName)) { + throw new AlertAlreadyExistException("Execution plan already exists with name " + + executionPlanName); + } + } + updateRegistry(getRegistryPath(alertType, identifier, alert.getQueryName()), identifier, content, + options); eventprocessorStub.deployExecutionPlan(parsedTemplate); } } else { @@ -344,6 +361,8 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic private String getExecutionPlanName(String alertType, String queryName, String deviceId) { if ("Traffic".equals(alertType)) { return "Geo-ExecutionPlan-Traffic_" + queryName + "_alert"; + } else if ("Speed".equals(alertType)) { + return "Geo-ExecutionPlan-" + alertType + "---" + deviceId + "_alert"; } else { return "Geo-ExecutionPlan-" + alertType + "_" + queryName + "---_" + deviceId + "_alert"; } 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 26aad9a908..7be18ebff9 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,6 +19,7 @@ package org.wso2.carbon.device.mgt.core.geo.service; +import org.apache.axis2.AxisFault; import org.mockito.Mockito; import org.testng.Assert; @@ -31,11 +32,13 @@ 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.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; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.event.processor.stub.EventProcessorAdminServiceStub; +import org.wso2.carbon.event.processor.stub.types.ExecutionPlanConfigurationDto; import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException; import org.wso2.carbon.utils.multitenancy.MultitenantConstants; @@ -57,6 +60,7 @@ public class GeoLocationProviderServiceTest { private EventProcessorAdminServiceStub mockEventProcessorAdminServiceStub; private GeoLocationProviderServiceImpl geoLocationProviderServiceImpl; + private ExecutionPlanConfigurationDto[] mockExecutionPlanConfigurationDto = new ExecutionPlanConfigurationDto[1]; @BeforeClass public void init() throws Exception { @@ -65,42 +69,42 @@ public class GeoLocationProviderServiceTest { } @Test (description = "Create a sample geo exit-alert with relevant details.") - public void createGeoExitAlert() throws GeoLocationBasedServiceException { + public void createGeoExitAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. createGeoAlert(getExitAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_EXIT); Assert.assertEquals(result, Boolean.TRUE); } @Test (description = "Create a sample geo within-alert with relevant details.") - public void createGeoWithinAlert() throws GeoLocationBasedServiceException { + public void createGeoWithinAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. createGeoAlert(getWithinAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_WITHIN); Assert.assertEquals(result, Boolean.TRUE); } @Test (description = "Create a sample geo proximity-alert with relevant details.") - public void createGeoProximityAlert() throws GeoLocationBasedServiceException { + public void createGeoProximityAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. createGeoAlert(getProximityAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_PROXIMITY); Assert.assertEquals(result, Boolean.TRUE); } @Test (description = "Create a sample geo speed-alert with relevant details.") - public void createGeoSpeedAlert() throws GeoLocationBasedServiceException { + public void createGeoSpeedAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. createGeoAlert(getSpeedAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_SPEED); Assert.assertEquals(result, Boolean.TRUE); } @Test (description = "Create a sample geo stationary-alert with relevant details.") - public void createGeoStationaryAlert() throws GeoLocationBasedServiceException { + public void createGeoStationaryAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. createGeoAlert(getStationaryAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_STATIONARY); Assert.assertEquals(result, Boolean.TRUE); } @Test (description = "Create a sample geo traffic-alert with relevant details.") - public void createGeoTrafficAlert() throws GeoLocationBasedServiceException { + public void createGeoTrafficAlert() throws GeoLocationBasedServiceException, AlertAlreadyExistException { Boolean result = geoLocationProviderServiceImpl. createGeoAlert(getTrafficAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_TRAFFIC); Assert.assertEquals(result, Boolean.TRUE); @@ -139,10 +143,14 @@ public class GeoLocationProviderServiceTest { private void initMocks() throws JWTClientException, RemoteException { mockEventProcessorAdminServiceStub = Mockito.mock(EventProcessorAdminServiceStub.class); geoLocationProviderServiceImpl = Mockito.mock(GeoLocationProviderServiceImpl.class, Mockito.CALLS_REAL_METHODS); + mockExecutionPlanConfigurationDto[0] = Mockito.mock(ExecutionPlanConfigurationDto.class); Mockito.doReturn(mockEventProcessorAdminServiceStub). when(geoLocationProviderServiceImpl).getEventProcessorAdminServiceStub(); Mockito.doReturn("success"). when(mockEventProcessorAdminServiceStub).validateExecutionPlan(Mockito.anyString()); + Mockito.when(mockEventProcessorAdminServiceStub.getAllActiveExecutionPlanConfigurations()). + thenReturn(mockExecutionPlanConfigurationDto); + Mockito.when(mockExecutionPlanConfigurationDto[0].getExecutionPlan()).thenReturn("EXECUTION_PLAN"); } private DeviceIdentifier getDeviceIdentifier() { 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 a87a8ba984..487b367b63 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 @@ -178,6 +178,10 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { 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(); } } @@ -211,6 +215,10 @@ public class GeoLocationBasedServiceImpl implements GeoLocationBasedService { 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(); } }