Merge branch 'application-mgt-new' of https://gitlab.com/tcdlpds/carbon-device-mgt into application-mgt-new

feature/appm-store/pbac
Jayasanka 6 years ago
commit 4681ac250f

@ -95,10 +95,10 @@ public class ApplicationDTO {
example = "REMOVED, ACTIVE") example = "REMOVED, ACTIVE")
private String status; private String status;
@ApiModelProperty(name = "applicationReleases", @ApiModelProperty(name = "applicationReleaseDTOs",
value = "List of application releases", value = "List of application releases",
required = true) required = true)
private List<ApplicationReleaseDTO> applicationReleases; private List<ApplicationReleaseDTO> applicationReleaseDTOs;
public int getId() { public int getId() {
return id; return id;
@ -152,12 +152,12 @@ public class ApplicationDTO {
this.paymentCurrency = paymentCurrency; this.paymentCurrency = paymentCurrency;
} }
public List<ApplicationReleaseDTO> getApplicationReleases() { public List<ApplicationReleaseDTO> getApplicationReleaseDTOs() {
return applicationReleases; return applicationReleaseDTOs;
} }
public void setApplicationReleases(List<ApplicationReleaseDTO> applicationReleases) { public void setApplicationReleaseDTOs(List<ApplicationReleaseDTO> applicationReleaseDTOs) {
this.applicationReleases = applicationReleases; this.applicationReleaseDTOs = applicationReleaseDTOs;
} }
public List<String> getUnrestrictedRoles() { public List<String> getUnrestrictedRoles() {

@ -28,6 +28,7 @@ import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException;
import org.wso2.carbon.device.application.mgt.common.response.Application; import org.wso2.carbon.device.application.mgt.common.response.Application;
import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper;
@ -52,12 +53,12 @@ public interface ApplicationManager {
/** /**
* Updates an already existing application. * Updates an already existing application.
* *
* @param application Application that need to be updated. * @param applicationWrapper Application that need to be updated.
* @param applicationId ID of the application * @param applicationId ID of the application
* @return Updated Application * @return Updated Application
* @throws ApplicationManagementException ApplicationDTO Management Exception * @throws ApplicationManagementException ApplicationDTO Management Exception
*/ */
ApplicationDTO updateApplication(int applicationId, ApplicationDTO application) throws ApplicationManagementException; void updateApplication(int applicationId, ApplicationWrapper applicationWrapper) throws ApplicationManagementException;
/** /**
* Delete an application identified by the unique ID. * Delete an application identified by the unique ID.
@ -93,7 +94,7 @@ public interface ApplicationManager {
* @return the ApplicationDTO identified by the ID * @return the ApplicationDTO identified by the ID
* @throws ApplicationManagementException ApplicationDTO Management Exception. * @throws ApplicationManagementException ApplicationDTO Management Exception.
*/ */
ApplicationDTO getApplicationById(int id, String state) throws ApplicationManagementException; Application getApplicationById(int id, String state) throws ApplicationManagementException;
/** /**
* To get the ApplicationDTO for given application relase UUID. * To get the ApplicationDTO for given application relase UUID.
@ -138,38 +139,34 @@ public interface ApplicationManager {
/** /**
* To update release images such as icons, banner and screenshots. * To update release images such as icons, banner and screenshots.
* *
* @param appId ID of the ApplicationDTO
* @param uuid uuid of the ApplicationDTO * @param uuid uuid of the ApplicationDTO
* @param iconFileStream icon file of the release * @param applicationArtifact Application artifact that contains names and input streams of the application artifacts.
* @param bannerFileStream bannerFileStream of the release.
* @param attachments screenshot attachments of the release
* @throws ApplicationManagementException ApplicationDTO Management Exception. * @throws ApplicationManagementException ApplicationDTO Management Exception.
*/ */
void updateApplicationImageArtifact(int appId, String uuid, InputStream iconFileStream, InputStream void updateApplicationImageArtifact(String uuid, ApplicationArtifact applicationArtifact) throws ApplicationManagementException;
bannerFileStream, List<InputStream> attachments) throws ApplicationManagementException;
/** /**
* To update release images. * To update release images.
* *
* @param appId ID of the ApplicationDTO * @param deviceType Application artifact compatible device type name.
* @param deviceType Applicable device type of the application * @param appType Type of the application.
* @param uuid uuid of the ApplicationDTO * @param uuid uuid of the ApplicationDTO
* @param binaryFile binaryFile of the release. * @param applicationArtifact Application artifact that contains names and input streams of the application artifacts.
* @throws ApplicationManagementException ApplicationDTO Management Exception. * @throws ApplicationManagementException ApplicationDTO Management Exception.
*/ */
void updateApplicationArtifact(int appId, String deviceType, String uuid, InputStream binaryFile) void updateApplicationArtifact(String deviceType, String appType, String uuid,
throws ApplicationManagementException; ApplicationArtifact applicationArtifact) throws ApplicationManagementException;
/** /**
* To create an application release for an ApplicationDTO. * To create an application release for an ApplicationDTO.
* *
* @param applicationId ID of the ApplicationDTO * @param applicationId ID of the ApplicationDTO
* @param applicationRelease ApplicatonRelease that need to be be created. * @param applicationReleaseWrapper ApplicatonRelease that need to be be created.
* @return the unique id of the application release, if the application release succeeded else -1 * @return the unique id of the application release, if the application release succeeded else -1
*/ */
ApplicationReleaseDTO createRelease(int applicationId, ApplicationReleaseDTO applicationRelease) ApplicationRelease createRelease(int applicationId, ApplicationReleaseWrapper applicationReleaseWrapper,
throws ApplicationManagementException; ApplicationArtifact applicationArtifact) throws ApplicationManagementException;
/*** /***
* *
@ -201,20 +198,20 @@ public interface ApplicationManager {
* @param applicationType Type of the application * @param applicationType Type of the application
* @throws RequestValidatingException throws if payload does not satisfy requrements. * @throws RequestValidatingException throws if payload does not satisfy requrements.
*/ */
void validateReleaseCreatingRequest(ApplicationReleaseWrapper applicationReleaseWrapper, void validateReleaseCreatingRequest(ApplicationReleaseWrapper applicationReleaseWrapper, String applicationType)
String applicationType) throws RequestValidatingException; throws RequestValidatingException;
/*** /***
* *
* @param binaryFile Uploading binary fila. i.e .apk or .ipa
* @param iconFile Icon file for the application. * @param iconFile Icon file for the application.
* @param bannerFile Banner file for the application. * @param bannerFile Banner file for the application.
* @param attachmentList Screenshot list. * @param attachmentList Screenshot list.
* @param applicationType Type of the application.
* @throws RequestValidatingException If request doesn't contains required attachments. * @throws RequestValidatingException If request doesn't contains required attachments.
*/ */
void isValidAttachmentSet(Attachment binaryFile, Attachment iconFile, Attachment bannerFile, void validateImageArtifacts(Attachment iconFile, Attachment bannerFile, List<Attachment> attachmentList)
List<Attachment> attachmentList, String applicationType) throws RequestValidatingException; throws RequestValidatingException;
void validateBinaryArtifact(Attachment binaryFile, String applicationType) throws RequestValidatingException;
void addAplicationCategories(List<String> categories) throws ApplicationManagementException; void addAplicationCategories(List<String> categories) throws ApplicationManagementException;

@ -47,13 +47,9 @@ public interface ApplicationStorageManager {
* To upload image artifacts related with an ApplicationDTO. * To upload image artifacts related with an ApplicationDTO.
* *
* @param applicationRelease Release of the application * @param applicationRelease Release of the application
* @param iconFile Icon File input stream
* @param bannerFile Banner File input stream
* @param screenshots Input Streams of screenshots
* @throws ResourceManagementException Resource Management Exception. * @throws ResourceManagementException Resource Management Exception.
*/ */
ApplicationReleaseDTO updateImageArtifacts(ApplicationReleaseDTO applicationRelease, InputStream iconFile, void deleteImageArtifacts(ApplicationReleaseDTO applicationRelease) throws ResourceManagementException;
InputStream bannerFile, List<InputStream> screenshots) throws ResourceManagementException;
ApplicationInstaller getAppInstallerData(InputStream binaryFile, String deviceType) ApplicationInstaller getAppInstallerData(InputStream binaryFile, String deviceType)
throws ApplicationStorageManagementException; throws ApplicationStorageManagementException;
@ -74,14 +70,12 @@ public interface ApplicationStorageManager {
/** /**
* To upload release artifacts for an ApplicationDTO. * To upload release artifacts for an ApplicationDTO.
* *
* @param applicationRelease applicationRelease ApplicationDTO release of a particular application. * @param applicationReleaseDTO applicationRelease ApplicationDTO release of a particular application.
* @param appType Type of the application. * @param deletingAppHashValue Hash value of the deleting application release.
* @param deviceType Compatible device tipe of the application.
* @param binaryFile Binary File for the release.
* @throws ApplicationStorageManagementException Resource Management Exception. * @throws ApplicationStorageManagementException Resource Management Exception.
*/ */
ApplicationReleaseDTO updateReleaseArtifacts(ApplicationReleaseDTO applicationRelease, String appType, String deviceType, void copyImageArtifactsAndDeleteInstaller(String deletingAppHashValue,
InputStream binaryFile) throws ApplicationStorageManagementException, RequestValidatingException; ApplicationReleaseDTO applicationReleaseDTO) throws ApplicationStorageManagementException;
/** /**
* To delete the artifacts related with particular ApplicationDTO Release. * To delete the artifacts related with particular ApplicationDTO Release.

@ -24,6 +24,7 @@ import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.dto.CategoryDTO; import org.wso2.carbon.device.application.mgt.common.dto.CategoryDTO;
import org.wso2.carbon.device.application.mgt.common.dto.TagDTO; import org.wso2.carbon.device.application.mgt.common.dto.TagDTO;
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
import java.util.List; import java.util.List;
/** /**
@ -115,8 +116,7 @@ public interface ApplicationDAO {
* @return the application * @return the application
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception.
*/ */
ApplicationDTO getApplicationById(String id, int tenantId) throws ApplicationDTO getApplicationById(String id, int tenantId) throws ApplicationManagementDAOException;
ApplicationManagementDAOException;
/** /**
* To get the application with the given id * To get the application with the given id
@ -149,15 +149,16 @@ public interface ApplicationDAO {
boolean verifyApplicationExistenceById(int appId, int tenantId) throws ApplicationManagementDAOException; boolean verifyApplicationExistenceById(int appId, int tenantId) throws ApplicationManagementDAOException;
/** /**
* To get the application id of the application specified by the UUID * Verify whether application exist for given application name and device type. Because a name and device type is
* unique for an application.
* *
* @param appName name of the application. * @param appName name of the application.
* @param appType type of the application. * @param deviceTypeId ID of the device type.
* @param tenantId ID of the tenant. * @param tenantId ID of the tenant.
* @return ID of the ApplicationDTO. * @return ID of the ApplicationDTO.
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. * @throws ApplicationManagementDAOException Application Management DAO Exception.
*/ */
int getApplicationId(String appName, String appType, int tenantId) throws ApplicationManagementDAOException; boolean isValidAppName(String appName, int deviceTypeId, int tenantId) throws ApplicationManagementDAOException;
/** /**
* To edit the given application. * To edit the given application.

@ -82,12 +82,11 @@ public interface ApplicationReleaseDAO {
* To update an ApplicationDTO release. * To update an ApplicationDTO release.
* *
* @param applicationRelease ApplicationReleaseDTO that need to be updated. * @param applicationRelease ApplicationReleaseDTO that need to be updated.
* @param applicationId Id of the application.
* @param tenantId Id of the tenant * @param tenantId Id of the tenant
* @return the updated ApplicationDTO Release * @return the updated ApplicationDTO Release
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception
*/ */
ApplicationReleaseDTO updateRelease(int applicationId, ApplicationReleaseDTO applicationRelease, int tenantId) throws ApplicationReleaseDTO updateRelease(ApplicationReleaseDTO applicationRelease, int tenantId) throws
ApplicationManagementDAOException; ApplicationManagementDAOException;
/** /**
@ -129,6 +128,8 @@ public interface ApplicationReleaseDAO {
ApplicationReleaseDTO getReleaseByIds(int applicationId, String releaseUuid, int tenantId) throws ApplicationReleaseDTO getReleaseByIds(int applicationId, String releaseUuid, int tenantId) throws
ApplicationManagementDAOException; ApplicationManagementDAOException;
ApplicationReleaseDTO getReleaseByUUID(String uuid, int tenantId) throws ApplicationManagementDAOException;
/** /**
* To verify whether application release exist or not. * To verify whether application release exist or not.
* *
@ -142,12 +143,11 @@ public interface ApplicationReleaseDAO {
/** /**
* To verify whether application release exist or not for the given app release version. * To verify whether application release exist or not for the given app release version.
* *
* @param appId ID of the application.
* @param hashVal Hash value of the application release. * @param hashVal Hash value of the application release.
* @param tenantId Tenant Id * @param tenantId Tenant Id
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception.
*/ */
boolean verifyReleaseExistenceByHash(int appId, String hashVal, int tenantId) boolean verifyReleaseExistenceByHash(String hashVal, int tenantId)
throws ApplicationManagementDAOException; throws ApplicationManagementDAOException;
/** /**
@ -177,6 +177,6 @@ public interface ApplicationReleaseDAO {
* @return True if application release package name already exist in the IoT server, Otherwise returns False. * @return True if application release package name already exist in the IoT server, Otherwise returns False.
* @throws ApplicationManagementDAOException Application Management DAO Exception. * @throws ApplicationManagementDAOException Application Management DAO Exception.
*/ */
boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId) throws ApplicationManagementDAOException; boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId, String inactiveState) throws ApplicationManagementDAOException;
} }

@ -32,6 +32,7 @@ import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorage
import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager;
import org.wso2.carbon.device.application.mgt.core.config.Configuration; import org.wso2.carbon.device.application.mgt.core.config.Configuration;
import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@ -47,66 +48,6 @@ public class Util {
private static final Log log = LogFactory.getLog(Util.class); private static final Log log = LogFactory.getLog(Util.class);
// /**
// * To create application object from the result set retrieved from the Database.
// *
// * @param rs ResultSet
// * @return List of Applications that is retrieved from the Database.
// * @throws SQLException SQL Exception
// * @throws JSONException JSONException.
// */
// public static List<ApplicationDTO> loadApplications(ResultSet rs) throws SQLException, JSONException {
//
// List<ApplicationDTO> applications = new ArrayList<>();
// ApplicationDTO application = null;
// int applicationId = -1;
// boolean hasNext = rs.next();
//
// while (hasNext) {
// if (applicationId != rs.getInt("APP_ID")) {
// if (application != null) {
// applications.add(application);
// }
// applicationId = rs.getInt("APP_ID");
// application = new ApplicationDTO();
// application.setTags(new ArrayList<>());
// application.setUnrestrictedRoles(new ArrayList<>());
// application.setId(applicationId);
// application.setName(rs.getString("APP_NAME"));
// application.setType(rs.getString("APP_TYPE"));
// application.setAppCategories(rs.getString("APP_CATEGORY"));
// application.setSubType(rs.getString("SUB_TYPE"));
// application.setPaymentCurrency(rs.getString("CURRENCY"));
// application.setIsRestricted(rs.getBoolean("RESTRICTED"));
// application.setStatus(rs.getString("STATUS"));
// String tag = rs.getString("APP_TAG");
// String unrestrictedRole = rs.getString("ROLE");
// if (tag != null) {
// application.getTags().add(tag);
// }
// if (unrestrictedRole != null) {
// application.getUnrestrictedRoles().add(unrestrictedRole);
// }
// } else {
// String tag = rs.getString("APP_TAG");
// String unrestrictedRole = rs.getString("ROLE");
// if (application != null) {
// if (tag != null && !application.getTags().contains(tag)) {
// application.getTags().add(tag);
// }
// if (unrestrictedRole != null && !application.getUnrestrictedRoles().contains(unrestrictedRole)) {
// application.getUnrestrictedRoles().add(unrestrictedRole);
// }
// }
// }
// hasNext = rs.next();
// if (!hasNext) {
// applications.add(application);
// }
// }
// return applications;
// }
/** /**
* To create application object from the result set retrieved from the Database. * To create application object from the result set retrieved from the Database.
* *
@ -128,7 +69,7 @@ public class Util {
applications.add(application); applications.add(application);
} }
application = new ApplicationDTO(); application = new ApplicationDTO();
application.setApplicationReleases(new ArrayList<>()); application.setApplicationReleaseDTOs(new ArrayList<>());
applicationId = rs.getInt("APP_ID"); applicationId = rs.getInt("APP_ID");
application.setId(applicationId); application.setId(applicationId);
application.setName(rs.getString("APP_NAME")); application.setName(rs.getString("APP_NAME"));
@ -139,10 +80,10 @@ public class Util {
application.setStatus(rs.getString("APP_STATUS")); application.setStatus(rs.getString("APP_STATUS"));
application.setAppRating(rs.getInt("APP_RATING")); application.setAppRating(rs.getInt("APP_RATING"));
application.setDeviceTypeId(rs.getInt("APP_DEVICE_TYPE_ID")); application.setDeviceTypeId(rs.getInt("APP_DEVICE_TYPE_ID"));
application.getApplicationReleases().add(loadAppRelease(rs)); application.getApplicationReleaseDTOs().add(loadAppRelease(rs));
} else { } else {
if (application != null && application.getApplicationReleases() != null) { if (application != null && application.getApplicationReleaseDTOs() != null) {
application.getApplicationReleases().add(loadAppRelease(rs)); application.getApplicationReleaseDTOs().add(loadAppRelease(rs));
} }
} }
hasNext = rs.next(); hasNext = rs.next();
@ -167,10 +108,12 @@ public class Util {
appRelease.setReleaseType(rs.getString("RELEASE_TYPE")); appRelease.setReleaseType(rs.getString("RELEASE_TYPE"));
appRelease.setVersion(rs.getString("RELEASE_VERSION")); appRelease.setVersion(rs.getString("RELEASE_VERSION"));
appRelease.setInstallerName(rs.getString("AP_RELEASE_STORED_LOC")); appRelease.setInstallerName(rs.getString("AP_RELEASE_STORED_LOC"));
appRelease.setIconName(rs.getString("AP_RELEASE_ICON_LOC"));
appRelease.setBannerName(rs.getString("AP_RELEASE_BANNER_LOC")); appRelease.setBannerName(rs.getString("AP_RELEASE_BANNER_LOC"));
appRelease.setScreenshotName1("AP_RELEASE_SC1"); appRelease.setScreenshotName1(rs.getString("AP_RELEASE_SC1"));
appRelease.setScreenshotName2("AP_RELEASE_SC2"); appRelease.setScreenshotName2(rs.getString("AP_RELEASE_SC2"));
appRelease.setScreenshotName3("AP_RELEASE_SC3"); appRelease.setScreenshotName3(rs.getString("AP_RELEASE_SC3"));
appRelease.setAppHashValue(rs.getString("RELEASE_HASH_VALUE"));
appRelease.setPrice(rs.getDouble("RELEASE_PRICE")); appRelease.setPrice(rs.getDouble("RELEASE_PRICE"));
appRelease.setMetaData(rs.getString("RELEASE_META_INFO")); appRelease.setMetaData(rs.getString("RELEASE_META_INFO"));
appRelease.setSupportedOsVersions(rs.getString("RELEASE_SUP_OS_VERSIONS")); appRelease.setSupportedOsVersions(rs.getString("RELEASE_SUP_OS_VERSIONS"));
@ -189,41 +132,18 @@ public class Util {
* @throws SQLException SQL Exception * @throws SQLException SQL Exception
* @throws JSONException JSONException. * @throws JSONException JSONException.
*/ */
public static ApplicationDTO loadApplication(ResultSet rs) throws SQLException, JSONException { public static ApplicationDTO loadApplication(ResultSet rs)
throws SQLException, JSONException, UnexpectedServerErrorException {
ApplicationDTO application = null; List<ApplicationDTO> applicationDTOs = loadApplications(rs);
int applicatioId; if (applicationDTOs.isEmpty()) {
int iteration = 0; return null;
if (rs != null) { }
while (rs.next()) { if (applicationDTOs.size() > 1) {
if (iteration == 0) { String msg = "Internal server error. Found more than one application for requested application ID";
application = new ApplicationDTO(); log.error(msg);
application.setTags(new ArrayList<>()); throw new UnexpectedServerErrorException(msg);
application.setUnrestrictedRoles(new ArrayList<>());
applicatioId = rs.getInt("APP_ID");
application.setId(applicatioId);
application.setName(rs.getString("APP_NAME"));
application.setType(rs.getString("APP_TYPE"));
application.setAppCategory(rs.getString("APP_CATEGORY"));
application.setSubType(rs.getString("SUB_TYPE"));
application.setPaymentCurrency(rs.getString("CURRENCY"));
// application.setIsRestricted(rs.getBoolean("RESTRICTED"));
application.setDeviceTypeId(rs.getInt("DEVICE_TYPE_ID"));
}
String tag = rs.getString("APP_TAG");
String unrestrictedRole = rs.getString("ROLE");
if (tag != null && !application.getTags().contains(tag)) {
application.getTags().add(tag);
}
if (unrestrictedRole != null && !application.getUnrestrictedRoles().contains(unrestrictedRole)) {
application.getUnrestrictedRoles().add(unrestrictedRole);
}
iteration++;
}
} }
return application; return applicationDTOs.get(0);
} }
/** /**

@ -24,17 +24,16 @@ import org.apache.commons.logging.LogFactory;
import org.json.JSONException; import org.json.JSONException;
import org.wso2.carbon.device.application.mgt.common.AppLifecycleState; import org.wso2.carbon.device.application.mgt.common.AppLifecycleState;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO;
import org.wso2.carbon.device.application.mgt.common.ApplicationList;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO; import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.dto.CategoryDTO; import org.wso2.carbon.device.application.mgt.common.dto.CategoryDTO;
import org.wso2.carbon.device.application.mgt.common.Filter; import org.wso2.carbon.device.application.mgt.common.Filter;
import org.wso2.carbon.device.application.mgt.common.Pagination;
import org.wso2.carbon.device.application.mgt.common.dto.TagDTO; import org.wso2.carbon.device.application.mgt.common.dto.TagDTO;
import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException;
import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO;
import org.wso2.carbon.device.application.mgt.core.dao.common.Util; import org.wso2.carbon.device.application.mgt.core.dao.common.Util;
import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl;
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@ -150,10 +149,12 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "AP_APP_RELEASE.UUID AS RELEASE_UUID, " + "AP_APP_RELEASE.UUID AS RELEASE_UUID, "
+ "AP_APP_RELEASE.RELEASE_TYPE AS RELEASE_TYPE, " + "AP_APP_RELEASE.RELEASE_TYPE AS RELEASE_TYPE, "
+ "AP_APP_RELEASE.INSTALLER_LOCATION AS AP_RELEASE_STORED_LOC, " + "AP_APP_RELEASE.INSTALLER_LOCATION AS AP_RELEASE_STORED_LOC, "
+ "AP_APP_RELEASE.ICON_LOCATION AS AP_RELEASE_ICON_LOC, "
+ "AP_APP_RELEASE.BANNER_LOCATION AS AP_RELEASE_BANNER_LOC, " + "AP_APP_RELEASE.BANNER_LOCATION AS AP_RELEASE_BANNER_LOC, "
+ "AP_APP_RELEASE.SC_1_LOCATION AS AP_RELEASE_SC1, " + "AP_APP_RELEASE.SC_1_LOCATION AS AP_RELEASE_SC1, "
+ "AP_APP_RELEASE.SC_2_LOCATION AS AP_RELEASE_SC2, " + "AP_APP_RELEASE.SC_2_LOCATION AS AP_RELEASE_SC2, "
+ "AP_APP_RELEASE.SC_3_LOCATION AS AP_RELEASE_SC3, " + "AP_APP_RELEASE.SC_3_LOCATION AS AP_RELEASE_SC3, "
+ "AP_APP_RELEASE.APP_HASH_VALUE AS RELEASE_HASH_VALUE, "
+ "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, " + "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, "
+ "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, " + "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, "
+ "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, " + "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, "
@ -163,8 +164,8 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "FROM AP_APP " + "FROM AP_APP "
+ "INNER JOIN AP_APP_RELEASE ON " + "INNER JOIN AP_APP_RELEASE ON "
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID AND " + "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID AND "
+ "AP_APP.TENANT_ID = ? AND " + "AP_APP.TENANT_ID = AP_APP_RELEASE.TENANT_ID "
+ "AP_APP.TENANT_ID = AP_APP_RELEASE.TENANT_ID"; + "WHERE AP_APP.TENANT_ID = ?";
if (filter == null) { if (filter == null) {
throw new ApplicationManagementDAOException("Filter need to be instantiated"); throw new ApplicationManagementDAOException("Filter need to be instantiated");
@ -381,14 +382,15 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} catch (UnexpectedServerErrorException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} finally { } finally {
Util.cleanupResources(stmt, rs); Util.cleanupResources(stmt, rs);
} }
} }
@Override @Override
public ApplicationDTO getApplicationById(String id, int tenantId) throws public ApplicationDTO getApplicationById(String id, int tenantId) throws ApplicationManagementDAOException {
ApplicationManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Getting application with the id:" + id); log.debug("Getting application with the id:" + id);
} }
@ -423,14 +425,16 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} catch (UnexpectedServerErrorException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} finally { } finally {
Util.cleanupResources(stmt, rs); Util.cleanupResources(stmt, rs);
} }
} }
@Override @Override
public ApplicationDTO getApplicationByUUID(String releaseUuid, int tenantId) throws public ApplicationDTO getApplicationByUUID(String releaseUuid, int tenantId)
ApplicationManagementDAOException { throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Getting application with the release UUID: " + releaseUuid + " from the database"); log.debug("Getting application with the release UUID: " + releaseUuid + " from the database");
} }
@ -470,14 +474,16 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} catch (UnexpectedServerErrorException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} finally { } finally {
Util.cleanupResources(stmt, rs); Util.cleanupResources(stmt, rs);
} }
} }
@Override @Override
public ApplicationDTO getApplicationById(int applicationId, int tenantId) throws public ApplicationDTO getApplicationById(int applicationId, int tenantId)
ApplicationManagementDAOException { throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Getting application with the id (" + applicationId + ") from the database"); log.debug("Getting application with the id (" + applicationId + ") from the database");
} }
@ -486,28 +492,48 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
ResultSet rs = null; ResultSet rs = null;
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
String sql = String sql = "SELECT "
"SELECT AP_APP.ID AS APP_ID, AP_APP.NAME AS APP_NAME, AP_APP.TYPE AS APP_TYPE, AP_APP.APP_CATEGORY " + "AP_APP.ID AS APP_ID, "
+ "AS APP_CATEGORY, AP_APP.SUB_TYPE AS SUB_TYPE, AP_APP.CURRENCY AS CURRENCY, " + "AP_APP.NAME AS APP_NAME, "
+ "AP_APP.RESTRICTED AS RESTRICTED, AP_APP.DEVICE_TYPE_ID AS DEVICE_TYPE_ID, " + "AP_APP.DESCRIPTION AS APP_DESCRIPTION, "
+ "AP_APP_TAG.TAG AS APP_TAG, AP_UNRESTRICTED_ROLE.ROLE AS ROLE FROM " + "AP_APP.TYPE AS APP_TYPE, "
+ "((AP_APP LEFT JOIN AP_APP_TAG ON AP_APP.ID = AP_APP_TAG.AP_APP_ID) " + "AP_APP.STATUS AS APP_STATUS, "
+ "LEFT JOIN AP_UNRESTRICTED_ROLE ON AP_APP.ID = AP_UNRESTRICTED_ROLE.AP_APP_ID) WHERE " + "AP_APP.SUB_TYPE AS APP_SUB_TYPE, "
+ "AP_APP.ID = ? AND AP_APP.TENANT_ID = ? AND AP_APP.STATUS != ?"; + "AP_APP.CURRENCY AS APP_CURRENCY, "
+ "AP_APP.RATING AS APP_RATING, "
+ "AP_APP.DEVICE_TYPE_ID AS APP_DEVICE_TYPE_ID, "
+ "AP_APP_RELEASE.DESCRIPTION AS RELEASE_DESCRIPTION, "
+ "AP_APP_RELEASE.VERSION AS RELEASE_VERSION, "
+ "AP_APP_RELEASE.UUID AS RELEASE_UUID, "
+ "AP_APP_RELEASE.RELEASE_TYPE AS RELEASE_TYPE, "
+ "AP_APP_RELEASE.INSTALLER_LOCATION AS AP_RELEASE_STORED_LOC, "
+ "AP_APP_RELEASE.BANNER_LOCATION AS AP_RELEASE_BANNER_LOC, "
+ "AP_APP_RELEASE.SC_1_LOCATION AS AP_RELEASE_SC1, "
+ "AP_APP_RELEASE.SC_2_LOCATION AS AP_RELEASE_SC2, "
+ "AP_APP_RELEASE.SC_3_LOCATION AS AP_RELEASE_SC3, "
+ "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, "
+ "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, "
+ "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, "
+ "AP_APP_RELEASE.RATING AS RELEASE_RATING, "
+ "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, "
+ "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT "
+ "FROM AP_APP "
+ "INNER JOIN AP_APP_RELEASE ON "
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID AND "
+ "AP_APP.TENANT_ID = AP_APP_RELEASE.TENANT_ID "
+ "WHERE "
+ "AP_APP.ID =? AND "
+ "AP_APP.TENANT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
stmt.setInt(1, applicationId); stmt.setInt(1, applicationId);
stmt.setInt(2, tenantId); stmt.setInt(2, tenantId);
stmt.setString(3, AppLifecycleState.REMOVED.toString());
rs = stmt.executeQuery(); rs = stmt.executeQuery();
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Successfully retrieved basic details of the application with the id " log.debug("Successfully retrieved basic details of the application with the id "
+ applicationId); + applicationId);
} }
return Util.loadApplication(rs); return Util.loadApplication(rs);
} catch (SQLException e) { } catch (SQLException e) {
throw new ApplicationManagementDAOException( throw new ApplicationManagementDAOException(
"Error occurred while getting application details with app id " + applicationId + "Error occurred while getting application details with app id " + applicationId +
@ -516,6 +542,8 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} catch (UnexpectedServerErrorException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} finally { } finally {
Util.cleanupResources(stmt, rs); Util.cleanupResources(stmt, rs);
} }
@ -555,10 +583,12 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
} }
@Override @Override
public ApplicationDTO editApplication(ApplicationDTO application, int tenantId) throws ApplicationManagementDAOException { public ApplicationDTO editApplication(ApplicationDTO application, int tenantId)
throws ApplicationManagementDAOException {
int paramIndex = 1; int paramIndex = 1;
Connection conn; Connection conn;
PreparedStatement stmt = null; PreparedStatement stmt = null;
//todo this is wrong
ApplicationDTO existingApplication = this.getApplicationById(application.getId(), tenantId); ApplicationDTO existingApplication = this.getApplicationById(application.getId(), tenantId);
if (existingApplication == null) { if (existingApplication == null) {
@ -883,7 +913,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "FROM " + "FROM "
+ "AP_APP_TAG tag INNER JOIN AP_APP_TAG_MAPPING tag_map ON tag.ID = tag_map.AP_APP_TAG_ID " + "AP_APP_TAG tag INNER JOIN AP_APP_TAG_MAPPING tag_map ON tag.ID = tag_map.AP_APP_TAG_ID "
+ "INNER JOIN AP_APP app ON tag_map.AP_APP_ID = app.ID " + "INNER JOIN AP_APP app ON tag_map.AP_APP_ID = app.ID "
+ "WHERE app.ID = ? and app.TENANT_ID = ?"; + "WHERE app.ID = ? AND app.TENANT_ID = ?";
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)){ try (PreparedStatement stmt = conn.prepareStatement(sql)){
@ -915,7 +945,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "FROM " + "FROM "
+ "AP_APP_CATEGORY cat INNER JOIN AP_APP_CATEGORY_MAPPING cat_map ON cat.ID = cat_map.AP_APP_CATEGORY_ID " + "AP_APP_CATEGORY cat INNER JOIN AP_APP_CATEGORY_MAPPING cat_map ON cat.ID = cat_map.AP_APP_CATEGORY_ID "
+ "INNER JOIN AP_APP app ON cat_map.AP_APP_ID = app.ID " + "INNER JOIN AP_APP app ON cat_map.AP_APP_ID = app.ID "
+ "WHERE app.ID = ? and app.TENANT_ID = ?"; + "WHERE app.ID = ? AND app.TENANT_ID = ?";
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)){ try (PreparedStatement stmt = conn.prepareStatement(sql)){
@ -1019,7 +1049,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
List<ApplicationReleaseDTO> applicationReleaseList = new ArrayList<>(); List<ApplicationReleaseDTO> applicationReleaseList = new ArrayList<>();
applicationReleaseList.add(appRelease); applicationReleaseList.add(appRelease);
application.setApplicationReleases(applicationReleaseList); application.setApplicationReleaseDTOs(applicationReleaseList);
} }
return application; return application;
} catch (SQLException e) { } catch (SQLException e) {
@ -1035,23 +1065,25 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
} }
@Override @Override
public int getApplicationId(String appName, String appType, int tenantId) throws ApplicationManagementDAOException { public boolean isValidAppName(String appName, int deviceTypeId, int tenantId) throws ApplicationManagementDAOException {
Connection conn; Connection conn;
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null; ResultSet rs = null;
String sql; String sql;
int id = -1;
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
sql = "SELECT ID FROM AP_APP WHERE NAME = ? AND TYPE = ? AND TENANT_ID = ?"; sql = "SELECT AP_APP.ID AS ID "
+ "FROM AP_APP "
+ "WHERE "
+ "AP_APP.NAME = ? AND "
+ "AP_APP.DEVICE_TYPE_ID = ? AND "
+ "AP_APP.TENANT_ID = ?";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
stmt.setString(1, appName); stmt.setString(1, appName);
stmt.setString(2, appType); stmt.setInt(2, deviceTypeId);
stmt.setInt(3, tenantId); stmt.setInt(3, tenantId);
rs = stmt.executeQuery(); rs = stmt.executeQuery();
if (rs.next()) { return rs.next();
id = rs.getInt(1);
}
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} catch (SQLException e) { } catch (SQLException e) {
@ -1059,6 +1091,5 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
} finally { } finally {
Util.cleanupResources(stmt, rs); Util.cleanupResources(stmt, rs);
} }
return id;
} }
} }

@ -222,6 +222,52 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
} }
} }
@Override
public ApplicationReleaseDTO getReleaseByUUID( String uuid, int tenantId) throws ApplicationManagementDAOException {
Connection connection;
String sql =
"SELECT AR.DESCRIPTION AS RELEASE_DESCRIPTION, "
+ "AR.VERSION AS RELEASE_VERSION, "
+ "AR.UUID AS RELEASE_UUID, "
+ "AR.RELEASE_TYPE AS RELEASE_TYPE, "
+ "AR.INSTALLER_LOCATION AS AP_RELEASE_STORED_LOC, "
+ "AR.ICON_LOCATION AS AP_RELEASE_ICON_LOC, "
+ "AR.BANNER_LOCATION AS AP_RELEASE_BANNER_LOC, "
+ "AR.SC_1_LOCATION AS AP_RELEASE_SC1, "
+ "AR.SC_2_LOCATION AS AP_RELEASE_SC2, "
+ "AR.SC_3_LOCATION AS AP_RELEASE_SC3, "
+ "AR.APP_HASH_VALUE AS RELEASE_HASH_VALUE, "
+ "AR.APP_PRICE AS RELEASE_PRICE, "
+ "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 "
+ "FROM AP_APP_RELEASE AS AR "
+ "WHERE AR.UUID = ? AND AR.TENAT_ID = ?";
try {
connection = this.getDBConnection();
try (PreparedStatement statement = connection.prepareStatement(sql)) {
statement.setString(1, uuid);
statement.setInt(2, tenantId);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
return Util.loadAppRelease(resultSet);
}
return null;
}
}
} catch (DBConnectionException e) {
throw new ApplicationManagementDAOException(
"Database connection exception while trying to get the release details of the UUID of the application release: "
+ uuid, e);
} catch (SQLException e) {
throw new ApplicationManagementDAOException(
"Error while getting release details of the UUID of the application " + "release: " + uuid
+ " , while executing the query " + sql, e);
}
}
/** /**
* To insert the application release properties. * To insert the application release properties.
* *
@ -378,39 +424,56 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
/** /**
* To insert the application release properties. * To insert the application release properties.
* *
* @param applicationRelease ApplicationDTO Release the properties of which that need to be inserted. * @param applicationReleaseDTO ApplicationDTO Release the properties of which that need to be inserted.
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception.
*/ */
@Override @Override
public ApplicationReleaseDTO updateRelease(int applicationId, ApplicationReleaseDTO applicationRelease, int tenantId) public ApplicationReleaseDTO updateRelease(ApplicationReleaseDTO applicationReleaseDTO, int tenantId)
throws ApplicationManagementDAOException { throws ApplicationManagementDAOException {
Connection connection; Connection connection;
PreparedStatement statement = null; PreparedStatement statement = null;
String sql = "UPDATE AP_APP_RELEASE SET VERSION = ?, UUID = ?, RELEASE_TYPE = ?, PACKAGE_NAME = ?," String sql = "UPDATE AP_APP_RELEASE "
+ " APP_PRICE = ?, STORED_LOCATION = ?, BANNER_LOCATION = ?, ICON_LOCATION =?, SC_1_LOCATION = ?, " + + "SET "
"SC_2_LOCATION = ?," + "DESCRIPTION = ?, "
+ " SC_3_LOCATION = ?, APP_HASH_VALUE = ?, SHARED_WITH_ALL_TENANTS = ?, APP_META_INFO = ? " + "VERSION = ?, "
+ "WHERE AP_APP_ID = ? AND TENANT_ID = ? AND ID = ?;"; + "UUID = ?, "
+ "RELEASE_TYPE = ?, "
+ "PACKAGE_NAME = ?, "
+ "APP_PRICE = ?, "
+ "INSTALLER_LOCATION = ?, "
+ "BANNER_LOCATION = ?, "
+ "ICON_LOCATION = ?, "
+ "SC_1_LOCATION = ?, "
+ "SC_2_LOCATION = ?, "
+ "SC_3_LOCATION = ?, "
+ "APP_HASH_VALUE = ?, "
+ "SHARED_WITH_ALL_TENANTS = ?, "
+ "APP_META_INFO = ?, "
+ "SUPPORTED_OS_VERSIONS = ?, "
+ "CURRENT_STATE = ? "
+ "WHERE ID = ? AND TENANT_ID = ? ";
try { try {
connection = this.getDBConnection(); connection = this.getDBConnection();
statement = connection.prepareStatement(sql); statement = connection.prepareStatement(sql);
statement.setString(1, applicationRelease.getVersion()); statement.setString(1, applicationReleaseDTO.getDescription());
statement.setString(2, applicationRelease.getUuid()); statement.setString(2, applicationReleaseDTO.getVersion());
statement.setString(3, applicationRelease.getReleaseType()); statement.setString(3, applicationReleaseDTO.getUuid());
statement.setString(4, applicationRelease.getPackageName()); statement.setString(4, applicationReleaseDTO.getReleaseType());
statement.setDouble(5, applicationRelease.getPrice()); statement.setString(5, applicationReleaseDTO.getPackageName());
statement.setString(6, applicationRelease.getInstallerName()); statement.setDouble(6, applicationReleaseDTO.getPrice());
statement.setString(7, applicationRelease.getBannerName()); statement.setString(7, applicationReleaseDTO.getInstallerName());
statement.setString(8, applicationRelease.getIconName()); statement.setString(8, applicationReleaseDTO.getBannerName());
statement.setString(9, applicationRelease.getScreenshotName1()); statement.setString(9, applicationReleaseDTO.getIconName());
statement.setString(10, applicationRelease.getScreenshotName2()); statement.setString(10, applicationReleaseDTO.getScreenshotName1());
statement.setString(11, applicationRelease.getScreenshotName3()); statement.setString(11, applicationReleaseDTO.getScreenshotName2());
statement.setString(12, applicationRelease.getAppHashValue()); statement.setString(12, applicationReleaseDTO.getScreenshotName3());
statement.setBoolean(13, applicationRelease.getIsSharedWithAllTenants()); statement.setString(13, applicationReleaseDTO.getAppHashValue());
statement.setString(14, applicationRelease.getMetaData()); statement.setBoolean(14, applicationReleaseDTO.getIsSharedWithAllTenants());
statement.setInt(15, applicationId); statement.setString(15, applicationReleaseDTO.getMetaData());
statement.setInt(16, tenantId); statement.setString(16, applicationReleaseDTO.getSupportedOsVersions());
statement.setInt(17, applicationRelease.getId()); statement.setString(17, applicationReleaseDTO.getCurrentState());
statement.setInt(18, tenantId);
statement.setInt(19, applicationReleaseDTO.getId());
if (statement.executeUpdate() == 0) { if (statement.executeUpdate() == 0) {
return null; return null;
} }
@ -423,7 +486,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
} finally { } finally {
Util.cleanupResources(statement, null); Util.cleanupResources(statement, null);
} }
return applicationRelease; return applicationReleaseDTO;
} }
/** /**
@ -456,35 +519,27 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
} }
@Override @Override
public boolean verifyReleaseExistenceByHash(int appId, String hashVal, int tenantId) throws ApplicationManagementDAOException { public boolean verifyReleaseExistenceByHash(String hashVal, int tenantId) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Verifying application release existence by application id:" + appId log.debug("Verifying application release existence by application hash value: " + hashVal);
+ " and application hash value: " + hashVal);
} }
Connection conn; Connection conn;
PreparedStatement stmt = null; PreparedStatement stmt = null;
ResultSet rs = null; ResultSet rs = null;
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
String sql = String sql = "SELECT AR.ID AS RELEASE_ID FROM AP_APP_RELEASE AS AR WHERE AR.APP_HASH_VALUE = ? AND "
"SELECT AR.ID AS RELEASE_ID FROM AP_APP_RELEASE AS AR WHERE AR.AP_APP_ID = ? AND " + "AR.TENANT_ID = ?;";
+ "AR.APP_HASH_VALUE = ? AND AR.TENANT_ID = ?;";
stmt = conn.prepareStatement(sql); stmt = conn.prepareStatement(sql);
stmt.setInt(1, appId); stmt.setString(1, hashVal);
stmt.setString(2, hashVal); stmt.setInt(2, tenantId);
stmt.setInt(3, tenantId);
rs = stmt.executeQuery(); rs = stmt.executeQuery();
if (log.isDebugEnabled()) {
log.debug("Successfully retrieved basic details of the application release with the application ID "
+ appId + " ApplicationDTO release hash value: " + hashVal);
}
return rs.next(); return rs.next();
} catch (SQLException e) { } catch (SQLException e) {
throw new ApplicationManagementDAOException( throw new ApplicationManagementDAOException(
"Error occurred while getting application release details with app ID: " + appId "Error occurred while getting application release details for application release hash value: "
+ " App release hash value: " + hashVal + " While executing query ", e); + hashVal + " While executing query ", e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} finally { } finally {
@ -658,7 +713,8 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
} }
@Override @Override
public boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId) throws ApplicationManagementDAOException { public boolean isActiveReleaseExisitForPackageName(String packageName, int tenantId, String inactiveState)
throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Verifying application release existence for package name:" + packageName); log.debug("Verifying application release existence for package name:" + packageName);
} }
@ -671,7 +727,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
try (PreparedStatement stmt = conn.prepareStatement(sql)) { try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, packageName); stmt.setString(1, packageName);
stmt.setString(2, AppLifecycleState.REMOVED.toString()); stmt.setString(2, inactiveState);
stmt.setInt(3, tenantId); stmt.setInt(3, tenantId);
try (ResultSet rs = stmt.executeQuery()) { try (ResultSet rs = stmt.executeQuery()) {
return rs.next(); return rs.next();

@ -24,18 +24,14 @@ import com.dd.plist.NSString;
import com.dd.plist.PropertyListFormatException; import com.dd.plist.PropertyListFormatException;
import com.dd.plist.PropertyListParser; import com.dd.plist.PropertyListParser;
import net.dongliu.apk.parser.bean.ApkMeta; import net.dongliu.apk.parser.bean.ApkMeta;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.routines.UrlValidator;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.application.mgt.common.ApplicationInstaller; 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.dto.ApplicationReleaseDTO;
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.DeviceTypes;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; 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 org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; 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.exception.ParsingException;
@ -46,6 +42,7 @@ import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import java.io.*; import java.io.*;
import java.nio.file.Files;
import java.text.ParseException; import java.text.ParseException;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -54,7 +51,7 @@ import java.util.Objects;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import static org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil.deleteDir; import static org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil.delete;
import static org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil.saveFile; import static org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil.saveFile;
/** /**
@ -88,7 +85,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
String scStoredLocation = null; String scStoredLocation = null;
try { try {
// todo handle WEB CLIP and save data in different folder (uuid)
artifactDirectoryPath = storagePath + applicationRelease.getAppHashValue(); artifactDirectoryPath = storagePath + applicationRelease.getAppHashValue();
StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath); StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath);
iconStoredLocation = artifactDirectoryPath + File.separator + applicationRelease.getIconName(); iconStoredLocation = artifactDirectoryPath + File.separator + applicationRelease.getIconName();
@ -135,43 +131,42 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
@Override @Override
public ApplicationReleaseDTO updateImageArtifacts(ApplicationReleaseDTO applicationRelease, InputStream public void deleteImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO)
iconFileStream, InputStream bannerFileStream, List<InputStream> screenShotStreams)
throws ResourceManagementException { throws ResourceManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
try { try {
if (iconFileStream != null) { String iconName = applicationReleaseDTO.getIconName();
deleteApplicationReleaseArtifacts(applicationRelease.getIconName()); String bannerName = applicationReleaseDTO.getBannerName();
} String sc1 = applicationReleaseDTO.getScreenshotName1();
if (bannerFileStream != null) { String sc2 = applicationReleaseDTO.getScreenshotName2();
deleteApplicationReleaseArtifacts(applicationRelease.getBannerName()); String sc3 = applicationReleaseDTO.getScreenshotName3();
} String hashValue = applicationReleaseDTO.getAppHashValue();
if (!screenShotStreams.isEmpty()) { if (iconName != null) {
if (screenShotStreams.size() > screenShotMaxCount) { deleteApplicationReleaseArtifacts(
throw new ApplicationStorageManagementException("Maximum limit for the screen-shot exceeds"); storagePath + Constants.FORWARD_SLASH + hashValue + Constants.FORWARD_SLASH + iconName);
}
int count = 1;
while (count < screenShotStreams.size()) {
if (count == 1) {
deleteApplicationReleaseArtifacts(applicationRelease.getScreenshotName1());
} }
if (count == 2) { if (bannerName != null) {
deleteApplicationReleaseArtifacts(applicationRelease.getScreenshotName2()); deleteApplicationReleaseArtifacts(
storagePath + Constants.FORWARD_SLASH + hashValue + Constants.FORWARD_SLASH + bannerName);
} }
if (count == 3) {
deleteApplicationReleaseArtifacts(applicationRelease.getScreenshotName3()); if (sc1 != null) {
deleteApplicationReleaseArtifacts(
storagePath + Constants.FORWARD_SLASH + hashValue + Constants.FORWARD_SLASH + sc1);
} }
count++; 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);
} }
applicationRelease = uploadImageArtifacts(applicationRelease, iconFileStream, bannerFileStream,
screenShotStreams);
return applicationRelease;
} catch (ApplicationStorageManagementException e) { } catch (ApplicationStorageManagementException e) {
throw new ApplicationStorageManagementException("ApplicationDTO Storage exception while trying to" throw new ApplicationStorageManagementException("ApplicationDTO Storage exception while trying to"
+ " update the screen-shot count for the application Release " + applicationRelease.getUuid() + + " update the screen-shot count for the application Release " + applicationReleaseDTO.getUuid() +
" for the tenant " + tenantId, e); " for the tenant " + tenantId, e);
} }
} }
@ -208,22 +203,13 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
String deviceType, InputStream binaryFile) throws ResourceManagementException { String deviceType, InputStream binaryFile) throws ResourceManagementException {
try { try {
String artifactDirectoryPath; String artifactDirectoryPath;
String md5OfApp;
String artifactPath; String artifactPath;
byte [] content = IOUtils.toByteArray(binaryFile); byte [] content = IOUtils.toByteArray(binaryFile);
md5OfApp = getMD5(new ByteArrayInputStream(content)); artifactDirectoryPath = storagePath + applicationReleaseDTO.getAppHashValue();
if (md5OfApp == null) {
String msg = "Error occurred while md5sum value retrieving process: application UUID "
+ applicationReleaseDTO.getUuid();
log.error(msg);
throw new ApplicationStorageManagementException(msg);
}
artifactDirectoryPath = storagePath + md5OfApp;
StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath); StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath);
artifactPath = artifactDirectoryPath + File.separator + applicationReleaseDTO.getInstallerName(); artifactPath = artifactDirectoryPath + File.separator + applicationReleaseDTO.getInstallerName();
saveFile(new ByteArrayInputStream(content), artifactPath); saveFile(new ByteArrayInputStream(content), artifactPath);
applicationReleaseDTO.setAppHashValue(md5OfApp);
} catch (IOException e) { } catch (IOException e) {
String msg = "IO Exception while saving the release artifacts in the server for the application UUID " String msg = "IO Exception while saving the release artifacts in the server for the application UUID "
+ applicationReleaseDTO.getUuid(); + applicationReleaseDTO.getUuid();
@ -234,27 +220,53 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
} }
@Override @Override
public ApplicationReleaseDTO updateReleaseArtifacts(ApplicationReleaseDTO applicationRelease, public void copyImageArtifactsAndDeleteInstaller(String deletingAppHashValue,
String appType, String deviceType, InputStream binaryFile) throws ApplicationStorageManagementException { ApplicationReleaseDTO applicationReleaseDTO) throws ApplicationStorageManagementException {
try { try {
deleteApplicationReleaseArtifacts(applicationRelease.getInstallerName()); String basePath = storagePath + Constants.FORWARD_SLASH;
applicationRelease = uploadReleaseArtifact(applicationRelease, appType, deviceType, binaryFile); String appHashValue = applicationReleaseDTO.getAppHashValue();
} catch (ApplicationStorageManagementException e) { String bannerName = applicationReleaseDTO.getBannerName();
throw new ApplicationStorageManagementException("ApplicationDTO Artifact doesn't contains in the System", e); String iconName = applicationReleaseDTO.getIconName();
} catch (ResourceManagementException e) { String screenshot1 = applicationReleaseDTO.getScreenshotName1();
throw new ApplicationStorageManagementException("ApplicationDTO Artifact Updating failed", e); String screenshot2 = applicationReleaseDTO.getScreenshotName2();
String screenshot3 = applicationReleaseDTO.getScreenshotName3();
if (bannerName != null) {
StorageManagementUtil
.copy(basePath + deletingAppHashValue + bannerName, basePath + appHashValue + bannerName);
}
if (iconName != null) {
StorageManagementUtil
.copy(basePath + deletingAppHashValue + iconName, basePath + appHashValue + iconName);
}
if (screenshot1 != null) {
StorageManagementUtil
.copy(basePath + deletingAppHashValue + screenshot1, basePath + appHashValue + screenshot1);
}
if (screenshot2 != null) {
StorageManagementUtil
.copy(basePath + deletingAppHashValue + screenshot2, basePath + appHashValue + screenshot2);
}
if (screenshot3 != null) {
StorageManagementUtil
.copy(basePath + deletingAppHashValue + screenshot3, basePath + appHashValue + screenshot3);
}
deleteApplicationReleaseArtifacts( basePath + deletingAppHashValue);
} catch (IOException e) {
String msg = "Application installer updating is failed because of I/O issue";
log.error(msg);
throw new ApplicationStorageManagementException(msg, e);
} }
return applicationRelease;
} }
@Override @Override
public void deleteApplicationReleaseArtifacts(String directoryPath) throws ApplicationStorageManagementException { public void deleteApplicationReleaseArtifacts(String artifactPath) throws ApplicationStorageManagementException {
File artifact = new File(directoryPath); File artifact = new File(artifactPath);
if (artifact.exists()) { if (artifact.exists()) {
try { try {
StorageManagementUtil.deleteDir(artifact); StorageManagementUtil.delete(artifact);
} catch (IOException e) { } catch (IOException e) {
throw new ApplicationStorageManagementException( throw new ApplicationStorageManagementException(
"Error occured while deleting application release artifacts", e); "Error occured while deleting application release artifacts", e);
@ -283,17 +295,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
} }
} }
private String getMD5(InputStream binaryFile) throws ApplicationStorageManagementException {
String md5;
try {
md5 = DigestUtils.md5Hex(binaryFile);
} catch (IOException e) {
throw new ApplicationStorageManagementException
("IO Exception while trying to get the md5sum value of application");
}
return md5;
}
private synchronized Map<String, String> getIPAInfo(File ipaFile) throws ApplicationStorageManagementException { private synchronized Map<String, String> getIPAInfo(File ipaFile) throws ApplicationStorageManagementException {
Map<String, String> ipaInfo = new HashMap<>(); Map<String, String> ipaInfo = new HashMap<>();
@ -303,7 +304,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
ipaDirectory = new File(ipaAbsPath).getParent(); ipaDirectory = new File(ipaAbsPath).getParent();
if (new File(ipaDirectory + File.separator + Constants.PAYLOAD).exists()) { if (new File(ipaDirectory + File.separator + Constants.PAYLOAD).exists()) {
deleteDir(new File(ipaDirectory + File.separator + Constants.PAYLOAD)); delete(new File(ipaDirectory + File.separator + Constants.PAYLOAD));
} }
// unzip ipa zip file // unzip ipa zip file
@ -333,7 +334,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
if (ipaDirectory != null) { if (ipaDirectory != null) {
// remove unzip folder // remove unzip folder
deleteDir(new File(ipaDirectory + File.separator + Constants.PAYLOAD)); delete(new File(ipaDirectory + File.separator + Constants.PAYLOAD));
} }
} catch (ParseException e) { } catch (ParseException e) {

@ -103,7 +103,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
int applicationReleaseId = application.getApplicationReleases().get(0).getId(); int applicationReleaseId = application.getApplicationReleaseDTOs().get(0).getId();
try { try {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
@ -144,7 +144,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
int applicationReleaseId = application.getApplicationReleases().get(0).getId(); int applicationReleaseId = application.getApplicationReleaseDTOs().get(0).getId();
try { try {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
@ -188,7 +188,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
int applicationReleaseId = application.getApplicationReleases().get(0).getId(); int applicationReleaseId = application.getApplicationReleaseDTOs().get(0).getId();
try { try {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
@ -239,7 +239,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); String subscriber = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
int applicationReleaseId = application.getApplicationReleases().get(0).getId(); int applicationReleaseId = application.getApplicationReleaseDTOs().get(0).getId();
try { try {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
List<Device> deviceList = new ArrayList<>(); List<Device> deviceList = new ArrayList<>();
@ -266,8 +266,8 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
//todo: generate operation payload correctly for all types of devices. //todo: generate operation payload correctly for all types of devices.
operation.setPayLoad( operation.setPayLoad(
"{'type':'enterprise', 'url':'" + application.getApplicationReleases().get(0).getInstallerName() "{'type':'enterprise', 'url':'" + application.getApplicationReleaseDTOs().get(0).getInstallerName()
+ "', 'app':'" + application.getApplicationReleases().get(0).getUuid() + "'}"); + "', 'app':'" + application.getApplicationReleaseDTOs().get(0).getUuid() + "'}");
return operation; return operation;
} }

@ -133,7 +133,7 @@ public class LifecycleStateManager {
return null; return null;
} }
public boolean isUpdatable(String state) throws LifecycleManagementException { public boolean isUpdatableState(String state) throws LifecycleManagementException {
State currentState = getMatchingState(state); State currentState = getMatchingState(state);
if (currentState != null) { if (currentState != null) {
return currentState.isAppUpdatable(); return currentState.isAppUpdatable();
@ -144,7 +144,7 @@ public class LifecycleStateManager {
} }
} }
public boolean isInstallable(String state) throws LifecycleManagementException { public boolean isInstallableState(String state) throws LifecycleManagementException {
State currentState = getMatchingState(state); State currentState = getMatchingState(state);
if (currentState != null) { if (currentState != null) {
return currentState.isAppInstallable(); return currentState.isAppInstallable();

@ -19,10 +19,12 @@
package org.wso2.carbon.device.application.mgt.core.util; package org.wso2.carbon.device.application.mgt.core.util;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.application.mgt.common.ImageArtifact; import org.wso2.carbon.device.application.mgt.common.ImageArtifact;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException;
import java.io.File; import java.io.File;
@ -61,16 +63,28 @@ public class StorageManagementUtil {
* *
* @param artifactDirectory Artifact Directory that need to be deleted. * @param artifactDirectory Artifact Directory that need to be deleted.
*/ */
public static void deleteDir(File artifactDirectory) throws IOException { public static void delete(File artifactDirectory) throws IOException {
File[] contents = artifactDirectory.listFiles(); File[] contents = artifactDirectory.listFiles();
if (contents != null) { if (contents != null) {
for (File file : contents) { for (File file : contents) {
deleteDir(file); delete(file);
} }
} }
Files.delete(artifactDirectory.toPath()); Files.delete(artifactDirectory.toPath());
} }
public static void copy(String source, String destination) throws IOException {
File sourceFile = new File(source);
File destinationFile = new File(destination);
if (sourceFile.exists() && destinationFile.exists()) {
Files.copy(sourceFile.toPath(), destinationFile.toPath());
} else {
String msg = "Source file " + source + " or destination file " + destination + " doesn't exist";
log.error(msg);
throw new IOException(msg);
}
}
/** /**
* To save a file in a given location. * To save a file in a given location.
* *
@ -120,4 +134,15 @@ public class StorageManagementUtil {
throw new IOException(msg); throw new IOException(msg);
} }
} }
public static String getMD5(InputStream binaryFile) throws ApplicationStorageManagementException {
String md5;
try {
md5 = DigestUtils.md5Hex(binaryFile);
} catch (IOException e) {
throw new ApplicationStorageManagementException
("IO Exception while trying to get the md5sum value of application");
}
return md5;
}
} }

@ -51,27 +51,27 @@ public class LifecycleManagementTest {
// @Test // @Test
// public void CheckUpdatableState() { // public void CheckUpdatableState() {
// boolean isUpdatable = lifecycleStateManager.isUpdatable(UPDATABLE_STATE); // boolean isUpdatableState = lifecycleStateManager.isUpdatableState(UPDATABLE_STATE);
// System.out.println(isUpdatable); // System.out.println(isUpdatableState);
// Assert.assertTrue("Updatable state: " + UPDATABLE_STATE, isUpdatable); // Assert.assertTrue("Updatable state: " + UPDATABLE_STATE, isUpdatableState);
// } // }
// //
// @Test // @Test
// public void CheckNonUpdatableState() { // public void CheckNonUpdatableState() {
// boolean isUpdatable = lifecycleStateManager.isUpdatable(NON_UPDATABLE_STATE); // boolean isUpdatableState = lifecycleStateManager.isUpdatableState(NON_UPDATABLE_STATE);
// Assert.assertFalse("Non Updatable state: " + NON_UPDATABLE_STATE, isUpdatable); // Assert.assertFalse("Non Updatable state: " + NON_UPDATABLE_STATE, isUpdatableState);
// } // }
// //
// @Test // @Test
// public void CheckInstallableState() { // public void CheckInstallableState() {
// boolean isInstallable = lifecycleStateManager.isInstallable(INSTALLABLE_STATE); // boolean isInstallableState = lifecycleStateManager.isInstallableState(INSTALLABLE_STATE);
// Assert.assertTrue("Installable state: " + INSTALLABLE_STATE, isInstallable); // Assert.assertTrue("Installable state: " + INSTALLABLE_STATE, isInstallableState);
// } // }
// //
// @Test // @Test
// public void CheckUnInstallableState() { // public void CheckUnInstallableState() {
// boolean isInstallable = lifecycleStateManager.isInstallable(UNINSTALlABLE_STATE); // boolean isInstallableState = lifecycleStateManager.isInstallableState(UNINSTALlABLE_STATE);
// Assert.assertFalse("UnInstallable state: " + UNINSTALlABLE_STATE, isInstallable); // Assert.assertFalse("UnInstallable state: " + UNINSTALlABLE_STATE, isInstallableState);
// } // }
// //
// @Test // @Test

@ -39,7 +39,7 @@ public class StorageManagementUtilTest {
public void before() throws IOException { public void before() throws IOException {
File file = new File(TEMP_FOLDER); File file = new File(TEMP_FOLDER);
if (file.exists()) { if (file.exists()) {
StorageManagementUtil.deleteDir(file); StorageManagementUtil.delete(file);
} }
} }
@ -67,7 +67,7 @@ public class StorageManagementUtilTest {
@AfterMethod @AfterMethod
public void deleteFileTest() throws IOException, ResourceManagementException { public void deleteFileTest() throws IOException, ResourceManagementException {
File file = new File(TEMP_FOLDER); File file = new File(TEMP_FOLDER);
StorageManagementUtil.deleteDir(file); StorageManagementUtil.delete(file);
if (file.exists()) { if (file.exists()) {
Assert.fail("File deleting failed."); Assert.fail("File deleting failed.");
} }

@ -20,7 +20,7 @@ package org.wso2.carbon.device.application.mgt.handler.util;
public class HandlerConstants { public class HandlerConstants {
public static final String PUBLISHER_APPLICATION_NAME = "application-mgt-publisher"; public static final String PUBLISHER_APPLICATION_NAME = "application-mgt-publisher";
public static final String APP_REG_ENDPOINT = "/api-application-registration/register"; public static final String APP_REG_ENDPOINT = "/api-application-registration/register";
public static final String UI_CONFIG_ENDPOINT = "/api/application-mgt/v1.0/app-mgt/ui-config"; public static final String UI_CONFIG_ENDPOINT = "/api/application-mgt/v1.0/config/ui-config";
public static final String TOKEN_ENDPOINT = "/oauth2/token"; public static final String TOKEN_ENDPOINT = "/oauth2/token";
public static final String AUTHORIZATION = "Authorization"; public static final String AUTHORIZATION = "Authorization";
public static final String BASIC = "Basic "; public static final String BASIC = "Basic ";

@ -36,6 +36,8 @@ import org.wso2.carbon.device.application.mgt.common.*;
import org.wso2.carbon.device.application.mgt.common.ErrorResponse; import org.wso2.carbon.device.application.mgt.common.ErrorResponse;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; 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.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper;
import java.util.List; import java.util.List;
@ -155,9 +157,12 @@ public interface ApplicationManagementAPI {
code = 200, code = 200,
message = "OK. \n Successfully retrieved relevant application.", message = "OK. \n Successfully retrieved relevant application.",
response = ApplicationDTO.class), response = ApplicationDTO.class),
@ApiResponse(
code = 403,
message = "Don't have permission to access the application"),
@ApiResponse( @ApiResponse(
code = 404, code = 404,
message = "ApplicationDTO not found"), message = "Application not found"),
@ApiResponse( @ApiResponse(
code = 500, code = 500,
message = "Internal Server Error. \n Error occurred while getting relevant application.", message = "Internal Server Error. \n Error occurred while getting relevant application.",
@ -218,7 +223,7 @@ public interface ApplicationManagementAPI {
name = "application", name = "application",
value = "The application that need to be edited.", value = "The application that need to be edited.",
required = true) required = true)
@Valid ApplicationDTO application @Valid ApplicationWrapper applicationWrapper
); );
@POST @POST
@ -290,78 +295,85 @@ public interface ApplicationManagementAPI {
@Multipart(value = "screenshot3") Attachment screenshot3 @Multipart(value = "screenshot3") Attachment screenshot3
); );
// @POST @POST
// @Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
// @Consumes("multipart/mixed") @Consumes("multipart/mixed")
// @Path("/{deviceType}/{appType}/{appId}") @Path("/{appType}/{appId}")
// @ApiOperation( @ApiOperation(
// consumes = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,
// produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
// httpMethod = "POST", httpMethod = "POST",
// value = "Create an application", value = "Create an application",
// notes = "This will create a new application", notes = "This will create a new application",
// tags = "ApplicationDTO Management", tags = "ApplicationDTO Management",
// extensions = { extensions = {
// @Extension(properties = { @Extension(properties = {
// @ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update") @ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update")
// }) })
// } }
// ) )
// @ApiResponses( @ApiResponses(
// value = { value = {
// @ApiResponse( @ApiResponse(
// code = 201, code = 201,
// message = "OK. \n Successfully created an application.", message = "OK. \n Successfully created an application.",
// response = Application.class), response = ApplicationRelease.class),
// @ApiResponse( @ApiResponse(
// code = 400, code = 400,
// message = "Bad Request. \n " + message = "Bad Request. \n " +
// "ApplicationDTO creating payload contains unacceptable or vulnerable data"), "ApplicationDTO creating payload contains unacceptable or vulnerable data"),
// @ApiResponse( @ApiResponse(
// code = 500, code = 500,
// message = "Internal Server Error. \n Error occurred while creating the application.", message = "Internal Server Error. \n Error occurred while creating the application.",
// response = ErrorResponse.class) response = ErrorResponse.class)
// }) })
// Response createRelease( Response createRelease(
// @PathParam("deviceType") String deviceType, @ApiParam(
// @PathParam("appId") String appType, name = "appType",
// @PathParam("appId") int appId, value = "Application Type.",
// @ApiParam( required = true)
// name = "applicationRelease", @PathParam("appType") String appType,
// value = "The application release that need to be created.", @ApiParam(
// required = true) name = "appId",
// @Multipart("applicationRelease") ApplicationReleaseDTO applicationRelease, value = "Id of the application.",
// @ApiParam( required = true)
// name = "binaryFile", @PathParam("appId") int appId,
// value = "Binary file of uploading application", @ApiParam(
// required = true) name = "applicationRelease",
// @Multipart(value = "binaryFile") Attachment binaryFile, value = "The application release that need to be created.",
// @ApiParam( required = true)
// name = "icon", @Multipart("applicationRelease") ApplicationReleaseWrapper applicationReleaseWrapper,
// value = "Icon of the uploading application", @ApiParam(
// required = true) name = "binaryFile",
// @Multipart(value = "icon") Attachment iconFile, value = "Binary file of uploading application",
// @ApiParam( required = true)
// name = "banner", @Multipart(value = "binaryFile") Attachment binaryFile,
// value = "Banner of the uploading application", @ApiParam(
// required = true) name = "icon",
// @Multipart(value = "banner") Attachment bannerFile, value = "Icon of the uploading application",
// @ApiParam( required = true)
// name = "screenshot1", @Multipart(value = "icon") Attachment iconFile,
// value = "Screen Shots of the uploading application", @ApiParam(
// required = true) name = "banner",
// @Multipart(value = "screenshot1") Attachment screenshot1, value = "Banner of the uploading application",
// @ApiParam( required = true)
// name = "screenshot2", @Multipart(value = "banner") Attachment bannerFile,
// value = "Screen Shots of the uploading application", @ApiParam(
// required = false) name = "screenshot1",
// @Multipart(value = "screenshot2") Attachment screenshot2, value = "Screen Shots of the uploading application",
// @ApiParam( required = true)
// name = "screenshot3", @Multipart(value = "screenshot1") Attachment screenshot1,
// value = "Screen Shots of the uploading application", @ApiParam(
// required = false) name = "screenshot2",
// @Multipart(value = "screenshot3") Attachment screenshot3 value = "Screen Shots of the uploading application",
// ); required = false)
@Multipart(value = "screenshot2") Attachment screenshot2,
@ApiParam(
name = "screenshot3",
value = "Screen Shots of the uploading application",
required = false)
@Multipart(value = "screenshot3") Attachment screenshot3
);
@DELETE @DELETE
@Consumes("application/json") @Consumes("application/json")
@ -399,7 +411,7 @@ public interface ApplicationManagementAPI {
); );
@PUT @PUT
@Path("/image-artifacts/{appId}/{uuid}") @Path("/image-artifacts/{uuid}")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@Consumes("multipart/mixed") @Consumes("multipart/mixed")
@ApiOperation( @ApiOperation(
@ -437,11 +449,6 @@ public interface ApplicationManagementAPI {
response = ErrorResponse.class) response = ErrorResponse.class)
}) })
Response updateApplicationImageArtifacts( Response updateApplicationImageArtifacts(
@ApiParam(
name = "appId",
value = "ID of the application",
required = true)
@PathParam("appId") int applicatioId,
@ApiParam( @ApiParam(
name = "uuid", name = "uuid",
value = "UUID of the application", value = "UUID of the application",
@ -509,13 +516,20 @@ public interface ApplicationManagementAPI {
response = ErrorResponse.class) response = ErrorResponse.class)
}) })
Response updateApplicationArtifact( Response updateApplicationArtifact(
@ApiParam(name = "deviceType", value = "Type of the device i.e Android, IOS etc", required = true) @ApiParam(
name = "deviceType",
value = "Type of the device i.e Android, IOS etc",
required = true)
@PathParam("deviceType") String deviceType, @PathParam("deviceType") String deviceType,
@ApiParam(name = "appType", value = "Type of the application i.e Mobile, WEB, WEB-CLIP etc", required = true) @ApiParam(
name = "appType",
value = "Type of the application i.e ENTERPRISE, PUBLIC, WEB, WEB-CLIP etc",
required = true)
@PathParam("appType") String appType, @PathParam("appType") String appType,
@ApiParam(name = "appId", value = "Id of the application", required = true) @ApiParam(
@PathParam("appId") int applicationId, name = "uuid",
@ApiParam(name = "uuid", value = "UUID of the application", required = true) value = "UUID of the application",
required = true)
@PathParam("uuid") String applicationUUID, @PathParam("uuid") String applicationUUID,
@Multipart("binaryFile") Attachment binaryFile @Multipart("binaryFile") Attachment binaryFile
); );

@ -29,6 +29,8 @@ import org.wso2.carbon.device.application.mgt.common.dto.LifecycleStateDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException; import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException;
import org.wso2.carbon.device.application.mgt.common.response.Application; import org.wso2.carbon.device.application.mgt.common.response.Application;
import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationReleaseWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper;
import org.wso2.carbon.device.application.mgt.core.exception.BadRequestException; import org.wso2.carbon.device.application.mgt.core.exception.BadRequestException;
import org.wso2.carbon.device.application.mgt.core.exception.ForbiddenException; import org.wso2.carbon.device.application.mgt.core.exception.ForbiddenException;
@ -103,13 +105,24 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@DefaultValue("PUBLISHED") @QueryParam("state") String state) { @DefaultValue("PUBLISHED") @QueryParam("state") String state) {
ApplicationManager applicationManager = APIUtil.getApplicationManager(); ApplicationManager applicationManager = APIUtil.getApplicationManager();
try { try {
ApplicationDTO application = applicationManager.getApplicationById(appId, state); Application application = applicationManager.getApplicationById(appId, state);
if (application == null){
String msg = "Couldn't found an application release which is in " + state + " state for application id "
+ appId;
log.error(msg);
return Response.status(Response.Status.NOT_FOUND).entity(msg).build();
}
return Response.status(Response.Status.OK).entity(application).build(); return Response.status(Response.Status.OK).entity(application).build();
} catch (NotFoundException e) { } catch (NotFoundException e) {
String msg = "ApplicationDTO with application id: " + appId + " not found"; String msg = "ApplicationDTO with application id: " + appId + " not found";
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); return Response.status(Response.Status.NOT_FOUND).entity(msg).build();
} catch (ApplicationManagementException e) { } catch(ForbiddenException e){
String msg = "You don't have permission to access the application. application id: " + appId;
log.error(msg);
return Response.status(Response.Status.FORBIDDEN).entity(msg).build();
}
catch (ApplicationManagementException e) {
String msg = "Error occurred while getting application with the id " + appId; String msg = "Error occurred while getting application with the id " + appId;
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
@ -143,8 +156,8 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
applicationManager.validateAppCreatingRequest(applicationWrapper); applicationManager.validateAppCreatingRequest(applicationWrapper);
applicationManager.validateReleaseCreatingRequest(applicationWrapper.getApplicationReleaseWrappers().get(0), applicationManager.validateReleaseCreatingRequest(applicationWrapper.getApplicationReleaseWrappers().get(0),
applicationWrapper.getType()); applicationWrapper.getType());
applicationManager.isValidAttachmentSet(binaryFile, iconFile, bannerFile, attachmentList, applicationManager.validateBinaryArtifact(binaryFile, applicationWrapper.getType());
applicationWrapper.getType()); applicationManager.validateImageArtifacts(iconFile, bannerFile, attachmentList);
// Created new application entry // Created new application entry
Application application = applicationManager.createApplication(applicationWrapper, Application application = applicationManager.createApplication(applicationWrapper,
@ -167,99 +180,63 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
} }
} }
// @POST @POST
// @Consumes("multipart/mixed") @Consumes("multipart/mixed")
// @Path("/{deviceType}/{appType}/{appId}") @Path("/{appType}/{appId}")
// public Response createRelease( public Response createRelease(
// @PathParam("deviceType") String deviceType, @PathParam("appType") String appType,
// @PathParam("appType") String appType, @PathParam("appId") int appId,
// @PathParam("appId") int appId, @Multipart("applicationRelease") ApplicationReleaseWrapper applicationReleaseWrapper,
// @Multipart("applicationRelease") ApplicationReleaseDTO applicationRelease, @Multipart("binaryFile") Attachment binaryFile,
// @Multipart("binaryFile") Attachment binaryFile, @Multipart("icon") Attachment iconFile,
// @Multipart("icon") Attachment iconFile, @Multipart("banner") Attachment bannerFile,
// @Multipart("banner") Attachment bannerFile, @Multipart("screenshot1") Attachment screenshot1,
// @Multipart("screenshot1") Attachment screenshot1, @Multipart("screenshot2") Attachment screenshot2,
// @Multipart("screenshot2") Attachment screenshot2, @Multipart("screenshot3") Attachment screenshot3) {
// @Multipart("screenshot3") Attachment screenshot3) { ApplicationManager applicationManager = APIUtil.getApplicationManager();
// ApplicationManager applicationManager = APIUtil.getApplicationManager(); List<Attachment> attachmentList = new ArrayList<>();
// ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
// InputStream iconFileStream; if (screenshot1 != null) {
// InputStream bannerFileStream; attachmentList.add(screenshot1);
// List<InputStream> attachments = new ArrayList<>(); }
// List<Attachment> attachmentList = new ArrayList<>(); if (screenshot2 != null) {
// attachmentList.add(screenshot1); attachmentList.add(screenshot2);
// if (screenshot2 != null) { }
// attachmentList.add(screenshot2); if (screenshot3 != null) {
// } attachmentList.add(screenshot3);
// if (screenshot3 != null) { }
// attachmentList.add(screenshot3);
// } try {
// applicationManager.validateReleaseCreatingRequest(applicationReleaseWrapper, appType);
// try { applicationManager.validateBinaryArtifact(binaryFile, appType);
// applicationManager applicationManager.validateImageArtifacts(iconFile, bannerFile, attachmentList);
// .validateReleaseCreatingRequest(applicationRelease, appType, binaryFile, iconFile, bannerFile,
// attachmentList); // Created new application release
// ApplicationRelease release = applicationManager.createRelease(appId, applicationReleaseWrapper,
// // The application executable artifacts such as apks are uploaded. constructApplicationArtifact(binaryFile, iconFile, bannerFile, attachmentList));
// if (!ApplicationType.ENTERPRISE.toString().equals(appType)) { if (release != null) {
// applicationRelease = applicationStorageManager return Response.status(Response.Status.CREATED).entity(release).build();
// .uploadReleaseArtifact(applicationRelease, appType, deviceType, null); } else {
// } else { log.error("ApplicationDTO Creation Failed");
// applicationRelease = applicationStorageManager return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
// .uploadReleaseArtifact(applicationRelease, appType, deviceType, }
// binaryFile.getDataHandler().getInputStream()); } catch (ApplicationManagementException e) {
// if (applicationRelease.getInstallerName() == null || applicationRelease.getAppHashValue() == null) { String msg = "Error occurred while creating the application";
// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); log.error(msg, e);
// } return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
// } } catch (RequestValidatingException e) {
// String msg = "Error occurred while handling the application creating request";
// iconFileStream = iconFile.getDataHandler().getInputStream(); log.error(msg, e);
// bannerFileStream = bannerFile.getDataHandler().getInputStream(); return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
// }
// for (Attachment screenshot : attachmentList) { }
// attachments.add(screenshot.getDataHandler().getInputStream());
// }
//
// // Upload images
// applicationRelease = applicationStorageManager
// .uploadImageArtifacts(applicationRelease, iconFileStream, bannerFileStream, attachments);
// applicationRelease.setUuid(UUID.randomUUID().toString());
//
// // Created new application release entry
// ApplicationReleaseDTO release = applicationManager.createRelease(appId, applicationRelease);
// if (release != null) {
// return Response.status(Response.Status.CREATED).entity(release).build();
// } else {
// log.error("ApplicationDTO Creation Failed");
// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
// }
// } catch (ApplicationManagementException e) {
// String msg = "Error occurred while creating the application";
// log.error(msg, e);
// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
// } catch (ResourceManagementException e) {
// String msg = "Error occurred while uploading the releases artifacts of the application ID: " + appId;
// log.error(msg, e);
// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
// } catch (IOException e) {
// String msg = "Error while uploading binary file and resources for the application release of the "
// + "application ID: " + appId;
// log.error(msg, e);
// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
// } catch (RequestValidatingException e) {
// String msg = "Error occurred while handling the application creating request";
// log.error(msg, e);
// return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
// }
// }
@Override @Override
@PUT @PUT
@Consumes("multipart/mixed") @Consumes("multipart/mixed")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@Path("/image-artifacts/{appId}/{uuid}") @Path("/image-artifacts/{uuid}")
public Response updateApplicationImageArtifacts( public Response updateApplicationImageArtifacts(
@PathParam("appId") int appId,
@PathParam("uuid") String applicationReleaseUuid, @PathParam("uuid") String applicationReleaseUuid,
@Multipart("icon") Attachment iconFile, @Multipart("icon") Attachment iconFile,
@Multipart("banner") Attachment bannerFile, @Multipart("banner") Attachment bannerFile,
@ -267,89 +244,72 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@Multipart("screenshot2") Attachment screenshot2, @Multipart("screenshot2") Attachment screenshot2,
@Multipart("screenshot3") Attachment screenshot3) { @Multipart("screenshot3") Attachment screenshot3) {
try { try {
InputStream iconFileStream = null; List<Attachment> attachments = new ArrayList<>();
InputStream bannerFileStream = null;
List<InputStream> attachments = new ArrayList<>();
if (iconFile != null) { if (screenshot1 != null) {
iconFileStream = iconFile.getDataHandler().getInputStream(); attachments.add(screenshot1);
}
if (bannerFile != null) {
bannerFileStream = bannerFile.getDataHandler().getInputStream();
} }
attachments.add(screenshot1.getDataHandler().getInputStream());
if (screenshot2 != null) { if (screenshot2 != null) {
attachments.add(screenshot2.getDataHandler().getInputStream()); attachments.add(screenshot2);
} }
if (screenshot3 != null) { if (screenshot3 != null) {
attachments.add(screenshot3.getDataHandler().getInputStream()); attachments.add(screenshot3);
} }
ApplicationManager applicationManager = APIUtil.getApplicationManager(); ApplicationManager applicationManager = APIUtil.getApplicationManager();
applicationManager applicationManager.validateImageArtifacts(iconFile, bannerFile, attachments);
.updateApplicationImageArtifact(appId, applicationReleaseUuid, iconFileStream, bannerFileStream, applicationManager.updateApplicationImageArtifact(applicationReleaseUuid,
attachments); constructApplicationArtifact(null, iconFile, bannerFile, attachments));
return Response.status(Response.Status.OK) return Response.status(Response.Status.OK)
.entity("Successfully uploaded artifacts for the application " + applicationReleaseUuid).build(); .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) { } catch (NotFoundException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build(); return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
} catch (ValidationException e) {
log.error(e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
} catch (ForbiddenException e) { } catch (ForbiddenException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
return Response.status(Response.Status.FORBIDDEN).entity(e.getMessage()).build(); return Response.status(Response.Status.FORBIDDEN).entity(e.getMessage()).build();
} catch (ApplicationManagementException e) { } catch (ApplicationManagementException e) {
String msg = "Error occurred while updating the application image artifacts for app id: " + appId String msg = "Error occurred while updating the application image artifacts for application release uuid: "
+ " application release uuid: " + applicationReleaseUuid; + applicationReleaseUuid;
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (IOException e) {
String msg =
"Exception while trying to read icon, banner files for the application " + applicationReleaseUuid;
log.error(msg);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} }
} }
@Override @Override
@PUT @PUT
@Consumes("multipart/mixed") @Consumes("multipart/mixed")
@Path("/app-artifacts/{deviceType}/{appType}/{appId}/{uuid}") @Path("/app-artifact/{deviceType}/{appType}/{uuid}")
public Response updateApplicationArtifact( public Response updateApplicationArtifact(
@PathParam("deviceType") String deviceType, @PathParam("deviceType") String deviceType,
@PathParam("appType") String appType, @PathParam("appType") String appType,
@PathParam("appId") int applicationId,
@PathParam("uuid") String applicationReleaseUuid, @PathParam("uuid") String applicationReleaseUuid,
@Multipart("binaryFile") Attachment binaryFile) { @Multipart("binaryFile") Attachment binaryFile) {
try { try {
if (binaryFile == null) { ApplicationManager applicationManager = APIUtil.getApplicationManager();
return Response.status(Response.Status.BAD_REQUEST)
.entity("binary file is NULL, hence invalid request to update application release artifact for application release UUID: "
+ applicationReleaseUuid).build();
}
if (!ApplicationType.ENTERPRISE.toString().equals(appType)) { if (!ApplicationType.ENTERPRISE.toString().equals(appType)) {
return Response.status(Response.Status.BAD_REQUEST).entity("If ApplicationDTO type is " + appType String msg = "If ApplicationDTO type is " + appType
+ ", therefore you don't have application release artifact to update for application release UUID: " + ", therefore you don't have application release artifact to update for application release UUID: "
+ applicationReleaseUuid).build(); + applicationReleaseUuid;
log.error(msg);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
} }
APIUtil.getApplicationManager().updateApplicationArtifact(applicationId, deviceType, applicationReleaseUuid, applicationManager.validateBinaryArtifact(binaryFile, appType);
binaryFile.getDataHandler().getInputStream()); applicationManager.updateApplicationArtifact(deviceType, appType, applicationReleaseUuid,
constructApplicationArtifact(binaryFile, null, null, null));
return Response.status(Response.Status.OK) return Response.status(Response.Status.OK)
.entity("Successfully uploaded artifacts for the application release. UUID is " .entity("Successfully uploaded artifacts for the application release. UUID is "
+ applicationReleaseUuid).build(); + applicationReleaseUuid).build();
} catch (IOException e) { } catch (RequestValidatingException e) {
String msg = "Error occurred while trying to read icon, banner files for the application release" log.error(e.getMessage(), e);
+ applicationReleaseUuid; return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
log.error(msg);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
} catch (NotFoundException e) { } catch (NotFoundException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build(); return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
} catch (ValidationException e) {
log.error(e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
} catch (ApplicationManagementException e) { } catch (ApplicationManagementException e) {
log.error("Error occurred while updating the image artifacts of the application with the uuid " log.error("Error occurred while updating the image artifacts of the application with the uuid "
+ applicationReleaseUuid, e); + applicationReleaseUuid, e);
@ -363,10 +323,13 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@Path("/{appId}") @Path("/{appId}")
public Response updateApplication( public Response updateApplication(
@PathParam("appId") int applicationId, @PathParam("appId") int applicationId,
@Valid ApplicationDTO application) { @Valid ApplicationWrapper applicationWrapper) {
ApplicationManager applicationManager = APIUtil.getApplicationManager(); ApplicationManager applicationManager = APIUtil.getApplicationManager();
try { try {
application = applicationManager.updateApplication(applicationId, application); //todo wrong
applicationManager.updateApplication(applicationId, applicationWrapper);
return Response.status(Response.Status.OK)
.entity("Application was updated successfully. ApplicationID " + applicationId).build();
} catch (NotFoundException e) { } catch (NotFoundException e) {
log.error(e.getMessage()); log.error(e.getMessage());
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build(); return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
@ -378,7 +341,6 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
} }
return Response.status(Response.Status.OK).entity(application).build();
} }
@Override @Override
@ -610,6 +572,7 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
applicationArtifact.setInstallerStream(installerStream); applicationArtifact.setInstallerStream(installerStream);
} }
if (iconFile != null) {
dataHandler = iconFile.getDataHandler(); dataHandler = iconFile.getDataHandler();
String iconFileName = dataHandler.getName(); String iconFileName = dataHandler.getName();
InputStream iconStream = dataHandler.getInputStream(); InputStream iconStream = dataHandler.getInputStream();
@ -621,14 +584,16 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
throw new BadRequestException(msg); throw new BadRequestException(msg);
} }
if (iconFileName == null) { if (iconFileName == null) {
String msg = String msg = "Icon file name retrieving is failed.. Hence can't proceed. Please verify the "
"Icon file name retrieving is failed.. Hence can't proceed. Please verify the " + "icon file."; + "icon file.";
log.error(msg); log.error(msg);
throw new BadRequestException(msg); throw new BadRequestException(msg);
} }
applicationArtifact.setIconName(iconFileName); applicationArtifact.setIconName(iconFileName);
applicationArtifact.setIconStream(iconStream); applicationArtifact.setIconStream(iconStream);
}
if (bannerFile != null) {
dataHandler = bannerFile.getDataHandler(); dataHandler = bannerFile.getDataHandler();
String bannerFileName = dataHandler.getName(); String bannerFileName = dataHandler.getName();
InputStream bannerStream = dataHandler.getInputStream(); InputStream bannerStream = dataHandler.getInputStream();
@ -646,7 +611,9 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
} }
applicationArtifact.setBannerName(bannerFileName); applicationArtifact.setBannerName(bannerFileName);
applicationArtifact.setBannerStream(bannerStream); applicationArtifact.setBannerStream(bannerStream);
}
if (attachmentList != null) {
Map<String, InputStream> scrrenshotData = new HashMap<>(); Map<String, InputStream> scrrenshotData = new HashMap<>();
for (Attachment sc : attachmentList) { for (Attachment sc : attachmentList) {
dataHandler = sc.getDataHandler(); dataHandler = sc.getDataHandler();
@ -661,14 +628,15 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
} }
if (screenshotrFileName == null) { if (screenshotrFileName == null) {
String msg = String msg =
"Screenshot file name retrieving is failed for one screenshot. Hence can't proceed. Please verify the " "Screenshot file name retrieving is failed for one screenshot. Hence can't proceed. "
+ "screenshots."; + "Please verify the screenshots.";
log.error(msg); log.error(msg);
throw new BadRequestException(msg); throw new BadRequestException(msg);
} }
scrrenshotData.put(screenshotrFileName, screenshotStream); scrrenshotData.put(screenshotrFileName, screenshotStream);
} }
applicationArtifact.setScreenshots(scrrenshotData); applicationArtifact.setScreenshots(scrrenshotData);
}
return applicationArtifact; return applicationArtifact;
} catch (IOException e) { } catch (IOException e) {
String msg = "Error occurred when reading attachment data."; String msg = "Error occurred when reading attachment data.";

Loading…
Cancel
Save