diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationArtifact.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationArtifact.java index 1b44fb9e7fb..a8ae90ff589 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationArtifact.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/ApplicationArtifact.java @@ -1,4 +1,5 @@ -package org.wso2.carbon.device.application.mgt.common;/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. +package org.wso2.carbon.device.application.mgt.common; +/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. * * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except 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 eb5f11a022d..ae452e5f558 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 @@ -175,16 +175,16 @@ public interface ApplicationManager { * @param applicationId ID of the application * @param releaseUuid UUID of the application release * @param deviceType Supported device type of the application - * @param applicationRelease {@link ApplicationReleaseDTO} + * @param applicationReleaseWrapper {@link ApplicationReleaseDTO} * @param binaryFileStram {@link InputStream} of the binary file * @param iconFileStream {@link InputStream} of the icon * @param bannerFileStream {@link InputStream} of the banner * @param attachments {@link List} of {@link InputStream} of attachments * @return If the application release is updated correctly True returns, otherwise retuen False */ - boolean updateRelease(int applicationId, String releaseUuid, String deviceType, ApplicationReleaseDTO applicationRelease, - InputStream binaryFileStram, InputStream iconFileStream, InputStream bannerFileStream, - List attachments) throws ApplicationManagementException; + boolean updateRelease(String deviceType, String applicationType, String releaseUuid, + ApplicationReleaseWrapper applicationReleaseWrapper, 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 26e426227e5..759e6136283 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 @@ -22,7 +22,6 @@ package org.wso2.carbon.device.application.mgt.common.services; 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.exception.ApplicationStorageManagementException; -import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; import java.io.InputStream; 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/ApplicationReleaseWrapper.java index cef7d31e0cb..3d991776474 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/ApplicationReleaseWrapper.java @@ -1,20 +1,18 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. + * http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.wso2.carbon.device.application.mgt.common.wrapper; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationUpdateWrapper.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationUpdateWrapper.java index 88e3f959079..81d0f1714f1 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationUpdateWrapper.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/wrapper/ApplicationUpdateWrapper.java @@ -1,20 +1,18 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. + * http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.wso2.carbon.device.application.mgt.common.wrapper; 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 b83bbc6a7de..3a02f1b3dcf 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 @@ -1,20 +1,18 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved. * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at + * Entgra (Pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. + * http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ package org.wso2.carbon.device.application.mgt.common.wrapper; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java index efd1bdec20b..d43819d949d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java @@ -207,5 +207,7 @@ public interface ApplicationDAO { * @throws ApplicationManagementDAOException if unable to fetch the ApplicationDTO from the data store. */ ApplicationDTO getApplicationByRelease(String appReleaseUUID, int tenantId) throws ApplicationManagementDAOException; + + String getApplicationSubTypeByUUID(String uuid, int tenantId) throws ApplicationManagementDAOException; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java index f003862396f..64dc0bd9847 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java @@ -1095,4 +1095,41 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic Util.cleanupResources(stmt, rs); } } + + @Override + public String getApplicationSubTypeByUUID(String uuid, int tenantId) throws ApplicationManagementDAOException { + Connection conn; + String sql; + try { + conn = this.getDBConnection(); + sql = "SELECT AP_APP.SUB_TYPE AS SUB_TYPE " + + "FROM AP_APP " + + "WHERE " + + "AP_APP.ID = (SELECT AP_APP_RELEASE.AP_APP_ID " + + " FROM AP_APP_RELEASE " + + " WHERE AP_APP_RELEASE.UUID = ?) " + + "AND AP_APP.TENANT_ID = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)){ + stmt.setString(1, uuid); + stmt.setInt(2, tenantId); + try(ResultSet rs = stmt.executeQuery()){ + if (rs.next()){ + return rs.getString("SUB_TYPE"); + } + return null; + } + } + } catch (DBConnectionException e) { + String msg = "Error occurred while obtaining the DB connection to get subscription type of the application " + + "for given application release uuid. UUID:." + uuid; + log.error(msg); + throw new ApplicationManagementDAOException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while getting application subscribe type for given application release UUID: " + + uuid + " from database."; + log.error(msg); + throw new ApplicationManagementDAOException(msg, e); + } + } + } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/release/GenericApplicationReleaseDAOImpl.java index d8d473932cb..ad5f520570b 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 @@ -241,7 +241,8 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements + "AR.APP_META_INFO AS RELEASE_META_INFO, " + "AR.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, " + "AR.RATING AS RELEASE_RATING, " - + "AR.CURRENT_STATE AS RELEASE_CURRENT_STATE, AR.RATED_USERS AS RATED_USER_COUNT " + + "AR.CURRENT_STATE AS RELEASE_CURRENT_STATE, " + + "AR.RATED_USERS AS RATED_USER_COUNT " + "FROM AP_APP_RELEASE AS AR " + "WHERE AR.UUID = ? AND AR.TENAT_ID = ?"; 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 7a1f683ba61..d04b68ac58e 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 @@ -416,6 +416,91 @@ public class ApplicationManagerImpl implements ApplicationManager { return applicationReleaseDTO; } + private ApplicationReleaseDTO updateApplicationReleaseArtifacts(String applicationType, String deviceType, + ApplicationReleaseDTO applicationReleaseDTO, ApplicationArtifact applicationArtifact) + throws ResourceManagementException, ApplicationManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + + // The application executable artifacts such as apks are uploaded. + if (ApplicationType.ENTERPRISE.toString().equals(applicationType)) { + try { + byte[] content = IOUtils.toByteArray(applicationArtifact.getInstallerStream()); + + 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()); + + try (ByteArrayInputStream binary = new ByteArrayInputStream(content)) { + ApplicationInstaller applicationInstaller = applicationStorageManager + .getAppInstallerData(binary, deviceType); + String packagename = applicationInstaller.getPackageName(); + + 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."; + 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); + } + + applicationReleaseDTO.setAppHashValue(md5OfApp); + try (ByteArrayInputStream binaryDuplicate = new ByteArrayInputStream(content)) { + applicationReleaseDTO = applicationStorageManager + .uploadReleaseArtifact(applicationReleaseDTO,applicationType, + deviceType, binaryDuplicate); + } + } + } + + } + + + } 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()); + } + return applicationReleaseDTO; + } + private ApplicationReleaseDTO addImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO, ApplicationArtifact applicationArtifact) throws ResourceManagementException { ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); @@ -432,13 +517,49 @@ public class ApplicationManagerImpl implements ApplicationManager { applicationReleaseDTO.setScreenshotName1(scName); } else if (counter == 2) { applicationReleaseDTO.setScreenshotName2(scName); + } else if (counter == 3) { + applicationReleaseDTO.setScreenshotName3(scName); + } + counter++; + } + + // Upload images + applicationReleaseDTO = applicationStorageManager + .uploadImageArtifacts(applicationReleaseDTO, applicationArtifact.getIconStream(), + applicationArtifact.getBannerStream(), new ArrayList<>(screenshots.values())); + return applicationReleaseDTO; + } + private ApplicationReleaseDTO updateImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO, + ApplicationArtifact applicationArtifact) throws ResourceManagementException{ + ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); + + applicationReleaseDTO.setIconName(applicationArtifact.getIconName()); + 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); } counter++; } + int numOfScreenshots = screenshotNames.size(); + if (numOfScreenshots == 1) { + applicationReleaseDTO.setScreenshotName2(null); + applicationReleaseDTO.setScreenshotName3(null); + } else if (numOfScreenshots == 2) { + applicationReleaseDTO.setScreenshotName3(null); + } + // Upload images applicationReleaseDTO = applicationStorageManager .uploadImageArtifacts(applicationReleaseDTO, applicationArtifact.getIconStream(), @@ -1683,132 +1804,75 @@ public class ApplicationManagerImpl implements ApplicationManager { return lifecycleState; } - //todo check whether package names are same @Override - public boolean updateRelease(int applicationId, String releaseUuid, String deviceType, - ApplicationReleaseDTO updateRelease, InputStream binaryFileStram, InputStream iconFileStream, - InputStream bannerFileStream, List attachments) throws ApplicationManagementException { + public boolean updateRelease(String deviceType, String applicationType, String releaseUuid, + ApplicationReleaseWrapper applicationReleaseWrapper, ApplicationArtifact applicationArtifact) + throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); - String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - ApplicationReleaseDTO release; - ApplicationDTO app = null; - ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager(); - DeviceType deviceTypeObj; - boolean isAdminUser; - try { - // Getting the device type details to get device type ID for internal mappings - deviceTypeObj = Util.getDeviceManagementService().getDeviceType(deviceType); - isAdminUser = isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION); - ConnectionManagerUtil.beginDBTransaction(); - app = this.applicationDAO.getApplicationById(applicationId, tenantId); - release = this.applicationReleaseDAO.getReleaseByIds(applicationId, releaseUuid, tenantId); + ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO + .getReleaseByUUID(releaseUuid, tenantId); - if (app == null) { - ConnectionManagerUtil.rollbackDBTransaction(); - throw new NotFoundException( - "Couldn't found an application for updating. ApplicationDTO id: " + applicationId); + if (applicationReleaseDTO == null) { + String msg = "Couldn't found an application release for updating. Application release UUID: " + releaseUuid; + log.error(msg); + throw new NotFoundException(msg); } - if (deviceTypeObj == null || deviceTypeObj.getId() != app.getDeviceTypeId()) { - ConnectionManagerUtil.rollbackDBTransaction(); - throw new BadRequestException( - "Request to update application release for Invalid device type. Device type: " + deviceType - + " application ID " + applicationId + " ApplicationDTO Release UUID " + releaseUuid); - } - if (release == null) { - ConnectionManagerUtil.rollbackDBTransaction(); - throw new NotFoundException( - "Couldn't found an application realise for updating. ApplicationDTO id: " + applicationId - + " and application release UUID: " + releaseUuid); + 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); } - String releaseType = updateRelease.getReleaseType(); - Double price = updateRelease.getPrice(); - String metaData = updateRelease.getMetaData(); + DeviceType deviceTypeObj = getDeviceTypeData(deviceType); + String releaseType = applicationReleaseWrapper.getReleaseType(); + Double price = applicationReleaseWrapper.getPrice(); + String metaData = applicationReleaseWrapper.getMetaData(); - if (price < 0.0 || (price == 0.0 && ApplicationSubscriptionType.PAID.toString().equals(app.getSubType())) - || (price > 0.0 && ApplicationSubscriptionType.FREE.toString().equals(app.getSubType()))) { - ConnectionManagerUtil.rollbackDBTransaction(); + 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); + } + + if (price < 0.0 || (price == 0.0 && ApplicationSubscriptionType.PAID.toString().equals(applicationSubType)) + || (price > 0.0 && ApplicationSubscriptionType.FREE.toString().equals(applicationSubType))) { throw new BadRequestException( "Invalid app release payload for updating application release. ApplicationDTO price is " + price - + " for " + app.getSubType() + " application. ApplicationDTO ID: " + applicationId - + ", ApplicationDTO Release UUID " + releaseUuid + " and supported device type is " - + deviceType); + + " for " + applicationSubType + " application., Application Release UUID " + + releaseUuid + " and supported device type is " + deviceType); } - release.setPrice(price); - if (releaseType != null) { - release.setReleaseType(releaseType); + applicationReleaseDTO.setPrice(price); + if (!StringUtils.isEmpty(releaseType)) { + applicationReleaseDTO.setReleaseType(releaseType); } - if (metaData != null) { - release.setMetaData(metaData); - } - - List unrestrictedRoles = app.getUnrestrictedRoles(); - - String applicationReleaseCreatedUser = lifecycleStateDAO - .getAppReleaseCreatedUsername(applicationId, releaseUuid, tenantId); - - if (!isAdminUser && !(!unrestrictedRoles.isEmpty() && hasUserRole(unrestrictedRoles, userName)) - && !userName.equals(applicationReleaseCreatedUser)) { - ConnectionManagerUtil.rollbackDBTransaction(); - throw new ForbiddenException("You are not authorized user to update application"); - } - - //todo try to remove this DB call and get it when getting application release - LifecycleStateDTO lifecycleState = this.lifecycleStateDAO.getLatestLifeCycleState(applicationId, releaseUuid); - if (!AppLifecycleState.CREATED.toString().equals(lifecycleState.getCurrentState()) - && !AppLifecycleState.IN_REVIEW.toString().equals(lifecycleState.getCurrentState()) - && !AppLifecycleState.REJECTED.toString().equals(lifecycleState.getCurrentState())) { - ConnectionManagerUtil.rollbackDBTransaction(); - throw new ForbiddenException( - "You can't update application release which is in " + lifecycleState.getCurrentState() - + " State"); + if (!StringUtils.isEmpty(metaData)) { + applicationReleaseDTO.setMetaData(metaData); } -// release = applicationStorageManager -// .deleteImageArtifacts(release, iconFileStream, bannerFileStream, attachments); -// release = applicationStorageManager -// .copyImageArtifactsAndDeleteInstaller(release, app.getType(), deviceType, binaryFileStram); - return applicationReleaseDAO.updateRelease(release, tenantId) != null; - } catch (DeviceManagementException e) { - throw new ApplicationManagementException("Error occured when validating the device type " + deviceType, e); - } catch (UserStoreException e) { - throw new ApplicationManagementException( - "Error occured while verifying whether user is admin user or not. Username " + userName - + " tenant id " + tenantId, e); - } catch (LifeCycleManagementDAOException e) { - ConnectionManagerUtil.rollbackDBTransaction(); - throw new ApplicationManagementException( - "Error Occured when getting lifecycle state of the application release of application UUID: " - + releaseUuid, e); + applicationReleaseDTO = updateApplicationReleaseArtifacts(applicationType, deviceTypeObj.getName(), + applicationReleaseDTO, applicationArtifact); + applicationReleaseDTO = updateImageArtifacts(applicationReleaseDTO, applicationArtifact); + return applicationReleaseDAO.updateRelease(applicationReleaseDTO, tenantId) != null; } catch (ApplicationManagementDAOException e) { ConnectionManagerUtil.rollbackDBTransaction(); - throw new ApplicationManagementException( - "Error occured when updating ApplicationDTO release. ApplicationDTO ID " + applicationId - + " ApplicationDTO Release UUID: " + releaseUuid, e); + String msg = "Error occured when updating Application release. ApplicationDTO ID ApplicationDTO Release " + + "UUID: " + releaseUuid; + log.error(msg); + throw new ApplicationManagementException(msg, e); + } catch (ResourceManagementException e) { + String msg = "Error occured when updating application release artifact in the file system. Application " + + "release UUID:" + releaseUuid; + log.error(msg); + throw new ApplicationManagementException(msg, e); } -// catch (ApplicationStorageManagementException e) { -// ConnectionManagerUtil.rollbackDBTransaction(); -// throw new ApplicationManagementException( -// "Error occured when updating application release artifact. ApplicationDTO ID " + applicationId -// + " ApplicationDTO release UUID: " + releaseUuid, e); -// } -// catch (ResourceManagementException e) { -// // updating images -// ConnectionManagerUtil.rollbackDBTransaction(); -// throw new ApplicationManagementException( -// "Error occured when updating image artifact of the application release. ApplicationDTO ID: " -// + applicationId + " ApplicationDTO release UUID: " + releaseUuid, e); -// } catch (RequestValidatingException e) { -// ConnectionManagerUtil.rollbackDBTransaction(); -// throw new ApplicationManagementException( -// "Error occured when validating application release artifact for device type " + deviceType -// + " And application type " + app.getType() + ". Applicationn ID: " + applicationId -// + " ApplicationDTO release UUID: " + releaseUuid); -// } } 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 b695405bc10..053aa3bf73c 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 @@ -78,7 +78,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager public ApplicationReleaseDTO uploadImageArtifacts(ApplicationReleaseDTO applicationRelease, InputStream iconFileStream, InputStream bannerFileStream, List screenShotStreams) throws ResourceManagementException { - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String artifactDirectoryPath; String iconStoredLocation; String bannerStoredLocation; @@ -122,10 +121,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager } catch (IOException e) { throw new ApplicationStorageManagementException("IO Exception while saving the screens hots for " + "the application " + applicationRelease.getUuid(), e); - } catch (ApplicationStorageManagementException e) { - throw new ApplicationStorageManagementException("ApplicationDTO Management DAO exception while trying to " - + "update the screen-shot count for the application " + applicationRelease.getUuid() + - " for the tenant id " + tenantId, e); } } 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 5ffaa35752b..30dbfb2fb40 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 @@ -535,7 +535,7 @@ public interface ApplicationManagementPublisherAPI { ); @PUT - @Path("/{deviceType}/{appId}/{uuid}") + @Path("/app-release/{deviceType}/{appType}/{uuid}") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.MULTIPART_FORM_DATA) @ApiOperation( @@ -567,21 +567,56 @@ public interface ApplicationManagementPublisherAPI { response = ErrorResponse.class) }) Response updateApplicationRelease( - @ApiParam(name = "deviceType", value = "Supported device type of the application", required = true) + @ApiParam( + name = "deviceType", + value = "Supported device type of the application", + required = true) @PathParam("deviceType") String deviceType, - @ApiParam(name = "appId", value = "Identifier of the ApplicationDTO", required = true) - @PathParam("appId") int applicationId, - @ApiParam(name = "UUID", value = "Unique identifier of the ApplicationDTO Release", required = true) + @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, - @Multipart(value = "applicationRelease", required = false, type = "application/json") ApplicationReleaseDTO applicationRelease, - @Multipart(value = "binaryFile", required = false) Attachment binaryFile, - @Multipart(value = "icon", required = false) Attachment iconFile, - @Multipart(value = "banner", required = false) Attachment bannerFile, - @ApiParam(name = "screenshot1", value = "Screen Shots of the uploading application", required = true) + @ApiParam( + name = "applicationReleaseWrapper", + value = "Application release wrapper which is going to update.", + required = true) + @Multipart( + value = "applicationReleaseWrapper", + type = "application/json") + ApplicationReleaseWrapper applicationReleaseWrapper, + @ApiParam( + name = "binaryFile", + value = "Application installer file.", + required = true) + @Multipart(value = "binaryFile") Attachment binaryFile, + @ApiParam( + name = "icon", + value = "Icon file of the application release.", + required = true) + @Multipart(value = "icon") Attachment iconFile, + @ApiParam( + name = "banner", + value = "banner file of the application release.", + required = true) + @Multipart(value = "banner") Attachment bannerFile, + @ApiParam( + name = "screenshot1", + value = "First screenshot of the uploading application", + required = true) @Multipart(value = "screenshot1") Attachment screenshot1, - @ApiParam(name = "screenshot2", value = "Screen Shots of the uploading application") + @ApiParam( + name = "screenshot2", + value = "Second screenshot 2 of the uploading application") @Multipart(value = "screenshot2") Attachment screenshot2, - @ApiParam(name = "screenshot3", value = "Screen Shots of the uploading application") + @ApiParam( + name = "screenshot3", + value = "Third screenshot of the uploading application") @Multipart(value = "screenshot3") Attachment screenshot3); @GET 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 be37e9e3b2c..a72767a6ed6 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 @@ -288,6 +288,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem try { ApplicationManager applicationManager = APIUtil.getApplicationManager(); + applicationManager.validateBinaryArtifact(binaryFile, appType); if (!ApplicationType.ENTERPRISE.toString().equals(appType)) { String msg = "If ApplicationDTO type is " + appType + ", therefore you don't have application release artifact to update for application release UUID: " @@ -295,7 +296,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem log.error(msg); return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); } - applicationManager.validateBinaryArtifact(binaryFile, appType); + applicationManager.updateApplicationArtifact(deviceType, appType, applicationReleaseUuid, constructApplicationArtifact(binaryFile, null, null, null)); return Response.status(Response.Status.OK) @@ -341,18 +342,14 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem } } - /* - //todo ---------------------- - */ - @Override @PUT - @Path("/{deviceType}/{appId}/{uuid}") + @Path("/app-release/{deviceType}/{appType}/{uuid}") public Response updateApplicationRelease( @PathParam("deviceType") String deviceType, - @PathParam("appId") int applicationId, + @PathParam("appType") String appType, @PathParam("uuid") String applicationUUID, - @Multipart("applicationRelease") ApplicationReleaseDTO applicationRelease, + @Multipart("applicationRelease") ApplicationReleaseWrapper applicationReleaseWrapper, @Multipart("binaryFile") Attachment binaryFile, @Multipart("icon") Attachment iconFile, @Multipart("banner") Attachment bannerFile, @@ -360,50 +357,35 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Multipart("screenshot2") Attachment screenshot2, @Multipart("screenshot3") Attachment screenshot3) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); - InputStream iconFileStream; - InputStream bannerFileStream; - InputStream binaryFileStram; - List attachments = new ArrayList<>(); - List attachmentList = new ArrayList<>(); + List screenshots = new ArrayList<>(); if (screenshot1 != null){ - attachmentList.add(screenshot1); + screenshots.add(screenshot1); } if (screenshot2 != null) { - attachmentList.add(screenshot2); + screenshots.add(screenshot2); } if (screenshot3 != null) { - attachmentList.add(screenshot3); + screenshots.add(screenshot3); } - if (iconFile == null || bannerFile == null || binaryFile == null || attachmentList.isEmpty()){ - String msg = "Invalid data is received for application release updating. application id: " + applicationId - + " and application release UUID: " + applicationUUID; - return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); - } - try { - binaryFileStram = binaryFile.getDataHandler().getInputStream(); - iconFileStream = iconFile.getDataHandler().getInputStream(); - bannerFileStream = bannerFile.getDataHandler().getInputStream(); - for (Attachment screenshot : attachmentList) { - attachments.add(screenshot.getDataHandler().getInputStream()); - } - boolean status = applicationManager - .updateRelease(applicationId, applicationUUID, deviceType, applicationRelease, binaryFileStram, - iconFileStream, bannerFileStream, attachments); - if (!status){ - log.error("ApplicationDTO release updating is failed. Please contact the administrator. ApplicationDTO id: " - + applicationId + ", ApplicationDTO release UUID: " + applicationUUID + ", Supported device type: " - + deviceType); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(applicationRelease).build(); + applicationManager.validateBinaryArtifact(binaryFile, appType); + applicationManager.validateImageArtifacts(iconFile, bannerFile, screenshots); + if (!applicationManager.updateRelease(deviceType, appType, applicationUUID, applicationReleaseWrapper, + constructApplicationArtifact(binaryFile, iconFile, bannerFile, screenshots))) { + log.error("Application release updating is failed. Please contact the administrator. " + + "ApplicationDTO release UUID: " + applicationUUID + ", Supported device type: " + deviceType); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(applicationReleaseWrapper).build(); } - return Response.status(Response.Status.OK).entity("ApplicationDTO release is successfully updated.").build(); - } catch(BadRequestException e){ - String msg = "Invalid request to update application release for application release UUID " + applicationUUID; + + return Response.status(Response.Status.OK).entity("Application release is successfully updated.").build(); + } catch (BadRequestException e) { + String msg = + "Invalid request to update application release for application release UUID " + applicationUUID; log.error(msg, e); return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); } catch (NotFoundException e) { - String msg = "Couldn't found application or application release for application id: " + applicationId - + " and application release UUID " + applicationUUID; + String msg = + "Couldn't found application or application release for application release UUID " + applicationUUID; log.error(msg, e); return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); } catch (ForbiddenException e) { @@ -411,18 +393,20 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem + applicationUUID; log.error(msg, e); return Response.status(Response.Status.FORBIDDEN).entity(msg).build(); - } - catch (ApplicationManagementException e) { + } catch (ApplicationManagementException e) { 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 (IOException e) { - String msg = "Error while updating the release artifacts of the application with UUID " + applicationUUID; - log.error(msg, e); + } 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(); } } + /* +//todo ---------------------- +*/ @DELETE @Path("/{appid}") public Response deleteApplication(