Add ne APIs and refactor

feature/appm-store/pbac
lasanthaDLPDS 6 years ago
parent 19f088d222
commit 6c543922b4

@ -53,12 +53,12 @@ public interface ApplicationManager {
/**
* 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
* @return Updated Application
* @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.
@ -94,7 +94,7 @@ public interface ApplicationManager {
* @return the ApplicationDTO identified by the ID
* @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.
@ -139,28 +139,24 @@ public interface ApplicationManager {
/**
* To update release images such as icons, banner and screenshots.
*
* @param appId ID of the ApplicationDTO
* @param uuid uuid of the ApplicationDTO
* @param iconFileStream icon file of the release
* @param bannerFileStream bannerFileStream of the release.
* @param attachments screenshot attachments of the release
* @param applicationArtifact Application artifact that contains names and input streams of the application artifacts.
* @throws ApplicationManagementException ApplicationDTO Management Exception.
*/
void updateApplicationImageArtifact(int appId, String uuid, InputStream iconFileStream, InputStream
bannerFileStream, List<InputStream> attachments) throws ApplicationManagementException;
void updateApplicationImageArtifact(String uuid, ApplicationArtifact applicationArtifact) throws ApplicationManagementException;
/**
* To update release images.
*
* @param appId ID of the ApplicationDTO
* @param deviceType Applicable device type of the application
* @param deviceType Application artifact compatible device type name.
* @param appType Type of the application.
* @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.
*/
void updateApplicationArtifact(int appId, String deviceType, String uuid, InputStream binaryFile)
throws ApplicationManagementException;
void updateApplicationArtifact(String deviceType, String appType, String uuid,
ApplicationArtifact applicationArtifact) throws ApplicationManagementException;
/**
* To create an application release for an ApplicationDTO.
@ -207,15 +203,15 @@ public interface ApplicationManager {
/***
*
* @param binaryFile Uploading binary fila. i.e .apk or .ipa
* @param iconFile Icon file for the application.
* @param bannerFile Banner file for the application.
* @param attachmentList Screenshot list.
* @param applicationType Type of the application.
* @throws RequestValidatingException If request doesn't contains required attachments.
*/
void isValidAttachmentSet(Attachment binaryFile, Attachment iconFile, Attachment bannerFile,
List<Attachment> attachmentList, String applicationType) throws RequestValidatingException;
void validateImageArtifacts(Attachment iconFile, Attachment bannerFile, List<Attachment> attachmentList)
throws RequestValidatingException;
void validateBinaryArtifact(Attachment binaryFile, String applicationType) throws RequestValidatingException;
void addAplicationCategories(List<String> categories) throws ApplicationManagementException;

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

@ -149,15 +149,16 @@ public interface ApplicationDAO {
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 appType type of the application.
* @param deviceTypeId ID of the device type.
* @param tenantId ID of the tenant.
* @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.

@ -82,12 +82,11 @@ public interface ApplicationReleaseDAO {
* To update an ApplicationDTO release.
*
* @param applicationRelease ApplicationReleaseDTO that need to be updated.
* @param applicationId Id of the application.
* @param tenantId Id of the tenant
* @return the updated ApplicationDTO Release
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception
*/
ApplicationReleaseDTO updateRelease(int applicationId, ApplicationReleaseDTO applicationRelease, int tenantId) throws
ApplicationReleaseDTO updateRelease(ApplicationReleaseDTO applicationRelease, int tenantId) throws
ApplicationManagementDAOException;
/**
@ -129,6 +128,8 @@ public interface ApplicationReleaseDAO {
ApplicationReleaseDTO getReleaseByIds(int applicationId, String releaseUuid, int tenantId) throws
ApplicationManagementDAOException;
ApplicationReleaseDTO getReleaseByUUID(String uuid, int tenantId) throws ApplicationManagementDAOException;
/**
* To verify whether application release exist or not.
*

@ -108,10 +108,12 @@ public class Util {
appRelease.setReleaseType(rs.getString("RELEASE_TYPE"));
appRelease.setVersion(rs.getString("RELEASE_VERSION"));
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.setScreenshotName1("AP_RELEASE_SC1");
appRelease.setScreenshotName2("AP_RELEASE_SC2");
appRelease.setScreenshotName3("AP_RELEASE_SC3");
appRelease.setScreenshotName1(rs.getString("AP_RELEASE_SC1"));
appRelease.setScreenshotName2(rs.getString("AP_RELEASE_SC2"));
appRelease.setScreenshotName3(rs.getString("AP_RELEASE_SC3"));
appRelease.setAppHashValue(rs.getString("RELEASE_HASH_VALUE"));
appRelease.setPrice(rs.getDouble("RELEASE_PRICE"));
appRelease.setMetaData(rs.getString("RELEASE_META_INFO"));
appRelease.setSupportedOsVersions(rs.getString("RELEASE_SUP_OS_VERSIONS"));

@ -149,10 +149,12 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "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.ICON_LOCATION AS AP_RELEASE_ICON_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_HASH_VALUE AS RELEASE_HASH_VALUE, "
+ "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, "
@ -1063,23 +1065,25 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
}
@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;
PreparedStatement stmt = null;
ResultSet rs = null;
String sql;
int id = -1;
try {
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.setString(1, appName);
stmt.setString(2, appType);
stmt.setInt(2, deviceTypeId);
stmt.setInt(3, tenantId);
rs = stmt.executeQuery();
if (rs.next()) {
id = rs.getInt(1);
}
return rs.next();
} catch (DBConnectionException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e);
} catch (SQLException e) {
@ -1087,6 +1091,5 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
} finally {
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.
*
@ -378,39 +424,56 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
/**
* 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.
*/
@Override
public ApplicationReleaseDTO updateRelease(int applicationId, ApplicationReleaseDTO applicationRelease, int tenantId)
public ApplicationReleaseDTO updateRelease(ApplicationReleaseDTO applicationReleaseDTO, int tenantId)
throws ApplicationManagementDAOException {
Connection connection;
PreparedStatement statement = null;
String sql = "UPDATE AP_APP_RELEASE SET VERSION = ?, UUID = ?, RELEASE_TYPE = ?, PACKAGE_NAME = ?,"
+ " APP_PRICE = ?, STORED_LOCATION = ?, BANNER_LOCATION = ?, ICON_LOCATION =?, SC_1_LOCATION = ?, " +
"SC_2_LOCATION = ?,"
+ " SC_3_LOCATION = ?, APP_HASH_VALUE = ?, SHARED_WITH_ALL_TENANTS = ?, APP_META_INFO = ? "
+ "WHERE AP_APP_ID = ? AND TENANT_ID = ? AND ID = ?;";
String sql = "UPDATE AP_APP_RELEASE "
+ "SET "
+ "DESCRIPTION = ?, "
+ "VERSION = ?, "
+ "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 {
connection = this.getDBConnection();
statement = connection.prepareStatement(sql);
statement.setString(1, applicationRelease.getVersion());
statement.setString(2, applicationRelease.getUuid());
statement.setString(3, applicationRelease.getReleaseType());
statement.setString(4, applicationRelease.getPackageName());
statement.setDouble(5, applicationRelease.getPrice());
statement.setString(6, applicationRelease.getInstallerName());
statement.setString(7, applicationRelease.getBannerName());
statement.setString(8, applicationRelease.getIconName());
statement.setString(9, applicationRelease.getScreenshotName1());
statement.setString(10, applicationRelease.getScreenshotName2());
statement.setString(11, applicationRelease.getScreenshotName3());
statement.setString(12, applicationRelease.getAppHashValue());
statement.setBoolean(13, applicationRelease.getIsSharedWithAllTenants());
statement.setString(14, applicationRelease.getMetaData());
statement.setInt(15, applicationId);
statement.setInt(16, tenantId);
statement.setInt(17, applicationRelease.getId());
statement.setString(1, applicationReleaseDTO.getDescription());
statement.setString(2, applicationReleaseDTO.getVersion());
statement.setString(3, applicationReleaseDTO.getUuid());
statement.setString(4, applicationReleaseDTO.getReleaseType());
statement.setString(5, applicationReleaseDTO.getPackageName());
statement.setDouble(6, applicationReleaseDTO.getPrice());
statement.setString(7, applicationReleaseDTO.getInstallerName());
statement.setString(8, applicationReleaseDTO.getBannerName());
statement.setString(9, applicationReleaseDTO.getIconName());
statement.setString(10, applicationReleaseDTO.getScreenshotName1());
statement.setString(11, applicationReleaseDTO.getScreenshotName2());
statement.setString(12, applicationReleaseDTO.getScreenshotName3());
statement.setString(13, applicationReleaseDTO.getAppHashValue());
statement.setBoolean(14, applicationReleaseDTO.getIsSharedWithAllTenants());
statement.setString(15, applicationReleaseDTO.getMetaData());
statement.setString(16, applicationReleaseDTO.getSupportedOsVersions());
statement.setString(17, applicationReleaseDTO.getCurrentState());
statement.setInt(18, tenantId);
statement.setInt(19, applicationReleaseDTO.getId());
if (statement.executeUpdate() == 0) {
return null;
}
@ -423,7 +486,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
} finally {
Util.cleanupResources(statement, null);
}
return applicationRelease;
return applicationReleaseDTO;
}
/**

@ -67,7 +67,6 @@ import org.wso2.carbon.device.application.mgt.core.exception.ForbiddenException;
import org.wso2.carbon.device.application.mgt.core.exception.LifeCycleManagementDAOException;
import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException;
import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException;
import org.wso2.carbon.device.application.mgt.core.exception.ValidationException;
import org.wso2.carbon.device.application.mgt.core.exception.VisibilityManagementDAOException;
import org.wso2.carbon.device.application.mgt.core.internal.DataHolder;
import org.wso2.carbon.device.application.mgt.core.lifecycle.LifecycleStateManager;
@ -145,9 +144,10 @@ public class ApplicationManagerImpl implements ApplicationManager {
applicationDTO = appWrapperToAppDTO(applicationWrapper);
ApplicationReleaseDTO initialApplicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0);
applicationDTO.getApplicationReleaseDTOs().clear();
applicationDTO.getApplicationReleaseDTOs()
.add(addApplicationReleaseArtifacts(applicationDTO.getType(), applicationDTO.getDeviceTypeName(),
initialApplicationReleaseDTO, applicationArtifact));
ApplicationReleaseDTO applicationReleaseDTO = addApplicationReleaseArtifacts(applicationDTO.getType(), applicationDTO.getDeviceTypeName(),
initialApplicationReleaseDTO, applicationArtifact);
applicationDTO.getApplicationReleaseDTOs().add(addImageArtifacts(applicationReleaseDTO, applicationArtifact));
} catch (UnexpectedServerErrorException e) {
String msg = "Error occurred when getting Device Type data.";
log.error(msg);
@ -161,8 +161,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
try {
List<ApplicationReleaseDTO> applicationReleaseEntities = new ArrayList<>();
ApplicationReleaseDTO applicationReleaseDTO;
Filter filter = new Filter();
Filter filter = new Filter();
filter.setFullMatch(true);
filter.setAppName(applicationDTO.getName().trim());
filter.setOffset(0);
@ -193,10 +193,20 @@ public class ApplicationManagerImpl implements ApplicationManager {
List<String> unrestrictedRoles = applicationWrapper.getUnrestrictedRoles();
if (!unrestrictedRoles.isEmpty()) {
if (!isValidRestrictedRole(unrestrictedRoles)) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Unrestricted role list contain role/roles which are not in the user store.";
log.error(msg);
throw new ApplicationManagementException(msg);
}
if (!hasUserRole(unrestrictedRoles, userName)){
ConnectionManagerUtil.rollbackDBTransaction();
String msg =
"You are trying to restrict the visibility of the application for a role set, but in order to perform the action at least one role should be assigned to user: "
+ userName;
log.error(msg);
throw new BadRequestException(msg);
}
this.visibilityDAO.addUnrestrictedRoles(unrestrictedRoles, appId, tenantId);
if (log.isDebugEnabled()) {
log.debug("New restricted roles to app ID mapping added to AP_UNRESTRICTED_ROLE table."
@ -251,7 +261,6 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
tagIds = this.applicationDAO.getTagIdsForTagNames(tags, tenantId);
} else {
for (TagDTO tagDTO : registeredTags) {
for (String tagName : tags) {
if (tagName.equals(tagDTO.getTagName())) {
@ -403,6 +412,12 @@ public class ApplicationManagerImpl implements ApplicationManager {
// Since WEB CLIP doesn't have an installer, set uuid as has value for WEB CLIP
applicationReleaseDTO.setAppHashValue(uuid);
}
return applicationReleaseDTO;
}
private ApplicationReleaseDTO addImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO,
ApplicationArtifact applicationArtifact) throws ResourceManagementException {
ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager();
applicationReleaseDTO.setIconName(applicationArtifact.getIconName());
applicationReleaseDTO.setBannerName(applicationArtifact.getBannerName());
@ -441,8 +456,6 @@ public class ApplicationManagerImpl implements ApplicationManager {
DeviceType deviceType = null;
try {
validateFilter(filter);
//set default values
if (StringUtils.isEmpty(filter.getSortBy())) {
filter.setSortBy("ASC");
@ -456,6 +469,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
ConnectionManagerUtil.openDBConnection();
validateFilter(filter);
if (deviceType == null) {
appDTOs = applicationDAO.getApplications(filter, 0, tenantId);
} else {
@ -464,57 +479,39 @@ public class ApplicationManagerImpl implements ApplicationManager {
for (ApplicationDTO app : appDTOs) {
boolean isSearchingApp = true;
List<String> tags = filter.getTags();
List<String> categories = filter.getAppCategories();
List<String> unrestrictedRoles = filter.getUnrestrictedRoles();
if (lifecycleStateManager.getEndState().equals(app.getStatus())) {
isSearchingApp = false;
}
if (unrestrictedRoles != null && !unrestrictedRoles.isEmpty()) {
List<String> filteringTags = filter.getTags();
List<String> filteringCategories = filter.getAppCategories();
List<String> filteringUnrestrictedRoles = filter.getUnrestrictedRoles();
if (!isRoleExists(unrestrictedRoles, userName)) {
String msg = "At least one filtering role is not assigned for the user: " + userName
+ ". Hence user " + userName
+ " Can't filter applications by giving these unrestriced role list";
log.error(msg);
throw new BadRequestException(msg);
}
if (!lifecycleStateManager.getEndState().equals(app.getStatus())) {
List<String> appUnrestrictedRoles = visibilityDAO.getUnrestrictedRoles(app.getId(), tenantId);
boolean isUnrestrictedRoleExistForApp = false;
for (String role : unrestrictedRoles) {
if (appUnrestrictedRoles.contains(role)) {
isUnrestrictedRoleExistForApp = true;
if ((appUnrestrictedRoles.isEmpty() || hasUserRole(appUnrestrictedRoles, userName)) && (
filteringUnrestrictedRoles == null || filteringUnrestrictedRoles.isEmpty()
|| hasAppUnrestrictedRole(appUnrestrictedRoles, filteringUnrestrictedRoles,
userName))) {
if (filteringCategories != null && !filteringCategories.isEmpty()) {
List<String> appTagList = applicationDAO.getAppCategories(app.getId(), tenantId);
boolean isAppCategory = false;
for (String category : filteringCategories) {
if (appTagList.contains(category)) {
isAppCategory = true;
break;
}
}
if (!isUnrestrictedRoleExistForApp) {
if (!isAppCategory) {
isSearchingApp = false;
}
}
if (tags != null && !tags.isEmpty()) {
if (filteringTags != null && !filteringTags.isEmpty()) {
List<String> appTagList = applicationDAO.getAppTags(app.getId(), tenantId);
boolean isTagExistForApp = false;
for (String tag : tags) {
boolean isAppTag = false;
for (String tag : filteringTags) {
if (appTagList.contains(tag)) {
isTagExistForApp = true;
break;
}
}
if (!isTagExistForApp) {
isSearchingApp = false;
}
}
if (categories != null && !categories.isEmpty()) {
List<String> appTagList = applicationDAO.getAppCategories(app.getId(), tenantId);
boolean isCategoryExistForApp = false;
for (String category : categories) {
if (appTagList.contains(category)) {
isCategoryExistForApp = true;
isAppTag = true;
break;
}
}
if (!isCategoryExistForApp) {
if (!isAppTag) {
isSearchingApp = false;
}
}
@ -522,6 +519,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
filteredApplications.add(app);
}
}
}
}
for(ApplicationDTO appDTO : filteredApplications){
applications.add(appDtoToAppResponse(appDTO));
@ -546,6 +545,25 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
}
private boolean hasAppUnrestrictedRole(List<String> appUnrestrictedRoles, List<String> filteringUnrestrictedRoles,
String userName) throws BadRequestException, UserStoreException {
if (!haveAllUserRoles(filteringUnrestrictedRoles, userName)) {
String msg =
"At least one filtering role is not assigned for the user: " + userName + ". Hence user " + userName
+ " Can't filter applications by giving these unrestriced role list";
log.error(msg);
throw new BadRequestException(msg);
}
if (!appUnrestrictedRoles.isEmpty()) {
for (String role : filteringUnrestrictedRoles) {
if (appUnrestrictedRoles.contains(role)) {
return true;
}
}
}
return false;
}
@Override
public ApplicationRelease createRelease(int applicationId,
ApplicationReleaseWrapper applicationReleaseWrapper, ApplicationArtifact applicationArtifact)
@ -567,6 +585,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
ApplicationReleaseDTO applicationReleaseDTO = addApplicationReleaseArtifacts(applicationDTO.getType(),
applicationDTO.getDeviceTypeName(), releaseWrapperToReleaseDTO(applicationReleaseWrapper),
applicationArtifact);
applicationReleaseDTO = addImageArtifacts(applicationReleaseDTO, applicationArtifact);
String initialstate = lifecycleStateManager.getInitialState();
applicationReleaseDTO.setCurrentState(initialstate);
@ -607,45 +626,54 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
@Override
public ApplicationDTO getApplicationById(int appId, String state) throws ApplicationManagementException {
public Application getApplicationById(int appId, String state) throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
ApplicationDTO application;
boolean isAppAllowed = false;
ApplicationDTO applicationDTO;
List<ApplicationReleaseDTO> filteredApplicationReleaseDTOs;
boolean isVisibleApp = false;
try {
ConnectionManagerUtil.openDBConnection();
application = this.applicationDAO.getApplicationById(appId, tenantId);
if (application == null) {
applicationDTO = this.applicationDAO.getApplicationById(appId, tenantId);
if (applicationDTO == null) {
throw new NotFoundException("Couldn't find an application for application Id: " + appId);
}
filteredApplicationReleaseDTOs = applicationDTO.getApplicationReleaseDTOs().stream()
.filter(applicationReleaseDTO -> applicationReleaseDTO.getCurrentState().equals(state))
.collect(Collectors.toList());
applicationDTO.setApplicationReleaseDTOs(filteredApplicationReleaseDTOs);
if (applicationDTO.getApplicationReleaseDTOs().isEmpty()){
return null;
}
List<String> tags = this.applicationDAO.getAppTags(appId, tenantId);
List<String> categories = this.applicationDAO.getAppCategories(appId, tenantId);
application.setTags(tags);
applicationDTO.setTags(tags);
//todo when support to add multiple categories this has to be changed
if (!categories.isEmpty()){
application.setAppCategory(categories.get(0));
applicationDTO.setAppCategory(categories.get(0));
}
if (isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION)) {
return application;
return appDtoToAppResponse(applicationDTO);
}
List<String> unrestrictedRoles = this.visibilityDAO.getUnrestrictedRoles(appId, tenantId);
if (!unrestrictedRoles.isEmpty()) {
if (isRoleExists(unrestrictedRoles, userName)) {
isAppAllowed = true;
if (hasUserRole(unrestrictedRoles, userName)) {
isVisibleApp = true;
}
} else {
isAppAllowed = true;
isVisibleApp = true;
}
if (!isAppAllowed) {
if (!isVisibleApp) {
String msg = "You are trying to access visibility restricted application. You don't have required "
+ "roles to view this application,";
log.error(msg);
throw new ForbiddenException(msg);
}
return application;
return appDtoToAppResponse(applicationDTO);
} catch (UserStoreException e) {
throw new ApplicationManagementException(
"User-store exception while getting application with the application id " + appId);
@ -674,7 +702,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
if (!application.getUnrestrictedRoles().isEmpty()) {
if (isRoleExists(application.getUnrestrictedRoles(), userName)) {
if (hasUserRole(application.getUnrestrictedRoles(), userName)) {
isAppAllowed = true;
}
} else {
@ -695,7 +723,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
}
private boolean isRoleExists(Collection<String> unrestrictedRoleList, String userName) throws UserStoreException {
private boolean hasUserRole(Collection<String> unrestrictedRoleList, String userName) throws UserStoreException {
String[] roleList;
roleList = getRolesOfUser(userName);
for (String unrestrictedRole : unrestrictedRoleList) {
@ -708,6 +736,20 @@ public class ApplicationManagerImpl implements ApplicationManager {
return false;
}
private boolean haveAllUserRoles(Collection<String> unrestrictedRoleList, String userName)
throws UserStoreException {
String[] roleList;
roleList = getRolesOfUser(userName);
for (String unrestrictedRole : unrestrictedRoleList) {
for (String role : roleList) {
if (!unrestrictedRole.equals(role)) {
return false;
}
}
}
return true;
}
private boolean isValidRestrictedRole(Collection<String> unrestrictedRoleList) throws UserStoreException {
List<String> roleList = new ArrayList<>(Arrays.asList(getRoleNames()));
return roleList.containsAll(unrestrictedRoleList);
@ -754,7 +796,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
if (!application.getUnrestrictedRoles().isEmpty()) {
if (isRoleExists(application.getUnrestrictedRoles(), userName)) {
if (hasUserRole(application.getUnrestrictedRoles(), userName)) {
isAppAllowed = true;
}
} else {
@ -784,7 +826,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
ConnectionManagerUtil.openDBConnection();
application = this.applicationDAO.getApplicationByRelease(appReleaseUUID, tenantId);
if (application.getUnrestrictedRoles().isEmpty() || isRoleExists(application.getUnrestrictedRoles(),
if (application.getUnrestrictedRoles().isEmpty() || hasUserRole(application.getUnrestrictedRoles(),
userName)) {
return application;
}
@ -867,7 +909,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
if (!isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION) && !application
.getUnrestrictedRoles().isEmpty() && isRoleExists(application.getUnrestrictedRoles(), userName)) {
.getUnrestrictedRoles().isEmpty() && hasUserRole(application.getUnrestrictedRoles(), userName)) {
throw new ForbiddenException(
"You don't have permission to delete this application. In order to delete an application you "
+ "need to have required permission. ApplicationDTO ID: " + applicationId);
@ -988,7 +1030,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
throw new NotFoundException("Couldn't find an application for application ID: " + applicationId);
}
if (!isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION) && !application
.getUnrestrictedRoles().isEmpty() && isRoleExists(application.getUnrestrictedRoles(), userName)) {
.getUnrestrictedRoles().isEmpty() && hasUserRole(application.getUnrestrictedRoles(), userName)) {
throw new ForbiddenException(
"You don't have permission for deleting application release. ApplicationDTO id: " + applicationId
+ " and release UUID: " + releaseUuid);
@ -1094,77 +1136,76 @@ public class ApplicationManagerImpl implements ApplicationManager {
return false;
}
//todo check whether user is whether admin user or application owner, otherwise throw an exception
@Override
public void updateApplicationImageArtifact(int appId, String uuid, InputStream iconFileStream,
InputStream bannerFileStream, List<InputStream> attachments) throws ApplicationManagementException {
//todo with this implementation user has to provide all image artifacts in order to update one image artifact as
// well. Therefore enhance this later.
public void updateApplicationImageArtifact(String uuid, ApplicationArtifact applicationArtifact)
throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager();
ApplicationReleaseDTO applicationRelease;
ApplicationReleaseDTO applicationReleaseDTO;
try {
if (appId <= 0) {
throw new ValidationException(
"ApplicationDTO id could,t be a negative integer. Hence please add valid application id.");
}
ConnectionManagerUtil.beginDBTransaction();
applicationRelease = this.applicationReleaseDAO.getReleaseByIds(appId, uuid, tenantId);
if (applicationRelease == null) {
throw new NotFoundException(
"Doesn't exist a application release for application ID: " + appId + "and application UUID: "
+ uuid);
}
LifecycleStateDTO lifecycleState = this.lifecycleStateDAO
.getLatestLifeCycleState(appId, applicationRelease.getUuid());
if (AppLifecycleState.PUBLISHED.toString().equals(lifecycleState.getCurrentState())
|| AppLifecycleState.DEPRECATED.toString().equals(lifecycleState.getCurrentState())) {
throw new ForbiddenException("Can't Update the application release in PUBLISHED or DEPRECATED state. "
+ "Hence please demote the application and update the application release");
}
applicationRelease = applicationStorageManager
.updateImageArtifacts(applicationRelease, iconFileStream, bannerFileStream, attachments);
applicationRelease = this.applicationReleaseDAO.updateRelease(appId, applicationRelease, tenantId);
if (applicationRelease == null) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"ApplicationDTO release updating count is 0. ApplicationDTO id: " + appId
+ " ApplicationDTO release UUID: " + uuid);
applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
if (applicationReleaseDTO == null) {
String msg = "Application release image artifact uploading is failed. Doesn't exist a application "
+ "release for application ID: application UUID: " + uuid;
log.error(msg);
throw new NotFoundException(msg);
}
String currentState = applicationReleaseDTO.getCurrentState();
if (!lifecycleStateManager.isUpdatableState(currentState)){
throw new ForbiddenException(
"Can't Update the application release. Application release is in " + currentState
+ " and it is not an release updatable state. Hence please move the application release"
+ " into updatable state and retry the operation.");
}
applicationStorageManager.deleteImageArtifacts(applicationReleaseDTO);
applicationReleaseDTO = this.applicationReleaseDAO
.updateRelease(addImageArtifacts(applicationReleaseDTO, applicationArtifact), tenantId);
if (applicationReleaseDTO == null) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "ApplicationDTO release updating count is 0. ApplicationDTO release UUID is " + uuid;
log.error(msg);
throw new ApplicationManagementException(msg);
}
ConnectionManagerUtil.commitDBTransaction();
} catch (DBConnectionException e) {
throw new ApplicationManagementException(
"Error occured when getting DB connection to update image artifacts of the application, appid: "
+ appId + " and uuid " + uuid + ".", e);
String msg =
"Error occured when getting DB connection to update image artifacts of the application release of haveing uuid "
+ uuid + ".";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"Error occured while getting application release data for updating image artifacts of the application, appid: "
+ appId + " and uuid " + uuid + ".", e);
} catch (LifeCycleManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"Error occured while getting latest lifecycle state for updating image artifacts of the application, appid: "
+ appId + " and uuid " + uuid + ".", e);
String msg =
"Error occured while getting application release data for updating image artifacts of the application release uuid "
+ uuid + ".";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (ResourceManagementException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"Error occured while updating image artifacts of the application, appid: " + appId + " and uuid "
+ uuid + " to the system.", e);
String msg = "Error occured while updating image artifacts of the application release uuid " + uuid + ".";
log.error(msg);
throw new ApplicationManagementException(msg , e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
}
//todo check whether package names are same
@Override
public void updateApplicationArtifact(int appId, String deviceType, String uuid, InputStream binaryFile)
throws ApplicationManagementException {
public void updateApplicationArtifact(String deviceType, String appType, String uuid,
ApplicationArtifact applicationArtifact) throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager();
ApplicationReleaseDTO applicationRelease;
try {
boolean isValidDeviceType = false;
List<DeviceType> deviceTypes = Util.getDeviceManagementService().getDeviceTypes();
List<DeviceType> deviceTypes;
try {
deviceTypes = Util.getDeviceManagementService().getDeviceTypes();
for (DeviceType dt : deviceTypes) {
if (dt.getName().equals(deviceType)) {
isValidDeviceType = true;
@ -1172,59 +1213,64 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
}
if (!isValidDeviceType) {
throw new ValidationException(
"Invalid request to update application release artifact, invalid application type: "
+ deviceType + " for ApplicationDTO id: " + appId + " application release uuid: " + uuid);
String msg = "Invalid request to update application release artifact, invalid application type: "
+ deviceType + " for application release uuid: " + uuid;
log.error(msg);
throw new BadRequestException(msg);
}
if (appId <= 0) {
throw new ValidationException(
"ApplicationDTO id could,t be a negative integer. Hence please add valid application id. application type: "
+ deviceType + " ApplicationDTO id: " + appId + " UUID: " + uuid);
} catch (DeviceManagementException e) {
String msg = "Error occured while getting supported device types in IoTS";
log.error(msg);
throw new ApplicationManagementException(msg, e);
}
try {
ConnectionManagerUtil.beginDBTransaction();
ApplicationDTO application = this.applicationDAO.getApplicationById(appId, tenantId);
if (application == null) {
throw new NotFoundException("Doesn't exist a application for the application ID: " + appId);
}
applicationRelease = this.applicationReleaseDAO.getReleaseByIds(appId, uuid, tenantId);
if (applicationRelease == null) {
throw new NotFoundException(
"Doesn't exist a application release for application ID: " + appId + "and application UUID: "
+ uuid);
ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
if (applicationReleaseDTO == null) {
String msg = "Couldn't found an application release for UUID: " + uuid;
log.error(msg);
throw new NotFoundException(msg);
}
applicationRelease = applicationStorageManager
.updateReleaseArtifacts(applicationRelease, application.getType(), application.getDeviceTypeName(),
binaryFile);
applicationRelease = this.applicationReleaseDAO.updateRelease(appId, applicationRelease, tenantId);
if (applicationRelease == null) {
String deletingAppHashValue = applicationReleaseDTO.getAppHashValue();
applicationReleaseDTO = addApplicationReleaseArtifacts(appType, deviceType, applicationReleaseDTO,
applicationArtifact);
applicationStorageManager.copyImageArtifactsAndDeleteInstaller(deletingAppHashValue, applicationReleaseDTO);
applicationReleaseDTO = this.applicationReleaseDAO.updateRelease(applicationReleaseDTO, tenantId);
if (applicationReleaseDTO == null) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"ApplicationDTO release updating count is 0. ApplicationDTO id: " + appId
+ " ApplicationDTO release UUID: " + uuid);
"ApplicationDTO release updating count is 0. ApplicationDTO release UUID: " + uuid);
}
ConnectionManagerUtil.commitDBTransaction();
} catch (ApplicationManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException("Error occured while getting/updating APPM DB.", e);
String msg = "Error occured while getting/updating APPM DB for updating application Installer.";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (TransactionManagementException e) {
throw new ApplicationManagementException(
"Error occured while starting the transaction to update application release artifact of the application, appid: "
+ appId + " and uuid " + uuid + ".", e);
} catch (RequestValidatingException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException("Error occured while updating application artifact.", e);
} catch (DeviceManagementException e) {
throw new ApplicationManagementException("Error occured while getting supported device types in IoTS", e);
String msg =
"Error occured while starting the transaction to update application release artifact of the application uuid "
+ uuid + ".";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (DBConnectionException e) {
throw new ApplicationManagementException(
"Error occured when getting DB connection to update application release artifact of the application, appid: "
+ appId + " and uuid " + uuid + ".", e);
String msg =
"Error occured when getting DB connection to update application release artifact of the application release uuid "
+ uuid + ".";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationStorageManagementException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException("In order to update the artifact, couldn't find it in the system",
e);
} catch (ResourceManagementException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occured when updating application installer.";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
@ -1246,7 +1292,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
// unRestrictedApplications.add(application);
// } else {
// try {
// if (isRoleExists(application.getUnrestrictedRoles(), userName)) {
// if (hasUserRole(application.getUnrestrictedRoles(), userName)) {
// unRestrictedApplications.add(application);
// }
// } catch (UserStoreException e) {
@ -1366,82 +1412,137 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
@Override
public ApplicationDTO updateApplication(int applicationId, ApplicationDTO application)
public void updateApplication(int applicationId, ApplicationWrapper applicationWrapper)
throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
ApplicationDTO existingApplication;
boolean isExistingAppRestricted = false;
List<String> addingRoleList;
List<String> removingRoleList;
List<String> addingTags;
List<String> removingTags;
ApplicationDTO applicationDTO;
try {
ConnectionManagerUtil.beginDBTransaction();
existingApplication = this.applicationDAO.getApplicationById(applicationId, tenantId);
if (existingApplication == null) {
applicationDTO = this.applicationDAO.getApplicationById(applicationId, tenantId);
if (applicationDTO == null) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new NotFoundException("Tried to update ApplicationDTO which is not in the publisher, "
+ "Please verify application details");
String msg = "Tried to update Application which is not in the publisher. Please verify "
+ "application details";
log.error(msg);
throw new NotFoundException(msg);
}
if (!StringUtils.isEmpty(applicationWrapper.getType()) && !applicationDTO.getType()
.equals(applicationWrapper.getType())) {
String msg = "You are trying to change the application type and it is not "
+ "possible after you create an application. Therefore please remove this application and "
+ "publish new application with type: " + applicationWrapper.getType();
log.error(msg);
throw new BadRequestException(msg);
}
if (!existingApplication.getUnrestrictedRoles().isEmpty()) {
isExistingAppRestricted = true;
if (!StringUtils.isEmpty(applicationWrapper.getDeviceType()) && !applicationDTO.getDeviceTypeName()
.equals(applicationWrapper.getDeviceType())) {
String msg = "You are trying to change the compatible device type of the application type and it is not "
+ "possible after you create an application for device type. " +
applicationWrapper.getDeviceType() + "Therefore please remove this application and publish "
+ "new application with device type: " + applicationWrapper.getDeviceType();
log.error(msg);
throw new BadRequestException(msg);
}
if (!StringUtils.isEmpty(applicationWrapper.getSubType()) && !applicationDTO.getSubType()
.equals(applicationWrapper.getSubType())) {
if (!ApplicationSubscriptionType.PAID.toString().equals(applicationWrapper.getSubType())
&& !ApplicationSubscriptionType.FREE.toString().equals(applicationWrapper.getSubType())) {
String msg = "Invalid application subscription type is found with application updating request "
+ applicationWrapper.getSubType();
log.error(msg);
throw new BadRequestException(msg);
if (!isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION) && !(
isExistingAppRestricted && isRoleExists(existingApplication.getUnrestrictedRoles(), userName))) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ForbiddenException("You are not authorized user to update application");
} else if (ApplicationSubscriptionType.FREE.toString().equals(applicationWrapper.getSubType()) && !StringUtils
.isEmpty(applicationWrapper.getPaymentCurrency())) {
String msg = "If you are going to change Non-Free app as Free app, "
+ "currency attribute in the application updating payload should be null or \"\"";
log.error(msg);
throw new ApplicationManagementException(msg);
} else if (ApplicationSubscriptionType.PAID.toString().equals(applicationWrapper.getSubType())
&& StringUtils.isEmpty(applicationWrapper.getPaymentCurrency()) ){
String msg = "If you are going to change Free app as Non-Free app, "
+ "currency attribute in the application payload should not be null or \"\"";
log.error(msg);
throw new ApplicationManagementException(msg);
}
if (!existingApplication.getType().equals(application.getType())) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException("You are trying to change the application type and it is not "
+ "possible after you create an application. Therefore please remove this application and "
+ "publish new application with type: " + application.getType());
applicationDTO.setSubType(applicationWrapper.getSubType());
applicationDTO.setPaymentCurrency(applicationWrapper.getPaymentCurrency());
}
if (!existingApplication.getSubType().equals(application.getSubType())) {
if (ApplicationSubscriptionType.PAID.toString().equals(existingApplication.getSubType()) && (
!"".equals(application.getPaymentCurrency()) || application.getPaymentCurrency() != null)) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException("If you are going to change Non-Free app as Free app, "
+ "currency attribute in the application updating payload should be null or \"\"");
} else if (ApplicationSubscriptionType.FREE.toString().equals(existingApplication.getSubType()) && (
application.getPaymentCurrency() == null || "".equals(application.getPaymentCurrency()))) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException("If you are going to change Free app as Non-Free app, "
+ "currency attribute in the application payload should not be null or \"\"");
if (!StringUtils.isEmpty(applicationWrapper.getName())){
Filter filter = new Filter();
filter.setFullMatch(true);
filter.setAppName(applicationWrapper.getName().trim());
filter.setOffset(0);
filter.setLimit(1);
List<ApplicationDTO> applicationList = applicationDAO
.getApplications(filter, applicationDTO.getDeviceTypeId(), tenantId);
if (!applicationList.isEmpty()) {
String msg = "Already an application registered with same name " + applicationWrapper.getName()
+ ". Hence you can't update the application name from " + applicationDTO.getName() + " to "
+ applicationWrapper.getName();
log.error(msg);
throw new BadRequestException(msg);
}
applicationDTO.setName(applicationWrapper.getName());
}
if (isExistingAppRestricted && application.getUnrestrictedRoles().isEmpty()) {
visibilityDAO.deleteUnrestrictedRoles(existingApplication.getUnrestrictedRoles(), application.getId(),
tenantId);
} else if (!isExistingAppRestricted && !application.getUnrestrictedRoles().isEmpty()) {
visibilityDAO.addUnrestrictedRoles(application.getUnrestrictedRoles(), application.getId(), tenantId);
} else if (isExistingAppRestricted && !application.getUnrestrictedRoles().isEmpty()) {
addingRoleList = getDifference(application.getUnrestrictedRoles(),
existingApplication.getUnrestrictedRoles());
removingRoleList = getDifference(existingApplication.getUnrestrictedRoles(),
application.getUnrestrictedRoles());
if (!StringUtils.isEmpty(applicationWrapper.getDescription())){
applicationDTO.setDescription(applicationWrapper.getDescription());
}
List<String> appUnrestrictedRoles = this.visibilityDAO.getUnrestrictedRoles(applicationId, tenantId);
List<String> appCategories = this.applicationDAO.getAppCategories(applicationId, tenantId);
boolean isExistingAppRestricted = !appUnrestrictedRoles.isEmpty();
boolean isUpdatingAppRestricted = !applicationWrapper.getUnrestrictedRoles().isEmpty();
if (isExistingAppRestricted && !isUpdatingAppRestricted) {
visibilityDAO.deleteUnrestrictedRoles(appUnrestrictedRoles, applicationId, tenantId);
} else if (isUpdatingAppRestricted) {
if (!hasUserRole(applicationWrapper.getUnrestrictedRoles(), userName)) {
String msg =
"You are trying to restrict the visibility of visible application.But you are trying to "
+ "restrict the visibility to roles that there isn't at least one role is assigned "
+ "to user: " + userName + ". Therefore, it is not allowed and you should have "
+ "added at least one role that assigned to " + userName + " user into "
+ "restricting role set.";
log.error(msg);
throw new BadRequestException(msg);
}
if (!isExistingAppRestricted) {
visibilityDAO
.addUnrestrictedRoles(applicationWrapper.getUnrestrictedRoles(), applicationId, tenantId);
} else {
List<String> addingRoleList = getDifference(applicationWrapper.getUnrestrictedRoles(),
applicationDTO.getUnrestrictedRoles());
List<String> removingRoleList = getDifference(applicationDTO.getUnrestrictedRoles(),
applicationWrapper.getUnrestrictedRoles());
if (!addingRoleList.isEmpty()) {
visibilityDAO.addUnrestrictedRoles(addingRoleList, application.getId(), tenantId);
visibilityDAO.addUnrestrictedRoles(addingRoleList, applicationId, tenantId);
}
if (!removingRoleList.isEmpty()) {
visibilityDAO.deleteUnrestrictedRoles(removingRoleList, application.getId(), tenantId);
visibilityDAO.deleteUnrestrictedRoles(removingRoleList, applicationId, tenantId);
}
}
}
applicationDTO.setUnrestrictedRoles(applicationWrapper.getUnrestrictedRoles());
addingTags = getDifference(existingApplication.getTags(), application.getTags());
removingTags = getDifference(application.getTags(), existingApplication.getTags());
if (!addingTags.isEmpty()) {
List<String> appTags = this.applicationDAO.getAppTags(applicationId, tenantId);
List<String> addingTagList = getDifference(appTags, applicationWrapper.getTags());
List<String> removingTagList = getDifference(applicationWrapper.getTags(), appTags);
if (!addingTagList.isEmpty()) {
// applicationDAO.addTags(addingTags, application.getId(), tenantId);
}
if (!removingTags.isEmpty()) {
applicationDAO.deleteTags(removingTags, application.getId(), tenantId);
if (!removingTagList.isEmpty()) {
applicationDAO.deleteTags(removingTagList, applicationId, tenantId);
}
return applicationDAO.editApplication(application, tenantId);
applicationDAO.editApplication(applicationDTO, tenantId);
} catch (UserStoreException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
@ -1613,7 +1714,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
String applicationReleaseCreatedUser = lifecycleStateDAO
.getAppReleaseCreatedUsername(applicationId, releaseUuid, tenantId);
if (!isAdminUser && !(!unrestrictedRoles.isEmpty() && isRoleExists(unrestrictedRoles, userName))
if (!isAdminUser && !(!unrestrictedRoles.isEmpty() && hasUserRole(unrestrictedRoles, userName))
&& !userName.equals(applicationReleaseCreatedUser)) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ForbiddenException("You are not authorized user to update application");
@ -1630,11 +1731,11 @@ public class ApplicationManagerImpl implements ApplicationManager {
+ " State");
}
release = applicationStorageManager
.updateImageArtifacts(release, iconFileStream, bannerFileStream, attachments);
release = applicationStorageManager
.updateReleaseArtifacts(release, app.getType(), deviceType, binaryFileStram);
return applicationReleaseDAO.updateRelease(applicationId, release, tenantId) != null;
// release = applicationStorageManager
// .deleteImageArtifacts(release, iconFileStream, bannerFileStream, attachments);
// release = applicationStorageManager
// .copyImageArtifactsAndDeleteInstaller(release, app.getType(), deviceType, binaryFileStram);
return applicationReleaseDAO.updateRelease(release, tenantId) != null;
} catch (DeviceManagementException e) {
throw new ApplicationManagementException("Error occured when validating the device type " + deviceType, e);
} catch (UserStoreException e) {
@ -1651,31 +1752,32 @@ public class ApplicationManagerImpl implements ApplicationManager {
throw new ApplicationManagementException(
"Error occured when updating ApplicationDTO release. ApplicationDTO ID " + applicationId
+ " ApplicationDTO Release UUID: " + releaseUuid, e);
} catch (ApplicationStorageManagementException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"Error occured when updating application release artifact. ApplicationDTO ID " + applicationId
+ " ApplicationDTO release UUID: " + releaseUuid, e);
} catch (ResourceManagementException e) {
// updating images
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"Error occured when updating image artifact of the application release. ApplicationDTO ID: "
+ applicationId + " ApplicationDTO release UUID: " + releaseUuid, e);
} catch (RequestValidatingException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"Error occured when validating application release artifact for device type " + deviceType
+ " And application type " + app.getType() + ". Applicationn ID: " + applicationId
+ " ApplicationDTO release UUID: " + releaseUuid);
}
// catch (ApplicationStorageManagementException e) {
// ConnectionManagerUtil.rollbackDBTransaction();
// throw new ApplicationManagementException(
// "Error occured when updating application release artifact. ApplicationDTO ID " + applicationId
// + " ApplicationDTO release UUID: " + releaseUuid, e);
// }
// catch (ResourceManagementException e) {
// // updating images
// ConnectionManagerUtil.rollbackDBTransaction();
// throw new ApplicationManagementException(
// "Error occured when updating image artifact of the application release. ApplicationDTO ID: "
// + applicationId + " ApplicationDTO release UUID: " + releaseUuid, e);
// } catch (RequestValidatingException e) {
// ConnectionManagerUtil.rollbackDBTransaction();
// throw new ApplicationManagementException(
// "Error occured when validating application release artifact for device type " + deviceType
// + " And application type " + app.getType() + ". Applicationn ID: " + applicationId
// + " ApplicationDTO release UUID: " + releaseUuid);
// }
}
@Override
public void validateAppCreatingRequest(ApplicationWrapper applicationWrapper) throws RequestValidatingException {
boolean isValidApplicationType;
String applicationType = applicationWrapper.getType();
if (StringUtils.isEmpty(applicationWrapper.getName())) {
@ -1699,13 +1801,6 @@ public class ApplicationManagerImpl implements ApplicationManager {
throw new RequestValidatingException(msg);
}
isValidApplicationType = isValidAppType(applicationWrapper.getType());
if (!isValidApplicationType) {
String msg = "App Type contains in the application creating payload doesn't match with supported app types.";
log.error(msg);
throw new RequestValidatingException(msg);
}
List<ApplicationReleaseWrapper> applicationReleaseWrappers;
applicationReleaseWrappers = applicationWrapper.getApplicationReleaseWrappers();
@ -1754,8 +1849,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
@Override
public void isValidAttachmentSet(Attachment binaryFile, Attachment iconFile, Attachment bannerFile,
List<Attachment> attachmentList, String applicationType) throws RequestValidatingException {
public void validateImageArtifacts(Attachment iconFile, Attachment bannerFile,
List<Attachment> attachmentList) throws RequestValidatingException {
if (iconFile == null) {
String msg = "Icon file is not found with the application release creating request.";
log.error(msg);
@ -1771,8 +1866,18 @@ public class ApplicationManagerImpl implements ApplicationManager {
log.error(msg);
throw new RequestValidatingException(msg);
}
}
@Override
public void validateBinaryArtifact(Attachment binaryFile, String applicationType) throws RequestValidatingException {
if (StringUtils.isEmpty(applicationType)) {
String msg = "Application type is empty and it cannot be empty";
String msg = "Application type can't be empty.";
log.error(msg);
throw new RequestValidatingException(msg);
}
if (!isValidAppType(applicationType)) {
String msg = "App Type contains in the application creating payload doesn't match with supported app types.";
log.error(msg);
throw new RequestValidatingException(msg);
}

@ -24,18 +24,14 @@ import com.dd.plist.NSString;
import com.dd.plist.PropertyListFormatException;
import com.dd.plist.PropertyListParser;
import net.dongliu.apk.parser.bean.ApkMeta;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.routines.UrlValidator;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.application.mgt.common.ApplicationInstaller;
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.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.services.ApplicationStorageManager;
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 java.io.*;
import java.nio.file.Files;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
@ -54,7 +51,7 @@ import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import static org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil.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;
/**
@ -88,7 +85,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
String scStoredLocation = null;
try {
// todo handle WEB CLIP and save data in different folder (uuid)
artifactDirectoryPath = storagePath + applicationRelease.getAppHashValue();
StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath);
iconStoredLocation = artifactDirectoryPath + File.separator + applicationRelease.getIconName();
@ -135,43 +131,42 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
@Override
public ApplicationReleaseDTO updateImageArtifacts(ApplicationReleaseDTO applicationRelease, InputStream
iconFileStream, InputStream bannerFileStream, List<InputStream> screenShotStreams)
public void deleteImageArtifacts(ApplicationReleaseDTO applicationReleaseDTO)
throws ResourceManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
try {
if (iconFileStream != null) {
deleteApplicationReleaseArtifacts(applicationRelease.getIconName());
}
if (bannerFileStream != null) {
deleteApplicationReleaseArtifacts(applicationRelease.getBannerName());
}
if (!screenShotStreams.isEmpty()) {
if (screenShotStreams.size() > screenShotMaxCount) {
throw new ApplicationStorageManagementException("Maximum limit for the screen-shot exceeds");
String iconName = applicationReleaseDTO.getIconName();
String bannerName = applicationReleaseDTO.getBannerName();
String sc1 = applicationReleaseDTO.getScreenshotName1();
String sc2 = applicationReleaseDTO.getScreenshotName2();
String sc3 = applicationReleaseDTO.getScreenshotName3();
String hashValue = applicationReleaseDTO.getAppHashValue();
if (iconName != null) {
deleteApplicationReleaseArtifacts(
storagePath + Constants.FORWARD_SLASH + hashValue + Constants.FORWARD_SLASH + iconName);
}
int count = 1;
while (count < screenShotStreams.size()) {
if (count == 1) {
deleteApplicationReleaseArtifacts(applicationRelease.getScreenshotName1());
}
if (count == 2) {
deleteApplicationReleaseArtifacts(applicationRelease.getScreenshotName2());
if (bannerName != null) {
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) {
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);
}
}
@ -225,27 +220,53 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
}
@Override
public ApplicationReleaseDTO updateReleaseArtifacts(ApplicationReleaseDTO applicationRelease,
String appType, String deviceType, InputStream binaryFile) throws ApplicationStorageManagementException {
public void copyImageArtifactsAndDeleteInstaller(String deletingAppHashValue,
ApplicationReleaseDTO applicationReleaseDTO) throws ApplicationStorageManagementException {
try {
deleteApplicationReleaseArtifacts(applicationRelease.getInstallerName());
applicationRelease = uploadReleaseArtifact(applicationRelease, appType, deviceType, binaryFile);
} catch (ApplicationStorageManagementException e) {
throw new ApplicationStorageManagementException("ApplicationDTO Artifact doesn't contains in the System", e);
} catch (ResourceManagementException e) {
throw new ApplicationStorageManagementException("ApplicationDTO Artifact Updating failed", e);
String basePath = storagePath + Constants.FORWARD_SLASH;
String appHashValue = applicationReleaseDTO.getAppHashValue();
String bannerName = applicationReleaseDTO.getBannerName();
String iconName = applicationReleaseDTO.getIconName();
String screenshot1 = applicationReleaseDTO.getScreenshotName1();
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
public void deleteApplicationReleaseArtifacts(String directoryPath) throws ApplicationStorageManagementException {
File artifact = new File(directoryPath);
public void deleteApplicationReleaseArtifacts(String artifactPath) throws ApplicationStorageManagementException {
File artifact = new File(artifactPath);
if (artifact.exists()) {
try {
StorageManagementUtil.deleteDir(artifact);
StorageManagementUtil.delete(artifact);
} catch (IOException e) {
throw new ApplicationStorageManagementException(
"Error occured while deleting application release artifacts", e);
@ -283,7 +304,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
ipaDirectory = new File(ipaAbsPath).getParent();
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
@ -313,7 +334,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
if (ipaDirectory != null) {
// remove unzip folder
deleteDir(new File(ipaDirectory + File.separator + Constants.PAYLOAD));
delete(new File(ipaDirectory + File.separator + Constants.PAYLOAD));
}
} catch (ParseException e) {

@ -133,7 +133,7 @@ public class LifecycleStateManager {
return null;
}
public boolean isUpdatable(String state) throws LifecycleManagementException {
public boolean isUpdatableState(String state) throws LifecycleManagementException {
State currentState = getMatchingState(state);
if (currentState != null) {
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);
if (currentState != null) {
return currentState.isAppInstallable();

@ -63,16 +63,28 @@ public class StorageManagementUtil {
*
* @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();
if (contents != null) {
for (File file : contents) {
deleteDir(file);
delete(file);
}
}
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.
*

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

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

@ -223,7 +223,7 @@ public interface ApplicationManagementAPI {
name = "application",
value = "The application that need to be edited.",
required = true)
@Valid ApplicationDTO application
@Valid ApplicationWrapper applicationWrapper
);
@POST
@ -298,7 +298,7 @@ public interface ApplicationManagementAPI {
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes("multipart/mixed")
@Path("/{deviceType}/{appType}/{appId}")
@Path("/{appType}/{appId}")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
@ -328,8 +328,15 @@ public interface ApplicationManagementAPI {
response = ErrorResponse.class)
})
Response createRelease(
@PathParam("deviceType") String deviceType,
@PathParam("appId") String appType,
@ApiParam(
name = "appType",
value = "Application Type.",
required = true)
@PathParam("appType") String appType,
@ApiParam(
name = "appId",
value = "Id of the application.",
required = true)
@PathParam("appId") int appId,
@ApiParam(
name = "applicationRelease",
@ -404,7 +411,7 @@ public interface ApplicationManagementAPI {
);
@PUT
@Path("/image-artifacts/{appId}/{uuid}")
@Path("/image-artifacts/{uuid}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes("multipart/mixed")
@ApiOperation(
@ -442,11 +449,6 @@ public interface ApplicationManagementAPI {
response = ErrorResponse.class)
})
Response updateApplicationImageArtifacts(
@ApiParam(
name = "appId",
value = "ID of the application",
required = true)
@PathParam("appId") int applicatioId,
@ApiParam(
name = "uuid",
value = "UUID of the application",
@ -514,13 +516,20 @@ public interface ApplicationManagementAPI {
response = ErrorResponse.class)
})
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,
@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,
@ApiParam(name = "appId", value = "Id of the application", required = true)
@PathParam("appId") int applicationId,
@ApiParam(name = "uuid", value = "UUID of the application", required = true)
@ApiParam(
name = "uuid",
value = "UUID of the application",
required = true)
@PathParam("uuid") String applicationUUID,
@Multipart("binaryFile") Attachment binaryFile
);

@ -105,7 +105,13 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@DefaultValue("PUBLISHED") @QueryParam("state") String state) {
ApplicationManager applicationManager = APIUtil.getApplicationManager();
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();
} catch (NotFoundException e) {
String msg = "ApplicationDTO with application id: " + appId + " not found";
@ -150,8 +156,8 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
applicationManager.validateAppCreatingRequest(applicationWrapper);
applicationManager.validateReleaseCreatingRequest(applicationWrapper.getApplicationReleaseWrappers().get(0),
applicationWrapper.getType());
applicationManager.isValidAttachmentSet(binaryFile, iconFile, bannerFile, attachmentList,
applicationWrapper.getType());
applicationManager.validateBinaryArtifact(binaryFile, applicationWrapper.getType());
applicationManager.validateImageArtifacts(iconFile, bannerFile, attachmentList);
// Created new application entry
Application application = applicationManager.createApplication(applicationWrapper,
@ -176,9 +182,8 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@POST
@Consumes("multipart/mixed")
@Path("/{deviceType}/{appType}/{appId}")
@Path("/{appType}/{appId}")
public Response createRelease(
@PathParam("deviceType") String deviceType,
@PathParam("appType") String appType,
@PathParam("appId") int appId,
@Multipart("applicationRelease") ApplicationReleaseWrapper applicationReleaseWrapper,
@ -203,7 +208,8 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
try {
applicationManager.validateReleaseCreatingRequest(applicationReleaseWrapper, appType);
applicationManager.isValidAttachmentSet(binaryFile, iconFile, bannerFile, attachmentList, appType);
applicationManager.validateBinaryArtifact(binaryFile, appType);
applicationManager.validateImageArtifacts(iconFile, bannerFile, attachmentList);
// Created new application release
ApplicationRelease release = applicationManager.createRelease(appId, applicationReleaseWrapper,
@ -229,9 +235,8 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@PUT
@Consumes("multipart/mixed")
@Produces(MediaType.APPLICATION_JSON)
@Path("/image-artifacts/{appId}/{uuid}")
@Path("/image-artifacts/{uuid}")
public Response updateApplicationImageArtifacts(
@PathParam("appId") int appId,
@PathParam("uuid") String applicationReleaseUuid,
@Multipart("icon") Attachment iconFile,
@Multipart("banner") Attachment bannerFile,
@ -239,89 +244,72 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@Multipart("screenshot2") Attachment screenshot2,
@Multipart("screenshot3") Attachment screenshot3) {
try {
InputStream iconFileStream = null;
InputStream bannerFileStream = null;
List<InputStream> attachments = new ArrayList<>();
List<Attachment> attachments = new ArrayList<>();
if (iconFile != null) {
iconFileStream = iconFile.getDataHandler().getInputStream();
}
if (bannerFile != null) {
bannerFileStream = bannerFile.getDataHandler().getInputStream();
if (screenshot1 != null) {
attachments.add(screenshot1);
}
attachments.add(screenshot1.getDataHandler().getInputStream());
if (screenshot2 != null) {
attachments.add(screenshot2.getDataHandler().getInputStream());
attachments.add(screenshot2);
}
if (screenshot3 != null) {
attachments.add(screenshot3.getDataHandler().getInputStream());
attachments.add(screenshot3);
}
ApplicationManager applicationManager = APIUtil.getApplicationManager();
applicationManager
.updateApplicationImageArtifact(appId, applicationReleaseUuid, iconFileStream, bannerFileStream,
attachments);
applicationManager.validateImageArtifacts(iconFile, bannerFile, attachments);
applicationManager.updateApplicationImageArtifact(applicationReleaseUuid,
constructApplicationArtifact(null, iconFile, bannerFile, attachments));
return Response.status(Response.Status.OK)
.entity("Successfully uploaded artifacts for the application " + applicationReleaseUuid).build();
} catch (RequestValidatingException e) {
log.error(e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
} catch (NotFoundException e) {
log.error(e.getMessage(), e);
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
} catch (ValidationException e) {
log.error(e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
} catch (ForbiddenException e) {
log.error(e.getMessage(), e);
return Response.status(Response.Status.FORBIDDEN).entity(e.getMessage()).build();
} catch (ApplicationManagementException e) {
String msg = "Error occurred while updating the application image artifacts for app id: " + appId
+ " application release uuid: " + applicationReleaseUuid;
String msg = "Error occurred while updating the application image artifacts for application release uuid: "
+ applicationReleaseUuid;
log.error(msg, e);
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
@PUT
@Consumes("multipart/mixed")
@Path("/app-artifacts/{deviceType}/{appType}/{appId}/{uuid}")
@Path("/app-artifact/{deviceType}/{appType}/{uuid}")
public Response updateApplicationArtifact(
@PathParam("deviceType") String deviceType,
@PathParam("appType") String appType,
@PathParam("appId") int applicationId,
@PathParam("uuid") String applicationReleaseUuid,
@Multipart("binaryFile") Attachment binaryFile) {
try {
if (binaryFile == null) {
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();
}
ApplicationManager applicationManager = APIUtil.getApplicationManager();
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: "
+ applicationReleaseUuid).build();
+ applicationReleaseUuid;
log.error(msg);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
}
APIUtil.getApplicationManager().updateApplicationArtifact(applicationId, deviceType, applicationReleaseUuid,
binaryFile.getDataHandler().getInputStream());
applicationManager.validateBinaryArtifact(binaryFile, appType);
applicationManager.updateApplicationArtifact(deviceType, appType, applicationReleaseUuid,
constructApplicationArtifact(binaryFile, null, null, null));
return Response.status(Response.Status.OK)
.entity("Successfully uploaded artifacts for the application release. UUID is "
+ applicationReleaseUuid).build();
} catch (IOException e) {
String msg = "Error occurred while trying to read icon, banner files for the application release"
+ applicationReleaseUuid;
log.error(msg);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
} catch (RequestValidatingException e) {
log.error(e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
} catch (NotFoundException e) {
log.error(e.getMessage(), e);
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
} catch (ValidationException e) {
log.error(e.getMessage(), e);
return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
} catch (ApplicationManagementException e) {
log.error("Error occurred while updating the image artifacts of the application with the uuid "
+ applicationReleaseUuid, e);
@ -335,10 +323,13 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@Path("/{appId}")
public Response updateApplication(
@PathParam("appId") int applicationId,
@Valid ApplicationDTO application) {
@Valid ApplicationWrapper applicationWrapper) {
ApplicationManager applicationManager = APIUtil.getApplicationManager();
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) {
log.error(e.getMessage());
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
@ -350,7 +341,6 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
log.error(msg, e);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
}
return Response.status(Response.Status.OK).entity(application).build();
}
@Override
@ -582,6 +572,7 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
applicationArtifact.setInstallerStream(installerStream);
}
if (iconFile != null) {
dataHandler = iconFile.getDataHandler();
String iconFileName = dataHandler.getName();
InputStream iconStream = dataHandler.getInputStream();
@ -593,14 +584,16 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
throw new BadRequestException(msg);
}
if (iconFileName == null) {
String msg =
"Icon file name retrieving is failed.. Hence can't proceed. Please verify the " + "icon file.";
String msg = "Icon file name retrieving is failed.. Hence can't proceed. Please verify the "
+ "icon file.";
log.error(msg);
throw new BadRequestException(msg);
}
applicationArtifact.setIconName(iconFileName);
applicationArtifact.setIconStream(iconStream);
}
if (bannerFile != null) {
dataHandler = bannerFile.getDataHandler();
String bannerFileName = dataHandler.getName();
InputStream bannerStream = dataHandler.getInputStream();
@ -618,7 +611,9 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
}
applicationArtifact.setBannerName(bannerFileName);
applicationArtifact.setBannerStream(bannerStream);
}
if (attachmentList != null) {
Map<String, InputStream> scrrenshotData = new HashMap<>();
for (Attachment sc : attachmentList) {
dataHandler = sc.getDataHandler();
@ -633,14 +628,15 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
}
if (screenshotrFileName == null) {
String msg =
"Screenshot file name retrieving is failed for one screenshot. Hence can't proceed. Please verify the "
+ "screenshots.";
"Screenshot file name retrieving is failed for one screenshot. Hence can't proceed. "
+ "Please verify the screenshots.";
log.error(msg);
throw new BadRequestException(msg);
}
scrrenshotData.put(screenshotrFileName, screenshotStream);
}
applicationArtifact.setScreenshots(scrrenshotData);
}
return applicationArtifact;
} catch (IOException e) {
String msg = "Error occurred when reading attachment data.";

Loading…
Cancel
Save