From 018d078e1b924394253743e1759562905456fd5d Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Mon, 6 May 2019 00:03:07 +0530 Subject: [PATCH 1/6] Improve life cycle manager --- .../mgt/api/services/ConfigRetrieveAPI.java | 29 ---- .../services/impl/ConfigRetrieveAPIImpl.java | 15 -- .../mgt/common/AppLifecycleState.java | 2 +- .../device/application/mgt/common/State.java | 51 ------- .../mgt/common/config/LifecycleState.java | 5 + .../mgt/common/dto/ApplicationDTO.java | 2 +- .../common/services/ApplicationManager.java | 11 +- .../mgt/common/services/AppmDataHandler.java | 4 +- .../mgt/core/dao/ApplicationDAO.java | 2 +- .../mgt/core/dao/ApplicationReleaseDAO.java | 4 +- .../mgt/core/dao/LifecycleStateDAO.java | 6 +- .../mgt/core/dao/SubscriptionDAO.java | 2 +- .../GenericApplicationDAOImpl.java | 6 +- .../GenericApplicationReleaseDAOImpl.java | 21 +-- .../GenericLifecycleStateDAOImpl.java | 23 ++- .../ApplicationManagementDAOException.java | 2 +- .../mgt/core/impl/ApplicationManagerImpl.java | 139 +++++++++++------- .../mgt/core/impl/AppmDataHandlerImpl.java | 4 +- .../core/impl/SubscriptionManagerImpl.java | 13 ++ .../core/lifecycle/LifecycleStateManager.java | 122 +++++++-------- .../LifeCycleStateManagerTest.java | 19 +-- .../LifecycleManagementTest.java | 22 +-- .../src/test/resources/application-mgt.xml | 37 ++--- .../ApplicationManagementPublisherAPI.java | 51 +++++-- ...pplicationManagementPublisherAdminAPI.java | 7 +- ...ApplicationManagementPublisherAPIImpl.java | 29 +++- ...cationManagementPublisherAdminAPIImpl.java | 21 ++- .../main/resources/conf/application-mgt.xml | 37 ++--- .../dbscripts/cdm/application-mgt/oracle.sql | 2 +- .../cdm/application-mgt/postgresql.sql | 2 +- 30 files changed, 335 insertions(+), 355 deletions(-) delete mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/State.java diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/ConfigRetrieveAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/ConfigRetrieveAPI.java index f4e3130c97..51ea56ef63 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/ConfigRetrieveAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/ConfigRetrieveAPI.java @@ -80,33 +80,4 @@ public interface ConfigRetrieveAPI { response = ErrorResponse.class) }) Response getUiConfig(); - - @GET - @Path("/lifecycle-config") - @Produces(MediaType.APPLICATION_JSON) - @ApiOperation( - consumes = MediaType.APPLICATION_JSON, - produces = MediaType.APPLICATION_JSON, - httpMethod = "GET", - value = "get application management UI configuration", - notes = "This will get all UI configuration of application management" - ) - @ApiResponses( - value = { - @ApiResponse( - code = 200, - message = "OK. \n Successfully got Lifecycle Config.", - response = ApplicationList.class), - @ApiResponse( - code = 404, - message = "Not Found. There doesn't have an defined in app management " - + "configuration file." + - "query."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Error occurred while getting the lifecycle config.", - response = ErrorResponse.class) - }) - Response getLifecycleConfig(); - } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ConfigRetrieveAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ConfigRetrieveAPIImpl.java index 65269f512a..a01dba4e7c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ConfigRetrieveAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ConfigRetrieveAPIImpl.java @@ -54,19 +54,4 @@ public class ConfigRetrieveAPIImpl implements ConfigRetrieveAPI { } return Response.status(Response.Status.OK).entity(uiConfiguration).build(); } - - @GET - @Override - @Consumes("application/json") - @Path("/lifecycle-config") - public Response getLifecycleConfig() { - AppmDataHandler dataHandler = APIUtil.getDataHandler(); - try { - return Response.status(Response.Status.OK).entity(dataHandler.getLifecycleConfiguration()).build(); - } catch (LifecycleManagementException e) { - String msg = "Error Occurred while accessing lifecycle manager."; - log.error(msg); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/AppLifecycleState.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/AppLifecycleState.java index 8c0c1cbc87..eadafefe7d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/AppLifecycleState.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/AppLifecycleState.java @@ -23,6 +23,6 @@ package org.wso2.carbon.device.application.mgt.common; * States of the Application. */ public enum AppLifecycleState { - CREATED, IN_REVIEW, PUBLISHED, APPROVED, UNPUBLISHED, REJECTED, DEPRECATED, REMOVED + CREATED, IN_REVIEW, PUBLISHED, APPROVED, BLOCKED, REJECTED, DEPRECATED, RETIRED } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/State.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/State.java deleted file mode 100644 index cec1555baf..0000000000 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/State.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.wso2.carbon.device.application.mgt.common; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * This class represents the state of the lifecycle - */ -public class State { - - private Set proceedingStates; - private String stateName; - private String permission; - private boolean isAppUpdatable; - private boolean isAppInstallable; - private boolean isInitialState; - private boolean isEndState; - - public State(String stateName, List states, String permission, boolean isAppUpdatable, - boolean isAppInstallable, boolean isInitialState, boolean isEndState) { - this.stateName = stateName; - this.permission = permission; - this.isAppUpdatable=isAppUpdatable; - this.isAppInstallable=isAppInstallable; - this.isInitialState=isInitialState; - this.isEndState=isEndState; - if (states != null && !states.isEmpty()) { - proceedingStates = new HashSet<>(states); - } - } - - public String getState() { - return stateName; - } - - public Set getProceedingStates() { - return proceedingStates; - } - - public String getPermission(){ return permission;} - - public boolean isAppUpdatable(){ return isAppUpdatable;} - - public boolean isAppInstallable(){ return isAppInstallable;} - - public boolean isInitialState(){ return isInitialState;} - - public boolean isEndState(){ return isEndState;} - -} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/config/LifecycleState.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/config/LifecycleState.java index 298ec1c57a..b3459ab451 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/config/LifecycleState.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/config/LifecycleState.java @@ -19,6 +19,7 @@ public class LifecycleState { private boolean isAppUpdatable; private boolean isInitialState; private boolean isEndState; + private boolean isDeletableState; @XmlAttribute(name = "name") public String getName() { @@ -84,4 +85,8 @@ public class LifecycleState { this.isEndState = isEndState; } + @XmlElement(name = "IsDeletableState") + public boolean isDeletableState() { return isDeletableState; } + + public void setDeletableState(boolean deletableState) { isDeletableState = deletableState; } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/ApplicationDTO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/ApplicationDTO.java index a058e430eb..d6eceeb30c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/ApplicationDTO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/ApplicationDTO.java @@ -86,7 +86,7 @@ public class ApplicationDTO { @ApiModelProperty(name = "status", value = "Application status", required = true, - example = "REMOVED, ACTIVE") + example = "RETIRED, ACTIVE") private String status; @ApiModelProperty(name = "applicationReleaseDTOs", diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java index ad6f457be6..7b82727d70 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java @@ -69,14 +69,21 @@ public interface ApplicationManager { */ void deleteApplication(int applicationId) throws ApplicationManagementException; + /** + * Retire an application identified by the unique ID. + * + * @param applicationId ID for tha application + * @throws ApplicationManagementException ApplicationDTO Management Exception + */ + void retireApplication(int applicationId) throws ApplicationManagementException; + /** * Delete an application identified by the unique ID. * - * @param applicationId ID of tha application * @param releaseUuid UUID of tha application release * @throws ApplicationManagementException ApplicationDTO Management Exception */ - void deleteApplicationRelease(int applicationId, String releaseUuid) throws ApplicationManagementException; + void deleteApplicationRelease(String releaseUuid) throws ApplicationManagementException; /** * To get the applications based on the search filter. diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/AppmDataHandler.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/AppmDataHandler.java index 7b8a49d177..960196389a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/AppmDataHandler.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/AppmDataHandler.java @@ -17,7 +17,7 @@ package org.wso2.carbon.device.application.mgt.common.services; -import org.wso2.carbon.device.application.mgt.common.State; +import org.wso2.carbon.device.application.mgt.common.config.LifecycleState; import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException; @@ -33,7 +33,7 @@ public interface AppmDataHandler { */ UIConfiguration getUIConfiguration(); - Map getLifecycleConfiguration() throws LifecycleManagementException; + Map getLifecycleConfiguration() throws LifecycleManagementException; InputStream getArtifactStream(String uuid, String artifactName) throws ApplicationManagementException; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java index d43819d949..76a12d9226 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java @@ -176,7 +176,7 @@ public interface ApplicationDAO { * @param appId ID of the application. * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. */ - void deleteApplication(int appId) throws ApplicationManagementDAOException; + void retireApplication(int appId) throws ApplicationManagementDAOException; /** * To get the application count that satisfies gives search query. diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java index 0bc1b13580..1793b764b1 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java @@ -19,7 +19,6 @@ package org.wso2.carbon.device.application.mgt.core.dao; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; -import org.wso2.carbon.device.application.mgt.common.ApplicationReleaseArtifactPaths; import org.wso2.carbon.device.application.mgt.common.Rating; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; @@ -112,10 +111,9 @@ public interface ApplicationReleaseDAO { * To delete a particular release. * * @param id ID of the ApplicationDTO which the release need to be deleted. - * @param version Version of the ApplicationDTO Release * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. */ - void deleteRelease(int id, String version) throws ApplicationManagementDAOException; + void deleteRelease(int id) throws ApplicationManagementDAOException; /** * To get release details of a specific application. diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java index 4c8494e9e6..df8d819b0e 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java @@ -69,12 +69,12 @@ public interface LifecycleStateDAO { throws LifeCycleManagementDAOException; /** - * To delete a specific lifecycle state for application release. - * @param identifier Id of the LifecycleStateDTO. + * To delete lifecycle state data of specific application release. + * @param releaseId Id of the LifecycleStateDTO. * * @throws LifeCycleManagementDAOException Lifecycle Management DAO Exception. */ - void deleteLifecycleState(int identifier) throws LifeCycleManagementDAOException; + void deleteLifecycleStateByReleaseId(int releaseId) throws LifeCycleManagementDAOException; /*** * diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/SubscriptionDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/SubscriptionDAO.java index cd46b6a8b3..a4183eb4b3 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/SubscriptionDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/SubscriptionDAO.java @@ -88,7 +88,7 @@ public interface SubscriptionDAO { void subscribeGroupToApplication(int tenantId, String subscribedBy, List groupList, int appId, int releaseId) throws ApplicationManagementDAOException; - public List getDeviceSubscriptions(int appReleaseId, int tenantId) throws + List getDeviceSubscriptions(int appReleaseId, int tenantId) throws ApplicationManagementDAOException; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java index 5565eb43b8..81bb1eaa28 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java @@ -456,7 +456,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic stmt = conn.prepareStatement(sql); stmt.setString(1, releaseUuid); stmt.setInt(2, tenantId); - stmt.setString(3, AppLifecycleState.REMOVED.toString()); + stmt.setString(3, AppLifecycleState.RETIRED.toString()); rs = stmt.executeQuery(); if (log.isDebugEnabled()) { @@ -619,14 +619,14 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } @Override - public void deleteApplication(int appId) throws ApplicationManagementDAOException { + public void retireApplication(int appId) throws ApplicationManagementDAOException { Connection conn; PreparedStatement stmt = null; try { conn = this.getDBConnection(); String sql = "UPDATE AP_APP SET STATUS = ? WHERE ID = ? "; stmt = conn.prepareStatement(sql); - stmt.setString(1, AppLifecycleState.REMOVED.toString()); + stmt.setString(1, AppLifecycleState.RETIRED.toString()); stmt.setInt(2, appId); stmt.executeUpdate(); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java index f7c9c634c9..bd8441a068 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java @@ -490,30 +490,25 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements return applicationReleaseDTO; } - /** - * To delete an application release. - * - * @param id Id of the application Release. - * @param version version name of the application release. - * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. - */ - @Override public void deleteRelease(int id, String version) throws ApplicationManagementDAOException { + @Override + public void deleteRelease(int id) throws ApplicationManagementDAOException { Connection connection; PreparedStatement statement = null; - String sql = "DELETE FROM AP_APP_RELEASE WHERE ID = ? AND VERSION = ?"; + String sql = "DELETE " + + "FROM AP_APP_RELEASE " + + "WHERE ID = ?"; try { connection = this.getDBConnection(); statement = connection.prepareStatement(sql); statement.setInt(1, id); - statement.setString(2, version); statement.executeUpdate(); } catch (DBConnectionException e) { throw new ApplicationManagementDAOException( - "Database connection exception while trying to delete the release with version " + version, e); + "Database connection exception while trying to delete the release fore release ID: " + id, e); } catch (SQLException e) { throw new ApplicationManagementDAOException( - "SQL exception while deleting the release with version " + version + ",while executing the query " - + "sql", e); + "SQL exception while deleting the release for release ID: " + id + ",while executing the query sql" + , e); } finally { Util.cleanupResources(statement, null); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java index b3bc877e8e..0db4362fd4 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java @@ -193,23 +193,22 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif } @Override - public void deleteLifecycleState(int identifier) throws LifeCycleManagementDAOException { - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; + public void deleteLifecycleStateByReleaseId(int releaseId) throws LifeCycleManagementDAOException { + Connection conn; try { conn = this.getDBConnection(); - String sql = "DELETE FROM AP_APP_LIFECYCLE_STATE WHERE ID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, identifier); - stmt.executeUpdate(); - + String sql = "DELETE FROM " + + "AP_APP_LIFECYCLE_STATE " + + "WHERE AP_APP_RELEASE_ID = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, releaseId); + stmt.executeUpdate(); + } } catch (DBConnectionException e) { throw new LifeCycleManagementDAOException("Error occurred while obtaining the DB connection.", e); } catch (SQLException e) { - throw new LifeCycleManagementDAOException("Error occurred while deleting lifecycle: " + identifier, e); - } finally { - Util.cleanupResources(stmt, rs); + throw new LifeCycleManagementDAOException("Error occurred while deleting lifecycle for application " + + "release ID: " + releaseId, e); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ApplicationManagementDAOException.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ApplicationManagementDAOException.java index c9059f3ea9..ccadcab072 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ApplicationManagementDAOException.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ApplicationManagementDAOException.java @@ -21,7 +21,7 @@ import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManage /** * Exception thrown during the ApplicationDTO Management DAO operations. */ -public class ApplicationManagementDAOException extends ApplicationManagementException { +public class ApplicationManagementDAOException extends Exception { public ApplicationManagementDAOException(String message, Throwable throwable) { super(message, throwable); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java index 95a5a17807..f10c9b566a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java @@ -27,7 +27,6 @@ import org.apache.commons.logging.LogFactory; import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext; -import org.wso2.carbon.device.application.mgt.common.AppLifecycleState; import org.wso2.carbon.device.application.mgt.common.ApplicationArtifact; import org.wso2.carbon.device.application.mgt.common.ApplicationInstaller; import org.wso2.carbon.device.application.mgt.common.Pagination; @@ -873,6 +872,10 @@ public class ApplicationManagerImpl implements ApplicationManager { String msg = "User-store exception while getting application with the application id " + appId; log.error(msg); throw new ApplicationManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occured when getting, either application tags or application categories"; + log.error(msg); + throw new ApplicationManagementException(msg); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -919,6 +922,9 @@ public class ApplicationManagerImpl implements ApplicationManager { String msg = "User-store exception while getting application with the application release UUID: " + uuid; log.error(msg); throw new ApplicationManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -961,6 +967,9 @@ public class ApplicationManagerImpl implements ApplicationManager { } catch (UserStoreException e) { throw new ApplicationManagementException( "User-store exception while getting application with the application release UUID " + uuid); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -1057,6 +1066,9 @@ public class ApplicationManagerImpl implements ApplicationManager { } catch (UserStoreException e) { throw new ApplicationManagementException( "User-store exception while getting application with the " + "application name " + appName); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -1078,6 +1090,9 @@ public class ApplicationManagerImpl implements ApplicationManager { } catch (UserStoreException e) { throw new ApplicationManagementException( "User-store exception while getting application with the application UUID " + appReleaseUUID); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -1092,7 +1107,14 @@ public class ApplicationManagerImpl implements ApplicationManager { log.debug("Request is received to retrieve all the releases related with the application " + application .toString()); } - applicationReleases = this.applicationReleaseDAO.getReleases(application.getId(), tenantId); + //todo + applicationReleases = null; + try { + applicationReleases = this.applicationReleaseDAO.getReleases(application.getId(), tenantId); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); + } for (ApplicationReleaseDTO applicationRelease : applicationReleases) { LifecycleStateDTO lifecycleState = null; try { @@ -1169,7 +1191,7 @@ public class ApplicationManagerImpl implements ApplicationManager { log.error(msg); throw new ForbiddenException(msg); } - this.applicationDAO.deleteApplication(applicationId); + this.applicationDAO.retireApplication(applicationId); ConnectionManagerUtil.commitDBTransaction(); applicationStorageManager.deleteAllApplicationReleaseArtifacts(storedLocations); } catch (ApplicationManagementDAOException e) { @@ -1186,6 +1208,45 @@ public class ApplicationManagerImpl implements ApplicationManager { } } + @Override + public void retireApplication(int applicationId) throws ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + ApplicationDTO applicationDTO; + if (log.isDebugEnabled()) { + log.debug("Request is received to delete applications which are related with the application id " + + applicationId); + } + try { + ConnectionManagerUtil.beginDBTransaction(); + applicationDTO = this.applicationDAO.getApplicationById(applicationId, tenantId); + + if (applicationDTO == null) { + throw new NotFoundException("Couldn't found an application for Application ID: " + applicationId); + } + List applicationReleaseDTOs = applicationDTO.getApplicationReleaseDTOs(); + List activeApplicationReleaseDTOs = new ArrayList<>(); + for (ApplicationReleaseDTO applicationReleaseDTO : applicationReleaseDTOs) { + if (!applicationReleaseDTO.getCurrentState().equals(lifecycleStateManager.getEndState())) { + activeApplicationReleaseDTOs.add(applicationReleaseDTO); + } + } + if (!activeApplicationReleaseDTOs.isEmpty()) { + String msg = "There are application releases which are not in the state " + lifecycleStateManager + .getEndState() + ". Hence you are not allowed to delete the application"; + log.error(msg); + throw new ForbiddenException(msg); + } + this.applicationDAO.retireApplication(applicationId); + ConnectionManagerUtil.commitDBTransaction(); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred when getting application data for application id: " + applicationId; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); + } + } + private List searchLifecycleStateFlow(String start, String finish) throws ApplicationManagementException { Map nextNodeMap = new HashMap<>(); List directions = new LinkedList<>(); @@ -1201,7 +1262,7 @@ public class ApplicationManagerImpl implements ApplicationManager { if (currentNode.equals(finish)) { break; } else { - Set nextStates = lifecycleStateManager.getNextLifecycleStates(currentNode); + List nextStates = lifecycleStateManager.getNextLifecycleStates(currentNode); if (nextStates.contains(finish)) { queue = new LinkedList<>(); queue.add(finish); @@ -1234,7 +1295,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } @Override - public void deleteApplicationRelease(int applicationId, String releaseUuid) + public void deleteApplicationRelease(String releaseUuid) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); @@ -1248,9 +1309,9 @@ public class ApplicationManagerImpl implements ApplicationManager { throw new NotFoundException(msg); } - if (!applicationReleaseDTO.getCurrentState().equals(lifecycleStateManager.getInitialState())) { - String msg = "Application state is not in the initial state: " + lifecycleStateManager.getInitialState() - + ". Therefore you are not permitted to delete the application release."; + if (!lifecycleStateManager.isDeletableState(applicationReleaseDTO.getCurrentState())) { + String msg = "Application state is not in the deletable state. Therefore you are not permitted to " + + "delete the application release."; log.error(msg); throw new ForbiddenException(msg); } @@ -1264,61 +1325,22 @@ public class ApplicationManagerImpl implements ApplicationManager { throw new ForbiddenException(msg); } } - //todo delete application release data ON delete cascade applicationStorageManager.deleteApplicationReleaseArtifacts(applicationReleaseDTO.getAppHashValue()); - - // LifecycleStateDTO appLifecycleState = this.lifecycleStateDAO -// .getLatestLifeCycleState(applicationId, releaseUuid); -// if (appLifecycleState == null) { -// throw new NotFoundException( -// "Couldn't find an lifecycle sate for application ID: " + applicationId + " and UUID: " -// + releaseUuid); -// } -// String currentState = appLifecycleState.getCurrentState(); -// if (AppLifecycleState.DEPRECATED.toString().equals(currentState) || AppLifecycleState.REJECTED.toString() -// .equals(currentState) || AppLifecycleState.UNPUBLISHED.toString().equals(currentState)) { -// LifecycleStateDTO newAppLifecycleState = getLifecycleStateInstance(AppLifecycleState.REMOVED.toString(), -// appLifecycleState.getCurrentState()); -// if (lifecycleStateManager.isValidStateChange(newAppLifecycleState.getPreviousState(), -// newAppLifecycleState.getCurrentState(), userName, tenantId)) { -// this.lifecycleStateDAO -// .addLifecycleState(newAppLifecycleState, applicationId, applicationRelease.getUuid(), -// tenantId); -// ConnectionManagerUtil.commitDBTransaction(); -// } else { -// List lifecycleFlow = searchLifecycleStateFlow(currentState, -// AppLifecycleState.REMOVED.toString()); -// for (String nextState : lifecycleFlow) { -// LifecycleStateDTO lifecycleState = getLifecycleStateInstance(nextState, currentState); -// if (lifecycleStateManager.isValidStateChange(currentState, nextState, userName, tenantId)) { -// this.lifecycleStateDAO -// .addLifecycleState(lifecycleState, applicationId, applicationRelease.getUuid(), -// tenantId); -// } else { -// ConnectionManagerUtil.rollbackDBTransaction(); -// throw new ApplicationManagementException( -// "Can't delete the application release, You have to move the " -// + "lifecycle state from " + currentState + " to " + nextState); -// } -// currentState = nextState; -// } -// } -// } else { -// throw new ApplicationManagementException( -// "Can't delete the application release, You have to move the " + "lifecycle state from " -// + currentState + " to acceptable " + "state"); -// } -// return applicationReleaseDTO.getAppHashValue(); + lifecycleStateDAO.deleteLifecycleStateByReleaseId(applicationReleaseDTO.getId()); + applicationReleaseDAO.deleteRelease(applicationReleaseDTO.getId()); } catch (ApplicationManagementDAOException e) { ConnectionManagerUtil.rollbackDBTransaction(); - String msg = "Error ocured when getting application data or application release data for application id of " - + applicationId + " application release UUID of the " + releaseUuid; - throw new ApplicationManagementDAOException(msg, e); + String msg = "Error occurred when application release data for application release UUID: " + releaseUuid; + throw new ApplicationManagementException(msg, e); } catch (ApplicationStorageManagementException e) { - ConnectionManagerUtil.rollbackDBTransaction(); - String msg = "Error occured when deleteing the application release artifact from the file system. Application release UUID: " + releaseUuid; + String msg = "Error occurred when deleting the application release artifact from the file system. " + + "Application release UUID: " + releaseUuid; log.error(msg); throw new ApplicationManagementException(msg, e); + } catch (LifeCycleManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred when dleting lifecycle data for application release UUID: " + releaseUuid; + throw new ApplicationManagementException(msg, e); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -1596,6 +1618,9 @@ public class ApplicationManagerImpl implements ApplicationManager { throw new ApplicationManagementException( "Failed to add lifecycle state. ApplicationDTO Id: " + applicationId + " ApplicationDTO release UUID: " + releaseUuid, e); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); } finally { ConnectionManagerUtil.closeDBConnection(); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/AppmDataHandlerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/AppmDataHandlerImpl.java index 9ea7d644f7..71570221af 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/AppmDataHandlerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/AppmDataHandlerImpl.java @@ -20,7 +20,7 @@ package org.wso2.carbon.device.application.mgt.core.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; -import org.wso2.carbon.device.application.mgt.common.State; +import org.wso2.carbon.device.application.mgt.common.config.LifecycleState; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException; @@ -60,7 +60,7 @@ public class AppmDataHandlerImpl implements AppmDataHandler { } @Override - public Map getLifecycleConfiguration() throws LifecycleManagementException { + public Map getLifecycleConfiguration() throws LifecycleManagementException { return lifecycleStateManager.getLifecycleConfig(); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java index cc228f9d1f..355fb24193 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java @@ -28,6 +28,7 @@ import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; import org.wso2.carbon.device.application.mgt.core.dao.SubscriptionDAO; import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; +import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; import org.wso2.carbon.device.application.mgt.core.util.HelperUtil; @@ -109,6 +110,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager { ConnectionManagerUtil.openDBConnection(); subscriptionDAO.subscribeUserToApplication(tenantId, subscriber, userList, application.getId(), applicationReleaseId); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -150,6 +154,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager { ConnectionManagerUtil.openDBConnection(); subscriptionDAO.subscribeRoleToApplication(tenantId, subscriber, roleList, application.getId(), applicationReleaseId); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -194,6 +201,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager { ConnectionManagerUtil.openDBConnection(); subscriptionDAO.subscribeGroupToApplication(tenantId, subscriber, groupList, application.getId(), applicationReleaseId); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -252,6 +262,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager { } subscriptionDAO.subscribeDeviceToApplication(tenantId, subscriber, deviceList, application.getId(), applicationReleaseId, String.valueOf(AppOperation.InstallState.UNINSTALLED)); + } catch (ApplicationManagementDAOException e) { + //todo + throw new ApplicationManagementException(""); } finally { ConnectionManagerUtil.closeDBConnection(); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/lifecycle/LifecycleStateManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/lifecycle/LifecycleStateManager.java index 078fce37e4..0a5d0cb1b6 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/lifecycle/LifecycleStateManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/lifecycle/LifecycleStateManager.java @@ -19,7 +19,6 @@ package org.wso2.carbon.device.application.mgt.core.lifecycle; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.application.mgt.common.State; import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException; import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; import org.wso2.carbon.device.application.mgt.common.config.LifecycleState; @@ -33,38 +32,36 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; /** * This class represents the activities related to lifecycle management */ public class LifecycleStateManager { - private Map lifecycleStates; + private Map lifecycleStates; private static Log log = LogFactory.getLog(LifecycleStateManager.class); public void init(List states) throws LifecycleManagementException { lifecycleStates = new HashMap<>(); - for (LifecycleState s : states) { - if (s.getProceedingStates() != null) { - s.getProceedingStates().replaceAll(String::toUpperCase); + for (LifecycleState lifecycleState : states) { + if (lifecycleState.getProceedingStates() != null) { + lifecycleState.getProceedingStates().replaceAll(String::toUpperCase); } - lifecycleStates.put(s.getName().toUpperCase(), new State(s.getName().toUpperCase(), - s.getProceedingStates(), s.getPermission(), s.isAppUpdatable(), s.isAppInstallable(), - s.isInitialState(), s.isEndState())); + lifecycleStates.put(lifecycleState.getName(), lifecycleState); try { - PermissionUtils.putPermission(s.getPermission()); + PermissionUtils.putPermission(lifecycleState.getPermission()); } catch (PermissionManagementException e) { - String msg = "Error when adding permission " + s.getPermission() + " related to the state: " - + s.getName(); + String msg = + "Error when adding permission " + lifecycleState.getPermission() + " related to the state: " + + lifecycleState.getName(); log.error(msg, e); throw new LifecycleManagementException(msg, e); } } } - public Map getLifecycleConfig() throws LifecycleManagementException { - if (lifecycleStates == null){ + public Map getLifecycleConfig() throws LifecycleManagementException { + if (lifecycleStates == null) { String msg = "Lifecycle configuration in not initialized."; log.error(msg); throw new LifecycleManagementException(msg); @@ -72,29 +69,27 @@ public class LifecycleStateManager { return lifecycleStates; } - - public Set getNextLifecycleStates(String currentLifecycleState) { + public List getNextLifecycleStates(String currentLifecycleState) { return lifecycleStates.get(currentLifecycleState.toUpperCase()).getProceedingStates(); } - public boolean isValidStateChange(String currentState, String nextState, String username, int tenantId) throws - LifecycleManagementException { - + public boolean isValidStateChange(String currentState, String nextState, String username, int tenantId) + throws LifecycleManagementException { UserRealm userRealm; String permission = getPermissionForStateChange(nextState); if (permission != null) { try { userRealm = DataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId); - if (userRealm != null && userRealm.getAuthorizationManager() != null && - userRealm.getAuthorizationManager().isUserAuthorized(username, - PermissionUtils.getAbsolutePermissionPath(permission), + if (userRealm != null && userRealm.getAuthorizationManager() != null && userRealm + .getAuthorizationManager() + .isUserAuthorized(username, PermissionUtils.getAbsolutePermissionPath(permission), Constants.UI_EXECUTE)) { if (currentState.equalsIgnoreCase(nextState)) { return true; } - State state = getMatchingState(currentState); - if (state != null) { - return getMatchingNextState(state.getProceedingStates(), nextState); + LifecycleState matchingState = getMatchingState(currentState); + if (matchingState != null) { + return getMatchingNextState(matchingState.getProceedingStates(), nextState); } return false; } @@ -105,24 +100,22 @@ public class LifecycleStateManager { + nextState + " with username : " + username + " and tenant Id : " + tenantId, e); } } else { - throw new LifecycleManagementException( - "Required permissions cannot be found for the state : " + nextState); + throw new LifecycleManagementException("Required permissions cannot be found for the state : " + nextState); } } - private State getMatchingState(String currentState) { - for (Map.Entry stringStateEntry : lifecycleStates.entrySet()) { - if (stringStateEntry.getKey().equalsIgnoreCase(currentState)) { - return lifecycleStates.get(stringStateEntry.getKey()); + private LifecycleState getMatchingState(String currentState) { + for (Map.Entry lifecycyleState : lifecycleStates.entrySet()) { + if (lifecycyleState.getKey().equalsIgnoreCase(currentState)) { + return lifecycyleState.getValue(); } } return null; } - - private boolean getMatchingNextState(Set proceedingStates, String nextState) { - for (String state : proceedingStates) { - if (state.equalsIgnoreCase(nextState)) { + private boolean getMatchingNextState(List proceedingStates, String nextState) { + for (String stateName : proceedingStates) { + if (stateName.equalsIgnoreCase(nextState)) { return true; } } @@ -131,7 +124,7 @@ public class LifecycleStateManager { private String getPermissionForStateChange(String nextState) { Iterator it = lifecycleStates.entrySet().iterator(); - State nextLifecycleState; + LifecycleState nextLifecycleState; while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); if (pair.getKey().toString().equalsIgnoreCase(nextState)) { @@ -143,8 +136,19 @@ public class LifecycleStateManager { return null; } + public boolean isDeletableState(String state) throws LifecycleManagementException { + LifecycleState currentState = getMatchingState(state); + if (currentState != null) { + return currentState.isDeletableState(); + } else { + String msg = "Couldn't find a lifecycle state that matches with " + state + " state."; + log.error(msg); + throw new LifecycleManagementException(msg); + } + } + public boolean isUpdatableState(String state) throws LifecycleManagementException { - State currentState = getMatchingState(state); + LifecycleState currentState = getMatchingState(state); if (currentState != null) { return currentState.isAppUpdatable(); } else { @@ -155,7 +159,7 @@ public class LifecycleStateManager { } public boolean isInstallableState(String state) throws LifecycleManagementException { - State currentState = getMatchingState(state); + LifecycleState currentState = getMatchingState(state); if (currentState != null) { return currentState.isAppInstallable(); } else { @@ -166,7 +170,7 @@ public class LifecycleStateManager { } public boolean isInitialState(String state) throws LifecycleManagementException { - State currentState = getMatchingState(state); + LifecycleState currentState = getMatchingState(state); if (currentState != null) { return currentState.isInitialState(); } else { @@ -177,7 +181,7 @@ public class LifecycleStateManager { } public boolean isEndState(String state) throws LifecycleManagementException { - State currentState = getMatchingState(state); + LifecycleState currentState = getMatchingState(state); if (currentState != null) { return currentState.isEndState(); } else { @@ -188,58 +192,55 @@ public class LifecycleStateManager { } public String getInitialState() throws LifecycleManagementException { - String initialState = null; - for (Map.Entry stringStateEntry : lifecycleStates.entrySet()) { - if (stringStateEntry.getValue().isInitialState()) { - initialState = stringStateEntry.getKey(); - break; + String initialState; + for (Map.Entry lifecycleState : lifecycleStates.entrySet()) { + if (lifecycleState.getValue().isInitialState()) { + initialState = lifecycleState.getKey(); + return initialState; } } - if (initialState == null){ - String msg = "Haven't defined the initial state in the application-manager.xml. Please add initial state " - + "to the section in the app-manager.xml"; - log.error(msg); - throw new LifecycleManagementException(msg); - } - return initialState; + String msg = "Haven't defined the initial state in the application-manager.xml. Please add initial state " + + "to the section in the app-manager.xml"; + log.error(msg); + throw new LifecycleManagementException(msg); } public String getEndState() throws LifecycleManagementException { String endState = null; - for (Map.Entry stringStateEntry : lifecycleStates.entrySet()) { + for (Map.Entry stringStateEntry : lifecycleStates.entrySet()) { if (stringStateEntry.getValue().isEndState()) { endState = stringStateEntry.getKey(); break; } } - if (endState == null){ + if (endState == null) { String msg = "Haven't defined the end state in the application-manager.xml. Please add end state " + "to the section in the app-manager.xml"; log.error(msg); - throw new LifecycleManagementException(msg); + throw new LifecycleManagementException(msg); } return endState; } public String getInstallableState() throws LifecycleManagementException { String installableState = null; - for (Map.Entry stringStateEntry : lifecycleStates.entrySet()) { + for (Map.Entry stringStateEntry : lifecycleStates.entrySet()) { if (stringStateEntry.getValue().isAppInstallable()) { installableState = stringStateEntry.getKey(); break; } } - if (installableState == null){ + if (installableState == null) { String msg = "Haven't defined the installable state in the application-manager.xml. Please add installable " + "state to the section in the app-manager.xml"; log.error(msg); - throw new LifecycleManagementException(msg); + throw new LifecycleManagementException(msg); } return installableState; } public boolean isStateExist(String currentState) { - for (Map.Entry stringStateEntry : lifecycleStates.entrySet()) { + for (Map.Entry stringStateEntry : lifecycleStates.entrySet()) { if (stringStateEntry.getKey().equalsIgnoreCase(currentState)) { return true; } @@ -247,8 +248,7 @@ public class LifecycleStateManager { return false; } - - public void setLifecycleStates(Map lifecycleStates) { + public void setLifecycleStates(Map lifecycleStates) { this.lifecycleStates = lifecycleStates; } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/LifeCycleStateManagerTest.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/LifeCycleStateManagerTest.java index 95069938af..1c0132f251 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/LifeCycleStateManagerTest.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/LifeCycleStateManagerTest.java @@ -1,25 +1,22 @@ package org.wso2.carbon.device.application.mgt.core; import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager; -import org.wso2.carbon.device.application.mgt.common.State; import org.wso2.carbon.device.application.mgt.common.config.LifecycleState; import java.util.HashMap; import java.util.List; -public class LifeCycleStateManagerTest extends LifecycleStateManager { +class LifeCycleStateManagerTest extends LifecycleStateManager { - public void initializeLifeCycleDetails(List states) { - HashMap lifecycleStates = new HashMap<>(); - for (LifecycleState s : states) { - if (s.getProceedingStates() != null) { - s.getProceedingStates().replaceAll(String::toUpperCase); + void initializeLifeCycleDetails(List lifecycleStates) { + HashMap lifecycleStatesMap = new HashMap<>(); + for (LifecycleState lifecycleState : lifecycleStates) { + if (lifecycleState.getProceedingStates() != null) { + lifecycleState.getProceedingStates().replaceAll(String::toUpperCase); } - lifecycleStates.put(s.getName().toUpperCase(), new State(s.getName().toUpperCase(), - s.getProceedingStates(), s.getPermission(), s.isAppUpdatable(), s.isAppInstallable(), - s.isInitialState(), s.isEndState())); + lifecycleStatesMap.put(lifecycleState.getName().toUpperCase(), lifecycleState); } - setLifecycleStates(lifecycleStates); + setLifecycleStates(lifecycleStatesMap); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/LifecycleManagementTest.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/LifecycleManagementTest.java index 496b231818..a938d9537e 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/LifecycleManagementTest.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/LifecycleManagementTest.java @@ -10,7 +10,6 @@ import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManag import org.wso2.carbon.device.application.mgt.common.config.LifecycleState; import java.util.List; -import java.util.Set; public class LifecycleManagementTest { @@ -19,17 +18,16 @@ public class LifecycleManagementTest { private final String CURRENT_STATE = "Approved"; private final String NEXT_STATE = "Published"; - private final String BOGUS_STATE = "Removed"; + private final String BOGUS_STATE = "Retired"; private final String UPDATABLE_STATE = "Created"; - private final String NON_UPDATABLE_STATE = "Removed"; + private final String NON_UPDATABLE_STATE = "Retired"; private final String INSTALLABLE_STATE = "Published"; - private final String UNINSTALlABLE_STATE = "Removed"; private final String INITIAL_STATE = "Created"; - private final String END_STATE = "Removed"; + private final String END_STATE = "Retired"; @BeforeClass - public void init() throws LifecycleManagementException { + public void init() { ConfigurationManager configurationManager = ConfigurationManager.getInstance(); Configuration configuration = configurationManager.getConfiguration(); lifecycleStates = configuration.getLifecycleStates(); @@ -39,14 +37,14 @@ public class LifecycleManagementTest { @Test public void checkValidNextLifecycleState() { - Set proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE); + List proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE); Assert.assertTrue("Invalid proceeding state of: " + CURRENT_STATE, proceedingStates.contains(NEXT_STATE.toUpperCase())); } @Test public void checkInvalidNextLifecycleState() { - Set proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE); + List proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE); Assert.assertFalse("Invalid proceeding state of: " + CURRENT_STATE, proceedingStates.contains(BOGUS_STATE.toUpperCase())); } @@ -70,12 +68,6 @@ public class LifecycleManagementTest { Assert.assertTrue("Installable state: " + INSTALLABLE_STATE, isInstallable); } - @Test - public void CheckUnInstallableState() throws LifecycleManagementException { - boolean isInstallable = lifecycleStateManager.isInstallableState(UNINSTALlABLE_STATE); - Assert.assertFalse("UnInstallable state: " + UNINSTALlABLE_STATE, isInstallable); - } - @Test public void CheckGetInitialState() throws LifecycleManagementException { boolean isInitialState = lifecycleStateManager.getInitialState().equalsIgnoreCase(INITIAL_STATE); @@ -126,7 +118,7 @@ public class LifecycleManagementTest { @Test public void check() { - Set proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE); + List proceedingStates = lifecycleStateManager.getNextLifecycleStates(CURRENT_STATE); Assert.assertFalse("Invalid proceeding state of: " + CURRENT_STATE, proceedingStates.contains(BOGUS_STATE.toUpperCase())); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/application-mgt.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/application-mgt.xml index be9209ee92..5af3ccc567 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/application-mgt.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/application-mgt.xml @@ -76,58 +76,59 @@ true true - /device-mgt/applications/life-cycle/create + true + /app-mgt/life-cycle/application/create In-Review - /device-mgt/applications/life-cycle/in-review + /app-mgt/life-cycle/application/review Rejected Approved + Created - /device-mgt/applications/life-cycle/approve + /app-mgt/life-cycle/application/approve + In-Review Published - Created - /device-mgt/applications/life-cycle/reject + true + /app-mgt/life-cycle/application/reject - Created - Removed + In-Review true - /device-mgt/applications/life-cycle/publish + /app-mgt/life-cycle/application/publish - Unpublished + Blocked Deprecated - - /device-mgt/applications/life-cycle/unpublish + + /app-mgt/life-cycle/application/block Published - In-Review - Removed + Deprecated - /device-mgt/applications/life-cycle/deprecate + /app-mgt/life-cycle/application/deprecate - Removed - In-Review + Published + Retired - + true - /device-mgt/applications/life-cycle/remove + /app-mgt/life-cycle/application/retire diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java index 47f2f64c1a..3d3d0fa08d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java @@ -45,7 +45,6 @@ import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; import java.util.List; import javax.validation.Valid; 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; @@ -416,15 +415,15 @@ public interface ApplicationManagementPublisherAPI { @Multipart(value = "screenshot3") Attachment screenshot3 ); - @DELETE + @PUT @Consumes("application/json") - @Path("/{appId}") + @Path("/retire/{appId}") @ApiOperation( consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON, - httpMethod = "DELETE", - value = "Delete the application with the given UUID", - notes = "This will delete the application with the given UUID", + httpMethod = "PUT", + value = "Retire the application with the given UUID", + notes = "This will retire the application with the given UUID", tags = "ApplicationDTO Management", extensions = { @Extension(properties = { @@ -449,8 +448,7 @@ public interface ApplicationManagementPublisherAPI { code = 404, message = "Application not found"), }) - //todo add new scope and permission - Response deleteApplication( + Response retireApplication( @ApiParam( name = "UUID", value = "Unique identifier of the ApplicationDTO", @@ -592,7 +590,7 @@ public interface ApplicationManagementPublisherAPI { httpMethod = "PUT", value = "Update an application release", notes = "This will update a new application release", - tags = "ApplicationDTO Management", + tags = "Application Management", extensions = { @Extension(properties = { @ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update") @@ -750,4 +748,39 @@ public interface ApplicationManagementPublisherAPI { required = true) @QueryParam("action") String action ); + + @GET + @Path("/lifecycle-config") + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "GET", + value = "get application management UI configuration", + notes = "This will get all UI configuration of application management", + tags = "Application Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully got Lifecycle Config.", + response = ApplicationList.class), + @ApiResponse( + code = 404, + message = "Not Found. There doesn't have an defined in app management " + + "configuration file." + + "query."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Error occurred while getting the lifecycle config.", + response = ErrorResponse.class) + }) + Response getLifecycleConfig(); + } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ApplicationManagementPublisherAdminAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ApplicationManagementPublisherAdminAPI.java index 2f2979d39e..16ad79e848 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ApplicationManagementPublisherAdminAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ApplicationManagementPublisherAdminAPI.java @@ -77,7 +77,7 @@ public interface ApplicationManagementPublisherAdminAPI { String SCOPE = "scope"; @DELETE - @Path("/release/{appId}/{uuid}") + @Path("/release/{uuid}") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @ApiOperation( @@ -108,11 +108,6 @@ public interface ApplicationManagementPublisherAdminAPI { message = "Internal Server Error. \n Error occurred while deleting application release.", response = ErrorResponse.class) }) Response deleteApplicationRelease( - @ApiParam( - name = "appId", - value = "application Id", - required = true) - @PathParam("appId") int applicationId, @ApiParam( name = "uuid", value = "application release UUID", diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java index a38e0880ba..15f7568e84 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java @@ -24,10 +24,11 @@ import org.apache.cxf.jaxrs.ext.multipart.Attachment; import org.apache.cxf.jaxrs.ext.multipart.Multipart; import org.wso2.carbon.device.application.mgt.common.*; import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO; -import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException; import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.response.Application; import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease; +import org.wso2.carbon.device.application.mgt.common.services.AppmDataHandler; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationUpdateWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; @@ -37,7 +38,6 @@ import org.wso2.carbon.device.application.mgt.core.util.APIUtil; import org.wso2.carbon.device.application.mgt.publisher.api.services.ApplicationManagementPublisherAPI; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import java.io.IOException; @@ -49,7 +49,6 @@ import java.util.Map; import javax.activation.DataHandler; import javax.validation.Valid; 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; @@ -433,12 +432,13 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem } - @DELETE - @Path("/{appId}") - public Response deleteApplication(@PathParam("appId") int applicationId) { + @PUT + @Path("/retire/{appId}") + public Response retireApplication( + @PathParam("appId") int applicationId) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); try { - applicationManager.deleteApplication(applicationId); + applicationManager.retireApplication(applicationId); return Response.status(Response.Status.OK) .entity("Successfully deleted the application for application ID: " + applicationId).build(); } catch (NotFoundException e) { @@ -513,6 +513,21 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem return Response.status(Response.Status.CREATED).entity("Lifecycle state added successfully.").build(); } + @GET + @Override + @Consumes("application/json") + @Path("/lifecycle-config") + public Response getLifecycleConfig() { + AppmDataHandler dataHandler = APIUtil.getDataHandler(); + try { + return Response.status(Response.Status.OK).entity(dataHandler.getLifecycleConfiguration()).build(); + } catch (LifecycleManagementException e) { + String msg = "Error Occurred while accessing lifecycle manager."; + log.error(msg); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } + } + /*** * * @param binaryFile binary file of the application release diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java index 56270db7e9..2416f6a61f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java @@ -74,28 +74,27 @@ public class ApplicationManagementPublisherAdminAPIImpl implements ApplicationMa private static Log log = LogFactory.getLog(ApplicationManagementPublisherAdminAPIImpl.class); @DELETE - @Path("/release/{appId}/{uuid}") + @Path("/release/{uuid}") public Response deleteApplicationRelease( - @PathParam("appId") int applicationId, @PathParam("uuid") String releaseUuid) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); try { - applicationManager.deleteApplicationRelease(applicationId, releaseUuid); + applicationManager.deleteApplicationRelease(releaseUuid); String responseMsg = "Successfully deleted the application release for uuid: " + releaseUuid + ""; return Response.status(Response.Status.OK).entity(responseMsg).build(); - } catch (NotFoundException e) { - String msg = "Couldn't found application release which is having application id: " + applicationId - + " and application release UUID:" + releaseUuid; + } catch (NotFoundException e) { + String msg = + "Couldn't found application release which is having application release UUID:" + releaseUuid; log.error(msg, e); return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); } catch (ForbiddenException e) { - String msg = - "You don't have require permission to delete the application release which has UUID " + releaseUuid - + " and application ID " + applicationId; + String msg = "You don't have require permission to delete the application release which has UUID " + + releaseUuid; log.error(msg, e); return Response.status(Response.Status.FORBIDDEN).entity(msg).build(); - }catch (ApplicationManagementException e) { - String msg = "Error occurred while deleting the application: " + applicationId; + } catch (ApplicationManagementException e) { + String msg = "Error occurred while deleting the application release for application release UUID:: " + + releaseUuid; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } diff --git a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml index b20305e30b..2d6dc36c31 100644 --- a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml +++ b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml @@ -76,58 +76,59 @@ true true - /device-mgt/applications/life-cycle/create + true + /app-mgt/life-cycle/application/create In-Review - /device-mgt/applications/life-cycle/in-review + /app-mgt/life-cycle/application/review Rejected Approved + Created - /device-mgt/applications/life-cycle/approve + /app-mgt/life-cycle/application/approve + In-Review Published - Created - /device-mgt/applications/life-cycle/reject + true + /app-mgt/life-cycle/application/reject - Created - Removed + In-Review true - /device-mgt/applications/life-cycle/publish + /app-mgt/life-cycle/application/publish - Unpublished + Blocked Deprecated - - /device-mgt/applications/life-cycle/unpublish + + /app-mgt/life-cycle/application/block Published - In-Review - Removed + Deprecated - /device-mgt/applications/life-cycle/deprecate + /app-mgt/life-cycle/application/deprecate - Removed - In-Review + Published + Retired - + true - /device-mgt/applications/life-cycle/remove + /app-mgt/life-cycle/application/retire diff --git a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/oracle.sql b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/oracle.sql index b1b0e88842..39f8aba3d9 100644 --- a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/oracle.sql +++ b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/oracle.sql @@ -157,7 +157,7 @@ VALUES ('PUBLISHED', 'PUBLISHED', 'State in which Application is in published st / INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) -VALUES ('UNPUBLISHED', 'UNPUBLISHED', 'State in which Application is in un published state.') +VALUES ('BLOCKED', 'BLOCKED', 'State in which Application is in un published state.') / INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) diff --git a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/postgresql.sql b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/postgresql.sql index 5937f68d08..cfe8495940 100644 --- a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/postgresql.sql +++ b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/postgresql.sql @@ -87,7 +87,7 @@ VALUES ('REJECTED', 'REJECTED', 'State in which Application is rejected after re INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) VALUES ('PUBLISHED', 'PUBLISHED', 'State in which Application is in published state.'); INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) -VALUES ('UNPUBLISHED', 'UNPUBLISHED', 'State in which Application is in un published state.'); +VALUES ('BLOCKED', 'BLOCKED', 'State in which Application is in un published state.'); INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) VALUES ('RETIRED', 'RETIRED', 'Retiring an application to indicate end of life state,'); From e293a236c5eea38e733ff18220072bc1ac10fba3 Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Mon, 6 May 2019 15:01:22 +0530 Subject: [PATCH 2/6] Add application delete admin API --- .../mgt/core/dao/ApplicationDAO.java | 9 +- .../mgt/core/dao/ApplicationReleaseDAO.java | 3 + .../mgt/core/dao/LifecycleStateDAO.java | 3 + .../GenericApplicationDAOImpl.java | 85 +++++++++++++++++- .../GenericApplicationReleaseDAOImpl.java | 25 ++++++ .../GenericLifecycleStateDAOImpl.java | 25 ++++++ .../mgt/core/impl/ApplicationManagerImpl.java | 90 +++++++++---------- ...pplicationManagementPublisherAdminAPI.java | 38 ++++++++ ...cationManagementPublisherAdminAPIImpl.java | 25 ++++++ 9 files changed, 256 insertions(+), 47 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java index 76a12d9226..25e6b575ad 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java @@ -59,14 +59,18 @@ public interface ApplicationDAO { void deleteTagMapping (List tagIds, int applicationId, int tenantId) throws ApplicationManagementDAOException; + void deleteTagMapping (int applicationId, int tenantId) throws ApplicationManagementDAOException; + List getAppCategories (int appId, int tenantId) throws ApplicationManagementDAOException; List getAllCategories(int tenantId) throws ApplicationManagementDAOException; void addCategories(List categories, int tenantId) throws ApplicationManagementDAOException; - void addCategoryMapping (List categoryIds, int applicationId, int tenantId) throws ApplicationManagementDAOException; + void addCategoryMapping(List categoryIds, int applicationId, int tenantId) + throws ApplicationManagementDAOException; + void deleteCategoryMapping (int applicationId, int tenantId) throws ApplicationManagementDAOException; /** * To check application existence. @@ -209,5 +213,8 @@ public interface ApplicationDAO { ApplicationDTO getApplicationByRelease(String appReleaseUUID, int tenantId) throws ApplicationManagementDAOException; String getApplicationSubTypeByUUID(String uuid, int tenantId) throws ApplicationManagementDAOException; + + void deleteApplication(int appId, int tenantId) throws ApplicationManagementDAOException; + } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java index 1793b764b1..93ec3d4908 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java @@ -115,6 +115,9 @@ public interface ApplicationReleaseDAO { */ void deleteRelease(int id) throws ApplicationManagementDAOException; + void deleteReleases(List applicationReleaseIds) throws ApplicationManagementDAOException; + + /** * To get release details of a specific application. * diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java index df8d819b0e..fe1b3eccc4 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java @@ -76,6 +76,9 @@ public interface LifecycleStateDAO { */ void deleteLifecycleStateByReleaseId(int releaseId) throws LifeCycleManagementDAOException; + void deleteLifecycleStates(List appReleaseIds) throws LifeCycleManagementDAOException; + + /*** * * @param appId ID of the application diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java index 81bb1eaa28..2cb7aa2711 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java @@ -808,6 +808,34 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } } + @Override + public void deleteCategoryMapping (int applicationId, int tenantId) throws ApplicationManagementDAOException{ + if (log.isDebugEnabled()) { + log.debug("Request received in DAO Layer to delete Category mappings."); + } + Connection conn; + String sql = "DELETE FROM " + + "AP_APP_CATEGORY_MAPPING cm " + + "WHERE " + + "cm.AP_APP_ID = ? AND " + + "cm.TENANT_ID = ?"; + try { + conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql)){ + stmt.setInt(1, applicationId); + stmt.setInt(2, tenantId); + stmt.executeUpdate(); + } + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException( + "Error occurred while obtaining the DB connection when deleting category mapping of application ID: " + + applicationId , e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred when deleting category mapping of application ID: " + + applicationId, e); + } + } + @Override public List getTagIdsForTagNames(List tagNames, int tenantId) throws ApplicationManagementDAOException { @@ -931,12 +959,40 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } } catch (DBConnectionException e) { throw new ApplicationManagementDAOException( - "Error occurred while obtaining the DB connection when deleting tag mapppig", e); + "Error occurred while obtaining the DB connection when deleting tag mapping", e); } catch (SQLException e) { throw new ApplicationManagementDAOException("Error occurred when deleting tag mapping", e); } } + @Override + public void deleteTagMapping (int applicationId, int tenantId) throws ApplicationManagementDAOException{ + if (log.isDebugEnabled()) { + log.debug("Request received in DAO Layer to delete Tag mappings."); + } + Connection conn; + String sql = "DELETE FROM " + + "AP_APP_TAG_MAPPING tm " + + "WHERE " + + "tm.AP_APP_ID = ? AND " + + "tm.TENANT_ID = ?"; + try { + conn = this.getDBConnection(); + try (PreparedStatement stmt = conn.prepareStatement(sql)){ + stmt.setInt(1, applicationId); + stmt.setInt(2, tenantId); + stmt.executeUpdate(); + } + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException( + "Error occurred while obtaining the DB connection when deleting tag mapping of application ID: " + + applicationId , e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred when deleting tag mapping of application ID: " + + applicationId, e); + } + } + @Override public List getAppCategories(int appId, int tenantId) throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { @@ -1132,4 +1188,31 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } } + @Override + public void deleteApplication(int appId, int tenantId) throws ApplicationManagementDAOException { + Connection conn; + String sql; + try { + conn = this.getDBConnection(); + sql = "DELETE AP_APP ap " + + "WHERE ap.ID = ? AND " + + "ap.TENANT_ID = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)){ + stmt.setInt(1, appId); + stmt.setInt(2, tenantId); + stmt.executeUpdate(); + + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the DB connection to delete application for application id::." + + appId; + log.error(msg); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while deleting application for application ID: " + appId; + log.error(msg); + throw new ApplicationManagementDAOException(msg, e); + } + } + } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java index bd8441a068..2c9a74370f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java @@ -514,6 +514,31 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } } + @Override + public void deleteReleases(List applicationReleaseIds) throws ApplicationManagementDAOException{ + Connection connection; + String sql = "DELETE " + + "FROM AP_APP_RELEASE " + + "WHERE ID = ?"; + try { + connection = this.getDBConnection(); + try (PreparedStatement statement = connection.prepareStatement(sql)){ + for (Integer releaseId : applicationReleaseIds){ + statement.setInt(1, releaseId); + statement.addBatch(); + } + statement.executeBatch(); + } + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException( + "Database connection exception occurred while trying to delete given application release", e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException( + "SQL exception occurred while execute delete query for deleting given application releases.", e); + } + } + + @Override public boolean verifyReleaseExistenceByHash(String hashVal, int tenantId) throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java index 0db4362fd4..184fdf13ef 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java @@ -212,6 +212,31 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif } } + @Override + public void deleteLifecycleStates(List appReleaseIds) throws LifeCycleManagementDAOException{ + Connection conn; + try { + conn = this.getDBConnection(); + String sql = "DELETE FROM " + + "AP_APP_LIFECYCLE_STATE " + + "WHERE AP_APP_RELEASE_ID = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + for (Integer releaseId : appReleaseIds) { + stmt.setInt(1, releaseId); + stmt.addBatch(); + } + stmt.executeBatch(); + } + } catch (DBConnectionException e) { + throw new LifeCycleManagementDAOException("Error occurred while obtaining the DB connection for deleting " + + "application life-cycle states for given application Ids.", e); + } catch (SQLException e) { + throw new LifeCycleManagementDAOException("Error occurred while deleting life-cycle states for given " + + "application releases.", e); + } + } + + private LifecycleStateDTO constructLifecycle(ResultSet rs) throws LifeCycleManagementDAOException { LifecycleStateDTO lifecycleState = null; try { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java index f10c9b566a..c4f225c691 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java @@ -737,8 +737,9 @@ public class ApplicationManagerImpl implements ApplicationManager { if (log.isDebugEnabled()) { log.debug("ApplicationDTO release request is received for the application id: " + applicationId); } + + ApplicationDTO applicationDTO = getApplication(applicationId); try { - ApplicationDTO applicationDTO = getApplication(applicationId); ApplicationReleaseDTO applicationReleaseDTO = uploadReleaseArtifacts(applicationReleaseWrapper, applicationDTO, applicationArtifact); ConnectionManagerUtil.beginDBTransaction(); @@ -819,11 +820,10 @@ public class ApplicationManagerImpl implements ApplicationManager { public Application getApplicationById(int appId, String state) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - ApplicationDTO applicationDTO; boolean isVisibleApp = false; - try { - applicationDTO = getApplication(appId); + ApplicationDTO applicationDTO = getApplication(appId); + try { ConnectionManagerUtil.openDBConnection(); List filteredApplicationReleaseDTOs = new ArrayList<>(); for (ApplicationReleaseDTO applicationReleaseDTO : applicationDTO.getApplicationReleaseDTOs()) { @@ -1162,39 +1162,49 @@ public class ApplicationManagerImpl implements ApplicationManager { @Override public void deleteApplication(int applicationId) throws ApplicationManagementException { - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); - List storedLocations = new ArrayList<>(); - ApplicationDTO applicationDTO; if (log.isDebugEnabled()) { log.debug("Request is received to delete applications which are related with the application id " + applicationId); } + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + ApplicationDTO applicationDTO = getApplication(applicationId); + List applicationReleaseDTOs = applicationDTO.getApplicationReleaseDTOs(); + for (ApplicationReleaseDTO applicationReleaseDTO : applicationReleaseDTOs) { + if (!lifecycleStateManager.isDeletableState(applicationReleaseDTO.getCurrentState())){ + String msg = "Application release which has application release UUID: " + + applicationReleaseDTO.getUuid() + " is not in a deletable state. Therefore Application " + + "deletion is not permitted. In order to delete the application, all application releases " + + "of the application has to be in a deletable state."; + log.error(msg); + throw new ForbiddenException(msg); + } + } + try { ConnectionManagerUtil.beginDBTransaction(); - applicationDTO = this.applicationDAO.getApplicationById(applicationId, tenantId); - - if (applicationDTO == null) { - throw new NotFoundException("Couldn't found an application for Application ID: " + applicationId); - } - List applicationReleaseDTOs = applicationDTO.getApplicationReleaseDTOs(); - List activeApplicationReleaseDTOs = new ArrayList<>(); + List deletingAppReleaseIds = new ArrayList<>(); for (ApplicationReleaseDTO applicationReleaseDTO : applicationReleaseDTOs) { - if (!applicationReleaseDTO.getCurrentState().equals(lifecycleStateManager.getEndState())){ - activeApplicationReleaseDTOs.add(applicationReleaseDTO); + List deviceSubscriptionDTOS = subscriptionDAO + .getDeviceSubscriptions(applicationReleaseDTO.getId(), tenantId); + if (!deviceSubscriptionDTOS.isEmpty()){ + String msg = "Application release which has UUID: " + applicationReleaseDTO.getUuid() + + " either subscribed to device/s or it had subscribed to device/s. Therefore you are not " + + "permitted to delete the application release."; + log.error(msg); + throw new ForbiddenException(msg); } - storedLocations.add(applicationReleaseDTO.getAppHashValue()); - } - if (!activeApplicationReleaseDTOs.isEmpty()) { - String msg = "There are application releases which are not in the state " + lifecycleStateManager - .getEndState() + ". Hence you are not allowed to delete the application"; - log.error(msg); - throw new ForbiddenException(msg); - } - this.applicationDAO.retireApplication(applicationId); + applicationStorageManager.deleteApplicationReleaseArtifacts(applicationReleaseDTO.getAppHashValue()); + deletingAppReleaseIds.add(applicationReleaseDTO.getId()); + } + this.lifecycleStateDAO.deleteLifecycleStates(deletingAppReleaseIds); + this.applicationReleaseDAO.deleteReleases(deletingAppReleaseIds); + this.applicationDAO.deleteTagMapping(applicationId, tenantId); + this.applicationDAO.deleteCategoryMapping(applicationId, tenantId); + this.applicationDAO.deleteApplication(applicationId, tenantId); ConnectionManagerUtil.commitDBTransaction(); - applicationStorageManager.deleteAllApplicationReleaseArtifacts(storedLocations); } catch (ApplicationManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); String msg = "Error occurred when getting application data for application id: " + applicationId; log.error(msg); throw new ApplicationManagementException(msg, e); @@ -1203,6 +1213,12 @@ public class ApplicationManagerImpl implements ApplicationManager { + applicationId; log.error(msg); throw new ApplicationManagementException(msg); + } catch (LifeCycleManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occured while deleting life-cycle state data of application releases of the application" + + " which has application ID: " + applicationId; + log.error(msg); + throw new ApplicationManagementException(msg); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -1210,19 +1226,13 @@ public class ApplicationManagerImpl implements ApplicationManager { @Override public void retireApplication(int applicationId) throws ApplicationManagementException { - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - ApplicationDTO applicationDTO; if (log.isDebugEnabled()) { log.debug("Request is received to delete applications which are related with the application id " + applicationId); } + ApplicationDTO applicationDTO = getApplication(applicationId); try { ConnectionManagerUtil.beginDBTransaction(); - applicationDTO = this.applicationDAO.getApplicationById(applicationId, tenantId); - - if (applicationDTO == null) { - throw new NotFoundException("Couldn't found an application for Application ID: " + applicationId); - } List applicationReleaseDTOs = applicationDTO.getApplicationReleaseDTOs(); List activeApplicationReleaseDTOs = new ArrayList<>(); for (ApplicationReleaseDTO applicationReleaseDTO : applicationReleaseDTOs) { @@ -1655,19 +1665,9 @@ public class ApplicationManagerImpl implements ApplicationManager { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - ApplicationDTO applicationDTO; - + ApplicationDTO applicationDTO = getApplication(applicationId); try { ConnectionManagerUtil.beginDBTransaction(); - applicationDTO = this.applicationDAO.getApplicationById(applicationId, tenantId); - if (applicationDTO == null) { - ConnectionManagerUtil.rollbackDBTransaction(); - String msg = "Tried to update Application which is not in the publisher. Please verify " - + "application details"; - log.error(msg); - throw new NotFoundException(msg); - } - if (!StringUtils.isEmpty(applicationUpdateWrapper.getName())){ Filter filter = new Filter(); filter.setFullMatch(true); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ApplicationManagementPublisherAdminAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ApplicationManagementPublisherAdminAPI.java index 16ad79e848..69ea2d9cbc 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ApplicationManagementPublisherAdminAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ApplicationManagementPublisherAdminAPI.java @@ -113,4 +113,42 @@ public interface ApplicationManagementPublisherAdminAPI { value = "application release UUID", required = true) @PathParam("uuid") String releaseUuid); + + @DELETE + @Path("/{appId}") + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "DELETE", + value = "Delete application release.", + notes = "This will delete application release for given UUID", + tags = "Application Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "perm:admin:app:publisher:update") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully delete application release.", + response = ApplicationList.class), + @ApiResponse( + code = 404, + message = "Not Found. There doesn't have an application release for UUID" + + "query."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Error occurred while deleting application release.", + response = ErrorResponse.class) + }) Response deleteApplication( + @ApiParam( + name = "appId", + value = "application ID", + required = true) + @PathParam("appId") int applicatioId); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java index 2416f6a61f..61ace448eb 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java @@ -100,4 +100,29 @@ public class ApplicationManagementPublisherAdminAPIImpl implements ApplicationMa } } + @DELETE + @Path("/{appId}") + public Response deleteApplication( + @PathParam("appId") int applicatioId) { + ApplicationManager applicationManager = APIUtil.getApplicationManager(); + try { + applicationManager.deleteApplication(applicatioId); + String responseMsg = "Successfully deleted the application which has ID: " + applicatioId + ""; + return Response.status(Response.Status.OK).entity(responseMsg).build(); + } catch (NotFoundException e) { + String msg = + "Couldn't found application release which is having the ID:" + applicatioId; + log.error(msg, e); + return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); + } catch (ForbiddenException e) { + String msg = "You don't have require permission to delete the application which has ID: " + applicatioId; + log.error(msg, e); + return Response.status(Response.Status.FORBIDDEN).entity(msg).build(); + } catch (ApplicationManagementException e) { + String msg = "Error occurred while deleting the application which has application ID:: " + applicatioId; + log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } + } + } From a3d75df8a0a11914bbd82731a0d6303ddf032f3a Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Mon, 6 May 2019 18:01:52 +0530 Subject: [PATCH 3/6] Add lifecycle adding API --- ...cycleStateDTO.java => LifecycleState.java} | 19 +--- .../common/services/ApplicationManager.java | 17 ++- .../mgt/core/dao/ApplicationReleaseDAO.java | 6 +- .../mgt/core/dao/LifecycleStateDAO.java | 17 ++- .../GenericApplicationReleaseDAOImpl.java | 34 ++++++ .../GenericLifecycleStateDAOImpl.java | 67 +++++------ .../mgt/core/impl/ApplicationManagerImpl.java | 104 +++++++++++------- .../ApplicationManagementPublisherAPI.java | 19 ++-- ...ApplicationManagementPublisherAPIImpl.java | 47 ++++---- ...cationManagementPublisherAdminAPIImpl.java | 31 ------ 10 files changed, 189 insertions(+), 172 deletions(-) rename components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/{dto/LifecycleStateDTO.java => LifecycleState.java} (83%) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/LifecycleStateDTO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/LifecycleState.java similarity index 83% rename from components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/LifecycleStateDTO.java rename to components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/LifecycleState.java index 9130e8a9fb..f499ba948e 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/dto/LifecycleStateDTO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/LifecycleState.java @@ -16,7 +16,7 @@ * under the License. * */ -package org.wso2.carbon.device.application.mgt.common.dto; +package org.wso2.carbon.device.application.mgt.common; import java.sql.Timestamp; import io.swagger.annotations.ApiModel; @@ -24,13 +24,8 @@ import io.swagger.annotations.ApiModelProperty; import java.util.List; -@ApiModel(value = "LifecycleStateDTO", description = "LifecycleStateDTO represents the Lifecycle state for an application release") -public class LifecycleStateDTO { - - @ApiModelProperty(name = "id", - value = "ID of the application release lifecycle", - required = true) - private int id; +@ApiModel(value = "LifecycleState", description = "LifecycleState represents the Lifecycle state for an application release") +public class LifecycleState { @ApiModelProperty(name = "currentState", value = "Current state of the application release", @@ -54,14 +49,6 @@ public class LifecycleStateDTO { value = "Timestamp of the lifecycle has been updated") private Timestamp updatedAt; - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - public String getCurrentState() { return currentState; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java index 7b82727d70..756b4505e7 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java @@ -24,7 +24,7 @@ import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; import org.wso2.carbon.device.application.mgt.common.ApplicationList; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; import org.wso2.carbon.device.application.mgt.common.Filter; -import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO; +import org.wso2.carbon.device.application.mgt.common.LifecycleState; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.response.Application; @@ -133,24 +133,23 @@ public interface ApplicationManager { ApplicationDTO getApplicationByRelease(String appReleaseUUID) throws ApplicationManagementException; /** - * To get all the releases of a particular ApplicationDTO. + * To get lifecycle state change flow of a particular Application Release. * - * @param applicationId ID of the ApplicationDTO . - * @param releaseUuid UUID of the ApplicationDTO Release. - * @return the LifecycleStateDTO of the ApplicationDTO releases related with the particular ApplicationDTO. - * @throws ApplicationManagementException ApplicationDTO Management Exception. + * @param releaseUuid UUID of the Application Release. + * @return the List of LifecycleStates which represent the lifecycle change flow of the application releases. + * @throws ApplicationManagementException Application Management Exception. */ - LifecycleStateDTO getLifecycleState(int applicationId, String releaseUuid) throws ApplicationManagementException; + List getLifecycleStateChangeFlow(String releaseUuid) throws ApplicationManagementException; /** * To get all the releases of a particular ApplicationDTO. * * @param applicationId ID of the ApplicationDTO. * @param releaseUuid UUID of the ApplicationDTO Release. - * @param state Lifecycle state to change the app + * @param stateName Lifecycle state to change the app * @throws ApplicationManagementException ApplicationDTO Management Exception. */ - void changeLifecycleState(int applicationId, String releaseUuid, LifecycleStateDTO state) + void changeLifecycleState(String releaseUuid, String stateName) throws ApplicationManagementException; /** diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java index 93ec3d4908..176f37dcae 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java @@ -178,6 +178,10 @@ public interface ApplicationReleaseDAO { * @return True if application release package name already exist in the IoT server, Otherwise returns False. * @throws ApplicationManagementDAOException Application Management DAO Exception. */ - boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId, String inactiveState) throws ApplicationManagementDAOException; + boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId, String inactiveState) + throws ApplicationManagementDAOException; + + boolean hasExisitInstallableAppRelease(String releaseUuid, String installableStateName, int tenantId) + throws ApplicationManagementDAOException; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java index fe1b3eccc4..a41c779ff0 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/LifecycleStateDAO.java @@ -18,7 +18,7 @@ */ package org.wso2.carbon.device.application.mgt.core.dao; -import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO; +import org.wso2.carbon.device.application.mgt.common.LifecycleState; import org.wso2.carbon.device.application.mgt.core.exception.LifeCycleManagementDAOException; import java.util.List; @@ -35,7 +35,7 @@ public interface LifecycleStateDAO { * @return Latest Lifecycle State for the given application release * @throws LifeCycleManagementDAOException Lifecycle Management DAO Exception. */ - LifecycleStateDTO getLatestLifeCycleStateByReleaseID(int applicationReleaseId) throws LifeCycleManagementDAOException; + LifecycleState getLatestLifeCycleStateByReleaseID(int applicationReleaseId) throws LifeCycleManagementDAOException; /** * To get the latest lifecycle state for the given application id and the application release UUID. @@ -45,32 +45,31 @@ public interface LifecycleStateDAO { * @return Latest Lifecycle State for the given application release * @throws LifeCycleManagementDAOException Lifecycle Management DAO Exception. */ - LifecycleStateDTO getLatestLifeCycleState(int appId, String uuid) throws LifeCycleManagementDAOException; + LifecycleState getLatestLifeCycleState(int appId, String uuid) throws LifeCycleManagementDAOException; /** * To get all changed lifecycle states for the given application release id. * @param appReleaseId id of the application release. + * @param tenantId Tenant Id. * * @return Lifecycle States for the given application release * @throws LifeCycleManagementDAOException Lifecycle Management DAO Exception. */ - List getLifecycleStates(int appReleaseId) throws LifeCycleManagementDAOException; + List getLifecycleStates(int appReleaseId, int tenantId) throws LifeCycleManagementDAOException; /** * To add new lifecycle states for the given application release. - * @param uuid Id of the application release. - * @param appId Id of the application. - * @param state LifecycleStateDTO. + * @param state LifecycleState. * @param tenantId Tenant id * * @throws LifeCycleManagementDAOException Lifecycle Management DAO Exception. */ - void addLifecycleState(LifecycleStateDTO state, int appId, String uuid, int tenantId) + void addLifecycleState(LifecycleState state, int appReleaseId, int tenantId) throws LifeCycleManagementDAOException; /** * To delete lifecycle state data of specific application release. - * @param releaseId Id of the LifecycleStateDTO. + * @param releaseId Id of the LifecycleState. * * @throws LifeCycleManagementDAOException Lifecycle Management DAO Exception. */ diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java index 2c9a74370f..2eb26a105f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java @@ -752,4 +752,38 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } } + @Override + public boolean hasExisitInstallableAppRelease(String releaseUuid, String installableStateName, int tenantId) + throws ApplicationManagementDAOException{ + if (log.isDebugEnabled()) { + log.debug("Verifying application release existence in the installable state: :" + installableStateName); + } + Connection conn; + try { + conn = this.getDBConnection(); + String sql = "SELECT AR.ID AS RELEASE_ID " + + "FROM AP_APP_RELEASE AS AR " + + "WHERE AR.CURRENT_STATE = ? AND " + + "AR.AP_APP_ID = (SELECT AP_APP_ID FROM AP_APP_RELEASE WHERE UUID = ?) AND " + + "AR.TENANT_ID = ?"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, installableStateName); + stmt.setString(2, releaseUuid); + stmt.setInt(3, tenantId); + try (ResultSet rs = stmt.executeQuery()) { + return rs.next(); + } + } + } catch (SQLException e) { + throw new ApplicationManagementDAOException( + "Error occurred while getting application release details in installable state: " + + installableStateName, e); + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException( + "Error occurred while obtaining the DB connection to get application release data in installable " + + "state.", e); + } + } + } \ No newline at end of file diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java index 184fdf13ef..78cf1e7a5b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/lifecyclestate/GenericLifecycleStateDAOImpl.java @@ -19,7 +19,7 @@ package org.wso2.carbon.device.application.mgt.core.dao.impl.lifecyclestate; import org.wso2.carbon.device.application.mgt.common.AppLifecycleState; -import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO; +import org.wso2.carbon.device.application.mgt.common.LifecycleState; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.LifecycleStateDAO; import org.wso2.carbon.device.application.mgt.core.dao.common.Util; @@ -41,7 +41,7 @@ import java.util.List; public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements LifecycleStateDAO { @Override - public LifecycleStateDTO getLatestLifeCycleStateByReleaseID(int applicationReleaseId) throws LifeCycleManagementDAOException { + public LifecycleState getLatestLifeCycleStateByReleaseID(int applicationReleaseId) throws LifeCycleManagementDAOException { Connection conn = null; PreparedStatement stmt = null; @@ -65,7 +65,7 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif } } - public LifecycleStateDTO getLatestLifeCycleState(int appId, String uuid) throws LifeCycleManagementDAOException{ + public LifecycleState getLatestLifeCycleState(int appId, String uuid) throws LifeCycleManagementDAOException{ Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; @@ -122,40 +122,45 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif } @Override - public List getLifecycleStates(int appReleaseId) throws LifeCycleManagementDAOException { - List lifecycleStates = new ArrayList<>(); - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; + public List getLifecycleStates(int appReleaseId, int tenantId) throws LifeCycleManagementDAOException { + List lifecycleStates = new ArrayList<>(); + Connection conn ; try { conn = this.getDBConnection(); - String sql = "SELECT ID, CURRENT_STATE, PREVIOUS_STATE, TENANT_ID, UPDATED_AT, UPDATED_BY FROM " - + "AP_APP_LIFECYCLE_STATE WHERE AP_APP_RELEASE_ID = ? ORDER BY UPDATED_AT ASC;"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1,appReleaseId); - rs = stmt.executeQuery(); - while (rs.next()) { - LifecycleStateDTO lifecycleState = new LifecycleStateDTO(); - lifecycleState.setId(rs.getInt("ID")); - lifecycleState.setCurrentState(rs.getString("CURRENT_STATE")); - lifecycleState.setPreviousState(rs.getString("PREVIOUS_STATE")); - lifecycleState.setUpdatedAt(rs.getTimestamp("UPDATED_AT")); - lifecycleState.setUpdatedBy(rs.getString("UPDATED_BY")); - lifecycleStates.add(lifecycleState); + String sql = "SELECT " + + "CURRENT_STATE, " + + "PREVIOUS_STATE, " + + "UPDATED_AT, " + + "UPDATED_BY " + + "FROM AP_APP_LIFECYCLE_STATE " + + "WHERE AP_APP_RELEASE_ID = ? AND " + + "TENANT_ID = ? " + + "ORDER BY UPDATED_AT ASC;"; + try (PreparedStatement stmt = conn.prepareStatement(sql)){ + stmt.setInt(1,appReleaseId); + stmt.setInt(2, tenantId); + try (ResultSet rs = stmt.executeQuery()){ + while (rs.next()) { + LifecycleState lifecycleState = new LifecycleState(); + lifecycleState.setCurrentState(rs.getString("CURRENT_STATE")); + lifecycleState.setPreviousState(rs.getString("PREVIOUS_STATE")); + lifecycleState.setUpdatedAt(rs.getTimestamp("UPDATED_AT")); + lifecycleState.setUpdatedBy(rs.getString("UPDATED_BY")); + lifecycleStates.add(lifecycleState); + } + } } } catch (DBConnectionException e) { throw new LifeCycleManagementDAOException("Error occurred while obtaining the DB connection when getting " + "lifecycle states for an application", e); } catch (SQLException e) { throw new LifeCycleManagementDAOException("Error occurred while retrieving lifecycle states.", e); - } finally { - Util.cleanupResources(stmt, rs); } return lifecycleStates; } @Override - public void addLifecycleState(LifecycleStateDTO state, int appId, String uuid, int tenantId) throws LifeCycleManagementDAOException { + public void addLifecycleState(LifecycleState state, int appReleaseId, int tenantId) throws LifeCycleManagementDAOException { Connection conn = null; PreparedStatement stmt = null; try { @@ -168,7 +173,7 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif + "UPDATED_AT, " + "AP_APP_RELEASE_ID, " + "AP_APP_ID) " - + "VALUES (?,?, ?, ?, ?, (SELECT ID FROM AP_APP_RELEASE WHERE UUID=?),?);"; + + "VALUES (?, ?, ?, ?, ?, ?, (SELECT AP_APP_ID FROM AP_APP_RELEASE WHERE ID = ?));"; Calendar calendar = Calendar.getInstance(); Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); @@ -179,10 +184,9 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif stmt.setInt(3, tenantId); stmt.setString(4, state.getUpdatedBy()); stmt.setTimestamp(5, timestamp); - stmt.setString(6, uuid); - stmt.setInt(7, appId); + stmt.setInt(6, appReleaseId); + stmt.setInt(7, appReleaseId); stmt.executeUpdate(); - } catch (DBConnectionException e) { throw new LifeCycleManagementDAOException("Error occurred while obtaining the DB connection.", e); } catch (SQLException e) { @@ -237,12 +241,11 @@ public class GenericLifecycleStateDAOImpl extends AbstractDAOImpl implements Lif } - private LifecycleStateDTO constructLifecycle(ResultSet rs) throws LifeCycleManagementDAOException { - LifecycleStateDTO lifecycleState = null; + private LifecycleState constructLifecycle(ResultSet rs) throws LifeCycleManagementDAOException { + LifecycleState lifecycleState = null; try { if (rs !=null && rs.next()) { - lifecycleState = new LifecycleStateDTO(); - lifecycleState.setId(rs.getInt("ID")); + lifecycleState = new LifecycleState(); lifecycleState.setCurrentState(rs.getString("CURRENT_STATE")); lifecycleState.setPreviousState(rs.getString("PREVIOUS_STATE")); lifecycleState.setUpdatedAt(rs.getTimestamp("UPDATED_AT")); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java index c4f225c691..cfe646d12f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java @@ -39,7 +39,7 @@ import org.wso2.carbon.device.application.mgt.common.ApplicationType; import org.wso2.carbon.device.application.mgt.common.dto.CategoryDTO; import org.wso2.carbon.device.application.mgt.common.Filter; import org.wso2.carbon.device.application.mgt.common.dto.DeviceSubscriptionDTO; -import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO; +import org.wso2.carbon.device.application.mgt.common.LifecycleState; import org.wso2.carbon.device.application.mgt.common.dto.TagDTO; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; @@ -311,10 +311,10 @@ public class ApplicationManagerImpl implements ApplicationManager { applicationReleaseDTO.setCurrentState(initialLifecycleState); applicationReleaseDTO = this.applicationReleaseDAO .createRelease(applicationReleaseDTO, appId, tenantId); - LifecycleStateDTO lifecycleStateDTO = getLifecycleStateInstance(initialLifecycleState, + LifecycleState lifecycleState = getLifecycleStateInstance(initialLifecycleState, initialLifecycleState); this.lifecycleStateDAO - .addLifecycleState(lifecycleStateDTO, appId, applicationReleaseDTO.getUuid(), tenantId); + .addLifecycleState(lifecycleState, applicationReleaseDTO.getId(), tenantId); applicationReleaseEntities.add(applicationReleaseDTO); applicationDTO.setApplicationReleaseDTOs(applicationReleaseEntities); Application application = appDtoToAppResponse(applicationDTO); @@ -745,11 +745,11 @@ public class ApplicationManagerImpl implements ApplicationManager { ConnectionManagerUtil.beginDBTransaction(); String initialstate = lifecycleStateManager.getInitialState(); applicationReleaseDTO.setCurrentState(initialstate); - LifecycleStateDTO lifecycleState = getLifecycleStateInstance(initialstate, initialstate); + LifecycleState lifecycleState = getLifecycleStateInstance(initialstate, initialstate); applicationReleaseDTO = this.applicationReleaseDAO .createRelease(applicationReleaseDTO, applicationDTO.getId(), tenantId); this.lifecycleStateDAO - .addLifecycleState(lifecycleState, applicationId, applicationReleaseDTO.getUuid(), tenantId); + .addLifecycleState(lifecycleState, applicationReleaseDTO.getId(), tenantId); applicationRelease = releaseDtoToRelease(applicationReleaseDTO); ConnectionManagerUtil.commitDBTransaction(); return applicationRelease; @@ -1116,7 +1116,7 @@ public class ApplicationManagerImpl implements ApplicationManager { throw new ApplicationManagementException(""); } for (ApplicationReleaseDTO applicationRelease : applicationReleases) { - LifecycleStateDTO lifecycleState = null; + LifecycleState lifecycleState = null; try { lifecycleState = this.lifecycleStateDAO.getLatestLifeCycleStateByReleaseID(applicationRelease.getId()); } catch (LifeCycleManagementDAOException e) { @@ -1139,7 +1139,7 @@ public class ApplicationManagerImpl implements ApplicationManager { // // if (state != null && !state.isEmpty()) { // for (ApplicationReleaseDTO applicationRelease : applicationReleases) { -// if (state.equals(applicationRelease.getLifecycleState().getCurrentState())) { +// if (state.equals(applicationRelease.getLifecycleStateChangeFlow().getCurrentState())) { // filteredReleases.add(applicationRelease); // } // } @@ -1147,9 +1147,9 @@ public class ApplicationManagerImpl implements ApplicationManager { // if (AppLifecycleState.PUBLISHED.toString().equals(state) && filteredReleases.size() > 1) { // log.warn("There are more than one application releases is found which is in PUBLISHED state"); // filteredReleases.sort((r1, r2) -> { -// if (r1.getLifecycleState().getUpdatedAt().after(r2.getLifecycleState().getUpdatedAt())) { +// if (r1.getLifecycleStateChangeFlow().getUpdatedAt().after(r2.getLifecycleStateChangeFlow().getUpdatedAt())) { // return -1; -// } else if (r2.getLifecycleState().getUpdatedAt().after(r1.getLifecycleState().getUpdatedAt())) { +// } else if (r2.getLifecycleStateChangeFlow().getUpdatedAt().after(r1.getLifecycleStateChangeFlow().getUpdatedAt())) { // return 1; // } // return 0; @@ -1327,17 +1327,17 @@ public class ApplicationManagerImpl implements ApplicationManager { } List deviceSubscriptionDTOS = subscriptionDAO .getDeviceSubscriptions(applicationReleaseDTO.getId(), tenantId); - for (DeviceSubscriptionDTO deviceSubscriptionDTO : deviceSubscriptionDTOS) { - if (!deviceSubscriptionDTO.isUnsubscribed()) { - String msg = "This application is subscribed to device/s. Therefore you are not permitted to delete " - + "the application release."; - log.error(msg); - throw new ForbiddenException(msg); - } + if (!deviceSubscriptionDTOS.isEmpty()){ + String msg = "Application release which has UUID: " + applicationReleaseDTO.getUuid() + + " either subscribed to device/s or it had subscribed to device/s. Therefore you are not " + + "permitted to delete the application release."; + log.error(msg); + throw new ForbiddenException(msg); } applicationStorageManager.deleteApplicationReleaseArtifacts(applicationReleaseDTO.getAppHashValue()); lifecycleStateDAO.deleteLifecycleStateByReleaseId(applicationReleaseDTO.getId()); applicationReleaseDAO.deleteRelease(applicationReleaseDTO.getId()); + ConnectionManagerUtil.commitDBTransaction(); } catch (ApplicationManagementDAOException e) { ConnectionManagerUtil.rollbackDBTransaction(); String msg = "Error occurred when application release data for application release UUID: " + releaseUuid; @@ -1565,31 +1565,58 @@ public class ApplicationManagerImpl implements ApplicationManager { } @Override - public LifecycleStateDTO getLifecycleState(int applicationId, String releaseUuid) - throws ApplicationManagementException { - LifecycleStateDTO lifecycleState; + public List getLifecycleStateChangeFlow(String releaseUuid) throws ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); try { ConnectionManagerUtil.openDBConnection(); - lifecycleState = this.lifecycleStateDAO.getLatestLifeCycleState(applicationId, releaseUuid); - if (lifecycleState == null) { - return null; + ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO + .getReleaseByUUID(releaseUuid, tenantId); + if (applicationReleaseDTO == null) { + String msg = "Couldn't found an application release for application release UUID: " + releaseUuid; + log.error(msg); + throw new NotFoundException(msg); } - lifecycleState.setNextStates(new ArrayList<>(lifecycleStateManager.getNextLifecycleStates(lifecycleState.getCurrentState()))); - + return this.lifecycleStateDAO.getLifecycleStates(applicationReleaseDTO.getId(), tenantId); } catch (LifeCycleManagementDAOException e) { - throw new ApplicationManagementException("Failed to get lifecycle state from database", e); + String msg = "Failed to get lifecycle state for application release uuid " + releaseUuid; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + String msg = + "Error occurred while getting application release for application release UUID: " + releaseUuid; + log.error(msg); + throw new ApplicationManagementException(msg, e); } finally { ConnectionManagerUtil.closeDBConnection(); } - return lifecycleState; } @Override - public void changeLifecycleState(int applicationId, String releaseUuid, LifecycleStateDTO state) + public void changeLifecycleState(String releaseUuid, String stateName) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); try { ConnectionManagerUtil.beginDBTransaction(); + ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(releaseUuid, tenantId); + + if (applicationReleaseDTO == null ){ + String msg = "Couldn't found an application release for the UUID: " + releaseUuid; + log.error(msg); + throw new NotFoundException(msg); + } + + if (lifecycleStateManager.isValidStateChange(applicationReleaseDTO.getCurrentState(), stateName, userName, tenantId)){ + LifecycleState lifecycleState = new LifecycleState(); + lifecycleState.setCurrentState(stateName); + lifecycleState.setPreviousState(applicationReleaseDTO.getCurrentState()); + lifecycleState.setUpdatedBy(userName); + this.lifecycleStateDAO.addLifecycleState(lifecycleState, applicationReleaseDTO.getId(), tenantId); + + } + + + if (!this.applicationDAO.verifyApplicationExistenceById(applicationId, tenantId)) { throw new NotFoundException("Couldn't find application for the application Id: " + applicationId); } @@ -1597,27 +1624,26 @@ public class ApplicationManagerImpl implements ApplicationManager { throw new NotFoundException("Couldn't find application release for the application Id: " + applicationId + " application release uuid: " + releaseUuid); } - LifecycleStateDTO currentState = this.lifecycleStateDAO.getLatestLifeCycleState(applicationId, releaseUuid); + LifecycleState currentState = this.lifecycleStateDAO.getLatestLifeCycleState(applicationId, releaseUuid); if (currentState == null) { throw new ApplicationManagementException( "Couldn't find latest lifecycle state for the appId: " + applicationId + " and application release UUID: " + releaseUuid); } - state.setPreviousState(currentState.getCurrentState()); - String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - state.setUpdatedBy(userName); + stateName.setPreviousState(currentState.getCurrentState()); + - if (state.getCurrentState() != null && state.getPreviousState() != null) { - if (lifecycleStateManager.isValidStateChange(state.getPreviousState(), state.getCurrentState(), + if (stateName.getCurrentState() != null && stateName.getPreviousState() != null) { + if (lifecycleStateManager.isValidStateChange(stateName.getPreviousState(), stateName.getCurrentState(), userName, tenantId)) { //todo if current state of the adding lifecycle state is PUBLISHED, need to check whether is there //todo any other application release in PUBLISHED state for the application( i.e for the appid) - this.lifecycleStateDAO.addLifecycleState(state, applicationId, releaseUuid, tenantId); + this.lifecycleStateDAO.addLifecycleState(stateName, applicationId, releaseUuid, tenantId); ConnectionManagerUtil.commitDBTransaction(); } else { ConnectionManagerUtil.rollbackDBTransaction(); - log.error("Invalid lifecycle state transition from '" + state.getPreviousState() + "'" + " to '" - + state.getCurrentState() + "'"); + log.error("Invalid lifecycle state transition from '" + stateName.getPreviousState() + "'" + " to '" + + stateName.getCurrentState() + "'"); throw new ApplicationManagementException( "Lifecycle State Validation failed. ApplicationDTO Id: " + applicationId + " ApplicationDTO release UUID: " + releaseUuid); @@ -1898,11 +1924,11 @@ public class ApplicationManagerImpl implements ApplicationManager { * By invoking the method, it returns Lifecycle State Instance. * @param currentState Current state of the lifecycle * @param previousState Previouse state of the Lifecycle - * @return {@link LifecycleStateDTO} + * @return {@link LifecycleState} */ - private LifecycleStateDTO getLifecycleStateInstance(String currentState, String previousState) { + private LifecycleState getLifecycleStateInstance(String currentState, String previousState) { String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - LifecycleStateDTO lifecycleState = new LifecycleStateDTO(); + LifecycleState lifecycleState = new LifecycleState(); lifecycleState.setCurrentState(currentState); lifecycleState.setPreviousState(previousState); lifecycleState.setUpdatedBy(userName); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java index 3d3d0fa08d..dceaecac72 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java @@ -666,7 +666,7 @@ public interface ApplicationManagementPublisherAPI { @Multipart(value = "screenshot3") Attachment screenshot3); @GET - @Path("/lifecycle/{appId}/{uuid}") + @Path("/life-cycle/state-changes/{uuid}") @Produces(MediaType.APPLICATION_JSON) @ApiOperation( produces = MediaType.APPLICATION_JSON, @@ -687,16 +687,22 @@ public interface ApplicationManagementPublisherAPI { message = "OK. \n Successfully retrieved lifecycle states.", response = List.class, responseContainer = "List"), + @ApiResponse( + code = 404, + message = "NOT FOUND. \n Couldn't found an application release for application release UUID."), @ApiResponse( code = 500, message = "Internal Server Error. \n Error occurred while getting the lifecycle list.", response = ErrorResponse.class) }) - Response getLifecycleState(@PathParam("appId") int applicationId, - @PathParam("uuid") String applicationUuid); + Response getLifecycleStates( + @ApiParam( + name = "uuid", + value = "UUID of the application release.") + @PathParam("uuid") String applicationUuid); @POST - @Path("/lifecycle/{appId}/{uuid}") + @Path("/life-cycle/{uuid}") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @ApiOperation( @@ -732,11 +738,6 @@ public interface ApplicationManagementPublisherAPI { response = ErrorResponse.class) }) Response addLifecycleState( - @ApiParam( - name = "appId", - value = "Identifier of the ApplicationDTO", - required = true) - @PathParam("appId") int applicationId, @ApiParam( name = "uuid", value = "UUID of the ApplicationDTO Release", diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java index 15f7568e84..33b6f800d6 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java @@ -18,12 +18,13 @@ */ package org.wso2.carbon.device.application.mgt.publisher.api.services.impl; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.cxf.jaxrs.ext.multipart.Attachment; import org.apache.cxf.jaxrs.ext.multipart.Multipart; import org.wso2.carbon.device.application.mgt.common.*; -import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO; +import org.wso2.carbon.device.application.mgt.common.LifecycleState; import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException; import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.response.Application; @@ -457,49 +458,43 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem } } - - /* -//todo ---------------------- -*/ @GET - @Path("/lifecycle/{appId}/{uuid}") - public Response getLifecycleState( - @PathParam("appId") int applicationId, - @PathParam("uuid") String applicationUuid) { - LifecycleStateDTO lifecycleState; + @Path("/life-cycle/state-changes/{uuid}") + public Response getLifecycleStates( + @PathParam("uuid") String releaseUuid) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); try { - lifecycleState = applicationManager.getLifecycleState(applicationId, applicationUuid); - if (lifecycleState == null) { - String msg = "Couldn't found application lifecycle details for appid: " + applicationId - + " and app release UUID: " + applicationUuid; - log.error(msg); - return Response.status(Response.Status.NOT_FOUND).build(); - } + List lifecycleStates = applicationManager.getLifecycleStateChangeFlow(releaseUuid); + return Response.status(Response.Status.OK).entity(lifecycleStates).build(); + } catch (NotFoundException e) { + String msg = "Couldn't found an application release for UUID: " + releaseUuid; + log.error(msg); + return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); } catch (ApplicationManagementException e) { - String msg = "Error occurred while getting lifecycle state."; + String msg = + "Error occurred while getting lifecycle states for application release UUID: " + releaseUuid; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } - return Response.status(Response.Status.OK).entity(lifecycleState).build(); } +/* +//todo ---------------------- +*/ @POST - @Path("/lifecycle/{appId}/{uuid}") + @Path("/life-cycle/{uuid}") public Response addLifecycleState( - @PathParam("appId") int applicationId, @PathParam("uuid") String applicationUuid, @QueryParam("action") String action) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); try { - if (action == null || action.isEmpty()) { - String msg = "The Action is null or empty. Please check the request"; + if (StringUtils.isEmpty(action)) { + String msg = "The Action is null or empty. Please verify the request."; log.error(msg); return Response.status(Response.Status.BAD_REQUEST).build(); } - LifecycleStateDTO state = new LifecycleStateDTO(); - state.setCurrentState(action); - applicationManager.changeLifecycleState(applicationId, applicationUuid, state); + + applicationManager.changeLifecycleState( applicationUuid, action); } catch (NotFoundException e) { String msg = "Could,t find application release for application id: " + applicationId + " and application release uuid: " + applicationUuid; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java index 61ace448eb..6f2525fe3b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/admin/ApplicationManagementPublisherAdminAPIImpl.java @@ -20,49 +20,18 @@ package org.wso2.carbon.device.application.mgt.publisher.api.services.impl.admin import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.cxf.jaxrs.ext.multipart.Attachment; -import org.apache.cxf.jaxrs.ext.multipart.Multipart; -import org.wso2.carbon.device.application.mgt.common.ApplicationArtifact; -import org.wso2.carbon.device.application.mgt.common.ApplicationList; -import org.wso2.carbon.device.application.mgt.common.ApplicationType; -import org.wso2.carbon.device.application.mgt.common.Filter; -import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; -import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; -import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; -import org.wso2.carbon.device.application.mgt.common.response.Application; -import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; -import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper; -import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationUpdateWrapper; -import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; -import org.wso2.carbon.device.application.mgt.core.exception.BadRequestException; import org.wso2.carbon.device.application.mgt.core.exception.ForbiddenException; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import org.wso2.carbon.device.application.mgt.core.util.APIUtil; -import org.wso2.carbon.device.application.mgt.publisher.api.services.ApplicationManagementPublisherAPI; import org.wso2.carbon.device.application.mgt.publisher.api.services.admin.ApplicationManagementPublisherAdminAPI; -import javax.activation.DataHandler; -import javax.validation.Valid; -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.MediaType; import javax.ws.rs.core.Response; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; /** * Implementation of Application Management related APIs. From 6d4252a5dd3d478c4f60e3c459bb648998f38b93 Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Mon, 6 May 2019 21:53:54 +0530 Subject: [PATCH 4/6] Fix issues in lifecycle adding method --- .../mgt/core/dao/ApplicationReleaseDAO.java | 2 +- .../GenericApplicationReleaseDAOImpl.java | 2 +- .../mgt/core/impl/ApplicationManagerImpl.java | 73 ++++++++----------- ...ApplicationManagementPublisherAPIImpl.java | 6 +- 4 files changed, 32 insertions(+), 51 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java index 176f37dcae..a97fe2d08b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationReleaseDAO.java @@ -181,7 +181,7 @@ public interface ApplicationReleaseDAO { boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId, String inactiveState) throws ApplicationManagementDAOException; - boolean hasExisitInstallableAppRelease(String releaseUuid, String installableStateName, int tenantId) + boolean hasExistInstallableAppRelease(String releaseUuid, String installableStateName, int tenantId) throws ApplicationManagementDAOException; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java index 2eb26a105f..d3ba1cdaa8 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java @@ -753,7 +753,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } @Override - public boolean hasExisitInstallableAppRelease(String releaseUuid, String installableStateName, int tenantId) + public boolean hasExistInstallableAppRelease(String releaseUuid, String installableStateName, int tenantId) throws ApplicationManagementDAOException{ if (log.isDebugEnabled()) { log.debug("Verifying application release existence in the installable state: :" + installableStateName); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java index cfe646d12f..c5384ddcba 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java @@ -1598,65 +1598,50 @@ public class ApplicationManagerImpl implements ApplicationManager { String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); try { ConnectionManagerUtil.beginDBTransaction(); - ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(releaseUuid, tenantId); + ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO + .getReleaseByUUID(releaseUuid, tenantId); - if (applicationReleaseDTO == null ){ + if (applicationReleaseDTO == null) { String msg = "Couldn't found an application release for the UUID: " + releaseUuid; log.error(msg); throw new NotFoundException(msg); } - if (lifecycleStateManager.isValidStateChange(applicationReleaseDTO.getCurrentState(), stateName, userName, tenantId)){ + if (lifecycleStateManager + .isValidStateChange(applicationReleaseDTO.getCurrentState(), stateName, userName, tenantId)) { + if (lifecycleStateManager.isInstallableState(stateName) && applicationReleaseDAO + .hasExistInstallableAppRelease(applicationReleaseDTO.getUuid(), + lifecycleStateManager.getInstallableState(), tenantId)) { + String msg = "Installable application release is already registered for the application. " + + "Therefore it is not permitted to change the lifecycle state from " + + applicationReleaseDTO.getCurrentState() + " to " + stateName; + log.error(msg); + throw new ForbiddenException(msg); + } LifecycleState lifecycleState = new LifecycleState(); lifecycleState.setCurrentState(stateName); lifecycleState.setPreviousState(applicationReleaseDTO.getCurrentState()); lifecycleState.setUpdatedBy(userName); + applicationReleaseDTO.setCurrentState(stateName); + this.applicationReleaseDAO.updateRelease(applicationReleaseDTO, tenantId); this.lifecycleStateDAO.addLifecycleState(lifecycleState, applicationReleaseDTO.getId(), tenantId); - - } - - - - if (!this.applicationDAO.verifyApplicationExistenceById(applicationId, tenantId)) { - throw new NotFoundException("Couldn't find application for the application Id: " + applicationId); - } - if (!this.applicationReleaseDAO.verifyReleaseExistence(applicationId, releaseUuid, tenantId)) { - throw new NotFoundException("Couldn't find application release for the application Id: " + applicationId - + " application release uuid: " + releaseUuid); - } - LifecycleState currentState = this.lifecycleStateDAO.getLatestLifeCycleState(applicationId, releaseUuid); - if (currentState == null) { - throw new ApplicationManagementException( - "Couldn't find latest lifecycle state for the appId: " + applicationId - + " and application release UUID: " + releaseUuid); - } - stateName.setPreviousState(currentState.getCurrentState()); - - - if (stateName.getCurrentState() != null && stateName.getPreviousState() != null) { - if (lifecycleStateManager.isValidStateChange(stateName.getPreviousState(), stateName.getCurrentState(), - userName, tenantId)) { - //todo if current state of the adding lifecycle state is PUBLISHED, need to check whether is there - //todo any other application release in PUBLISHED state for the application( i.e for the appid) - this.lifecycleStateDAO.addLifecycleState(stateName, applicationId, releaseUuid, tenantId); - ConnectionManagerUtil.commitDBTransaction(); - } else { - ConnectionManagerUtil.rollbackDBTransaction(); - log.error("Invalid lifecycle state transition from '" + stateName.getPreviousState() + "'" + " to '" - + stateName.getCurrentState() + "'"); - throw new ApplicationManagementException( - "Lifecycle State Validation failed. ApplicationDTO Id: " + applicationId - + " ApplicationDTO release UUID: " + releaseUuid); - } + } else { + String msg = "Invalid lifecycle state transition from '" + applicationReleaseDTO.getCurrentState() + "'" + + " to '" + stateName + "'"; + log.error(msg); + throw new ApplicationManagementException(msg); } } catch (LifeCycleManagementDAOException e) { ConnectionManagerUtil.rollbackDBTransaction(); - throw new ApplicationManagementException( - "Failed to add lifecycle state. ApplicationDTO Id: " + applicationId + " ApplicationDTO release UUID: " - + releaseUuid, e); + String msg = "Failed to add lifecycle state for Application release UUID: " + releaseUuid; + log.error(msg); + throw new ApplicationManagementException(msg, e); } catch (ApplicationManagementDAOException e) { - //todo - throw new ApplicationManagementException(""); + ConnectionManagerUtil.rollbackDBTransaction(); + String msg = "Error occurred when accessing application release data of application release which has the " + + "application release UUID: " + releaseUuid; + log.error(msg); + throw new ApplicationManagementException(msg); } finally { ConnectionManagerUtil.closeDBConnection(); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java index 33b6f800d6..06956b243b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java @@ -478,9 +478,6 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem } } -/* -//todo ---------------------- -*/ @POST @Path("/life-cycle/{uuid}") public Response addLifecycleState( @@ -496,8 +493,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem applicationManager.changeLifecycleState( applicationUuid, action); } catch (NotFoundException e) { - String msg = "Could,t find application release for application id: " + applicationId - + " and application release uuid: " + applicationUuid; + String msg = "Could,t find application release for application release uuid: " + applicationUuid; log.error(msg, e); return Response.status(Response.Status.NOT_FOUND).build(); } catch (ApplicationManagementException e) { From 38006c8ff0dfedf36b85da35f1e9406cd0bffffe Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Tue, 7 May 2019 02:19:18 +0530 Subject: [PATCH 5/6] Fix issues in lifecycle management feature --- .../mgt/common/services/ApplicationManager.java | 1 - .../application/mgt/core/dao/common/Util.java | 1 + .../impl/application/GenericApplicationDAOImpl.java | 2 ++ .../release/GenericApplicationReleaseDAOImpl.java | 3 ++- .../mgt/core/impl/ApplicationManagerImpl.java | 1 + .../mgt/core/lifecycle/LifecycleStateManager.java | 13 ++++--------- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java index 756b4505e7..afd081193d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java @@ -144,7 +144,6 @@ public interface ApplicationManager { /** * To get all the releases of a particular ApplicationDTO. * - * @param applicationId ID of the ApplicationDTO. * @param releaseUuid UUID of the ApplicationDTO Release. * @param stateName Lifecycle state to change the app * @throws ApplicationManagementException ApplicationDTO Management Exception. diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java index 2a5031f843..da51ababda 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java @@ -129,6 +129,7 @@ public class Util { */ public static ApplicationReleaseDTO loadAppRelease(ResultSet rs) throws SQLException { ApplicationReleaseDTO appRelease = new ApplicationReleaseDTO(); + appRelease.setId(rs.getInt("RELEASE_ID")); appRelease.setDescription(rs.getString("RELEASE_DESCRIPTION")); appRelease.setUuid(rs.getString("RELEASE_UUID")); appRelease.setReleaseType(rs.getString("RELEASE_TYPE")); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java index 2cb7aa2711..7e362f85e7 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java @@ -144,6 +144,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + "AP_APP.CURRENCY AS APP_CURRENCY, " + "AP_APP.RATING AS APP_RATING, " + "AP_APP.DEVICE_TYPE_ID AS APP_DEVICE_TYPE_ID, " + + "AP_APP_RELEASE.ID AS RELEASE_ID, " + "AP_APP_RELEASE.DESCRIPTION AS RELEASE_DESCRIPTION, " + "AP_APP_RELEASE.VERSION AS RELEASE_VERSION, " + "AP_APP_RELEASE.UUID AS RELEASE_UUID, " @@ -502,6 +503,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + "AP_APP.CURRENCY AS APP_CURRENCY, " + "AP_APP.RATING AS APP_RATING, " + "AP_APP.DEVICE_TYPE_ID AS APP_DEVICE_TYPE_ID, " + + "AP_APP_RELEASE.ID AS RELEASE_ID, " + "AP_APP_RELEASE.DESCRIPTION AS RELEASE_DESCRIPTION, " + "AP_APP_RELEASE.VERSION AS RELEASE_VERSION, " + "AP_APP_RELEASE.UUID AS RELEASE_UUID, " diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java index d3ba1cdaa8..c3eb59159c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java @@ -226,7 +226,8 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements public ApplicationReleaseDTO getReleaseByUUID( String uuid, int tenantId) throws ApplicationManagementDAOException { Connection connection; String sql = - "SELECT AR.DESCRIPTION AS RELEASE_DESCRIPTION, " + "SELECT AR.ID AS RELEASE_ID, " + + "AR.DESCRIPTION AS RELEASE_DESCRIPTION, " + "AR.VERSION AS RELEASE_VERSION, " + "AR.UUID AS RELEASE_UUID, " + "AR.RELEASE_TYPE AS RELEASE_TYPE, " diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java index c5384ddcba..ed17944967 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java @@ -1625,6 +1625,7 @@ public class ApplicationManagerImpl implements ApplicationManager { applicationReleaseDTO.setCurrentState(stateName); this.applicationReleaseDAO.updateRelease(applicationReleaseDTO, tenantId); this.lifecycleStateDAO.addLifecycleState(lifecycleState, applicationReleaseDTO.getId(), tenantId); + ConnectionManagerUtil.commitDBTransaction(); } else { String msg = "Invalid lifecycle state transition from '" + applicationReleaseDTO.getCurrentState() + "'" + " to '" + stateName + "'"; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/lifecycle/LifecycleStateManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/lifecycle/LifecycleStateManager.java index 0a5d0cb1b6..552b42640a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/lifecycle/LifecycleStateManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/lifecycle/LifecycleStateManager.java @@ -47,7 +47,7 @@ public class LifecycleStateManager { if (lifecycleState.getProceedingStates() != null) { lifecycleState.getProceedingStates().replaceAll(String::toUpperCase); } - lifecycleStates.put(lifecycleState.getName(), lifecycleState); + lifecycleStates.put(lifecycleState.getName().toUpperCase(), lifecycleState); try { PermissionUtils.putPermission(lifecycleState.getPermission()); } catch (PermissionManagementException e) { @@ -123,15 +123,10 @@ public class LifecycleStateManager { } private String getPermissionForStateChange(String nextState) { - Iterator it = lifecycleStates.entrySet().iterator(); - LifecycleState nextLifecycleState; - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - if (pair.getKey().toString().equalsIgnoreCase(nextState)) { - nextLifecycleState = lifecycleStates.get(nextState); - return nextLifecycleState.getPermission(); + for (Map.Entry lifecycyleState : lifecycleStates.entrySet()) { + if (lifecycyleState.getKey().equalsIgnoreCase(nextState)) { + return lifecycyleState.getValue().getPermission(); } - it.remove(); } return null; } From f93185a11ba8af7d38f2e1b0f58d769de80cf325 Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Tue, 7 May 2019 02:40:12 +0530 Subject: [PATCH 6/6] Improve publisher jax-rs logic --- ...ApplicationManagementPublisherAPIImpl.java | 100 +++++++----------- 1 file changed, 39 insertions(+), 61 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java index 06956b243b..fee5b16049 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java @@ -1,20 +1,18 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) 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 + * Entgra (Pvt) Ltd. 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. + * 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.application.mgt.publisher.api.services.impl; @@ -167,18 +165,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Multipart("screenshot2") Attachment screenshot2, @Multipart("screenshot3") Attachment screenshot3) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); - List attachmentList = new ArrayList<>(); - - if (screenshot1 != null) { - attachmentList.add(screenshot1); - } - if (screenshot2 != null) { - attachmentList.add(screenshot2); - } - if (screenshot3 != null) { - attachmentList.add(screenshot3); - } - + List attachmentList = constructAttachmentList(screenshot1, screenshot2, screenshot3); try { applicationManager.validateAppCreatingRequest(applicationWrapper); applicationManager.validateReleaseCreatingRequest(applicationWrapper.getApplicationReleaseWrappers().get(0), @@ -221,18 +208,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Multipart("screenshot2") Attachment screenshot2, @Multipart("screenshot3") Attachment screenshot3) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); - List attachmentList = new ArrayList<>(); - - if (screenshot1 != null) { - attachmentList.add(screenshot1); - } - if (screenshot2 != null) { - attachmentList.add(screenshot2); - } - if (screenshot3 != null) { - attachmentList.add(screenshot3); - } - + List attachmentList = constructAttachmentList(screenshot1, screenshot2, screenshot3); try { applicationManager.validateReleaseCreatingRequest(applicationReleaseWrapper, appType); applicationManager.validateBinaryArtifact(binaryFile, appType); @@ -271,17 +247,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Multipart("screenshot2") Attachment screenshot2, @Multipart("screenshot3") Attachment screenshot3) { try { - List attachments = new ArrayList<>(); - - if (screenshot1 != null) { - attachments.add(screenshot1); - } - if (screenshot2 != null) { - attachments.add(screenshot2); - } - if (screenshot3 != null) { - attachments.add(screenshot3); - } + List attachments = constructAttachmentList(screenshot1, screenshot2, screenshot3); ApplicationManager applicationManager = APIUtil.getApplicationManager(); applicationManager.validateImageArtifacts(iconFile, bannerFile, attachments); applicationManager.updateApplicationImageArtifact(applicationReleaseUuid, @@ -385,16 +351,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Multipart("screenshot2") Attachment screenshot2, @Multipart("screenshot3") Attachment screenshot3) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); - List screenshots = new ArrayList<>(); - if (screenshot1 != null){ - screenshots.add(screenshot1); - } - if (screenshot2 != null) { - screenshots.add(screenshot2); - } - if (screenshot3 != null) { - screenshots.add(screenshot3); - } + List screenshots = constructAttachmentList(screenshot1, screenshot2, screenshot3); try { applicationManager.validateBinaryArtifact(binaryFile, appType); applicationManager.validateImageArtifacts(iconFile, bannerFile, screenshots); @@ -519,6 +476,29 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem } } + /*** + * Construct the screenshot list by evaluating the availability of each screenshot. + * + * @param screenshot1 First Screenshot + * @param screenshot2 Second Screenshot + * @param screenshot3 Third Screenshot + * @return List of {@link Attachment} + */ + private List constructAttachmentList(Attachment screenshot1, Attachment screenshot2, + Attachment screenshot3) { + List attachments = new ArrayList<>(); + if (screenshot1 != null) { + attachments.add(screenshot1); + } + if (screenshot2 != null) { + attachments.add(screenshot2); + } + if (screenshot3 != null) { + attachments.add(screenshot3); + } + return attachments; + } + /*** * * @param binaryFile binary file of the application release @@ -624,7 +604,5 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem log.error(msg, e); throw new ApplicationManagementException(msg); } - } - }