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 cf6e9904b72..958d613513d 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 @@ -21,7 +21,6 @@ package org.wso2.carbon.device.application.mgt.common.services; import org.apache.cxf.jaxrs.ext.multipart.Attachment; import org.wso2.carbon.device.application.mgt.common.ApplicationArtifact; import org.wso2.carbon.device.application.mgt.common.LifecycleChanger; -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; @@ -32,7 +31,7 @@ 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.response.Category; import org.wso2.carbon.device.application.mgt.common.response.Tag; -import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper; +import org.wso2.carbon.device.application.mgt.common.wrapper.EntAppReleaseWrapper; 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.common.wrapper.PublicAppWrapper; @@ -53,7 +52,7 @@ public interface ApplicationManager { * @return {@link Application} * @throws ApplicationManagementException Catch all other throwing exceptions and throw {@link ApplicationManagementException} */ - Application createApplication(ApplicationWrapper applicationWrapper, ApplicationArtifact applicationArtifact) + Application createEntApp(ApplicationWrapper applicationWrapper, ApplicationArtifact applicationArtifact) throws ApplicationManagementException; Application createWebClip(WebAppWrapper webAppWrapper, ApplicationArtifact applicationArtifact) @@ -169,36 +168,33 @@ public interface ApplicationManager { * To update release images. * * @param deviceType Application artifact compatible device type name. - * @param appType Type of the application. * @param uuid uuid of the ApplicationDTO * @param applicationArtifact Application artifact that contains names and input streams of the application artifacts. * @throws ApplicationManagementException ApplicationDTO Management Exception. */ - void updateApplicationArtifact(String deviceType, String appType, String uuid, + void updateApplicationArtifact(String deviceType, String uuid, ApplicationArtifact applicationArtifact) throws ApplicationManagementException; /** * To create an application release for an ApplicationDTO. * * @param applicationId ID of the ApplicationDTO - * @param applicationReleaseWrapper ApplicatonRelease that need to be be created. + * @param entAppReleaseWrapper ApplicatonRelease that need to be be created. * @return the unique id of the application release, if the application release succeeded else -1 */ - ApplicationRelease createEntAppRelease(int applicationId, ApplicationReleaseWrapper applicationReleaseWrapper, + ApplicationRelease createEntAppRelease(int applicationId, EntAppReleaseWrapper entAppReleaseWrapper, ApplicationArtifact applicationArtifact) throws ApplicationManagementException; /*** * * @param deviceType Device type which is supported for the Application. - * @param applicationType Application Type * @param releaseUuid UUID of the application release. - * @param applicationReleaseWrapper {@link ApplicationReleaseDTO} + * @param entAppReleaseWrapper {@link ApplicationReleaseDTO} * @param applicationArtifact {@link ApplicationArtifact} * @return If the application release is updated correctly True returns, otherwise retuen False */ - boolean updateRelease(String deviceType, String applicationType, String releaseUuid, - ApplicationReleaseWrapper applicationReleaseWrapper, ApplicationArtifact applicationArtifact) - throws ApplicationManagementException; + boolean updateEntAppRelease(String deviceType, String releaseUuid, EntAppReleaseWrapper entAppReleaseWrapper, + ApplicationArtifact applicationArtifact) throws ApplicationManagementException; /*** * To validate the application creating request diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationStorageManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationStorageManager.java index 759e6136283..5e86145584c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationStorageManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationStorageManager.java @@ -42,14 +42,6 @@ public interface ApplicationStorageManager { ApplicationReleaseDTO uploadImageArtifacts(ApplicationReleaseDTO applicationRelease, InputStream iconFile, InputStream bannerFile, List screenshots) throws ResourceManagementException; - /** - * To upload image artifacts related with an ApplicationDTO. - * - * @param applicationRelease Release of the application - * @throws ResourceManagementException Resource Management Exception. - */ - void deleteImageArtifacts(ApplicationReleaseDTO applicationRelease) throws ResourceManagementException; - ApplicationInstaller getAppInstallerData(InputStream binaryFile, String deviceType) throws ApplicationStorageManagementException; @@ -58,12 +50,11 @@ public interface ApplicationStorageManager { * To upload release artifacts for an ApplicationDTO. * * @param applicationRelease ApplicationDTO Release Object. - * @param appType ApplicationDTO Type. * @param deviceType Compatible device tipe of the application. * @param binaryFile Binary File for the release. * @throws ResourceManagementException Resource Management Exception. */ - ApplicationReleaseDTO uploadReleaseArtifact(ApplicationReleaseDTO applicationRelease, String appType, String deviceType, + ApplicationReleaseDTO uploadReleaseArtifact(ApplicationReleaseDTO applicationRelease, String deviceType, InputStream binaryFile) throws ResourceManagementException; /** @@ -79,10 +70,9 @@ public interface ApplicationStorageManager { /** * To delete the artifacts related with particular ApplicationDTO Release. * - * @param directoryPath Hash value of the application artifact. * @throws ApplicationStorageManagementException Not Found Exception. */ - void deleteApplicationReleaseArtifacts(String directoryPath) throws ApplicationStorageManagementException; + void deleteAppReleaseArtifact(String appReleaseHashVal, String fileName) throws ApplicationStorageManagementException; /** * To delete all release artifacts related with particular ApplicationDTO Release. diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/SubscriptionManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/SubscriptionManager.java index e1c10ea9a9c..8cb861dc29f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/SubscriptionManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/SubscriptionManager.java @@ -27,6 +27,6 @@ import java.util.List; * This interface manages all the operations related with ApplicationDTO Subscription. */ public interface SubscriptionManager { - ApplicationInstallResponse performBulkAppInstallation(String applicationUUID, List params, String subType, + ApplicationInstallResponse performBulkAppOperation(String applicationUUID, List params, String subType, String action) throws ApplicationManagementException; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationWrapper.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationWrapper.java index 706aae0dc06..02ef3a05f32 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationWrapper.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationWrapper.java @@ -76,11 +76,11 @@ public class ApplicationWrapper { @NotNull private String deviceType; - @ApiModelProperty(name = "applicationReleaseWrappers", + @ApiModelProperty(name = "entAppReleaseWrappers", value = "List of application releases", required = true) @NotNull - private List applicationReleaseWrappers; + private List entAppReleaseWrappers; public String getName() { @@ -107,10 +107,10 @@ public class ApplicationWrapper { public void setPaymentCurrency(String paymentCurrency) { this.paymentCurrency = paymentCurrency; } - public List getApplicationReleaseWrappers() { return applicationReleaseWrappers; } + public List getEntAppReleaseWrappers() { return entAppReleaseWrappers; } - public void setApplicationReleaseWrappers(List applicationReleaseWrappers) { - this.applicationReleaseWrappers = applicationReleaseWrappers; } + public void setEntAppReleaseWrappers(List entAppReleaseWrappers) { + this.entAppReleaseWrappers = entAppReleaseWrappers; } public List getUnrestrictedRoles() { return unrestrictedRoles; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationReleaseWrapper.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/EntAppReleaseWrapper.java similarity index 98% rename from components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationReleaseWrapper.java rename to components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/EntAppReleaseWrapper.java index 4314be9659e..5a8bcce7378 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationReleaseWrapper.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/EntAppReleaseWrapper.java @@ -22,7 +22,7 @@ import io.swagger.annotations.ApiModelProperty; import javax.validation.constraints.NotNull; @ApiModel(value = "ApplicationReleaseDTO", description = "This class holds the details when releasing an ApplicationDTO to application store") -public class ApplicationReleaseWrapper { +public class EntAppReleaseWrapper { @ApiModelProperty(name = "description", value = "Description of the application release") 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 e289e58597c..9e195b156f7 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 @@ -157,11 +157,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 releaseUuid ID of the application. * @param tenantId Tenant Id * @throws ApplicationManagementDAOException Application Management DAO Exception. */ - String getPackageName(int appId, int tenantId) throws ApplicationManagementDAOException; + String getPackageName(String releaseUuid, int tenantId) throws ApplicationManagementDAOException; /** * To verify whether application release exist or not for given application 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/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 0e77e38b8a9..e0280c3d75f 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 @@ -67,13 +67,13 @@ public interface SubscriptionDAO { Map getDeviceSubscriptions(List deviceIds, int tenantId) throws ApplicationManagementDAOException; - List getSubscribedUsernames(List users, int tenantId) throws + List getSubscribedUserNames(List users, int tenantId) throws ApplicationManagementDAOException; - List getSubscribedRolenames(List roles, int tenantId) throws + List getSubscribedRoleNames(List roles, int tenantId) throws ApplicationManagementDAOException; - List getSubscribedGroupnames(List groups, int tenantId) throws + List getSubscribedGroupNames(List groups, int tenantId) throws ApplicationManagementDAOException; void updateSubscriptions(int tenantId, String updateBy, List paramList, @@ -81,5 +81,6 @@ public interface SubscriptionDAO { List getSubscribedDeviceIds(List deviceIds, int tenantId) throws ApplicationManagementDAOException; + void updateDeviceSubStatus (int operationId, String status, int tenantcId) 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 fca382660c8..33bed23875e 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 @@ -602,39 +602,39 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements } @Override - public String getPackageName(int appId, int tenantId) throws ApplicationManagementDAOException { + public String getPackageName(String releaseUuid, int tenantId) throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { - log.debug("Getting package name of the application release by application id:" + appId); + log.debug("Getting package name of the application release by application id:" + releaseUuid); } Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; try { conn = this.getDBConnection(); - String sql = "SELECT AR.PACKAGE_NAME AS PACKAGE_NAME FROM AP_APP_RELEASE AS AR WHERE AR.AP_APP_ID = ? " - + "AND AR.TENANT_ID = ? LIMIT 1;"; - - stmt = conn.prepareStatement(sql); - stmt.setInt(1, appId); - stmt.setInt(2, tenantId); - rs = stmt.executeQuery(); - - if (log.isDebugEnabled()) { - log.debug("Successfully retrieved package name of the application release with the application ID " - + appId); - } - if (rs.next()){ - return rs.getString("PACKAGE_NAME"); + String sql = "SELECT " + + "AR.PACKAGE_NAME AS PACKAGE_NAME " + + "FROM AP_APP_RELEASE AS AR " + + "WHERE AR.UUID = ? " + + "AND AR.TENANT_ID = ?"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)){ + stmt.setString(1, releaseUuid); + stmt.setInt(2, tenantId); + try (ResultSet rs = stmt.executeQuery()){ + if (log.isDebugEnabled()) { + log.debug("Successfully retrieved package name of the application release with the UUID: " + + releaseUuid); + } + if (rs.next()){ + return rs.getString("PACKAGE_NAME"); + } + return null; + } } - return null; } catch (SQLException e) { throw new ApplicationManagementDAOException( - "Error occurred while getting package name of the application release with app ID: " + appId, e); + "Error occurred while getting package name of the application release with app ID: " + releaseUuid, e); } catch (DBConnectionException e) { throw new ApplicationManagementDAOException( "Error occurred while obtaining the DB connection to get application release package name.", e); - } finally { - DAOUtil.cleanupResources(stmt, rs); } } 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/subscription/GenericSubscriptionDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java index 26984eeea06..365c05fca9e 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java @@ -368,7 +368,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc } @Override - public List getSubscribedUsernames(List users, int tenantId) + public List getSubscribedUserNames(List users, int tenantId) throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { log.debug("Request received in DAO Layer to get already subscribed users for given list of user names."); @@ -406,7 +406,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc } @Override - public List getSubscribedRolenames(List roles, int tenantId) + public List getSubscribedRoleNames(List roles, int tenantId) throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { log.debug( @@ -445,7 +445,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc } @Override - public List getSubscribedGroupnames(List groups, int tenantId) + public List getSubscribedGroupNames(List groups, int tenantId) throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { log.debug("Request received in DAO Layer to get already subscribed groups for given list of group names."); @@ -482,7 +482,8 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc } } - @Override public List getSubscribedDeviceIds(List deviceIds, int tenantId) + @Override + public List getSubscribedDeviceIds(List deviceIds, int tenantId) throws ApplicationManagementDAOException { if (log.isDebugEnabled()) { log.debug("Request received to DAO Layer to get already subscribed dvice Ids for given list of device Ids."); @@ -560,6 +561,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc stmt.setString(3, username); stmt.setInt(4, releaseId); stmt.setInt(5, tenantId); + stmt.addBatch(); } stmt.executeBatch(); } @@ -573,4 +575,33 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc throw new ApplicationManagementDAOException(msg, e); } } + + @Override + public void updateDeviceSubStatus (int operationId, String status, int tenantId) throws ApplicationManagementDAOException { + Connection conn; + try { + conn = this.getDBConnection(); + String sql = "UPDATE AP_DEVICE_SUBSCRIPTION " + + "SET STATUS = ? " + + "WHERE " + + "AP_APP_RELEASE_ID = (SELECT AP_DEVICE_SUBSCRIPTION_ID FROM AP_APP_SUB_OP_MAPPING WHERE OPERATION_ID = ?) " + + "AND TENANT_ID = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, status); + stmt.setInt(2, operationId); + stmt.setInt(3, tenantId); + stmt.executeUpdate(); + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the DB connection to update the subscription status of the " + + "device subscription."; + log.error(msg); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred when obtaining database connection for updating the subscription status of the " + + "device subscription."; + 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/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 3fa843c234e..61c4f325b37 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 @@ -56,7 +56,7 @@ import org.wso2.carbon.device.application.mgt.common.response.Category; import org.wso2.carbon.device.application.mgt.common.response.Tag; 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.EntAppReleaseWrapper; 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.common.wrapper.PublicAppReleaseWrapper; @@ -131,7 +131,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } @Override - public Application createApplication(ApplicationWrapper applicationWrapper, + public Application createEntApp(ApplicationWrapper applicationWrapper, ApplicationArtifact applicationArtifact) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); @@ -143,29 +143,106 @@ public class ApplicationManagerImpl implements ApplicationManager { ApplicationDTO applicationDTO = APIUtil.convertToAppDTO(applicationWrapper); + ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); + if (!isValidOsVersions(applicationReleaseDTO.getSupportedOsVersions(), applicationWrapper.getDeviceType())) { + String msg = "You are trying to create application which has an application release contains invalid or " + + "unsupported OS versions in the supportedOsVersions section. Hence, please re-evaluate the " + + "request payload."; + log.error(msg); + throw new BadRequestException(msg); + } + + //uploading application artifacts + applicationReleaseDTO = uploadEntAppReleaseArtifacts(applicationReleaseDTO, applicationArtifact, + applicationWrapper.getDeviceType(), false); + applicationDTO.getApplicationReleaseDTOs().clear(); + applicationDTO.getApplicationReleaseDTOs().add(applicationReleaseDTO); + return addAppDataIntoDB(applicationDTO, tenantId); + } + + @Override + public Application createWebClip(WebAppWrapper webAppWrapper, ApplicationArtifact applicationArtifact) + throws ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + if (log.isDebugEnabled()) { + log.debug("Web clip create request is received for the tenant : " + tenantId + " From" + " the user : " + + userName); + } + + ApplicationDTO applicationDTO = APIUtil.convertToAppDTO(webAppWrapper); + ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); + String uuid = UUID.randomUUID().toString(); + String md5 = DigestUtils.md5Hex(applicationReleaseDTO.getInstallerName()); + applicationReleaseDTO.setUuid(uuid); + applicationReleaseDTO.setAppHashValue(md5); + + //uploading application artifacts + try { + applicationDTO.getApplicationReleaseDTOs().clear(); + applicationDTO.getApplicationReleaseDTOs().add(addImageArtifacts(applicationReleaseDTO, applicationArtifact)); + } catch (ResourceManagementException e) { + String msg = "Error Occured when uploading artifacts of the web clip: " + webAppWrapper.getName(); + log.error(msg); + throw new ApplicationManagementException(msg, e); + } + + //insert application data into database + return addAppDataIntoDB(applicationDTO, tenantId); + } + + @Override + public Application createPublicApp(PublicAppWrapper publicAppWrapper, ApplicationArtifact applicationArtifact) + throws ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + String publicAppStorePath = ""; + if (log.isDebugEnabled()) { + log.debug("Public app creating request is received for the tenant : " + tenantId + " From" + " the user : " + + userName); + } + + if (!isValidOsVersions(publicAppWrapper.getPublicAppReleaseWrappers().get(0).getSupportedOsVersions(), + publicAppWrapper.getDeviceType())) { + String msg = "You are trying to add application release which has invalid or unsupported OS versions in " + + "the supportedOsVersions section. Hence, please re-evaluate the request payload."; + log.error(msg); + throw new BadRequestException(msg); + } + + if (DeviceTypes.ANDROID.toString().equals(publicAppWrapper.getDeviceType())) { + publicAppStorePath = Constants.GOOGLE_PLAY_STORE_URL; + } else if (DeviceTypes.IOS.toString().equals(publicAppWrapper.getDeviceType())) { + publicAppStorePath = Constants.APPLE_STORE_URL; + } + + ApplicationDTO applicationDTO = APIUtil.convertToAppDTO(publicAppWrapper); + ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); + String uuid = UUID.randomUUID().toString(); + String appInstallerUrl = publicAppStorePath + applicationReleaseDTO.getPackageName(); + //todo check app package name exist or not, do it in validation method + applicationReleaseDTO.setInstallerName(appInstallerUrl); + String md5 = DigestUtils.md5Hex(appInstallerUrl); + applicationReleaseDTO.setUuid(uuid); + applicationReleaseDTO.setAppHashValue(md5); + //uploading application artifacts try { - ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); - if (!isValidOsVersions(applicationReleaseDTO.getSupportedOsVersions(), applicationWrapper.getDeviceType())){ - String msg = "You are trying to create application which has an application release contains invalid or " - + "unsupported OS versions in the supportedOsVersions section. Hence, please re-evaluate the " - + "request payload."; - log.error(msg); - throw new BadRequestException(msg); - } - applicationReleaseDTO = addApplicationReleaseArtifacts(applicationDTO.getType(), - applicationWrapper.getDeviceType(), applicationReleaseDTO, applicationArtifact, false); - applicationReleaseDTO = addImageArtifacts(applicationReleaseDTO, applicationArtifact); applicationDTO.getApplicationReleaseDTOs().clear(); - applicationDTO.getApplicationReleaseDTOs().add(applicationReleaseDTO); + applicationDTO.getApplicationReleaseDTOs() + .add(addImageArtifacts(applicationReleaseDTO, applicationArtifact)); } catch (ResourceManagementException e) { - String msg = "Error Occured when uploading artifacts of the application: " + applicationWrapper.getName(); + String msg = "Error Occured when uploading artifacts of the public app: " + publicAppWrapper.getName(); log.error(msg); throw new ApplicationManagementException(msg, e); } + + //insert application data into database return addAppDataIntoDB(applicationDTO, tenantId); } + + private void deleteApplicationArtifacts(List directoryPaths) throws ApplicationManagementException { ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); try { @@ -178,7 +255,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } } - private ApplicationReleaseDTO addApplicationReleaseArtifacts(String applicationType, String deviceType, + private ApplicationReleaseDTO addApplicationReleaseArtifacts(String deviceType, ApplicationReleaseDTO applicationReleaseDTO, ApplicationArtifact applicationArtifact, boolean isNewRelease) throws ResourceManagementException, ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); @@ -188,7 +265,6 @@ public class ApplicationManagerImpl implements ApplicationManager { applicationReleaseDTO.setUuid(uuid); // The application executable artifacts such as apks are uploaded. - if (ApplicationType.ENTERPRISE.toString().equals(applicationType)) { try { byte[] content = IOUtils.toByteArray(applicationArtifact.getInstallerStream()); @@ -222,16 +298,14 @@ public class ApplicationManagerImpl implements ApplicationManager { if (this.applicationReleaseDAO .verifyReleaseExistenceByHash(md5OfApp, tenantId)) { throw new BadRequestException( - "Application release exists for the uploaded binary file. Application Type: " - + applicationType + " Device Type: " + deviceType); + "Application release exists for the uploaded binary file. Device Type: " + deviceType); } applicationReleaseDTO.setAppHashValue(md5OfApp); try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(content)) { applicationReleaseDTO = applicationStorageManager - .uploadReleaseArtifact(applicationReleaseDTO,applicationType, - deviceType, binaryDuplicate); + .uploadReleaseArtifact(applicationReleaseDTO, deviceType, binaryDuplicate); } } } catch (IOException e) { @@ -251,98 +325,92 @@ public class ApplicationManagerImpl implements ApplicationManager { throw new ApplicationManagementException(msg, e); } finally { ConnectionManagerUtil.closeDBConnection(); - } - } 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 - applicationReleaseDTO.setAppHashValue(uuid); } return applicationReleaseDTO; } - private ApplicationReleaseDTO updateApplicationReleaseArtifacts(String applicationType, String deviceType, + private ApplicationReleaseDTO updateEntAppReleaseArtifact(String deviceType, ApplicationReleaseDTO applicationReleaseDTO, ApplicationArtifact applicationArtifact) throws ResourceManagementException, ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); // The application executable artifacts such as apks are uploaded. - if (ApplicationType.ENTERPRISE.toString().equals(applicationType)) { - try { - byte[] content = IOUtils.toByteArray(applicationArtifact.getInstallerStream()); + try { + byte[] content = IOUtils.toByteArray(applicationArtifact.getInstallerStream()); - try(ByteArrayInputStream binaryClone = new ByteArrayInputStream(content)){ - String md5OfApp = StorageManagementUtil.getMD5(binaryClone); + try (ByteArrayInputStream binaryClone = new ByteArrayInputStream(content)) { + String md5OfApp = StorageManagementUtil.getMD5(binaryClone); - if (md5OfApp == null) { - String msg = "Error occurred while md5sum value retrieving process: application UUID " - + applicationReleaseDTO.getUuid(); - log.error(msg); - throw new ApplicationStorageManagementException(msg); - } - if (!applicationReleaseDTO.getAppHashValue().equals(md5OfApp)){ - applicationReleaseDTO.setInstallerName(applicationArtifact.getInstallerName()); + if (md5OfApp == null) { + String msg = "Error occurred while retrieving md5sum value from the binary file for application " + + "release UUID " + applicationReleaseDTO.getUuid(); + log.error(msg); + throw new ApplicationStorageManagementException(msg); + } + if (!applicationReleaseDTO.getAppHashValue().equals(md5OfApp)) { + applicationReleaseDTO.setInstallerName(applicationArtifact.getInstallerName()); - try (ByteArrayInputStream binary = new ByteArrayInputStream(content)) { - ApplicationInstaller applicationInstaller = applicationStorageManager - .getAppInstallerData(binary, deviceType); - String packagename = applicationInstaller.getPackageName(); + try (ByteArrayInputStream binary = new ByteArrayInputStream(content)) { + ApplicationInstaller applicationInstaller = applicationStorageManager + .getAppInstallerData(binary, deviceType); + String packageName = applicationInstaller.getPackageName(); + try { ConnectionManagerUtil.getDBConnection(); - 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 " - + "application."; + if (this.applicationReleaseDAO.verifyReleaseExistenceByHash(md5OfApp, tenantId)) { + String msg = "Same binary file is in the server. Hence you can't add same file into the " + + "server. Device Type: " + deviceType + " and package name: " + packageName; + log.error(msg); + throw new BadRequestException(msg); + } + if (applicationReleaseDTO.getPackageName() == null){ + String msg = "Found null value for application release package name for application " + + "release which has UUID: " + applicationReleaseDTO.getUuid(); log.error(msg); throw new ApplicationManagementException(msg); } - applicationReleaseDTO.setVersion(applicationInstaller.getVersion()); - applicationReleaseDTO.setPackageName(packagename); - - if (this.applicationReleaseDAO - .verifyReleaseExistenceByHash(md5OfApp, tenantId)) { - throw new BadRequestException( - "Application release exists for the uploaded binary file. Application Type: " - + applicationType + " Device Tyep: " + deviceType); + if (!applicationReleaseDTO.getPackageName().equals(packageName)){ + String msg = "Package name of the new artifact does not match with the package name of " + + "the exiting application release. Package name of the existing app release " + + applicationReleaseDTO.getPackageName() + " and package name of the new " + + "application release " + packageName; + log.error(msg); + throw new BadRequestException(msg); } - applicationReleaseDTO.setAppHashValue(md5OfApp); + applicationReleaseDTO.setVersion(applicationInstaller.getVersion()); + applicationReleaseDTO.setPackageName(packageName); String deletingAppHashValue = applicationReleaseDTO.getAppHashValue(); + applicationReleaseDTO.setAppHashValue(md5OfApp); try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(content)) { applicationReleaseDTO = applicationStorageManager - .uploadReleaseArtifact(applicationReleaseDTO,applicationType, - deviceType, binaryDuplicate); + .uploadReleaseArtifact(applicationReleaseDTO, deviceType, binaryDuplicate); applicationStorageManager.copyImageArtifactsAndDeleteInstaller(deletingAppHashValue, applicationReleaseDTO); } + } catch (DBConnectionException e) { + String msg = "Error occurred when getting database connection for verifying application " + + "release existing for new app hash value."; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred when executing the query for verifying application release " + + "existence for the new app hash value."; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } finally { + ConnectionManagerUtil.closeDBConnection(); } } - } - } catch (IOException e) { - String msg = - "Error occurred when getting byte array of binary file. Installer name: " + applicationArtifact - .getInstallerName(); - log.error(msg); - throw new ApplicationStorageManagementException(msg); - } catch (DBConnectionException e) { - String msg = "Error occurred when getting database connection for verifying application package existence."; - log.error(msg); - throw new ApplicationManagementException(msg, e); - } catch (ApplicationManagementDAOException e) { - String msg = "Error occurred when executing the query for verifying application release existence for " - + "the package."; - log.error(msg); - throw new ApplicationManagementException(msg, e); - } finally { - ConnectionManagerUtil.closeDBConnection(); + } - } else if (ApplicationType.WEB_CLIP.toString().equals(applicationType)) { - applicationReleaseDTO.setVersion(Constants.DEFAULT_VERSION); - applicationReleaseDTO.setInstallerName(applicationReleaseDTO.getUrl()); + } catch (IOException e) { + String msg = "Error occurred when getting byte array of binary file. Installer name: " + applicationArtifact + .getInstallerName(); + log.error(msg); + throw new ApplicationStorageManagementException(msg); } return applicationReleaseDTO; } @@ -380,117 +448,50 @@ public class ApplicationManagerImpl implements ApplicationManager { ApplicationArtifact applicationArtifact) throws ResourceManagementException{ ApplicationStorageManager applicationStorageManager = DAOUtil.getApplicationStorageManager(); - applicationStorageManager.deleteImageArtifacts(applicationReleaseDTO); - - applicationReleaseDTO.setIconName(applicationArtifact.getIconName()); - applicationReleaseDTO.setBannerName(applicationArtifact.getBannerName()); - applicationReleaseDTO.setScreenshotName1(null); - applicationReleaseDTO.setScreenshotName2(null); - applicationReleaseDTO.setScreenshotName3(null); + if (!StringUtils.isEmpty(applicationArtifact.getIconName())) { + applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), + applicationReleaseDTO.getIconName()); + applicationReleaseDTO.setIconName(applicationArtifact.getIconName()); + } + if (!StringUtils.isEmpty(applicationArtifact.getBannerName())){ + applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), + applicationReleaseDTO.getBannerName()); + applicationReleaseDTO.setBannerName(applicationArtifact.getBannerName()); + } Map screenshots = applicationArtifact.getScreenshots(); - List screenshotNames = new ArrayList<>(screenshots.keySet()); - - int counter = 1; - for (String scName : screenshotNames) { - if (counter == 1) { - applicationReleaseDTO.setScreenshotName1(scName); - } else if (counter == 2) { - applicationReleaseDTO.setScreenshotName2(scName); - } else if (counter == 3) { - applicationReleaseDTO.setScreenshotName3(scName); + List screenshotStreams = new ArrayList<>(); + + if (screenshots != null){ + List screenshotNames = new ArrayList<>(screenshots.keySet()); + screenshotStreams = new ArrayList<>(screenshots.values()); + + int counter = 1; + for (String scName : screenshotNames) { + if (counter == 1) { + applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), + applicationReleaseDTO.getScreenshotName1()); + applicationReleaseDTO.setScreenshotName1(scName); + } else if (counter == 2) { + applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), + applicationReleaseDTO.getScreenshotName2()); + applicationReleaseDTO.setScreenshotName2(scName); + } else if (counter == 3) { + applicationStorageManager.deleteAppReleaseArtifact(applicationReleaseDTO.getAppHashValue(), + applicationReleaseDTO.getScreenshotName3()); + applicationReleaseDTO.setScreenshotName3(scName); + } + counter++; } - counter++; } // Upload images applicationReleaseDTO = applicationStorageManager .uploadImageArtifacts(applicationReleaseDTO, applicationArtifact.getIconStream(), - applicationArtifact.getBannerStream(), new ArrayList<>(screenshots.values())); + applicationArtifact.getBannerStream(), screenshotStreams); return applicationReleaseDTO; } - @Override - public Application createWebClip(WebAppWrapper webAppWrapper, ApplicationArtifact applicationArtifact) - throws ApplicationManagementException { - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - if (log.isDebugEnabled()) { - log.debug("Web clip create request is received for the tenant : " + tenantId + " From" + " the user : " - + userName); - } - - ApplicationDTO applicationDTO = APIUtil.convertToAppDTO(webAppWrapper); - ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); - String uuid = UUID.randomUUID().toString(); - String md5 = DigestUtils.md5Hex(applicationReleaseDTO.getInstallerName()); - applicationReleaseDTO.setUuid(uuid); - applicationReleaseDTO.setAppHashValue(md5); - - //uploading application artifacts - try { - applicationDTO.getApplicationReleaseDTOs().clear(); - applicationDTO.getApplicationReleaseDTOs().add(addImageArtifacts(applicationReleaseDTO, applicationArtifact)); - } catch (ResourceManagementException e) { - String msg = "Error Occured when uploading artifacts of the web clip: " + webAppWrapper.getName(); - log.error(msg); - throw new ApplicationManagementException(msg, e); - } - - //insert application data into database - return addAppDataIntoDB(applicationDTO, tenantId); - } - - @Override - public Application createPublicApp(PublicAppWrapper publicAppWrapper, ApplicationArtifact applicationArtifact) - throws ApplicationManagementException { - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - String publicAppStorePath = ""; - if (log.isDebugEnabled()) { - log.debug("Public app creating request is received for the tenant : " + tenantId + " From" + " the user : " - + userName); - } - - if (!isValidOsVersions(publicAppWrapper.getPublicAppReleaseWrappers().get(0).getSupportedOsVersions(), - publicAppWrapper.getDeviceType())) { - String msg = "You are trying to add application release which has invalid or unsupported OS versions in " - + "the supportedOsVersions section. Hence, please re-evaluate the request payload."; - log.error(msg); - throw new BadRequestException(msg); - } - - if (DeviceTypes.ANDROID.toString().equals(publicAppWrapper.getDeviceType())) { - publicAppStorePath = Constants.GOOGLE_PLAY_STORE_URL; - } else if (DeviceTypes.IOS.toString().equals(publicAppWrapper.getDeviceType())) { - publicAppStorePath = Constants.APPLE_STORE_URL; - } - - ApplicationDTO applicationDTO = APIUtil.convertToAppDTO(publicAppWrapper); - ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); - String uuid = UUID.randomUUID().toString(); - String appInstallerUrl = publicAppStorePath + applicationReleaseDTO.getPackageName(); - //todo check app package name exist or not, do it in validation method - applicationReleaseDTO.setInstallerName(appInstallerUrl); - String md5 = DigestUtils.md5Hex(appInstallerUrl); - applicationReleaseDTO.setUuid(uuid); - applicationReleaseDTO.setAppHashValue(md5); - - //uploading application artifacts - try { - applicationDTO.getApplicationReleaseDTOs().clear(); - applicationDTO.getApplicationReleaseDTOs() - .add(addImageArtifacts(applicationReleaseDTO, applicationArtifact)); - } catch (ResourceManagementException e) { - String msg = "Error Occured when uploading artifacts of the public app: " + publicAppWrapper.getName(); - log.error(msg); - throw new ApplicationManagementException(msg, e); - } - - //insert application data into database - return addAppDataIntoDB(applicationDTO, tenantId); - } - @Override public ApplicationList getApplications(Filter filter) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); @@ -745,7 +746,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } @Override - public ApplicationRelease createEntAppRelease(int applicationId, ApplicationReleaseWrapper applicationReleaseWrapper, + public ApplicationRelease createEntAppRelease(int applicationId, EntAppReleaseWrapper entAppReleaseWrapper, ApplicationArtifact applicationArtifact) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); ApplicationRelease applicationRelease; @@ -764,14 +765,15 @@ public class ApplicationManagerImpl implements ApplicationManager { throw new BadRequestException(msg); } DeviceType deviceType = getDeviceTypeData(applicationDTO.getDeviceTypeId()); - if (!isValidOsVersions(applicationReleaseWrapper.getSupportedOsVersions(), deviceType.getName())){ + if (!isValidOsVersions(entAppReleaseWrapper.getSupportedOsVersions(), deviceType.getName())){ String msg = "You are trying to add application release which has invalid or unsupported OS versions in " + "the supportedOsVersions section. Hence, please re-evaluate the request payload."; log.error(msg); throw new BadRequestException(msg); } - ApplicationReleaseDTO applicationReleaseDTO = uploadReleaseArtifacts(applicationReleaseWrapper, - applicationDTO, applicationArtifact, deviceType.getName()); + ApplicationReleaseDTO applicationReleaseDTO = uploadEntAppReleaseArtifacts( + APIUtil.releaseWrapperToReleaseDTO(entAppReleaseWrapper), + applicationArtifact, deviceType.getName(), true); ConnectionManagerUtil.beginDBTransaction(); String initialstate = lifecycleStateManager.getInitialState(); applicationReleaseDTO.setCurrentState(initialstate); @@ -829,18 +831,16 @@ public class ApplicationManagerImpl implements ApplicationManager { } } - private ApplicationReleaseDTO uploadReleaseArtifacts(ApplicationReleaseWrapper applicationReleaseWrapper, - ApplicationDTO applicationDTO, ApplicationArtifact applicationArtifact, String deviceTypeName) + private ApplicationReleaseDTO uploadEntAppReleaseArtifacts(ApplicationReleaseDTO releaseDTO, + ApplicationArtifact applicationArtifact, String deviceTypeName, boolean isNewRelease) throws ApplicationManagementException { try { - ApplicationReleaseDTO applicationReleaseDTO = addApplicationReleaseArtifacts(applicationDTO.getType(), - deviceTypeName, APIUtil.releaseWrapperToReleaseDTO(applicationReleaseWrapper), applicationArtifact, - true); + ApplicationReleaseDTO applicationReleaseDTO = addApplicationReleaseArtifacts(deviceTypeName, releaseDTO, + applicationArtifact, isNewRelease); return addImageArtifacts(applicationReleaseDTO, applicationArtifact); } catch (ResourceManagementException e) { - String msg = - "Error occurred while uploading application release artifacts. Application ID: " + applicationDTO - .getId(); + String msg = "Error occurred while uploading application release artifacts."; + log.error(msg); throw new ApplicationManagementException(msg, e); } } @@ -1129,6 +1129,7 @@ public class ApplicationManagerImpl implements ApplicationManager { try { ConnectionManagerUtil.beginDBTransaction(); List deletingAppReleaseIds = new ArrayList<>(); + List deletingAppHashVals = new ArrayList<>(); for (ApplicationReleaseDTO applicationReleaseDTO : applicationReleaseDTOs) { List deviceSubscriptionDTOS = subscriptionDAO .getDeviceSubscriptions(applicationReleaseDTO.getId(), tenantId); @@ -1139,9 +1140,10 @@ public class ApplicationManagerImpl implements ApplicationManager { log.error(msg); throw new ForbiddenException(msg); } - applicationStorageManager.deleteApplicationReleaseArtifacts(applicationReleaseDTO.getAppHashValue()); + deletingAppHashVals.add(applicationReleaseDTO.getAppHashValue()); deletingAppReleaseIds.add(applicationReleaseDTO.getId()); } + applicationStorageManager.deleteAllApplicationReleaseArtifacts(deletingAppHashVals); this.lifecycleStateDAO.deleteLifecycleStates(deletingAppReleaseIds); this.applicationReleaseDAO.deleteReleases(deletingAppReleaseIds); this.applicationDAO.deleteApplicationTags(applicationId, tenantId); @@ -1186,8 +1188,8 @@ public class ApplicationManagerImpl implements ApplicationManager { } } 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"; + String msg = "There are application releases which are not in the " + lifecycleStateManager + .getEndState() + " state. Hence you are not allowed to delete the application"; log.error(msg); throw new ForbiddenException(msg); } @@ -1232,7 +1234,8 @@ public class ApplicationManagerImpl implements ApplicationManager { log.error(msg); throw new ForbiddenException(msg); } - applicationStorageManager.deleteApplicationReleaseArtifacts(applicationReleaseDTO.getAppHashValue()); + applicationStorageManager.deleteAllApplicationReleaseArtifacts( + Collections.singletonList(applicationReleaseDTO.getAppHashValue())); lifecycleStateDAO.deleteLifecycleStateByReleaseId(applicationReleaseDTO.getId()); applicationReleaseDAO.deleteRelease(applicationReleaseDTO.getId()); ConnectionManagerUtil.commitDBTransaction(); @@ -1278,10 +1281,10 @@ public class ApplicationManagerImpl implements ApplicationManager { + " into updatable state and retry the operation."); } applicationReleaseDTO = this.applicationReleaseDAO - .updateRelease(addImageArtifacts(applicationReleaseDTO, applicationArtifact), tenantId); + .updateRelease(updateImageArtifacts(applicationReleaseDTO, applicationArtifact), tenantId); if (applicationReleaseDTO == null) { ConnectionManagerUtil.rollbackDBTransaction(); - String msg = "ApplicationDTO release updating count is 0. ApplicationDTO release UUID is " + uuid; + String msg = "Application release updating count is 0 for application release UUID: " + uuid; log.error(msg); throw new ApplicationManagementException(msg); } @@ -1310,7 +1313,7 @@ public class ApplicationManagerImpl implements ApplicationManager { } @Override - public void updateApplicationArtifact(String deviceType, String appType, String uuid, + public void updateApplicationArtifact(String deviceType, String uuid, ApplicationArtifact applicationArtifact) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); boolean isValidDeviceType = false; @@ -1338,15 +1341,31 @@ public class ApplicationManagerImpl implements ApplicationManager { try { ConnectionManagerUtil.beginDBTransaction(); - ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId); - if (applicationReleaseDTO == null) { - String msg = "Couldn't found an application release for UUID: " + uuid; + ApplicationDTO applicationDTO = this.applicationDAO.getApplicationByUUID(uuid, tenantId); + if (applicationDTO == null) { + String msg = "Couldn't found an application which has application release for UUID: " + uuid; log.error(msg); throw new NotFoundException(msg); } + if (!ApplicationType.ENTERPRISE.toString().equals(applicationDTO.getType())) { + String msg = "If Application type is " + applicationDTO.getType() + ", then you don't have application " + + "release artifact to update for application release UUID: " + uuid; + log.error(msg); + throw new ApplicationManagementException(msg); + } + + ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); + if (!lifecycleStateManager.isUpdatableState(applicationReleaseDTO.getCurrentState())) { + String msg = "Application release in " + applicationReleaseDTO.getCurrentState() + + " state. Therefore you are not allowed to update the application release. Hence, " + + "please move application release from " + applicationReleaseDTO.getCurrentState() + + " to updatable state."; + log.error(msg); + throw new ForbiddenException(msg); + } - applicationReleaseDTO = updateApplicationReleaseArtifacts(appType, deviceType, applicationReleaseDTO, - applicationArtifact); + applicationReleaseDTO = updateEntAppReleaseArtifact(deviceType,applicationReleaseDTO + , applicationArtifact); applicationReleaseDTO = this.applicationReleaseDAO.updateRelease(applicationReleaseDTO, tenantId); if (applicationReleaseDTO == null) { ConnectionManagerUtil.rollbackDBTransaction(); @@ -2105,22 +2124,26 @@ public class ApplicationManagerImpl implements ApplicationManager { } @Override - public boolean updateRelease(String deviceType, String applicationType, String releaseUuid, - ApplicationReleaseWrapper applicationReleaseWrapper, ApplicationArtifact applicationArtifact) - throws ApplicationManagementException { + public boolean updateEntAppRelease(String deviceType, String releaseUuid, EntAppReleaseWrapper entAppReleaseWrapper, + ApplicationArtifact applicationArtifact) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); try { ConnectionManagerUtil.beginDBTransaction(); - ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO - .getReleaseByUUID(releaseUuid, tenantId); + ApplicationDTO applicationDTO = this.applicationDAO.getApplicationByUUID(releaseUuid, tenantId); - if (applicationReleaseDTO == null) { - String msg = "Couldn't found an application release for updating. Application release UUID: " + releaseUuid; + if (applicationDTO == null) { + String msg = "Couldn't found an application which has application release for UUID: " + releaseUuid; log.error(msg); throw new NotFoundException(msg); } + if (!ApplicationType.ENTERPRISE.toString().equals(applicationDTO.getType())) { + String msg = "You trying to perform enterprise app release update on non-enterprise app release."; + log.error(msg); + throw new ForbiddenException(msg); + } + ApplicationReleaseDTO applicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); if (!lifecycleStateManager.isUpdatableState(applicationReleaseDTO.getCurrentState())) { String msg = "Application release in " + applicationReleaseDTO.getCurrentState() + " state. Therefore you are not allowed to update the application release. Hence, " @@ -2131,15 +2154,9 @@ public class ApplicationManagerImpl implements ApplicationManager { } DeviceType deviceTypeObj = getDeviceTypeData(deviceType); - Double price = applicationReleaseWrapper.getPrice(); - - String applicationSubType = this.applicationDAO.getApplicationSubTypeByUUID(releaseUuid, tenantId); - if (applicationSubType == null) { - String msg = "Couldn't find an application subscription type for the application release UUID: " + releaseUuid; - log.error(msg); - throw new ApplicationManagementException(msg); - } + Double price = entAppReleaseWrapper.getPrice(); + String applicationSubType = applicationDTO.getSubType(); if (price < 0.0 || (price == 0.0 && ApplicationSubscriptionType.PAID.toString().equals(applicationSubType)) || (price > 0.0 && ApplicationSubscriptionType.FREE.toString().equals(applicationSubType))) { throw new BadRequestException( @@ -2150,7 +2167,7 @@ public class ApplicationManagerImpl implements ApplicationManager { applicationReleaseDTO.setPrice(price); applicationReleaseDTO.setIsSharedWithAllTenants(applicationReleaseDTO.getIsSharedWithAllTenants()); - String supportedOSVersions = applicationReleaseWrapper.getSupportedOsVersions(); + String supportedOSVersions = entAppReleaseWrapper.getSupportedOsVersions(); if (!StringUtils.isEmpty(supportedOSVersions)) { if (!isValidOsVersions(supportedOSVersions, deviceType)){ String msg = "You are trying to update application release which has invalid or unsupported OS " @@ -2159,18 +2176,20 @@ public class ApplicationManagerImpl implements ApplicationManager { throw new BadRequestException(msg); } applicationReleaseDTO.setSupportedOsVersions(supportedOSVersions); } - if (!StringUtils.isEmpty(applicationReleaseWrapper.getDescription())) { - applicationReleaseDTO.setDescription(applicationReleaseWrapper.getDescription()); + if (!StringUtils.isEmpty(entAppReleaseWrapper.getDescription())) { + applicationReleaseDTO.setDescription(entAppReleaseWrapper.getDescription()); } - if (!StringUtils.isEmpty(applicationReleaseWrapper.getReleaseType())) { - applicationReleaseDTO.setReleaseType(applicationReleaseWrapper.getReleaseType()); + if (!StringUtils.isEmpty(entAppReleaseWrapper.getReleaseType())) { + applicationReleaseDTO.setReleaseType(entAppReleaseWrapper.getReleaseType()); } - if (!StringUtils.isEmpty(applicationReleaseWrapper.getMetaData())) { - applicationReleaseDTO.setMetaData(applicationReleaseWrapper.getMetaData()); + if (!StringUtils.isEmpty(entAppReleaseWrapper.getMetaData())) { + applicationReleaseDTO.setMetaData(entAppReleaseWrapper.getMetaData()); } - applicationReleaseDTO = updateApplicationReleaseArtifacts(applicationType, deviceTypeObj.getName(), - applicationReleaseDTO, applicationArtifact); + if (!StringUtils.isEmpty(applicationArtifact.getInstallerName())&& applicationArtifact.getInstallerStream() != null){ + applicationReleaseDTO = updateEntAppReleaseArtifact(deviceTypeObj.getName(), + applicationReleaseDTO, applicationArtifact); + } applicationReleaseDTO = updateImageArtifacts(applicationReleaseDTO, applicationArtifact); boolean updateStatus = applicationReleaseDAO.updateRelease(applicationReleaseDTO, tenantId) != null; @@ -2232,10 +2251,10 @@ public class ApplicationManagerImpl implements ApplicationManager { DeviceType deviceType = getDeviceTypeData(applicationWrapper.getDeviceType()); deviceTypeId = deviceType.getId(); - List applicationReleaseWrappers; - applicationReleaseWrappers = applicationWrapper.getApplicationReleaseWrappers(); + List entAppReleaseWrappers; + entAppReleaseWrappers = applicationWrapper.getEntAppReleaseWrappers(); - if (applicationReleaseWrappers == null || applicationReleaseWrappers.size() != 1) { + if (entAppReleaseWrappers == null || entAppReleaseWrappers.size() != 1) { String msg = "Invalid application creating request. Application creating request must have single " + "application release. Application name:" + applicationWrapper.getName() + "."; log.error(msg); @@ -2402,9 +2421,9 @@ public class ApplicationManagerImpl implements ApplicationManager { throw new BadRequestException(msg); } - if (param instanceof ApplicationReleaseWrapper) { - ApplicationReleaseWrapper applicationReleaseWrapper = (ApplicationReleaseWrapper) param; - if (StringUtils.isEmpty(applicationReleaseWrapper.getSupportedOsVersions())) { + if (param instanceof EntAppReleaseWrapper) { + EntAppReleaseWrapper entAppReleaseWrapper = (EntAppReleaseWrapper) param; + if (StringUtils.isEmpty(entAppReleaseWrapper.getSupportedOsVersions())) { String msg = "Supported OS Version shouldn't be null or empty."; log.error(msg); throw new BadRequestException(msg); 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 6264c803436..243fd1bc75a 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 @@ -18,14 +18,10 @@ package org.wso2.carbon.device.application.mgt.core.impl; import com.dd.plist.NSDictionary; -import com.dd.plist.NSString; -import com.dd.plist.PropertyListFormatException; -import com.dd.plist.PropertyListParser; import net.dongliu.apk.parser.bean.ApkMeta; import org.apache.commons.io.IOUtils; 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.ApplicationInstaller; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; import org.wso2.carbon.device.application.mgt.common.DeviceTypes; @@ -34,22 +30,11 @@ import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagemen import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; import org.wso2.carbon.device.application.mgt.core.exception.ParsingException; import org.wso2.carbon.device.application.mgt.core.util.ArtifactsParser; -import org.wso2.carbon.device.application.mgt.core.util.Constants; import org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil; -import org.xml.sax.SAXException; -import javax.xml.parsers.ParserConfigurationException; import java.io.*; -import java.nio.file.Files; -import java.text.ParseException; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import static org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil.delete; import static org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil.saveFile; /** @@ -59,7 +44,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager private static final Log log = LogFactory.getLog(ApplicationStorageManagerImpl.class); private String storagePath; private int screenShotMaxCount; - private static final int BUFFER_SIZE = 4096; /** * Create a new ApplicationStorageManager Instance @@ -73,8 +57,8 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager } @Override - public ApplicationReleaseDTO uploadImageArtifacts(ApplicationReleaseDTO applicationRelease, InputStream iconFileStream, - InputStream bannerFileStream, List screenShotStreams) + public ApplicationReleaseDTO uploadImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO, + InputStream iconFileStream, InputStream bannerFileStream, List screenShotStreams) throws ResourceManagementException { String artifactDirectoryPath; String iconStoredLocation; @@ -82,15 +66,15 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager String scStoredLocation = null; try { - artifactDirectoryPath = storagePath + applicationRelease.getAppHashValue(); + artifactDirectoryPath = storagePath + applicationReleaseDTO.getAppHashValue(); StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath); - iconStoredLocation = artifactDirectoryPath + File.separator + applicationRelease.getIconName(); - bannerStoredLocation = artifactDirectoryPath + File.separator + applicationRelease.getBannerName(); if (iconFileStream != null) { + iconStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getIconName(); saveFile(iconFileStream, iconStoredLocation); } if (bannerFileStream != null) { + bannerStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getBannerName(); saveFile(bannerFileStream, bannerStoredLocation); } if (!screenShotStreams.isEmpty()) { @@ -103,67 +87,26 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager int count = 1; for (InputStream screenshotStream : screenShotStreams) { if (count == 1) { - scStoredLocation = artifactDirectoryPath + File.separator + applicationRelease.getScreenshotName1(); + scStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getScreenshotName1(); } if (count == 2) { - scStoredLocation = artifactDirectoryPath + File.separator + applicationRelease.getScreenshotName2(); + scStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getScreenshotName2(); } if (count == 3) { - scStoredLocation = artifactDirectoryPath + File.separator + applicationRelease.getScreenshotName3(); + scStoredLocation = artifactDirectoryPath + File.separator + applicationReleaseDTO.getScreenshotName3(); } saveFile(screenshotStream, scStoredLocation); count++; } } - return applicationRelease; + return applicationReleaseDTO; } catch (IOException e) { throw new ApplicationStorageManagementException("IO Exception while saving the screens hots for " + - "the application " + applicationRelease.getUuid(), e); + "the application " + applicationReleaseDTO.getUuid(), e); } } - @Override - public void deleteImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO) - throws ResourceManagementException { - - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - - try { - String iconName = applicationReleaseDTO.getIconName(); - String bannerName = applicationReleaseDTO.getBannerName(); - String sc1 = applicationReleaseDTO.getScreenshotName1(); - String sc2 = applicationReleaseDTO.getScreenshotName2(); - String sc3 = applicationReleaseDTO.getScreenshotName3(); - String hashValue = applicationReleaseDTO.getAppHashValue(); - if (iconName != null) { - deleteApplicationReleaseArtifacts( - storagePath + Constants.FORWARD_SLASH + hashValue + Constants.FORWARD_SLASH + iconName); - } - if (bannerName != null) { - deleteApplicationReleaseArtifacts( - storagePath + Constants.FORWARD_SLASH + hashValue + Constants.FORWARD_SLASH + bannerName); - } - - if (sc1 != null) { - deleteApplicationReleaseArtifacts( - storagePath + Constants.FORWARD_SLASH + hashValue + Constants.FORWARD_SLASH + sc1); - } - if (sc2 != null) { - deleteApplicationReleaseArtifacts( - storagePath + Constants.FORWARD_SLASH + hashValue + Constants.FORWARD_SLASH + sc2); - } - if (sc3 != null) { - deleteApplicationReleaseArtifacts( - storagePath + Constants.FORWARD_SLASH + hashValue + Constants.FORWARD_SLASH + sc3); - } - } catch (ApplicationStorageManagementException e) { - throw new ApplicationStorageManagementException("ApplicationDTO Storage exception while trying to" - + " update the screen-shot count for the application Release " + applicationReleaseDTO.getUuid() + - " for the tenant " + tenantId, e); - } - } - public ApplicationInstaller getAppInstallerData(InputStream binaryFile, String deviceType) throws ApplicationStorageManagementException { ApplicationInstaller applicationInstaller = new ApplicationInstaller(); @@ -192,7 +135,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager } @Override - public ApplicationReleaseDTO uploadReleaseArtifact(ApplicationReleaseDTO applicationReleaseDTO, String appType, + public ApplicationReleaseDTO uploadReleaseArtifact(ApplicationReleaseDTO applicationReleaseDTO, String deviceType, InputStream binaryFile) throws ResourceManagementException { try { String artifactDirectoryPath; @@ -217,7 +160,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager ApplicationReleaseDTO applicationReleaseDTO) throws ApplicationStorageManagementException { try { - String basePath = storagePath + Constants.FORWARD_SLASH; String appHashValue = applicationReleaseDTO.getAppHashValue(); String bannerName = applicationReleaseDTO.getBannerName(); String iconName = applicationReleaseDTO.getIconName(); @@ -226,26 +168,26 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager String screenshot3 = applicationReleaseDTO.getScreenshotName3(); if (bannerName != null) { - StorageManagementUtil - .copy(basePath + deletingAppHashValue + bannerName, basePath + appHashValue + bannerName); + StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + bannerName, + storagePath + appHashValue + File.separator + bannerName); } if (iconName != null) { - StorageManagementUtil - .copy(basePath + deletingAppHashValue + iconName, basePath + appHashValue + iconName); + StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + iconName, + storagePath + appHashValue + File.separator + iconName); } if (screenshot1 != null) { - StorageManagementUtil - .copy(basePath + deletingAppHashValue + screenshot1, basePath + appHashValue + screenshot1); + StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + screenshot1, + storagePath + appHashValue + File.separator + screenshot1); } if (screenshot2 != null) { - StorageManagementUtil - .copy(basePath + deletingAppHashValue + screenshot2, basePath + appHashValue + screenshot2); + StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + screenshot2, + storagePath + appHashValue + File.separator + screenshot2); } if (screenshot3 != null) { - StorageManagementUtil - .copy(basePath + deletingAppHashValue + screenshot3, basePath + appHashValue + screenshot3); + StorageManagementUtil.copy(storagePath + deletingAppHashValue + File.separator + screenshot3, + storagePath + appHashValue + File.separator + screenshot3); } - deleteApplicationReleaseArtifacts( basePath + deletingAppHashValue); + deleteAppReleaseArtifact( storagePath + deletingAppHashValue); } catch (IOException e) { String msg = "Application installer updating is failed because of I/O issue"; log.error(msg); @@ -253,31 +195,23 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager } } - @Override - public void deleteApplicationReleaseArtifacts(String artifactPath) throws ApplicationStorageManagementException { - File artifact = new File(artifactPath); - if (artifact.exists()) { - try { - StorageManagementUtil.delete(artifact); - } catch (IOException e) { - throw new ApplicationStorageManagementException( - "Error occured while deleting application release artifacts", e); - } - } else { - throw new ApplicationStorageManagementException( - "Tried to delete application release, but it doesn't exist in the system"); - } + + @Override + public void deleteAppReleaseArtifact(String appReleaseHashVal, String fileName) throws ApplicationStorageManagementException { + String artifactPath = storagePath + appReleaseHashVal + File.separator + fileName; + deleteAppReleaseArtifact(artifactPath); } @Override public void deleteAllApplicationReleaseArtifacts(List directoryPaths) throws ApplicationStorageManagementException { for (String directoryBasePath : directoryPaths) { - deleteApplicationReleaseArtifacts(storagePath + directoryBasePath); + deleteAppReleaseArtifact(storagePath + directoryBasePath); } } + @Override public InputStream getFileSttream (String path) throws ApplicationStorageManagementException { String filePath = storagePath + path; try { @@ -288,126 +222,26 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager } } - private synchronized Map getIPAInfo(File ipaFile) throws ApplicationStorageManagementException { - Map ipaInfo = new HashMap<>(); - - String ipaDirectory = null; - try { - String ipaAbsPath = ipaFile.getAbsolutePath(); - ipaDirectory = new File(ipaAbsPath).getParent(); - - if (new File(ipaDirectory + File.separator + Constants.PAYLOAD).exists()) { - delete(new File(ipaDirectory + File.separator + Constants.PAYLOAD)); - } - - // unzip ipa zip file - unzip(ipaAbsPath, ipaDirectory); - - // fetch app file name, after unzip ipa - String appFileName = ""; - for (File file : Objects.requireNonNull( - new File(ipaDirectory + File.separator + Constants.PAYLOAD).listFiles() - )) { - if (file.toString().endsWith(Constants.APP_EXTENSION)) { - appFileName = new File(file.toString()).getAbsolutePath(); - break; - } - } - - String plistFilePath = appFileName + File.separator + Constants.PLIST_NAME; - - // parse info.plist - File plistFile = new File(plistFilePath); - NSDictionary rootDict; - rootDict = (NSDictionary) PropertyListParser.parse(plistFile); - - // get version - NSString parameter = (NSString) rootDict.objectForKey(Constants.CF_BUNDLE_VERSION); - ipaInfo.put(Constants.CF_BUNDLE_VERSION, parameter.toString()); - - if (ipaDirectory != null) { - // remove unzip folder - delete(new File(ipaDirectory + File.separator + Constants.PAYLOAD)); - } - - } catch (ParseException e) { - String msg = "Error occurred while parsing the plist data"; - log.error(msg); - throw new ApplicationStorageManagementException(msg, e); - } catch (IOException e) { - String msg = "Error occurred while accessing the ipa file"; - log.error(msg); - throw new ApplicationStorageManagementException(msg, e); - } catch (SAXException | ParserConfigurationException | PropertyListFormatException e) { - log.error(e); - throw new ApplicationStorageManagementException(e.getMessage(), e); - } catch (ApplicationStorageManagementException e) { - String msg = "Error occurred while unzipping the ipa file"; - log.error(msg); - throw new ApplicationStorageManagementException(msg, e); - } - return ipaInfo; - } - - /** - * Extracts a zip file specified by the zipFilePath to a directory specified by - * destDirectory (will be created if does not exists) - * - * @param zipFilePath file path of the zip - * @param destDirectory destination directory path - */ - private void unzip(String zipFilePath, String destDirectory) - throws IOException, ApplicationStorageManagementException { - File destDir = new File(destDirectory); - boolean isDirCreated; - - if (!destDir.exists()) { - isDirCreated = destDir.mkdir(); - if (!isDirCreated) { - throw new ApplicationStorageManagementException("Directory Creation Is Failed while iOS app vertion " + - "retrieval"); - } - } - try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath))) { - - ZipEntry entry = zipIn.getNextEntry(); - // iterates over entries in the zip file - while (entry != null) { - String filePath = destDirectory + File.separator + entry.getName(); - - if (!entry.isDirectory()) { - // if the entry is a file, extracts it - extractFile(zipIn, filePath); - } else { - // if the entry is a directory, make the directory - File dir = new File(filePath); - isDirCreated = dir.mkdir(); - if (!isDirCreated) { - throw new ApplicationStorageManagementException( - "Directory Creation Is Failed while iOS app vertion " + "retrieval"); - } - - } - - zipIn.closeEntry(); - entry = zipIn.getNextEntry(); - } - } - } - - /** - * Extracts a zip entry (file entry) + /*** + * This method is responsible to delete artifact file which is located in the artifact path. * - * @param zipIn zip input stream - * @param filePath file path + * @param artifactPath relative path of the artifact file + * @throws ApplicationStorageManagementException when the file couldn't find in the given artifact path or if an + * IO error occured while deleting the artifact. */ - private void extractFile(ZipInputStream zipIn, String filePath) throws IOException { - try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath))) { - byte[] bytesIn = new byte[BUFFER_SIZE]; - int read; - while ((read = zipIn.read(bytesIn)) != -1) { - bos.write(bytesIn, 0, read); + private void deleteAppReleaseArtifact(String artifactPath) throws ApplicationStorageManagementException { + File artifact = new File(artifactPath); + if (artifact.exists()) { + try { + StorageManagementUtil.delete(artifact); + } catch (IOException e) { + throw new ApplicationStorageManagementException( + "Error occured while deleting application release artifacts", e); } + } else { + String msg = "Tried to delete application release, but it doesn't exist in the file system"; + log.error(msg); + throw new ApplicationStorageManagementException(msg); } } } 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 e32fe3f5cdd..0e3a0985f90 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 @@ -93,7 +93,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager { } @Override - public ApplicationInstallResponse performBulkAppInstallation(String applicationUUID, List params, + public ApplicationInstallResponse performBulkAppOperation(String applicationUUID, List params, String subType, String action) throws ApplicationManagementException { if (log.isDebugEnabled()) { log.debug("Install application release which has UUID " + applicationUUID + " to " + params.size() @@ -337,20 +337,20 @@ public class SubscriptionManagerImpl implements SubscriptionManager { List subscribedEntities = new ArrayList<>(); if (SubsciptionType.USER.toString().equals(subType)) { - subscribedEntities = subscriptionDAO.getSubscribedUsernames(params, tenantId); + subscribedEntities = subscriptionDAO.getSubscribedUserNames(params, tenantId); if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { params.removeAll(subscribedEntities); subscriptionDAO.addUserSubscriptions(tenantId, username, params, applicationReleaseId); } } else if (SubsciptionType.ROLE.toString().equals(subType)) { - subscribedEntities = subscriptionDAO.getSubscribedRolenames(params, tenantId); + subscribedEntities = subscriptionDAO.getSubscribedRoleNames(params, tenantId); if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { params.removeAll(subscribedEntities); subscriptionDAO.addRoleSubscriptions(tenantId, username, params, applicationReleaseId); } } else if (SubsciptionType.GROUP.toString().equals(subType)) { - subscribedEntities = subscriptionDAO.getSubscribedGroupnames(params, tenantId); + subscribedEntities = subscriptionDAO.getSubscribedGroupNames(params, tenantId); if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { params.removeAll(subscribedEntities); subscriptionDAO.addGroupSubscriptions(tenantId, username, params, applicationReleaseId); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/APIUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/APIUtil.java index 2a6ef030c5b..ac5431be788 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/APIUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/APIUtil.java @@ -24,14 +24,13 @@ import org.apache.commons.logging.LogFactory; import org.apache.commons.validator.routines.UrlValidator; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.application.mgt.common.ApplicationType; -import org.wso2.carbon.device.application.mgt.common.DeviceTypes; 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.Application; import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease; import org.wso2.carbon.device.application.mgt.common.services.*; import org.wso2.carbon.device.application.mgt.common.ErrorResponse; -import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper; +import org.wso2.carbon.device.application.mgt.common.wrapper.EntAppReleaseWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.PublicAppReleaseWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.PublicAppWrapper; @@ -237,7 +236,7 @@ public class APIUtil { applicationDTO.setTags(applicationWrapper.getTags()); applicationDTO.setUnrestrictedRoles(applicationWrapper.getUnrestrictedRoles()); applicationDTO.setDeviceTypeId(deviceType.getId()); - List applicationReleaseEntities = applicationWrapper.getApplicationReleaseWrappers() + List applicationReleaseEntities = applicationWrapper.getEntAppReleaseWrappers() .stream().map(APIUtil::releaseWrapperToReleaseDTO).collect(Collectors.toList()); applicationDTO.setApplicationReleaseDTOs(applicationReleaseEntities); } else if (param instanceof WebAppWrapper){ @@ -274,14 +273,14 @@ public class APIUtil { public static ApplicationReleaseDTO releaseWrapperToReleaseDTO(T param){ ApplicationReleaseDTO applicationReleaseDTO = new ApplicationReleaseDTO(); - if (param instanceof ApplicationReleaseWrapper){ - ApplicationReleaseWrapper applicationReleaseWrapper = (ApplicationReleaseWrapper) param; - applicationReleaseDTO.setDescription(applicationReleaseWrapper.getDescription()); - applicationReleaseDTO.setReleaseType(applicationReleaseWrapper.getReleaseType()); - applicationReleaseDTO.setPrice(applicationReleaseWrapper.getPrice()); - applicationReleaseDTO.setIsSharedWithAllTenants(applicationReleaseWrapper.getIsSharedWithAllTenants()); - applicationReleaseDTO.setMetaData(applicationReleaseWrapper.getMetaData()); - applicationReleaseDTO.setSupportedOsVersions(applicationReleaseWrapper.getSupportedOsVersions()); + if (param instanceof EntAppReleaseWrapper){ + EntAppReleaseWrapper entAppReleaseWrapper = (EntAppReleaseWrapper) param; + applicationReleaseDTO.setDescription(entAppReleaseWrapper.getDescription()); + applicationReleaseDTO.setReleaseType(entAppReleaseWrapper.getReleaseType()); + applicationReleaseDTO.setPrice(entAppReleaseWrapper.getPrice()); + applicationReleaseDTO.setIsSharedWithAllTenants(entAppReleaseWrapper.getIsSharedWithAllTenants()); + applicationReleaseDTO.setMetaData(entAppReleaseWrapper.getMetaData()); + applicationReleaseDTO.setSupportedOsVersions(entAppReleaseWrapper.getSupportedOsVersions()); } else if (param instanceof WebAppReleaseWrapper){ WebAppReleaseWrapper webAppReleaseWrapper = (WebAppReleaseWrapper) param; applicationReleaseDTO.setDescription(webAppReleaseWrapper.getDescription()); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/management/ApplicationManagementTest.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/management/ApplicationManagementTest.java index fce6bc41a98..cd5cc13e588 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/management/ApplicationManagementTest.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/java/org.wso2.carbon.device.application.mgt.core/management/ApplicationManagementTest.java @@ -13,7 +13,7 @@ import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease import org.wso2.carbon.device.application.mgt.common.response.Category; import org.wso2.carbon.device.application.mgt.common.response.Tag; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; -import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper; +import org.wso2.carbon.device.application.mgt.common.wrapper.EntAppReleaseWrapper; 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.BaseTestCase; @@ -72,17 +72,17 @@ public class ApplicationManagementTest extends BaseTestCase { applicationWrapper.setTags(tags); applicationWrapper.setPaymentCurrency("USD"); - List applicationReleaseWrappers = new ArrayList<>(); - ApplicationReleaseWrapper releaseWrapper = new ApplicationReleaseWrapper(); + List entAppReleaseWrappers = new ArrayList<>(); + EntAppReleaseWrapper releaseWrapper = new EntAppReleaseWrapper(); releaseWrapper.setDescription("First release"); releaseWrapper.setIsSharedWithAllTenants(false); releaseWrapper.setMetaData("Just meta data"); releaseWrapper.setReleaseType("free"); releaseWrapper.setPrice(5.7); releaseWrapper.setSupportedOsVersions("4.0-7.0"); - applicationReleaseWrappers.add(releaseWrapper); + entAppReleaseWrappers.add(releaseWrapper); - applicationWrapper.setApplicationReleaseWrappers(applicationReleaseWrappers); + applicationWrapper.setEntAppReleaseWrappers(entAppReleaseWrappers); ApplicationArtifact applicationArtifact = new ApplicationArtifact(); applicationArtifact.setBannerName("My First Banner"); @@ -102,7 +102,7 @@ public class ApplicationManagementTest extends BaseTestCase { applicationArtifact.setScreenshots(screenshots); ApplicationManager manager = new ApplicationManagerImpl(); - manager.createApplication(applicationWrapper, applicationArtifact); + manager.createEntApp(applicationWrapper, applicationArtifact); } @Test @@ -171,12 +171,12 @@ public class ApplicationManagementTest extends BaseTestCase { } @Test - public ApplicationRelease createRelease(int applicationId, ApplicationReleaseWrapper applicationReleaseWrapper, ApplicationArtifact applicationArtifact) throws ApplicationManagementException { + public ApplicationRelease createRelease(int applicationId, EntAppReleaseWrapper entAppReleaseWrapper, ApplicationArtifact applicationArtifact) throws ApplicationManagementException { return null; } @Test - public boolean updateRelease(String deviceType, String applicationType, String releaseUuid, ApplicationReleaseWrapper applicationReleaseWrapper, ApplicationArtifact applicationArtifact) throws ApplicationManagementException { + public boolean updateRelease(String deviceType, String applicationType, String releaseUuid, EntAppReleaseWrapper entAppReleaseWrapper, ApplicationArtifact applicationArtifact) throws ApplicationManagementException { return false; } @@ -186,7 +186,7 @@ public class ApplicationManagementTest extends BaseTestCase { } @Test - public void validateReleaseCreatingRequest(ApplicationReleaseWrapper applicationReleaseWrapper, String applicationType) throws RequestValidatingException { + public void validateReleaseCreatingRequest(EntAppReleaseWrapper entAppReleaseWrapper, String applicationType) throws RequestValidatingException { } 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 699a97f78ac..08dfc42d4b9 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 @@ -39,7 +39,7 @@ import org.wso2.carbon.device.application.mgt.common.LifecycleChanger; 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.EntAppReleaseWrapper; 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.common.wrapper.PublicAppWrapper; @@ -507,7 +507,7 @@ public interface ApplicationManagementPublisherAPI { name = "applicationRelease", value = "The application release that need to be created.", required = true) - @Multipart("applicationRelease") ApplicationReleaseWrapper applicationReleaseWrapper, + @Multipart("applicationRelease") EntAppReleaseWrapper entAppReleaseWrapper, @ApiParam( name = "binaryFile", value = "Binary file of uploading application", @@ -602,10 +602,6 @@ public interface ApplicationManagementPublisherAPI { @ApiResponse( code = 200, message = "OK. \n Successfully updated artifacts."), - @ApiResponse( - code = 400, - message = "Bad Request. \n Requesting to update image artifacts with invalid application " - + "or application release data."), @ApiResponse( code = 403, message = "FORBIDDEN. \n Can't Update the application release in PUBLISHED or DEPRECATED " @@ -626,8 +622,7 @@ public interface ApplicationManagementPublisherAPI { @PathParam("uuid") String applicationUUID, @ApiParam( name = "icon", - value = "Icon of the uploading application", - required = true) + value = "Icon of the uploading application") @Multipart(value = "icon") Attachment iconFile, @ApiParam( name = "banner", @@ -635,23 +630,20 @@ public interface ApplicationManagementPublisherAPI { @Multipart(value = "banner") Attachment bannerFile, @ApiParam( name = "screenshot1", - value = "Screen Shots of the uploading application", - required = true) + value = "Screen Shots of the uploading application") @Multipart(value = "screenshot1") Attachment screenshot1, @ApiParam( name = "screenshot2", - value = "Screen Shots of the uploading application", - required = false) + value = "Screen Shots of the uploading application") @Multipart(value = "screenshot2") Attachment screenshot2, @ApiParam( name = "screenshot3", - value = "Screen Shots of the uploading application", - required = false) + value = "Screen Shots of the uploading application") @Multipart(value = "screenshot3") Attachment screenshot3 ); @PUT - @Path("/app-artifacts/{deviceType}/{appType}/{appId}/{uuid}") + @Path("/ent-app-artifacts/{deviceType}/{appId}/{uuid}") @Produces(MediaType.APPLICATION_JSON) @Consumes({"multipart/mixed", MediaType.MULTIPART_FORM_DATA}) @ApiOperation( @@ -690,11 +682,6 @@ public interface ApplicationManagementPublisherAPI { value = "Type of the device i.e Android, IOS etc", required = true) @PathParam("deviceType") String deviceType, - @ApiParam( - name = "appType", - value = "Type of the application i.e ENTERPRISE, PUBLIC, WEB, WEB-CLIP etc", - required = true) - @PathParam("appType") String appType, @ApiParam( name = "uuid", value = "UUID of the application", @@ -704,7 +691,7 @@ public interface ApplicationManagementPublisherAPI { ); @PUT - @Path("/app-release/{deviceType}/{appType}/{uuid}") + @Path("/ent-app-release/{deviceType}/{uuid}") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.MULTIPART_FORM_DATA) @ApiOperation( @@ -735,30 +722,24 @@ public interface ApplicationManagementPublisherAPI { message = "Internal Server Error. \n Error occurred while releasing the application.", response = ErrorResponse.class) }) - Response updateApplicationRelease( + Response updateEntAppRelease( @ApiParam( name = "deviceType", value = "Supported device type of the application", required = true) @PathParam("deviceType") String deviceType, - @ApiParam( - name = "appType", - value = "Type of the application", - required = true) - @PathParam("appType") String appType, @ApiParam( name = "UUID", value = "Unique identifier of the ApplicationDTO Release", required = true) @PathParam("uuid") String applicationUUID, @ApiParam( - name = "applicationReleaseWrapper", + name = "entAppReleaseWrapper", value = "Application release wrapper which is going to update.", required = true) @Multipart( - value = "applicationReleaseWrapper", - type = "application/json") - ApplicationReleaseWrapper applicationReleaseWrapper, + value = "entAppReleaseWrapper", + type = "application/json") EntAppReleaseWrapper entAppReleaseWrapper, @ApiParam( name = "binaryFile", value = "Application installer file.", 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 0894c0d221c..05ab98ee3aa 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 @@ -29,7 +29,7 @@ import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease import org.wso2.carbon.device.application.mgt.common.response.Category; import org.wso2.carbon.device.application.mgt.common.response.Tag; 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.EntAppReleaseWrapper; 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.common.wrapper.PublicAppWrapper; @@ -178,12 +178,12 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem List attachmentList = constructAttachmentList(screenshot1, screenshot2, screenshot3); try { applicationManager.validateAppCreatingRequest(applicationWrapper); - applicationManager.validateReleaseCreatingRequest(applicationWrapper.getApplicationReleaseWrappers().get(0)); + applicationManager.validateReleaseCreatingRequest(applicationWrapper.getEntAppReleaseWrappers().get(0)); applicationManager.validateBinaryArtifact(binaryFile); applicationManager.validateImageArtifacts(iconFile, bannerFile, attachmentList); // Created new Ent App - Application application = applicationManager.createApplication(applicationWrapper, + Application application = applicationManager.createEntApp(applicationWrapper, constructApplicationArtifact(binaryFile, iconFile, bannerFile, attachmentList)); if (application != null) { return Response.status(Response.Status.CREATED).entity(application).build(); @@ -284,7 +284,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Path("/ent-app/{appId}") public Response createEntAppRelease( @PathParam("appId") int appId, - @Multipart("applicationRelease") ApplicationReleaseWrapper applicationReleaseWrapper, + @Multipart("applicationRelease") EntAppReleaseWrapper entAppReleaseWrapper, @Multipart("binaryFile") Attachment binaryFile, @Multipart("icon") Attachment iconFile, @Multipart(value = "banner", required = false) Attachment bannerFile, @@ -294,12 +294,12 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem ApplicationManager applicationManager = APIUtil.getApplicationManager(); List attachmentList = constructAttachmentList(screenshot1, screenshot2, screenshot3); try { - applicationManager.validateReleaseCreatingRequest(applicationReleaseWrapper); + applicationManager.validateReleaseCreatingRequest(entAppReleaseWrapper); applicationManager.validateBinaryArtifact(binaryFile); applicationManager.validateImageArtifacts(iconFile, bannerFile, attachmentList); // Created new Ent App release - ApplicationRelease release = applicationManager.createEntAppRelease(appId, applicationReleaseWrapper, + ApplicationRelease release = applicationManager.createEntAppRelease(appId, entAppReleaseWrapper, constructApplicationArtifact(binaryFile, iconFile, bannerFile, attachmentList)); if (release != null) { return Response.status(Response.Status.CREATED).entity(release).build(); @@ -325,22 +325,18 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Path("/image-artifacts/{uuid}") public Response updateApplicationImageArtifacts( @PathParam("uuid") String applicationReleaseUuid, - @Multipart("icon") Attachment iconFile, + @Multipart(value = "icon", required = false) Attachment iconFile, @Multipart(value = "banner", required = false) Attachment bannerFile, - @Multipart("screenshot1") Attachment screenshot1, - @Multipart("screenshot2") Attachment screenshot2, - @Multipart("screenshot3") Attachment screenshot3) { + @Multipart(value = "screenshot1", required = false) Attachment screenshot1, + @Multipart(value = "screenshot2", required = false) Attachment screenshot2, + @Multipart(value = "screenshot3", required = false) Attachment screenshot3) { try { List attachments = constructAttachmentList(screenshot1, screenshot2, screenshot3); ApplicationManager applicationManager = APIUtil.getApplicationManager(); - applicationManager.validateImageArtifacts(iconFile, bannerFile, attachments); applicationManager.updateApplicationImageArtifact(applicationReleaseUuid, constructApplicationArtifact(null, iconFile, bannerFile, attachments)); return Response.status(Response.Status.OK) .entity("Successfully uploaded artifacts for the application " + applicationReleaseUuid).build(); - } catch (RequestValidatingException e) { - log.error(e.getMessage(), e); - return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build(); } catch (NotFoundException e) { log.error(e.getMessage(), e); return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build(); @@ -358,24 +354,16 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Override @PUT @Consumes({"multipart/mixed", MediaType.MULTIPART_FORM_DATA}) - @Path("/app-artifact/{deviceType}/{appType}/{uuid}") + @Path("/ent-app-artifact/{deviceType}//{uuid}") public Response updateApplicationArtifact( @PathParam("deviceType") String deviceType, - @PathParam("appType") String appType, @PathParam("uuid") String applicationReleaseUuid, @Multipart("binaryFile") Attachment binaryFile) { try { - if (!ApplicationType.ENTERPRISE.toString().equals(appType)) { - String msg = "If Application type is " + appType + ", then you don't have application release artifact " - + "to update for application release UUID: " + applicationReleaseUuid; - log.error(msg); - return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); - } ApplicationManager applicationManager = APIUtil.getApplicationManager(); - //todo check again applicationManager.validateBinaryArtifact(binaryFile); - applicationManager.updateApplicationArtifact(deviceType, appType, applicationReleaseUuid, + applicationManager.updateApplicationArtifact(deviceType, applicationReleaseUuid, constructApplicationArtifact(binaryFile, null, null, null)); return Response.status(Response.Status.OK) .entity("Successfully uploaded artifacts for the application release. UUID is " @@ -422,25 +410,21 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Override @PUT - @Path("/app-release/{deviceType}/{appType}/{uuid}") - public Response updateApplicationRelease( + @Path("/ent-app-release/{deviceType}/{uuid}") + public Response updateEntAppRelease( @PathParam("deviceType") String deviceType, - @PathParam("appType") String appType, @PathParam("uuid") String applicationUUID, - @Multipart("applicationRelease") ApplicationReleaseWrapper applicationReleaseWrapper, - @Multipart("binaryFile") Attachment binaryFile, - @Multipart("icon") Attachment iconFile, + @Multipart("applicationRelease") EntAppReleaseWrapper entAppReleaseWrapper, + @Multipart(value = "binaryFile", required = false) Attachment binaryFile, + @Multipart(value = "icon", required = false) Attachment iconFile, @Multipart(value = "banner", required = false) Attachment bannerFile, - @Multipart("screenshot1") Attachment screenshot1, - @Multipart("screenshot2") Attachment screenshot2, - @Multipart("screenshot3") Attachment screenshot3) { + @Multipart(value = "screenshot1", required = false) Attachment screenshot1, + @Multipart(value = "screenshot2", required = false) Attachment screenshot2, + @Multipart(value = "screenshot3", required = false) Attachment screenshot3) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); List screenshots = constructAttachmentList(screenshot1, screenshot2, screenshot3); try { - //todo check again - applicationManager.validateBinaryArtifact(binaryFile); - applicationManager.validateImageArtifacts(iconFile, bannerFile, screenshots); - if (!applicationManager.updateRelease(deviceType, appType, applicationUUID, applicationReleaseWrapper, + if (!applicationManager.updateEntAppRelease(deviceType, applicationUUID, entAppReleaseWrapper, constructApplicationArtifact(binaryFile, iconFile, bannerFile, screenshots))) { String msg ="Application release updating is failed. Please contact the administrator. " + "ApplicationDTO release UUID: " + applicationUUID + ", Supported device type: " + deviceType; @@ -467,10 +451,6 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem String msg = "Error while updating the application release of the application with UUID " + applicationUUID; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } catch (RequestValidatingException e) { - String msg = "Error occurred while updating the application release in the file system"; - log.error(msg); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } } @@ -818,7 +798,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem applicationArtifact.setBannerStream(bannerStream); } - if (attachmentList != null) { + if (attachmentList != null && !attachmentList.isEmpty()) { Map scrrenshotData = new TreeMap<>(); for (Attachment sc : attachmentList) { dataHandler = sc.getDataHandler(); 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 ddca629ac66..4f6287e21f7 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 @@ -78,23 +78,23 @@ public class ApplicationManagementPublisherAdminAPIImpl implements ApplicationMa @DELETE @Path("/{appId}") public Response deleteApplication( - @PathParam("appId") int applicatioId) { + @PathParam("appId") int applicationId) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); try { - applicationManager.deleteApplication(applicatioId); - String responseMsg = "Successfully deleted the application which has ID: " + applicatioId + ""; + applicationManager.deleteApplication(applicationId); + String responseMsg = "Successfully deleted the application which has ID: " + applicationId + ""; 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; + "Couldn't found application release which is having the ID:" + applicationId; 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; + String msg = "You don't have require permission to delete the application which has ID: " + applicationId; 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; + String msg = "Error occurred while deleting the application which has application ID:: " + applicationId; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json index 0032b91112c..ae0f25ad97b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/package.json @@ -12,7 +12,7 @@ "dependencies": { "acorn": "^6.1.1", "antd": "^3.15.0", - "axios": "^0.18.0", + "axios": "^0.19.0", "d3": "^5.9.2", "dagre": "^0.8.4", "fetch": "^1.1.0", diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/new-app/AddNewAppForm.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/new-app/AddNewAppForm.js index 91cd8bc0ac9..2496c2f5698 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/new-app/AddNewAppForm.js +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/react-app/src/components/new-app/AddNewAppForm.js @@ -261,24 +261,19 @@ class AddNewAppFormComponent extends React.Component { - var data = new FormData(); - // data.append("binaryFile", "/Users/jayasanka/Desktop/gov/viber/a.apk"); - // data.append("application", "{\n\t\"name\": \"Tub1111\",\n\t\"description\": \"Watch thousands of hit movies and TV series for free. Tubi is 100% legal unlimited streaming, with no credit cards and no subscription required. Choose what you want to watch, when you want to watch it, with fewer ads than regular TV. Tubi is the largest free streaming service featuring award-winning movies and TV series. There is something for everybody; from comedy to drama, kids to classics, and niche favorites such as Korean dramas, anime, and British series. Download now and start streaming entertainment for free, today!\",\n\t\"appCategories\": [\"EMM\"],\n\t\"subType\": \"FREE\",\n\t\"tags\": [\"tv\", \"movies\"],\n\t\"unrestrictedRoles\": [],\n\t\"deviceType\": \"android\",\n\t\"entAppReleaseWrappers\": [{\n\t\t\"description\": \" SEND A MESSAGE -Skip exchanging phone numbers, just send a message. It's seamless across devices. * SHOW YOUR REACTION - Add a silly sticker\",\n\t\t\"releaseType\": \"GA\",\n\t\t\"price\": 0.0,\n\t\t\"isSharedWithAllTenants\": false,\n\t\t\"metaData\": \"{\\\"developer\\\":\\\"Facebook, Inc.\\\",\\\"Copyright\\\":\\\"\\u00A9 Facebook, Inc.\\\",\\\"Location\\\":\\\"This app may use your location even when it isn't open, which can decrease battery life.\\\"}\",\n\t\t\"ratedUsers\": 0,\n\t\t\"rating\": 0,\n\t\t\"supportedOsVersions\": \"4.0-10.0\"\n\t}]\n}"); - // data.append("icon", "/Users/jayasanka/Desktop/gov/angular/i.png"); - // data.append("screenshot1", "/Users/jayasanka/Desktop/gov/angular/1.webp"); - // data.append("screenshot2", "/Users/jayasanka/Desktop/gov/angular/2.webp"); - // data.append("screenshot3", "/Users/jayasanka/Desktop/gov/angular/3.webp"); - - + let data = new FormData(); data.append('binaryFile', binaryFile[0].originFileObj); data.append('icon', icon[0].originFileObj); data.append('screenshot1', screenshots[0].originFileObj); data.append('screenshot2', screenshots[1].originFileObj); data.append('screenshot3', screenshots[2].originFileObj); - data.append('application', JSON.toString(payload.application)); - + const json = JSON.stringify(payload.application); + const blob = new Blob([json], { + type: 'application/json' + }); + data.append('application', blob); - var xhr = new XMLHttpRequest(); + let xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function () { @@ -287,12 +282,10 @@ class AddNewAppFormComponent extends React.Component { } }); - xhr.open("POST", "https://localhost:9443/ui-request-handler/invoke/application-mgt-publisher/v1.0/applications/ent-app"); - xhr.setRequestHeader("Content-Type", "multipart/mixed"); + const url = config.serverConfig.protocol + "://" + config.serverConfig.hostname + ':' + config.serverConfig.httpsPort + config.serverConfig.invoker.uri + config.serverConfig.invoker.publisher + "/applications/ent-app"; + xhr.open("POST", url); xhr.setRequestHeader("X-Platform", "publisher"); - xhr.send(data); - } }); }; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/SubscriptionManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/SubscriptionManagementAPIImpl.java index 94d70c08d10..047b05ad3f2 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/SubscriptionManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/SubscriptionManagementAPIImpl.java @@ -57,7 +57,7 @@ public class SubscriptionManagementAPIImpl implements SubscriptionManagementAPI{ try { SubscriptionManager subscriptionManager = APIUtil.getSubscriptionManager(); ApplicationInstallResponse response = subscriptionManager - .performBulkAppInstallation(uuid, deviceIdentifiers, SubsciptionType.DEVICE.toString(), action); + .performBulkAppOperation(uuid, deviceIdentifiers, SubsciptionType.DEVICE.toString(), action); return Response.status(Response.Status.OK).entity(response).build(); } catch (NotFoundException e) { String msg = "Couldn't found an application release for UUI: " + uuid; @@ -92,7 +92,7 @@ public class SubscriptionManagementAPIImpl implements SubscriptionManagementAPI{ try { SubscriptionManager subscriptionManager = APIUtil.getSubscriptionManager(); ApplicationInstallResponse response = subscriptionManager - .performBulkAppInstallation(uuid, subscribers, subType, action); + .performBulkAppOperation(uuid, subscribers, subType, action); return Response.status(Response.Status.OK).entity(response).build(); } catch (NotFoundException e) { String msg = "Couldn't found an application release for UUID: " + uuid + ". Hence, verify the payload";