diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsArtifactsManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsArtifactsManagementService.java index caacc59b39d..9ff8ecc44d8 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsArtifactsManagementService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/AnalyticsArtifactsManagementService.java @@ -138,24 +138,18 @@ public interface AnalyticsArtifactsManagementService { responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests."), + description = "The content type of the body") } ), @ApiResponse( code = 400, - message = "Bad Request."), + message = "Bad Request. \n The resource to add already exists."), + @ApiResponse( + code = 404, + message = "Not Found. \n The resource to edit not available."), @ApiResponse( code = 406, - message = "Not Acceptable.\n The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, message = "Internal Server Error. \n Server error occurred while " + @@ -202,24 +196,15 @@ public interface AnalyticsArtifactsManagementService { responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests."), + description = "The content type of the body") } ), @ApiResponse( code = 400, - message = "Bad Request."), + message = "Bad Request. \n The payload is invalid."), @ApiResponse( code = 406, - message = "Not Acceptable.\n The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, message = "Internal Server Error. \n Server error occurred while deploying the " + @@ -235,7 +220,7 @@ public interface AnalyticsArtifactsManagementService { @Valid EventStream stream); @DELETE - @Path("/stream/{name}/{version}/delete") + @Path("/stream/{name}/{version}") @ApiOperation( httpMethod = "DELETE", value = "Delete the Stream with id as {name}:{version}", @@ -257,28 +242,18 @@ public interface AnalyticsArtifactsManagementService { responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests.") + description = "The content type of the body") } ), @ApiResponse( - code = 400, - message = "Bad Request."), + code = 404, + message = "Not Found. \n The resource to delete not available."), @ApiResponse( code = 406, - message = "Not Acceptable.\n" + - "The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, - message = "Internal Server Error.\nServer error occurred while " + + message = "Internal Server Error. \nServer error occurred while " + "deleting the Stream Artifact.", response = ErrorResponse.class) } @@ -320,25 +295,12 @@ public interface AnalyticsArtifactsManagementService { responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body."), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests."), + description = "The content type of the body.") } ), - @ApiResponse( - code = 400, - message = - "Bad Request."), @ApiResponse( code = 406, - message = "Not Acceptable.\n The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, message = "Internal Server Error. \n Server error occurred while deploying the " + @@ -385,25 +347,16 @@ public interface AnalyticsArtifactsManagementService { responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body."), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests."), + description = "The content type of the body.") } ), @ApiResponse( code = 400, message = - "Bad Request."), + "Bad Request. \n The payload is invalid."), @ApiResponse( code = 406, - message = "Not Acceptable.\n The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, message = "Internal Server Error. \n Server error occurred while deploying the " + @@ -419,7 +372,7 @@ public interface AnalyticsArtifactsManagementService { @Valid Adapter receiver); @DELETE - @Path("/receiver/{name}/delete") + @Path("/receiver/{name}") @ApiOperation( httpMethod = "DELETE", value = "Delete a Receiver with the given name", @@ -442,32 +395,16 @@ public interface AnalyticsArtifactsManagementService { @ResponseHeader( name = "Content-Type", description = "The content type of the body" - ), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests." - ), - @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." - ), @ApiResponse( code = 406, - message = "Not Acceptable.\n" + - "The requested media type is not supported." + message = "Not Acceptable. \n The requested media type is not supported." ), @ApiResponse( code = 500, - message = "Internal Server Error.\nServer error occurred while " + + message = "Internal Server Error.\n Server error occurred while " + "deleting the Receiver Artifact.", response = ErrorResponse.class ) @@ -504,25 +441,12 @@ public interface AnalyticsArtifactsManagementService { responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body."), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests."), + description = "The content type of the body.") } ), - @ApiResponse( - code = 400, - message = - "Bad Request."), @ApiResponse( code = 406, - message = "Not Acceptable.\n The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, message = "Internal Server Error. \n Server error occurred while deploying the " + @@ -569,16 +493,7 @@ public interface AnalyticsArtifactsManagementService { responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body."), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests."), + description = "The content type of the body.") } ), @ApiResponse( @@ -587,7 +502,7 @@ public interface AnalyticsArtifactsManagementService { "Bad Request."), @ApiResponse( code = 406, - message = "Not Acceptable.\n The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, message = "Internal Server Error. \n Server error occurred while deploying the " + @@ -603,7 +518,7 @@ public interface AnalyticsArtifactsManagementService { @Valid Adapter publisher); @DELETE - @Path("/publisher/{name}/delete") + @Path("/publisher/{name}") @ApiOperation( httpMethod = "DELETE", value = "Delete a Publisher with the given name", @@ -625,28 +540,15 @@ public interface AnalyticsArtifactsManagementService { responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests.") + description = "The content type of the body") } ), - @ApiResponse( - code = 400, - message = "Bad Request."), @ApiResponse( code = 406, - message = "Not Acceptable.\n" + - "The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, - message = "Internal Server Error.\nServer error occurred while " + + message = "Internal Server Error. \n Server error occurred while " + "deleting the Publisher Artifact.", response = ErrorResponse.class) } @@ -659,6 +561,7 @@ public interface AnalyticsArtifactsManagementService { @PathParam("name") String name); @POST + @Consumes(MediaType.APPLICATION_JSON) @Path("/siddhi-script/{name}") @ApiOperation( httpMethod = "POST", @@ -681,25 +584,12 @@ public interface AnalyticsArtifactsManagementService { responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body."), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests."), + description = "The content type of the body.") } ), - @ApiResponse( - code = 400, - message = - "Bad Request."), @ApiResponse( code = 406, - message = "Not Acceptable.\n The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, message = "Internal Server Error. \n Server error occurred while " + @@ -723,7 +613,7 @@ public interface AnalyticsArtifactsManagementService { @Valid SiddhiExecutionPlan plan); @DELETE - @Path("/siddhi-script/{name}/delete") + @Path("/siddhi-script/{name}") @ApiOperation( httpMethod = "DELETE", value = "Delete an already deployed Siddhi script", @@ -742,32 +632,19 @@ public interface AnalyticsArtifactsManagementService { value = { @ApiResponse( code = 200, - message = "OK. \n Successfully delete the Siddhi script Artifact.", + message = "OK. \n Successfully deleted the Siddhi script Artifact.", responseHeaders = { @ResponseHeader( name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = - "Date and time the resource was last modified.\n" + - "Used by caches, or in conditional requests.") + description = "The content type of the body") } ), - @ApiResponse( - code = 400, - message = "Bad Request."), @ApiResponse( code = 406, - message = "Not Acceptable.\n" + - "The requested media type is not supported."), + message = "Not Acceptable. \n The requested media type is not supported."), @ApiResponse( code = 500, - message = "Internal Server Error.\nServer error occurred while " + + message = "Internal Server Error.\n Server error occurred while " + "deleting the Siddhi script Artifact.", response = ErrorResponse.class) } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsArtifactsManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsArtifactsManagementServiceImpl.java index 2958d5b3a0c..be85aaa440a 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsArtifactsManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/AnalyticsArtifactsManagementServiceImpl.java @@ -82,20 +82,22 @@ public class AnalyticsArtifactsManagementServiceImpl try { String streamDefinition = stream.getDefinition(); if (deployStream(id, streamDefinition, isEdited)) { - return Response.ok().build(); + return Response.ok().entity("Stream artifact of id " + id + + " successfully deployed").build(); } else { String errMsg = "Failed to create the Stream artifact of id: " + id + " for tenant domain: " + tenantDomain; + log.error(errMsg); return Response.serverError().entity(errMsg).build(); } } catch (ArtifactAlreadyExistsException e) { String errMsg = "Failed to create Stream artifact for tenant domain: " + tenantDomain + - "Stream with id: "+ id + "already exists"; + "Stream with id: " + id + "already exists"; log.error(errMsg, e); return Response.status(Response.Status.BAD_REQUEST).entity(errMsg).build(); } catch (NotFoundException e) { String errMsg = "Failed to edit Stream artifact for tenant domain: " + tenantDomain + - "Stream with id: "+ id + "doesn't exist"; + "Stream with id: " + id + "doesn't exist"; log.error(errMsg, e); return Response.status(Response.Status.NOT_FOUND).entity(errMsg).build(); } catch (AxisFault e) { @@ -124,13 +126,13 @@ public class AnalyticsArtifactsManagementServiceImpl String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); try { validateStreamProperties(stream); - String name = stream.getName(); - String version = stream.getVersion(); + String id = stream.getName() + ":" + stream.getVersion(); if (deployStream(stream)) { - return Response.ok().build(); + return Response.ok().entity("Stream artifact of id " + id + + " successfully deployed").build(); } else { - String errMsg = String.format("Failed to create the Stream artifact of id: %s:%s " + - "for tenant domain: %s", name, version, tenantDomain); + String errMsg = "Failed to create the Stream artifact of id: " + id + + "for tenant domain: " + tenantDomain; log.error(errMsg); return Response.serverError().entity(errMsg).build(); } @@ -159,22 +161,23 @@ public class AnalyticsArtifactsManagementServiceImpl @Override @DELETE - @Path("/stream/{name}/{version}/delete") + @Path("/stream/{name}/{version}") public Response deleteStream(@PathParam("name") String name, @PathParam("version") String version) { String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + String id = name + ":" + version; try { if (undeployStream(name, version)) { - return Response.ok().build(); + return Response.ok().entity("Stream artifact of id " + id + + " successfully deleted").build(); } else { - String errMsg = String.format("Failed to undeploy the Stream artifact of id: %s:%s " + - "for tenant domain: %s", name, version, tenantDomain); + String errMsg = "Failed to undeploy the Stream artifact of id: " + id + + "for tenant domain: " + tenantDomain; log.error(errMsg); return Response.serverError().entity(errMsg).build(); } } catch (NotFoundException e) { - String errMsg = String.format("Failed to undeploy Stream with id %s:%s for tenant %s" - , name, version, tenantDomain); + String errMsg = "Failed to undeploy Stream with id " + id + "for tenant " + tenantDomain; log.error(errMsg, e); return Response.status(Response.Status.NOT_FOUND).entity(errMsg).build(); } catch (AxisFault e) { @@ -199,11 +202,16 @@ public class AnalyticsArtifactsManagementServiceImpl @Override @POST @Path("/receiver/{name}") + /* + Ideally this method should validate the existence of receiver before creating or editing. But + EventReceiverAdminServiceStub haven't implemented the methods to support these validations. + Therefore a common server error response is returned by catching Axis Fault + */ public Response deployEventReceiverAsString(@PathParam("name") String name, @QueryParam("isEdited") boolean isEdited, @Valid Adapter receiver) { String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); - EventReceiverAdminServiceStub eventReceiverAdminServiceStub; + EventReceiverAdminServiceStub eventReceiverAdminServiceStub = null; try { String receiverDefinition = receiver.getDefinition(); eventReceiverAdminServiceStub = DeviceMgtAPIUtils.getEventReceiverAdminServiceStub(); @@ -212,29 +220,37 @@ public class AnalyticsArtifactsManagementServiceImpl } else { eventReceiverAdminServiceStub.editActiveEventReceiverConfiguration(receiverDefinition, name); } - return Response.ok().build(); + return Response.ok().entity("Receiver artifact of name " + name + + " successfully deployed").build(); } catch (AxisFault e) { String errMsg = "Failed to create event definitions for tenantDomain: " + tenantDomain; log.error(errMsg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errMsg).build(); + return Response.serverError().entity(errMsg).build(); } catch (RemoteException e) { String errMsg = "Failed to connect with the remote services for tenantDomain: " + tenantDomain; log.error(errMsg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errMsg).build(); + return Response.serverError().entity(errMsg).build(); } catch (JWTClientException e) { String errMsg = "Failed to generate jwt token for tenantDomain: " + tenantDomain; log.error(errMsg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errMsg).build(); + return Response.serverError().entity(errMsg).build(); } catch (UserStoreException e) { String errMsg = "Failed to connect with the user store for tenantDomain: " + tenantDomain; log.error(errMsg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errMsg).build(); + return Response.serverError().entity(errMsg).build(); + } finally { + cleanup(eventReceiverAdminServiceStub); } } @Override @POST @Path("/receiver") + /* + Ideally this method should validate the existence of receiver before creating or editing. But + EventReceiverAdminServiceStub haven't implemented the methods to support these validations. + Therefore a common server error response is returned by catching Axis Fault + */ public Response deployEventReceiverAsDto(@Valid Adapter receiver) { String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); try { @@ -245,7 +261,8 @@ public class AnalyticsArtifactsManagementServiceImpl validateAdapterMapping(adapterConfiguration.getAdapterMappingConfiguration()); } deployReceiver(receiver, customMapping, adapterConfiguration); - return Response.ok().build(); + return Response.ok().entity("Receiver artifact of name " + receiver.getAdapterName() + + " successfully deployed").build(); } catch (BadRequestException e) { String errMsg = "Failed to deploy receiver due to invalid payload"; log.error(errMsg, e); @@ -271,15 +288,21 @@ public class AnalyticsArtifactsManagementServiceImpl @Override @DELETE - @Path("/receiver/{name}/delete") + @Path("/receiver/{name}") + /* + Ideally this method should validate the existence of receiver before deleting. But + EventReceiverAdminServiceStub haven't implemented the methods to support these validations. + Therefore a common server error response is returned by catching Axis Fault + */ public Response deleteReceiver(@PathParam("name") String name) { String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); try { if (undeployAdapter(name, "Receiver")) { - return Response.ok().build(); + return Response.ok().entity("Receiver artifact of name " + name + + " successfully deleted").build(); } else { - String errMsg = String.format("Failed to undeploy the Receiver artifact of name: %s" + - "for tenant domain: %s", name, tenantDomain); + String errMsg = "Failed to undeploy the Receiver artifact of name: " + name + + "for tenant domain: " + tenantDomain; log.error(errMsg); return Response.serverError().entity(errMsg).build(); } @@ -305,11 +328,16 @@ public class AnalyticsArtifactsManagementServiceImpl @Override @POST @Path("/publisher/{name}") + /* + Ideally this method should validate the existence of publisher before creating or editing. But + EventPublisherAdminServiceStub haven't implemented the methods to support these validations. + Therefore a common server error response is returned by catching Axis Fault + */ public Response deployEventPublisherAsString(@PathParam("name") String name, @QueryParam("isEdited") boolean isEdited, @Valid Adapter publisher) { String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); - EventPublisherAdminServiceStub eventPublisherAdminServiceStub; + EventPublisherAdminServiceStub eventPublisherAdminServiceStub = null; try { String publisherDefinition = publisher.getDefinition(); eventPublisherAdminServiceStub = DeviceMgtAPIUtils.getEventPublisherAdminServiceStub(); @@ -318,29 +346,37 @@ public class AnalyticsArtifactsManagementServiceImpl } else { eventPublisherAdminServiceStub.editActiveEventPublisherConfiguration(publisherDefinition, name); } - return Response.ok().build(); + return Response.ok().entity("Publisher artifact of name " + name + + " successfully deployed").build(); } catch (AxisFault e) { String errMsg = "Failed to create event definitions for tenantDomain: " + tenantDomain; log.error(errMsg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errMsg).build(); + return Response.serverError().entity(errMsg).build(); } catch (RemoteException e) { String errMsg = "Failed to connect with the remote services for tenantDomain: " + tenantDomain; log.error(errMsg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errMsg).build(); + return Response.serverError().entity(errMsg).build(); } catch (JWTClientException e) { String errMsg = "Failed to generate jwt token for tenantDomain: " + tenantDomain; log.error(errMsg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errMsg).build(); + return Response.serverError().entity(errMsg).build(); } catch (UserStoreException e) { String errMsg = "Failed to connect with the user store for tenantDomain: " + tenantDomain; log.error(errMsg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errMsg).build(); + return Response.serverError().entity(errMsg).build(); + } finally { + cleanup(eventPublisherAdminServiceStub); } } @Override @POST @Path("/publisher") + /* + Ideally this method should validate the existence of publisher before creating or editing. But + EventPublisherAdminServiceStub haven't implemented the methods to support these validations. + Therefore a common server error response is returned by catching Axis Fault + */ public Response deployEventPublisherAsDto(@Valid Adapter publisher) { String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); AdapterConfiguration adapterConfiguration = publisher.getAdapterConfiguration(); @@ -351,7 +387,8 @@ public class AnalyticsArtifactsManagementServiceImpl validateAdapterMapping(adapterConfiguration.getAdapterMappingConfiguration()); } deployPublisher(publisher, customMapping, adapterConfiguration); - return Response.ok().build(); + return Response.ok().entity("Publisher artifact of name " + publisher.getAdapterName() + + " successfully deployed").build(); } catch (BadRequestException e) { String errMsg = "Failed to deploy publisher due to invalid payload"; log.error(errMsg, e); @@ -377,15 +414,21 @@ public class AnalyticsArtifactsManagementServiceImpl @Override @DELETE - @Path("/publisher/{name}/delete") + @Path("/publisher/{name}") + /* + Ideally this method should validate the existence of publisher before deleting. But + EventPublisherAdminServiceStub haven't implemented the methods to support these validations. + Therefore a common server error response is returned by catching Axis Fault + */ public Response deletePublisher(@PathParam("name") String name) { String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); try { if (undeployAdapter(name, "Publisher")) { - return Response.ok().build(); + return Response.ok().entity("Publisher artifact of name " + name + + " successfully deleted").build(); } else { - String errMsg = String.format("Failed to undeploy the Publisher artifact of name: %s" + - "for tenant domain: %s", name, tenantDomain); + String errMsg = "Failed to undeploy the Publisher artifact of name: " + name + + "for tenant domain: " + tenantDomain; log.error(errMsg); return Response.serverError().entity(errMsg).build(); } @@ -411,13 +454,19 @@ public class AnalyticsArtifactsManagementServiceImpl @Override @POST @Path("/siddhi-script/{name}") + /* + Ideally this method should validate the existence of Siddhi script before creating or editing. But + EventProcessorAdminServiceStub haven't implemented the methods to support these validations. + Therefore a common server error response is returned by catching Axis Fault + */ public Response deploySiddhiExecutableScript(@PathParam("name") String name, @QueryParam("isEdited") boolean isEdited, @Valid SiddhiExecutionPlan plan) { String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); try { deploySiddhiExecutionPlan(name, isEdited, plan.getDefinition()); - return Response.ok().build(); + return Response.ok().entity("Siddhi script artifact of name " + name + + " successfully deleted").build(); } catch (InvalidExecutionPlanException e) { String errMsg = "Failed to deploy siddhi script due to invalid payload"; log.error(errMsg, e); @@ -443,12 +492,18 @@ public class AnalyticsArtifactsManagementServiceImpl @Override @DELETE - @Path("/siddhi-script/{name}/delete") + @Path("/siddhi-script/{name}") + /* + Ideally this method should validate the existence of Siddhi script before deleting. But + EventProcessorAdminServiceStub haven't implemented the methods to support these validations. + Therefore a common server error response is returned by catching Axis Fault + */ public Response deleteSiddhiScript(@PathParam("name") String name) { String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); try { undeploySiddhiScript(name); - return Response.ok().build(); + return Response.ok().entity("Publisher artifact of name " + name + + " successfully deleted").build(); } catch (AxisFault e) { String errMsg = "Failed to delete event definitions for tenant " + tenantDomain; log.error(errMsg, e); @@ -469,17 +524,24 @@ public class AnalyticsArtifactsManagementServiceImpl } /** - * Deploy Stream by passing a string to a stub + * Deploy Stream by passing data as string to a stub * * @param streamId Stream name:version * @param streamDefinition Stream that should be deployed * @param isEdited Create a new stream or edit an existing one * @return True if stream successfully created and false if not - * @throws RemoteException Exception that may occur during a remote method call - * @throws UserStoreException Exception that may occur during JWT token generation - * @throws JWTClientException Exception that may occur during connecting to client store - * @throws NotFoundException Exception that may occure if stream doesn't exist while editing - * @throws ArtifactAlreadyExistsException Exception that may occure if stream exist while creating + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventStreamAdminServiceStub and if communication + * gets interfered + * @throws UserStoreException Exception that may occur while getting user data from + * the client store for the specific tenant + * @throws JWTClientException Exception that may occur during creating a EventStreamAdminServiceStub + * instance, as a jwt based token client is used to generate a token + * for the tenant in the process + * @throws NotFoundException Exception that may occur if stream doesn't exist, + * when the method is called with isEdited flag as True + * @throws ArtifactAlreadyExistsException Exception that may occur if stream does exist, + * when the method is called with isEdited flag as False */ private boolean deployStream(String streamId, String streamDefinition, boolean isEdited) throws UserStoreException, JWTClientException, RemoteException, NotFoundException, @@ -502,14 +564,18 @@ public class AnalyticsArtifactsManagementServiceImpl } /** - * Deploy Stream by passing a DTO object to a stub + * Deploy Stream by passing data as a DTO object to a stub * * @param stream Stream definition * @return True if stream successfully created and false if not - * @throws RemoteException Exception that may occur during a remote method call - * @throws UserStoreException Exception that may occur during JWT token generation - * @throws JWTClientException Exception that may occur during connecting to client store - * @throws NotFoundException Exception that may occure if stream doesn't exist while editing + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventStreamAdminServiceStub and if communication + * gets interfered + * @throws UserStoreException Exception that may occur while getting user data from + * the client store for the specific tenant + * @throws JWTClientException Exception that may occur during creating a EventStreamAdminServiceStub + * instance, as a jwt based token client is used to generate a token + * for the tenant in the process */ private boolean deployStream(EventStream stream) throws RemoteException, UserStoreException, JWTClientException { @@ -553,10 +619,16 @@ public class AnalyticsArtifactsManagementServiceImpl * @param name Stream name * @param version Stream version * @return True if stream successfully created and false if not - * @throws RemoteException Exception that may occur during a remote method call - * @throws UserStoreException Exception that may occur during JWT token generation - * @throws JWTClientException Exception that may occur during connecting to client store - * @throws NotFoundException Exception that may occure if stream doesn't exist + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventStreamAdminServiceStub and if communication + * gets interfered + * @throws UserStoreException Exception that may occur while getting user data from + * the client store for the specific tenant + * @throws JWTClientException Exception that may occur during creating a EventStreamAdminServiceStub + * instance, as a jwt based token client is used to generate a token + * for the tenant in the process + * @throws NotFoundException Exception that may occur if stream doesn't exist, + * when the method is called with isEdited flag as True */ private boolean undeployStream(String name, String version) throws RemoteException, UserStoreException, JWTClientException, NotFoundException { @@ -578,14 +650,19 @@ public class AnalyticsArtifactsManagementServiceImpl } /** - * Set data to a receiver dto and deploy dto through a stub + * Deploy Receiver by passing data as a DTO object to a stub * * @param receiver Event Receiver adapter * @param customMapping Is Receiver mapped * @param adapterConfiguration Adapter property and mapping configuration - * @throws RemoteException Exception that may occur during a remote method call - * @throws UserStoreException Exception that may occur during JWT token generation - * @throws JWTClientException Exception that may occur during connecting to client store + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventReceiverAdminServiceStub and if communication + * gets interfered + * @throws UserStoreException Exception that may occur while getting user data from + * the client store for the specific tenant + * @throws JWTClientException Exception that may occur during creating a EventReceiverAdminServiceStub + * instance, as a jwt based token client is used to generate a token + * for the tenant in the process */ private void deployReceiver(Adapter receiver, boolean customMapping, AdapterConfiguration adapterConfiguration) @@ -660,14 +737,16 @@ public class AnalyticsArtifactsManagementServiceImpl } /** - * To deploy receiver if custom mapping is false + * Deploy Receiver by passing data as a DTO object to a stub when custom mapping is False * * @param receiverName Name of the receiver * @param eventStreamWithVersion Attached event stream of the receiver * @param adapterType Adapter type name * @param eventReceiverAdminServiceStub Stub to deploy receiver * @param basicInputAdapterPropertyDtos DTO to attach receiver data - * @throws RemoteException Exception that may occur during a remote method call + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventReceiverAdminServiceStub and if communication + * gets interfered */ private void deployReceiverWithoutMapping(String receiverName, String eventStreamWithVersion , String adapterType, EventReceiverAdminServiceStub eventReceiverAdminServiceStub @@ -694,14 +773,19 @@ public class AnalyticsArtifactsManagementServiceImpl } /** - * Set data to a publisher dto and deploy dto through a stub + * Deploy Publisher by passing data as a DTO object to a stub * * @param publisher Event Publisher adapter * @param customMapping Is Publisher mapped * @param adapterConfiguration Publisher property and mapping configuration - * @throws RemoteException Exception that may occur during a remote method call - * @throws UserStoreException Exception that may occur during JWT token generation - * @throws JWTClientException Exception that may occur during connecting to client store + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventPublisherAdminServiceStub and if communication + * gets interfered + * @throws UserStoreException Exception that may occur while getting user data from + * the client store for the specific tenant + * @throws JWTClientException Exception that may occur during creating a EventPublisherAdminServiceStub + * instance, as a jwt based token client is used to generate a token + * for the tenant in the process */ private void deployPublisher(Adapter publisher, boolean customMapping, AdapterConfiguration adapterConfiguration) @@ -788,14 +872,16 @@ public class AnalyticsArtifactsManagementServiceImpl } /** - * To deploy publisher if custom mapping is false + * Deploy Publisher by passing data as a DTO object to a stub when custom mapping is False * * @param publisherName Name of the publisher * @param eventStreamWithVersion Attached event stream of the publisher * @param adapterType Adapter type name * @param eventPublisherAdminServiceStub Stub to deploy publisher * @param basicOutputAdapterPropertyDtos DTO to attach publisher data - * @throws RemoteException Exception that may occur during a remote method call + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventPublisherAdminServiceStub and if communication + * gets interfered */ private void deployPublisherWithoutMapping(String publisherName, String eventStreamWithVersion , String adapterType, EventPublisherAdminServiceStub eventPublisherAdminServiceStub @@ -831,12 +917,19 @@ public class AnalyticsArtifactsManagementServiceImpl } /** + * Undeploy an active publisher or a receiver artifact + * * @param name Adapter name * @param type Adapter type(Receiver or Publisher) * @return True if Adapter successfully created and false if not - * @throws RemoteException Exception that may occur during a remote method call - * @throws UserStoreException Exception that may occur during JWT token generation - * @throws JWTClientException Exception that may occur during connecting to client store + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventReceiverAdminServiceStub or EventPublisherAdminServiceStub + * and if communication gets interfered + * @throws UserStoreException Exception that may occur while getting user data from + * the client store for the specific tenant + * @throws JWTClientException Exception that may occur during creating a EventReceiverAdminServiceStub or + * EventPublisherAdminServiceStub instance, as a jwt based token client + * is used to generate a token for the tenant in the process */ private boolean undeployAdapter(String name, String type) throws RemoteException, UserStoreException, JWTClientException { @@ -862,15 +955,21 @@ public class AnalyticsArtifactsManagementServiceImpl } /** - * Publish a siddhi execution plan using a stub + * Deploy Siddhi script by passing data as a DTO object to a stub * * @param name Plan name * @param isEdited Is plan edited * @param plan Plan data - * @throws RemoteException Exception that may occur during a remote method call - * @throws UserStoreException Exception that may occur during JWT token generation - * @throws JWTClientException Exception that may occur during connecting to client store - * @throws InvalidExecutionPlanException Exception that may occur if execution plan validation fails + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventProcessorAdminServiceStub and if communication + * gets interfered + * @throws UserStoreException Exception that may occur while getting user data from + * the client store for the specific tenant + * @throws JWTClientException Exception that may occur during creating a EventProcessorAdminServiceStub + * instance, as a jwt based token client is used to generate a + * token for the tenant in the process + * @throws InvalidExecutionPlanException Exception that may occur if Siddhi script validation fails + * due to having errors in the code */ private void deploySiddhiExecutionPlan(String name, boolean isEdited, String plan) throws RemoteException, UserStoreException, JWTClientException, @@ -894,12 +993,17 @@ public class AnalyticsArtifactsManagementServiceImpl } /** - * Undeploy a Siddhi artifact + * Undeploy an active Siddhi artifact * * @param name Siddhi script name - * @throws RemoteException Exception that may occur during a remote method call - * @throws UserStoreException Exception that may occur during JWT token generation - * @throws JWTClientException Exception that may occur during connecting to client store + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventProcessorAdminServiceStub and if communication + * gets interfered + * @throws UserStoreException Exception that may occur while getting user data from + * the client store for the specific tenant + * @throws JWTClientException Exception that may occur during creating a EventProcessorAdminServiceStub + * instance, as a jwt based token client is used to generate a + * token for the tenant in the process */ private void undeploySiddhiScript(String name) throws RemoteException, UserStoreException, JWTClientException { @@ -913,16 +1017,23 @@ public class AnalyticsArtifactsManagementServiceImpl } /** + * Validate if stream exists for update or if stream can be created + * * @param streamId Stream name:version * @param eventStreamAdminServiceStub stub used to mange Stream artifacts * @param isEdited Create a new stream or edit an existing one - * @throws ArtifactAlreadyExistsException Exception that may occur if stream exist while creating - * @throws RemoteException Exception that may occur during a remote method call + * @throws ArtifactAlreadyExistsException Will be thrown if stream with same id exists when isEdited + * is False + * @throws NotFoundException Will be thrown if stream with same id doesn't exist when + * isEdited is True + * @throws RemoteException Exception that may occur when a SOAP request is made + * through EventProcessorAdminServiceStub and if communication + * gets interfered while getting the stream definition */ private void validateStreamId(String streamId, EventStreamAdminServiceStub eventStreamAdminServiceStub, boolean isEdited) - throws ArtifactAlreadyExistsException, RemoteException { + throws ArtifactAlreadyExistsException, RemoteException, NotFoundException { EventStreamDefinitionDto eventStreamDefinitionDto = eventStreamAdminServiceStub .getStreamDefinitionDto(streamId); if (isEdited) { @@ -946,7 +1057,7 @@ public class AnalyticsArtifactsManagementServiceImpl * Validate stream properties * * @param stream EventStream object - * @throws BadRequestException Exception that may occur if property attributes invalid + * @throws BadRequestException Will be thrown if Stream has invalid properties */ private void validateStreamProperties(EventStream stream) throws BadRequestException { if ((stream.getMetaData() == null || stream.getMetaData().isEmpty()) && @@ -963,7 +1074,7 @@ public class AnalyticsArtifactsManagementServiceImpl * Validate adapter payload attributes * * @param adapterProperties Adapter payload attributes - * @throws BadRequestException Exception that may occur if adapter properties invalid + * @throws BadRequestException Will be thrown if Stream has invalid properties */ private void validateAdapterProperties(List adapterProperties) throws BadRequestException { @@ -983,7 +1094,7 @@ public class AnalyticsArtifactsManagementServiceImpl * - else continue * * @param adapterMappingConfiguration Adapter mapping attributes - * @throws BadRequestException Exception that may occur if adapter mapping properties invalid + * @throws BadRequestException Will be thrown if Stream has invalid properties */ private void validateAdapterMapping(AdapterMappingConfiguration adapterMappingConfiguration) throws BadRequestException {