From 19f088d2224e812bc2c2be743beb903bc9622481 Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Fri, 19 Apr 2019 13:19:59 +0530 Subject: [PATCH] Add get application and add new release APIs --- .../mgt/common/dto/ApplicationDTO.java | 12 +- .../common/services/ApplicationManager.java | 11 +- .../mgt/core/dao/ApplicationDAO.java | 4 +- .../mgt/core/dao/ApplicationReleaseDAO.java | 5 +- .../application/mgt/core/dao/common/Util.java | 114 ++---------- .../GenericApplicationDAOImpl.java | 80 ++++++--- .../GenericApplicationReleaseDAOImpl.java | 29 ++-- .../mgt/core/impl/ApplicationManagerImpl.java | 162 ++++++++++-------- .../impl/ApplicationStorageManagerImpl.java | 22 +-- .../core/impl/SubscriptionManagerImpl.java | 12 +- .../mgt/core/util/StorageManagementUtil.java | 13 ++ .../mgt/handler/util/HandlerConstants.java | 2 +- .../services/ApplicationManagementAPI.java | 151 ++++++++-------- .../impl/ApplicationManagementAPIImpl.java | 144 +++++++--------- 14 files changed, 344 insertions(+), 417 deletions(-) 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 484dc4c2557..83813c3af37 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 @@ -95,10 +95,10 @@ public class ApplicationDTO { example = "REMOVED, ACTIVE") private String status; - @ApiModelProperty(name = "applicationReleases", + @ApiModelProperty(name = "applicationReleaseDTOs", value = "List of application releases", required = true) - private List applicationReleases; + private List applicationReleaseDTOs; public int getId() { return id; @@ -152,12 +152,12 @@ public class ApplicationDTO { this.paymentCurrency = paymentCurrency; } - public List getApplicationReleases() { - return applicationReleases; + public List getApplicationReleaseDTOs() { + return applicationReleaseDTOs; } - public void setApplicationReleases(List applicationReleases) { - this.applicationReleases = applicationReleases; + public void setApplicationReleaseDTOs(List applicationReleaseDTOs) { + this.applicationReleaseDTOs = applicationReleaseDTOs; } public List getUnrestrictedRoles() { 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 5cca6efd570..455cfd59cb7 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 @@ -28,6 +28,7 @@ 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.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.wrapper.ApplicationReleaseWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; @@ -165,11 +166,11 @@ public interface ApplicationManager { * To create an application release for an ApplicationDTO. * * @param applicationId ID of the ApplicationDTO - * @param applicationRelease ApplicatonRelease that need to be be created. + * @param applicationReleaseWrapper ApplicatonRelease that need to be be created. * @return the unique id of the application release, if the application release succeeded else -1 */ - ApplicationReleaseDTO createRelease(int applicationId, ApplicationReleaseDTO applicationRelease) - throws ApplicationManagementException; + ApplicationRelease createRelease(int applicationId, ApplicationReleaseWrapper applicationReleaseWrapper, + ApplicationArtifact applicationArtifact) throws ApplicationManagementException; /*** * @@ -201,8 +202,8 @@ public interface ApplicationManager { * @param applicationType Type of the application * @throws RequestValidatingException throws if payload does not satisfy requrements. */ - void validateReleaseCreatingRequest(ApplicationReleaseWrapper applicationReleaseWrapper, - String applicationType) throws RequestValidatingException; + void validateReleaseCreatingRequest(ApplicationReleaseWrapper applicationReleaseWrapper, String applicationType) + throws RequestValidatingException; /*** * 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 feaa04b72c9..220dc9181d3 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 @@ -24,6 +24,7 @@ import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; import org.wso2.carbon.device.application.mgt.common.dto.CategoryDTO; import org.wso2.carbon.device.application.mgt.common.dto.TagDTO; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; + import java.util.List; /** @@ -115,8 +116,7 @@ public interface ApplicationDAO { * @return the application * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. */ - ApplicationDTO getApplicationById(String id, int tenantId) throws - ApplicationManagementDAOException; + ApplicationDTO getApplicationById(String id, int tenantId) throws ApplicationManagementDAOException; /** * To get the application with the given id 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 a954c34ae43..827d17041b5 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 @@ -142,12 +142,11 @@ public interface ApplicationReleaseDAO { /** * To verify whether application release exist or not for the given app release version. * - * @param appId ID of the application. * @param hashVal Hash value of the application release. * @param tenantId Tenant Id * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. */ - boolean verifyReleaseExistenceByHash(int appId, String hashVal, int tenantId) + boolean verifyReleaseExistenceByHash(String hashVal, int tenantId) throws ApplicationManagementDAOException; /** @@ -177,6 +176,6 @@ 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) throws ApplicationManagementDAOException; + boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId, String inactiveState) 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/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 8386301900d..3ac4186d520 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 @@ -32,6 +32,7 @@ import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorage import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; import org.wso2.carbon.device.application.mgt.core.config.Configuration; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; +import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import java.sql.PreparedStatement; @@ -47,66 +48,6 @@ public class Util { private static final Log log = LogFactory.getLog(Util.class); -// /** -// * To create application object from the result set retrieved from the Database. -// * -// * @param rs ResultSet -// * @return List of Applications that is retrieved from the Database. -// * @throws SQLException SQL Exception -// * @throws JSONException JSONException. -// */ -// public static List loadApplications(ResultSet rs) throws SQLException, JSONException { -// -// List applications = new ArrayList<>(); -// ApplicationDTO application = null; -// int applicationId = -1; -// boolean hasNext = rs.next(); -// -// while (hasNext) { -// if (applicationId != rs.getInt("APP_ID")) { -// if (application != null) { -// applications.add(application); -// } -// applicationId = rs.getInt("APP_ID"); -// application = new ApplicationDTO(); -// application.setTags(new ArrayList<>()); -// application.setUnrestrictedRoles(new ArrayList<>()); -// application.setId(applicationId); -// application.setName(rs.getString("APP_NAME")); -// application.setType(rs.getString("APP_TYPE")); -// application.setAppCategories(rs.getString("APP_CATEGORY")); -// application.setSubType(rs.getString("SUB_TYPE")); -// application.setPaymentCurrency(rs.getString("CURRENCY")); -// application.setIsRestricted(rs.getBoolean("RESTRICTED")); -// application.setStatus(rs.getString("STATUS")); -// String tag = rs.getString("APP_TAG"); -// String unrestrictedRole = rs.getString("ROLE"); -// if (tag != null) { -// application.getTags().add(tag); -// } -// if (unrestrictedRole != null) { -// application.getUnrestrictedRoles().add(unrestrictedRole); -// } -// } else { -// String tag = rs.getString("APP_TAG"); -// String unrestrictedRole = rs.getString("ROLE"); -// if (application != null) { -// if (tag != null && !application.getTags().contains(tag)) { -// application.getTags().add(tag); -// } -// if (unrestrictedRole != null && !application.getUnrestrictedRoles().contains(unrestrictedRole)) { -// application.getUnrestrictedRoles().add(unrestrictedRole); -// } -// } -// } -// hasNext = rs.next(); -// if (!hasNext) { -// applications.add(application); -// } -// } -// return applications; -// } - /** * To create application object from the result set retrieved from the Database. * @@ -128,7 +69,7 @@ public class Util { applications.add(application); } application = new ApplicationDTO(); - application.setApplicationReleases(new ArrayList<>()); + application.setApplicationReleaseDTOs(new ArrayList<>()); applicationId = rs.getInt("APP_ID"); application.setId(applicationId); application.setName(rs.getString("APP_NAME")); @@ -139,10 +80,10 @@ public class Util { application.setStatus(rs.getString("APP_STATUS")); application.setAppRating(rs.getInt("APP_RATING")); application.setDeviceTypeId(rs.getInt("APP_DEVICE_TYPE_ID")); - application.getApplicationReleases().add(loadAppRelease(rs)); + application.getApplicationReleaseDTOs().add(loadAppRelease(rs)); } else { - if (application != null && application.getApplicationReleases() != null) { - application.getApplicationReleases().add(loadAppRelease(rs)); + if (application != null && application.getApplicationReleaseDTOs() != null) { + application.getApplicationReleaseDTOs().add(loadAppRelease(rs)); } } hasNext = rs.next(); @@ -189,41 +130,18 @@ public class Util { * @throws SQLException SQL Exception * @throws JSONException JSONException. */ - public static ApplicationDTO loadApplication(ResultSet rs) throws SQLException, JSONException { - - ApplicationDTO application = null; - int applicatioId; - int iteration = 0; - if (rs != null) { - while (rs.next()) { - if (iteration == 0) { - application = new ApplicationDTO(); - application.setTags(new ArrayList<>()); - application.setUnrestrictedRoles(new ArrayList<>()); - applicatioId = rs.getInt("APP_ID"); - application.setId(applicatioId); - application.setName(rs.getString("APP_NAME")); - application.setType(rs.getString("APP_TYPE")); - application.setAppCategory(rs.getString("APP_CATEGORY")); - application.setSubType(rs.getString("SUB_TYPE")); - application.setPaymentCurrency(rs.getString("CURRENCY")); -// application.setIsRestricted(rs.getBoolean("RESTRICTED")); - application.setDeviceTypeId(rs.getInt("DEVICE_TYPE_ID")); - } - - String tag = rs.getString("APP_TAG"); - String unrestrictedRole = rs.getString("ROLE"); - if (tag != null && !application.getTags().contains(tag)) { - application.getTags().add(tag); - } - if (unrestrictedRole != null && !application.getUnrestrictedRoles().contains(unrestrictedRole)) { - application.getUnrestrictedRoles().add(unrestrictedRole); - } - iteration++; - } + public static ApplicationDTO loadApplication(ResultSet rs) + throws SQLException, JSONException, UnexpectedServerErrorException { + List applicationDTOs = loadApplications(rs); + if (applicationDTOs.isEmpty()) { + return null; } - return application; - + if (applicationDTOs.size() > 1) { + String msg = "Internal server error. Found more than one application for requested application ID"; + log.error(msg); + throw new UnexpectedServerErrorException(msg); + } + return applicationDTOs.get(0); } /** 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 7d2327f115d..a9045e2a8b4 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 @@ -24,17 +24,16 @@ import org.apache.commons.logging.LogFactory; import org.json.JSONException; import org.wso2.carbon.device.application.mgt.common.AppLifecycleState; 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.dto.CategoryDTO; import org.wso2.carbon.device.application.mgt.common.Filter; -import org.wso2.carbon.device.application.mgt.common.Pagination; import org.wso2.carbon.device.application.mgt.common.dto.TagDTO; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; import org.wso2.carbon.device.application.mgt.core.dao.common.Util; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; +import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException; import java.sql.Connection; import java.sql.PreparedStatement; @@ -163,8 +162,8 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + "FROM AP_APP " + "INNER JOIN AP_APP_RELEASE ON " + "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID AND " - + "AP_APP.TENANT_ID = ? AND " - + "AP_APP.TENANT_ID = AP_APP_RELEASE.TENANT_ID"; + + "AP_APP.TENANT_ID = AP_APP_RELEASE.TENANT_ID " + + "WHERE AP_APP.TENANT_ID = ?"; if (filter == null) { throw new ApplicationManagementDAOException("Filter need to be instantiated"); @@ -381,14 +380,15 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (UnexpectedServerErrorException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { Util.cleanupResources(stmt, rs); } } @Override - public ApplicationDTO getApplicationById(String id, int tenantId) throws - ApplicationManagementDAOException { + public ApplicationDTO getApplicationById(String id, int tenantId) throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { log.debug("Getting application with the id:" + id); } @@ -423,14 +423,16 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (UnexpectedServerErrorException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { Util.cleanupResources(stmt, rs); } } @Override - public ApplicationDTO getApplicationByUUID(String releaseUuid, int tenantId) throws - ApplicationManagementDAOException { + public ApplicationDTO getApplicationByUUID(String releaseUuid, int tenantId) + throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { log.debug("Getting application with the release UUID: " + releaseUuid + " from the database"); } @@ -470,14 +472,16 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (UnexpectedServerErrorException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { Util.cleanupResources(stmt, rs); } } @Override - public ApplicationDTO getApplicationById(int applicationId, int tenantId) throws - ApplicationManagementDAOException { + public ApplicationDTO getApplicationById(int applicationId, int tenantId) + throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { log.debug("Getting application with the id (" + applicationId + ") from the database"); } @@ -486,28 +490,48 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic ResultSet rs = null; try { conn = this.getDBConnection(); - String sql = - "SELECT AP_APP.ID AS APP_ID, AP_APP.NAME AS APP_NAME, AP_APP.TYPE AS APP_TYPE, AP_APP.APP_CATEGORY " - + "AS APP_CATEGORY, AP_APP.SUB_TYPE AS SUB_TYPE, AP_APP.CURRENCY AS CURRENCY, " - + "AP_APP.RESTRICTED AS RESTRICTED, AP_APP.DEVICE_TYPE_ID AS DEVICE_TYPE_ID, " - + "AP_APP_TAG.TAG AS APP_TAG, AP_UNRESTRICTED_ROLE.ROLE AS ROLE FROM " - + "((AP_APP LEFT JOIN AP_APP_TAG ON AP_APP.ID = AP_APP_TAG.AP_APP_ID) " - + "LEFT JOIN AP_UNRESTRICTED_ROLE ON AP_APP.ID = AP_UNRESTRICTED_ROLE.AP_APP_ID) WHERE " - + "AP_APP.ID = ? AND AP_APP.TENANT_ID = ? AND AP_APP.STATUS != ?"; + String sql = "SELECT " + + "AP_APP.ID AS APP_ID, " + + "AP_APP.NAME AS APP_NAME, " + + "AP_APP.DESCRIPTION AS APP_DESCRIPTION, " + + "AP_APP.TYPE AS APP_TYPE, " + + "AP_APP.STATUS AS APP_STATUS, " + + "AP_APP.SUB_TYPE AS APP_SUB_TYPE, " + + "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.DESCRIPTION AS RELEASE_DESCRIPTION, " + + "AP_APP_RELEASE.VERSION AS RELEASE_VERSION, " + + "AP_APP_RELEASE.UUID AS RELEASE_UUID, " + + "AP_APP_RELEASE.RELEASE_TYPE AS RELEASE_TYPE, " + + "AP_APP_RELEASE.INSTALLER_LOCATION AS AP_RELEASE_STORED_LOC, " + + "AP_APP_RELEASE.BANNER_LOCATION AS AP_RELEASE_BANNER_LOC, " + + "AP_APP_RELEASE.SC_1_LOCATION AS AP_RELEASE_SC1, " + + "AP_APP_RELEASE.SC_2_LOCATION AS AP_RELEASE_SC2, " + + "AP_APP_RELEASE.SC_3_LOCATION AS AP_RELEASE_SC3, " + + "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, " + + "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, " + + "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, " + + "AP_APP_RELEASE.RATING AS RELEASE_RATING, " + + "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, " + + "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT " + + "FROM AP_APP " + + "INNER JOIN AP_APP_RELEASE ON " + + "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID AND " + + "AP_APP.TENANT_ID = AP_APP_RELEASE.TENANT_ID " + + "WHERE " + + "AP_APP.ID =? AND " + + "AP_APP.TENANT_ID = ?"; stmt = conn.prepareStatement(sql); stmt.setInt(1, applicationId); stmt.setInt(2, tenantId); - stmt.setString(3, AppLifecycleState.REMOVED.toString()); rs = stmt.executeQuery(); - if (log.isDebugEnabled()) { log.debug("Successfully retrieved basic details of the application with the id " + applicationId); } - return Util.loadApplication(rs); - } catch (SQLException e) { throw new ApplicationManagementDAOException( "Error occurred while getting application details with app id " + applicationId + @@ -516,6 +540,8 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (UnexpectedServerErrorException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { Util.cleanupResources(stmt, rs); } @@ -555,10 +581,12 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic } @Override - public ApplicationDTO editApplication(ApplicationDTO application, int tenantId) throws ApplicationManagementDAOException { + public ApplicationDTO editApplication(ApplicationDTO application, int tenantId) + throws ApplicationManagementDAOException { int paramIndex = 1; Connection conn; PreparedStatement stmt = null; + //todo this is wrong ApplicationDTO existingApplication = this.getApplicationById(application.getId(), tenantId); if (existingApplication == null) { @@ -883,7 +911,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + "FROM " + "AP_APP_TAG tag INNER JOIN AP_APP_TAG_MAPPING tag_map ON tag.ID = tag_map.AP_APP_TAG_ID " + "INNER JOIN AP_APP app ON tag_map.AP_APP_ID = app.ID " - + "WHERE app.ID = ? and app.TENANT_ID = ?"; + + "WHERE app.ID = ? AND app.TENANT_ID = ?"; try { conn = this.getDBConnection(); try (PreparedStatement stmt = conn.prepareStatement(sql)){ @@ -915,7 +943,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic + "FROM " + "AP_APP_CATEGORY cat INNER JOIN AP_APP_CATEGORY_MAPPING cat_map ON cat.ID = cat_map.AP_APP_CATEGORY_ID " + "INNER JOIN AP_APP app ON cat_map.AP_APP_ID = app.ID " - + "WHERE app.ID = ? and app.TENANT_ID = ?"; + + "WHERE app.ID = ? AND app.TENANT_ID = ?"; try { conn = this.getDBConnection(); try (PreparedStatement stmt = conn.prepareStatement(sql)){ @@ -1019,7 +1047,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic List applicationReleaseList = new ArrayList<>(); applicationReleaseList.add(appRelease); - application.setApplicationReleases(applicationReleaseList); + application.setApplicationReleaseDTOs(applicationReleaseList); } return application; } catch (SQLException 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 732c3b6e407..9e339956feb 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 @@ -456,35 +456,27 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } @Override - public boolean verifyReleaseExistenceByHash(int appId, String hashVal, int tenantId) throws ApplicationManagementDAOException { + public boolean verifyReleaseExistenceByHash(String hashVal, int tenantId) throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { - log.debug("Verifying application release existence by application id:" + appId - + " and application hash value: " + hashVal); + log.debug("Verifying application release existence by application hash value: " + hashVal); } Connection conn; PreparedStatement stmt = null; ResultSet rs = null; try { conn = this.getDBConnection(); - String sql = - "SELECT AR.ID AS RELEASE_ID FROM AP_APP_RELEASE AS AR WHERE AR.AP_APP_ID = ? AND " - + "AR.APP_HASH_VALUE = ? AND AR.TENANT_ID = ?;"; + String sql = "SELECT AR.ID AS RELEASE_ID FROM AP_APP_RELEASE AS AR WHERE AR.APP_HASH_VALUE = ? AND " + + "AR.TENANT_ID = ?;"; stmt = conn.prepareStatement(sql); - stmt.setInt(1, appId); - stmt.setString(2, hashVal); - stmt.setInt(3, tenantId); + stmt.setString(1, hashVal); + stmt.setInt(2, tenantId); rs = stmt.executeQuery(); - - if (log.isDebugEnabled()) { - log.debug("Successfully retrieved basic details of the application release with the application ID " - + appId + " ApplicationDTO release hash value: " + hashVal); - } return rs.next(); } catch (SQLException e) { throw new ApplicationManagementDAOException( - "Error occurred while getting application release details with app ID: " + appId - + " App release hash value: " + hashVal + " While executing query ", e); + "Error occurred while getting application release details for application release hash value: " + + hashVal + " While executing query ", e); } catch (DBConnectionException e) { throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); } finally { @@ -658,7 +650,8 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } @Override - public boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId) throws ApplicationManagementDAOException { + public boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId, String inactiveState) + throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { log.debug("Verifying application release existence for package name:" + packageName); } @@ -671,7 +664,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements try (PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, packageName); - stmt.setString(2, AppLifecycleState.REMOVED.toString()); + stmt.setString(2, inactiveState); stmt.setInt(3, tenantId); try (ResultSet rs = stmt.executeQuery()) { return rs.next(); 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 1047c0f6e9e..012a35a22d7 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 @@ -73,6 +73,7 @@ import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager; import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; import org.wso2.carbon.device.application.mgt.core.util.Constants; +import org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil; import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.core.dto.DeviceType; @@ -141,8 +142,12 @@ public class ApplicationManagerImpl implements ApplicationManager { + userName); } try { - applicationDTO = addApplicationReleaseArtifacts(appWrapperToAppDTO(applicationWrapper), - applicationArtifact); + applicationDTO = appWrapperToAppDTO(applicationWrapper); + ApplicationReleaseDTO initialApplicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); + applicationDTO.getApplicationReleaseDTOs().clear(); + applicationDTO.getApplicationReleaseDTOs() + .add(addApplicationReleaseArtifacts(applicationDTO.getType(), applicationDTO.getDeviceTypeName(), + initialApplicationReleaseDTO, applicationArtifact)); } catch (UnexpectedServerErrorException e) { String msg = "Error occurred when getting Device Type data."; log.error(msg); @@ -263,7 +268,7 @@ public class ApplicationManagerImpl implements ApplicationManager { log.debug("Creating a new release. App Id:" + appId); } String initialLifecycleState = lifecycleStateManager.getInitialState(); - applicationReleaseDTO = applicationDTO.getApplicationReleases().get(0); + applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); applicationReleaseDTO.setCurrentState(initialLifecycleState); applicationReleaseDTO = this.applicationReleaseDAO.createRelease(applicationReleaseDTO, appId, tenantId); LifecycleStateDTO lifecycleStateDTO = getLifecycleStateInstance(initialLifecycleState, @@ -271,7 +276,7 @@ public class ApplicationManagerImpl implements ApplicationManager { this.lifecycleStateDAO .addLifecycleState(lifecycleStateDTO, appId, applicationReleaseDTO.getUuid(), tenantId); applicationReleaseEntities.add(applicationReleaseDTO); - applicationDTO.setApplicationReleases(applicationReleaseEntities); + applicationDTO.setApplicationReleaseDTOs(applicationReleaseEntities); application = appDtoToAppResponse(applicationDTO); ConnectionManagerUtil.commitDBTransaction(); } @@ -318,20 +323,17 @@ public class ApplicationManagerImpl implements ApplicationManager { } } - private ApplicationDTO addApplicationReleaseArtifacts(ApplicationDTO applicationDTO, - ApplicationArtifact applicationArtifact) throws ResourceManagementException, - ApplicationManagementException { + private ApplicationReleaseDTO addApplicationReleaseArtifacts(String applicationType, String deviceType, + ApplicationReleaseDTO applicationReleaseDTO, ApplicationArtifact applicationArtifact) + throws ResourceManagementException, ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); - List applicationReleaseEntities = new ArrayList<>(); - ApplicationReleaseDTO applicationReleaseDTO; - applicationReleaseDTO = applicationDTO.getApplicationReleases().get(0); String uuid = UUID.randomUUID().toString(); applicationReleaseDTO.setUuid(uuid); // The application executable artifacts such as apks are uploaded. - if (ApplicationType.ENTERPRISE.toString().equals(applicationDTO.getType())) { + if (ApplicationType.ENTERPRISE.toString().equals(applicationType)) { try { byte[] content = IOUtils.toByteArray(applicationArtifact.getInstallerStream()); @@ -339,11 +341,12 @@ public class ApplicationManagerImpl implements ApplicationManager { try (ByteArrayInputStream binary = new ByteArrayInputStream(content)) { ApplicationInstaller applicationInstaller = applicationStorageManager - .getAppInstallerData(binary, applicationDTO.getDeviceTypeName()); + .getAppInstallerData(binary, deviceType); String packagename = applicationInstaller.getPackageName(); ConnectionManagerUtil.getDBConnection(); - if (applicationReleaseDAO.isActiveReleaseExisitForPackageName(packagename, tenantId)) { + if (applicationReleaseDAO.isActiveReleaseExisitForPackageName(packagename, tenantId, + lifecycleStateManager.getEndState())) { String msg = "Application release is already exist for the package name: " + packagename + ". Either you can delete all application releases for package " + packagename + " or " + "you can add this app release as an new application release, under the existing " @@ -353,10 +356,27 @@ public class ApplicationManagerImpl implements ApplicationManager { } applicationReleaseDTO.setVersion(applicationInstaller.getVersion()); applicationReleaseDTO.setPackageName(packagename); + + String md5OfApp = StorageManagementUtil.getMD5(new ByteArrayInputStream(content)); + if (md5OfApp == null) { + String msg = "Error occurred while md5sum value retrieving process: application UUID " + + applicationReleaseDTO.getUuid(); + log.error(msg); + throw new ApplicationStorageManagementException(msg); + } + if (this.applicationReleaseDAO + .verifyReleaseExistenceByHash(md5OfApp, tenantId)) { + throw new BadRequestException( + "Application release exists for the uploaded binary file. Application Type: " + + applicationType + " Device Tyep: " + deviceType); + } + + applicationReleaseDTO.setAppHashValue(md5OfApp); + try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(content)) { applicationReleaseDTO = applicationStorageManager - .uploadReleaseArtifact(applicationReleaseDTO, applicationDTO.getType(), - applicationDTO.getDeviceTypeName(), binaryDuplicate); + .uploadReleaseArtifact(applicationReleaseDTO,applicationType, + deviceType, binaryDuplicate); } } } catch (IOException e) { @@ -377,7 +397,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } finally { ConnectionManagerUtil.closeDBConnection(); } - } else if (ApplicationType.WEB_CLIP.toString().equals(applicationDTO.getType())) { + } else if (ApplicationType.WEB_CLIP.toString().equals(applicationType)) { applicationReleaseDTO.setVersion(Constants.DEFAULT_VERSION); applicationReleaseDTO.setInstallerName(applicationReleaseDTO.getUrl()); // Since WEB CLIP doesn't have an installer, set uuid as has value for WEB CLIP @@ -407,9 +427,7 @@ public class ApplicationManagerImpl implements ApplicationManager { applicationReleaseDTO = applicationStorageManager .uploadImageArtifacts(applicationReleaseDTO, applicationArtifact.getIconStream(), applicationArtifact.getBannerStream(), new ArrayList<>(screenshots.values())); - applicationReleaseEntities.add(applicationReleaseDTO); - applicationDTO.setApplicationReleases(applicationReleaseEntities); - return applicationDTO; + return applicationReleaseDTO; } @Override @@ -528,50 +546,36 @@ public class ApplicationManagerImpl implements ApplicationManager { } } - @Override public ApplicationReleaseDTO createRelease(int applicationId, ApplicationReleaseDTO applicationRelease) + @Override + public ApplicationRelease createRelease(int applicationId, + ApplicationReleaseWrapper applicationReleaseWrapper, ApplicationArtifact applicationArtifact) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); -// validateAppReleasePayload(applicationRelease); + ApplicationRelease applicationRelease; if (log.isDebugEnabled()) { log.debug("ApplicationDTO release request is received for the application id: " + applicationId); } + try { ConnectionManagerUtil.beginDBTransaction(); - ApplicationDTO existingApplication = this.applicationDAO.getApplicationById(applicationId, tenantId); - if (existingApplication == null) { - throw new NotFoundException("Couldn't find application for the application Id: " + applicationId); + ApplicationDTO applicationDTO = this.applicationDAO.getApplicationById(applicationId, tenantId); + if (applicationDTO == null) { + String msg = "Couldn't find application for the application Id: " + applicationId; + log.error(msg); + throw new NotFoundException(msg); } + ApplicationReleaseDTO applicationReleaseDTO = addApplicationReleaseArtifacts(applicationDTO.getType(), + applicationDTO.getDeviceTypeName(), releaseWrapperToReleaseDTO(applicationReleaseWrapper), + applicationArtifact); - // todo check whether admin or app creator. - if (!isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION)) { - String msg = "You don't have permission to create application release for the application id: " - + applicationId - + ". In order to create ann new application realse, you should be either ADMIN user or the application created user."; - throw new ForbiddenException(msg); - } - if (!existingApplication.getUnrestrictedRoles().isEmpty() && !isRoleExists( - existingApplication.getUnrestrictedRoles(), userName)) { - String msg = "ApplicationDTO is visible to limited roles and those roles are not assigned to " + userName; - throw new ApplicationManagementException(msg); - } - if (this.applicationReleaseDAO - .verifyReleaseExistenceByHash(applicationId, applicationRelease.getAppHashValue(), tenantId)) { - throw new BadRequestException("ApplicationDTO release exists for the application Id: " + applicationId - + " and uploaded binary file"); - } - String packageName = this.applicationReleaseDAO.getPackageName(applicationId, tenantId); - if (packageName != null && !packageName.equals(applicationRelease.getPackageName())) { - throw new BadRequestException( - "Package name in the payload is different from the existing package name of other application" + - " releases."); - } - applicationRelease = this.applicationReleaseDAO - .createRelease(applicationRelease, existingApplication.getId(), tenantId); - LifecycleStateDTO lifecycleState = getLifecycleStateInstance(AppLifecycleState.CREATED.toString(), - AppLifecycleState.CREATED.toString()); + String initialstate = lifecycleStateManager.getInitialState(); + applicationReleaseDTO.setCurrentState(initialstate); + LifecycleStateDTO lifecycleState = getLifecycleStateInstance(initialstate, initialstate); this.lifecycleStateDAO - .addLifecycleState(lifecycleState, applicationId, applicationRelease.getUuid(), tenantId); + .addLifecycleState(lifecycleState, applicationId, applicationReleaseDTO.getUuid(), tenantId); + applicationReleaseDTO = this.applicationReleaseDAO + .createRelease(applicationReleaseDTO, applicationDTO.getId(), tenantId); + applicationRelease = releaseDtoToRelease(applicationReleaseDTO); ConnectionManagerUtil.commitDBTransaction(); return applicationRelease; } catch (TransactionManagementException e) { @@ -592,36 +596,43 @@ public class ApplicationManagerImpl implements ApplicationManager { ConnectionManagerUtil.rollbackDBTransaction(); throw new ApplicationManagementException( "Error occurred while adding new application release for application " + applicationId, e); - } catch (UserStoreException e) { + } catch (ResourceManagementException e) { ConnectionManagerUtil.rollbackDBTransaction(); - throw new ApplicationManagementException( - "Error occurred whecn checking whether user is admin user or not. ApplicationDTO release: " - + applicationId, e); + String msg = + "Error occurred while uploading application release artifacts. Application ID: " + applicationId; + throw new ApplicationManagementException(msg, e); } finally { ConnectionManagerUtil.closeDBConnection(); } } - @Override public ApplicationDTO getApplicationById(int appId, String state) throws ApplicationManagementException { + @Override + public ApplicationDTO getApplicationById(int appId, String state) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); ApplicationDTO application; boolean isAppAllowed = false; - List applicationReleases; try { ConnectionManagerUtil.openDBConnection(); application = this.applicationDAO.getApplicationById(appId, tenantId); if (application == null) { throw new NotFoundException("Couldn't find an application for application Id: " + appId); } + + List tags = this.applicationDAO.getAppTags(appId, tenantId); + List categories = this.applicationDAO.getAppCategories(appId, tenantId); + application.setTags(tags); + //todo when support to add multiple categories this has to be changed + if (!categories.isEmpty()){ + application.setAppCategory(categories.get(0)); + } if (isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION)) { - applicationReleases = getReleases(application, state); - application.setApplicationReleases(applicationReleases); return application; } - if (!application.getUnrestrictedRoles().isEmpty()) { - if (isRoleExists(application.getUnrestrictedRoles(), userName)) { + List unrestrictedRoles = this.visibilityDAO.getUnrestrictedRoles(appId, tenantId); + if (!unrestrictedRoles.isEmpty()) { + if (isRoleExists(unrestrictedRoles, userName)) { isAppAllowed = true; } } else { @@ -629,10 +640,11 @@ public class ApplicationManagerImpl implements ApplicationManager { } if (!isAppAllowed) { - return null; + String msg = "You are trying to access visibility restricted application. You don't have required " + + "roles to view this application,"; + log.error(msg); + throw new ForbiddenException(msg); } - applicationReleases = getReleases(application, state); - application.setApplicationReleases(applicationReleases); return application; } catch (UserStoreException e) { throw new ApplicationManagementException( @@ -657,7 +669,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } if (isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION)) { applicationReleases = getReleases(application, state); - application.setApplicationReleases(applicationReleases); + application.setApplicationReleaseDTOs(applicationReleases); return application; } @@ -673,7 +685,7 @@ public class ApplicationManagerImpl implements ApplicationManager { return null; } applicationReleases = getReleases(application, state); - application.setApplicationReleases(applicationReleases); + application.setApplicationReleaseDTOs(applicationReleases); return application; } catch (UserStoreException e) { throw new ApplicationManagementException( @@ -737,7 +749,7 @@ public class ApplicationManagerImpl implements ApplicationManager { application = this.applicationDAO.getApplication(appName, appType, tenantId); if (isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION)) { applicationReleases = getReleases(application, null); - application.setApplicationReleases(applicationReleases); + application.setApplicationReleaseDTOs(applicationReleases); return application; } @@ -754,7 +766,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } applicationReleases = getReleases(application, null); - application.setApplicationReleases(applicationReleases); + application.setApplicationReleaseDTOs(applicationReleases); return application; } catch (UserStoreException e) { throw new ApplicationManagementException( @@ -1713,6 +1725,12 @@ public class ApplicationManagerImpl implements ApplicationManager { public void validateReleaseCreatingRequest(ApplicationReleaseWrapper applicationReleaseWrapper, String applicationType) throws RequestValidatingException { + if (applicationReleaseWrapper == null){ + String msg = "Application Release shouldn't be null."; + log.error(msg); + throw new RequestValidatingException(msg); + } + if (ApplicationType.WEB_CLIP.toString().equals(applicationType)) { UrlValidator urlValidator = new UrlValidator(); if (StringUtils @@ -1784,7 +1802,7 @@ public class ApplicationManagerImpl implements ApplicationManager { applicationDTO.setDeviceTypeName(deviceType.getName()); List applicationReleaseEntities = applicationWrapper.getApplicationReleaseWrappers() .stream().map(this::releaseWrapperToReleaseDTO).collect(Collectors.toList()); - applicationDTO.setApplicationReleases(applicationReleaseEntities); + applicationDTO.setApplicationReleaseDTOs(applicationReleaseEntities); return applicationDTO; } @@ -1813,7 +1831,7 @@ public class ApplicationManagerImpl implements ApplicationManager { application.setTags(applicationDTO.getTags()); application.setUnrestrictedRoles(applicationDTO.getUnrestrictedRoles()); application.setDeviceType(applicationDTO.getDeviceTypeName()); - List applicationReleases = applicationDTO.getApplicationReleases() + List applicationReleases = applicationDTO.getApplicationReleaseDTOs() .stream().map(this::releaseDtoToRelease).collect(Collectors.toList()); application.setApplicationReleases(applicationReleases); return application; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java index 1961f78e91c..22cf8dc004a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java @@ -208,22 +208,13 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager String deviceType, InputStream binaryFile) throws ResourceManagementException { try { String artifactDirectoryPath; - String md5OfApp; String artifactPath; byte [] content = IOUtils.toByteArray(binaryFile); - md5OfApp = getMD5(new ByteArrayInputStream(content)); - if (md5OfApp == null) { - String msg = "Error occurred while md5sum value retrieving process: application UUID " - + applicationReleaseDTO.getUuid(); - log.error(msg); - throw new ApplicationStorageManagementException(msg); - } - artifactDirectoryPath = storagePath + md5OfApp; + artifactDirectoryPath = storagePath + applicationReleaseDTO.getAppHashValue(); StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath); artifactPath = artifactDirectoryPath + File.separator + applicationReleaseDTO.getInstallerName(); saveFile(new ByteArrayInputStream(content), artifactPath); - applicationReleaseDTO.setAppHashValue(md5OfApp); } catch (IOException e) { String msg = "IO Exception while saving the release artifacts in the server for the application UUID " + applicationReleaseDTO.getUuid(); @@ -283,17 +274,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager } } - private String getMD5(InputStream binaryFile) throws ApplicationStorageManagementException { - String md5; - try { - md5 = DigestUtils.md5Hex(binaryFile); - } catch (IOException e) { - throw new ApplicationStorageManagementException - ("IO Exception while trying to get the md5sum value of application"); - } - return md5; - } - private synchronized Map getIPAInfo(File ipaFile) throws ApplicationStorageManagementException { Map ipaInfo = new HashMap<>(); 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 e5fa42ab12c..cc228f9d1f5 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 @@ -103,7 +103,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - int applicationReleaseId = application.getApplicationReleases().get(0).getId(); + int applicationReleaseId = application.getApplicationReleaseDTOs().get(0).getId(); try { ConnectionManagerUtil.openDBConnection(); @@ -144,7 +144,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - int applicationReleaseId = application.getApplicationReleases().get(0).getId(); + int applicationReleaseId = application.getApplicationReleaseDTOs().get(0).getId(); try { ConnectionManagerUtil.openDBConnection(); @@ -188,7 +188,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - int applicationReleaseId = application.getApplicationReleases().get(0).getId(); + int applicationReleaseId = application.getApplicationReleaseDTOs().get(0).getId(); try { ConnectionManagerUtil.openDBConnection(); @@ -239,7 +239,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - int applicationReleaseId = application.getApplicationReleases().get(0).getId(); + int applicationReleaseId = application.getApplicationReleaseDTOs().get(0).getId(); try { ConnectionManagerUtil.openDBConnection(); List deviceList = new ArrayList<>(); @@ -266,8 +266,8 @@ public class SubscriptionManagerImpl implements SubscriptionManager { //todo: generate operation payload correctly for all types of devices. operation.setPayLoad( - "{'type':'enterprise', 'url':'" + application.getApplicationReleases().get(0).getInstallerName() - + "', 'app':'" + application.getApplicationReleases().get(0).getUuid() + "'}"); + "{'type':'enterprise', 'url':'" + application.getApplicationReleaseDTOs().get(0).getInstallerName() + + "', 'app':'" + application.getApplicationReleaseDTOs().get(0).getUuid() + "'}"); return operation; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java index 0aae14620a1..7539103c08c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java @@ -19,10 +19,12 @@ package org.wso2.carbon.device.application.mgt.core.util; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.application.mgt.common.ImageArtifact; +import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; import java.io.File; @@ -120,4 +122,15 @@ public class StorageManagementUtil { throw new IOException(msg); } } + + public static String getMD5(InputStream binaryFile) throws ApplicationStorageManagementException { + String md5; + try { + md5 = DigestUtils.md5Hex(binaryFile); + } catch (IOException e) { + throw new ApplicationStorageManagementException + ("IO Exception while trying to get the md5sum value of application"); + } + return md5; + } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.handler/src/main/java/org/wso2/carbon/device/application/mgt/handler/util/HandlerConstants.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.handler/src/main/java/org/wso2/carbon/device/application/mgt/handler/util/HandlerConstants.java index fcfd53c9265..2dfd677e037 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.handler/src/main/java/org/wso2/carbon/device/application/mgt/handler/util/HandlerConstants.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.handler/src/main/java/org/wso2/carbon/device/application/mgt/handler/util/HandlerConstants.java @@ -20,7 +20,7 @@ package org.wso2.carbon.device.application.mgt.handler.util; public class HandlerConstants { public static final String PUBLISHER_APPLICATION_NAME = "application-mgt-publisher"; public static final String APP_REG_ENDPOINT = "/api-application-registration/register"; - public static final String UI_CONFIG_ENDPOINT = "/api/application-mgt/v1.0/app-mgt/ui-config"; + public static final String UI_CONFIG_ENDPOINT = "/api/application-mgt/v1.0/config/ui-config"; public static final String TOKEN_ENDPOINT = "/oauth2/token"; public static final String AUTHORIZATION = "Authorization"; public static final String BASIC = "Basic "; 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/ApplicationManagementAPI.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/ApplicationManagementAPI.java index 7808f5ee084..129de52ce4d 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/ApplicationManagementAPI.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/ApplicationManagementAPI.java @@ -36,6 +36,8 @@ import org.wso2.carbon.device.application.mgt.common.*; import org.wso2.carbon.device.application.mgt.common.ErrorResponse; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; +import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease; +import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; import java.util.List; @@ -155,9 +157,12 @@ public interface ApplicationManagementAPI { code = 200, message = "OK. \n Successfully retrieved relevant application.", response = ApplicationDTO.class), + @ApiResponse( + code = 403, + message = "Don't have permission to access the application"), @ApiResponse( code = 404, - message = "ApplicationDTO not found"), + message = "Application not found"), @ApiResponse( code = 500, message = "Internal Server Error. \n Error occurred while getting relevant application.", @@ -290,78 +295,78 @@ public interface ApplicationManagementAPI { @Multipart(value = "screenshot3") Attachment screenshot3 ); -// @POST -// @Produces(MediaType.APPLICATION_JSON) -// @Consumes("multipart/mixed") -// @Path("/{deviceType}/{appType}/{appId}") -// @ApiOperation( -// consumes = MediaType.APPLICATION_JSON, -// produces = MediaType.APPLICATION_JSON, -// httpMethod = "POST", -// value = "Create an application", -// notes = "This will create a new application", -// tags = "ApplicationDTO Management", -// extensions = { -// @Extension(properties = { -// @ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update") -// }) -// } -// ) -// @ApiResponses( -// value = { -// @ApiResponse( -// code = 201, -// message = "OK. \n Successfully created an application.", -// response = Application.class), -// @ApiResponse( -// code = 400, -// message = "Bad Request. \n " + -// "ApplicationDTO creating payload contains unacceptable or vulnerable data"), -// @ApiResponse( -// code = 500, -// message = "Internal Server Error. \n Error occurred while creating the application.", -// response = ErrorResponse.class) -// }) -// Response createRelease( -// @PathParam("deviceType") String deviceType, -// @PathParam("appId") String appType, -// @PathParam("appId") int appId, -// @ApiParam( -// name = "applicationRelease", -// value = "The application release that need to be created.", -// required = true) -// @Multipart("applicationRelease") ApplicationReleaseDTO applicationRelease, -// @ApiParam( -// name = "binaryFile", -// value = "Binary file of uploading application", -// required = true) -// @Multipart(value = "binaryFile") Attachment binaryFile, -// @ApiParam( -// name = "icon", -// value = "Icon of the uploading application", -// required = true) -// @Multipart(value = "icon") Attachment iconFile, -// @ApiParam( -// name = "banner", -// value = "Banner of the uploading application", -// required = true) -// @Multipart(value = "banner") Attachment bannerFile, -// @ApiParam( -// name = "screenshot1", -// value = "Screen Shots of the uploading application", -// required = true) -// @Multipart(value = "screenshot1") Attachment screenshot1, -// @ApiParam( -// name = "screenshot2", -// value = "Screen Shots of the uploading application", -// required = false) -// @Multipart(value = "screenshot2") Attachment screenshot2, -// @ApiParam( -// name = "screenshot3", -// value = "Screen Shots of the uploading application", -// required = false) -// @Multipart(value = "screenshot3") Attachment screenshot3 -// ); + @POST + @Produces(MediaType.APPLICATION_JSON) + @Consumes("multipart/mixed") + @Path("/{deviceType}/{appType}/{appId}") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Create an application", + notes = "This will create a new application", + tags = "ApplicationDTO Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 201, + message = "OK. \n Successfully created an application.", + response = ApplicationRelease.class), + @ApiResponse( + code = 400, + message = "Bad Request. \n " + + "ApplicationDTO creating payload contains unacceptable or vulnerable data"), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Error occurred while creating the application.", + response = ErrorResponse.class) + }) + Response createRelease( + @PathParam("deviceType") String deviceType, + @PathParam("appId") String appType, + @PathParam("appId") int appId, + @ApiParam( + name = "applicationRelease", + value = "The application release that need to be created.", + required = true) + @Multipart("applicationRelease") ApplicationReleaseWrapper applicationReleaseWrapper, + @ApiParam( + name = "binaryFile", + value = "Binary file of uploading application", + required = true) + @Multipart(value = "binaryFile") Attachment binaryFile, + @ApiParam( + name = "icon", + value = "Icon of the uploading application", + required = true) + @Multipart(value = "icon") Attachment iconFile, + @ApiParam( + name = "banner", + value = "Banner of the uploading application", + required = true) + @Multipart(value = "banner") Attachment bannerFile, + @ApiParam( + name = "screenshot1", + value = "Screen Shots of the uploading application", + required = true) + @Multipart(value = "screenshot1") Attachment screenshot1, + @ApiParam( + name = "screenshot2", + value = "Screen Shots of the uploading application", + required = false) + @Multipart(value = "screenshot2") Attachment screenshot2, + @ApiParam( + name = "screenshot3", + value = "Screen Shots of the uploading application", + required = false) + @Multipart(value = "screenshot3") Attachment screenshot3 + ); @DELETE @Consumes("application/json") 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/ApplicationManagementAPIImpl.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/ApplicationManagementAPIImpl.java index 196339caf90..4b096880b82 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/ApplicationManagementAPIImpl.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/ApplicationManagementAPIImpl.java @@ -29,6 +29,8 @@ 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.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.wrapper.ApplicationReleaseWrapper; 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; @@ -109,7 +111,12 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { String msg = "ApplicationDTO with application id: " + appId + " not found"; log.error(msg, e); return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); - } catch (ApplicationManagementException e) { + } catch(ForbiddenException e){ + String msg = "You don't have permission to access the application. application id: " + appId; + log.error(msg); + return Response.status(Response.Status.FORBIDDEN).entity(msg).build(); + } + catch (ApplicationManagementException e) { String msg = "Error occurred while getting application with the id " + appId; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); @@ -167,91 +174,56 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { } } -// @POST -// @Consumes("multipart/mixed") -// @Path("/{deviceType}/{appType}/{appId}") -// public Response createRelease( -// @PathParam("deviceType") String deviceType, -// @PathParam("appType") String appType, -// @PathParam("appId") int appId, -// @Multipart("applicationRelease") ApplicationReleaseDTO applicationRelease, -// @Multipart("binaryFile") Attachment binaryFile, -// @Multipart("icon") Attachment iconFile, -// @Multipart("banner") Attachment bannerFile, -// @Multipart("screenshot1") Attachment screenshot1, -// @Multipart("screenshot2") Attachment screenshot2, -// @Multipart("screenshot3") Attachment screenshot3) { -// ApplicationManager applicationManager = APIUtil.getApplicationManager(); -// ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager(); -// InputStream iconFileStream; -// InputStream bannerFileStream; -// List attachments = new ArrayList<>(); -// List attachmentList = new ArrayList<>(); -// attachmentList.add(screenshot1); -// if (screenshot2 != null) { -// attachmentList.add(screenshot2); -// } -// if (screenshot3 != null) { -// attachmentList.add(screenshot3); -// } -// -// try { -// applicationManager -// .validateReleaseCreatingRequest(applicationRelease, appType, binaryFile, iconFile, bannerFile, -// attachmentList); -// -// // The application executable artifacts such as apks are uploaded. -// if (!ApplicationType.ENTERPRISE.toString().equals(appType)) { -// applicationRelease = applicationStorageManager -// .uploadReleaseArtifact(applicationRelease, appType, deviceType, null); -// } else { -// applicationRelease = applicationStorageManager -// .uploadReleaseArtifact(applicationRelease, appType, deviceType, -// binaryFile.getDataHandler().getInputStream()); -// if (applicationRelease.getInstallerName() == null || applicationRelease.getAppHashValue() == null) { -// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); -// } -// } -// -// iconFileStream = iconFile.getDataHandler().getInputStream(); -// bannerFileStream = bannerFile.getDataHandler().getInputStream(); -// -// for (Attachment screenshot : attachmentList) { -// attachments.add(screenshot.getDataHandler().getInputStream()); -// } -// -// // Upload images -// applicationRelease = applicationStorageManager -// .uploadImageArtifacts(applicationRelease, iconFileStream, bannerFileStream, attachments); -// applicationRelease.setUuid(UUID.randomUUID().toString()); -// -// // Created new application release entry -// ApplicationReleaseDTO release = applicationManager.createRelease(appId, applicationRelease); -// if (release != null) { -// return Response.status(Response.Status.CREATED).entity(release).build(); -// } else { -// log.error("ApplicationDTO Creation Failed"); -// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); -// } -// } catch (ApplicationManagementException e) { -// String msg = "Error occurred while creating the application"; -// log.error(msg, e); -// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); -// } catch (ResourceManagementException e) { -// String msg = "Error occurred while uploading the releases artifacts of the application ID: " + appId; -// log.error(msg, e); -// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); -// } catch (IOException e) { -// String msg = "Error while uploading binary file and resources for the application release of the " -// + "application ID: " + appId; -// log.error(msg, e); -// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); -// } catch (RequestValidatingException e) { -// String msg = "Error occurred while handling the application creating request"; -// log.error(msg, e); -// return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); -// } -// } + @POST + @Consumes("multipart/mixed") + @Path("/{deviceType}/{appType}/{appId}") + public Response createRelease( + @PathParam("deviceType") String deviceType, + @PathParam("appType") String appType, + @PathParam("appId") int appId, + @Multipart("applicationRelease") ApplicationReleaseWrapper applicationReleaseWrapper, + @Multipart("binaryFile") Attachment binaryFile, + @Multipart("icon") Attachment iconFile, + @Multipart("banner") Attachment bannerFile, + @Multipart("screenshot1") Attachment screenshot1, + @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); + } + + try { + applicationManager.validateReleaseCreatingRequest(applicationReleaseWrapper, appType); + applicationManager.isValidAttachmentSet(binaryFile, iconFile, bannerFile, attachmentList, appType); + + // Created new application release + ApplicationRelease release = applicationManager.createRelease(appId, applicationReleaseWrapper, + constructApplicationArtifact(binaryFile, iconFile, bannerFile, attachmentList)); + if (release != null) { + return Response.status(Response.Status.CREATED).entity(release).build(); + } else { + log.error("ApplicationDTO Creation Failed"); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } + } catch (ApplicationManagementException e) { + String msg = "Error occurred while creating the application"; + log.error(msg, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); + } catch (RequestValidatingException e) { + String msg = "Error occurred while handling the application creating request"; + log.error(msg, e); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } + } @Override @PUT