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 7301d98328

@ -42,7 +42,7 @@ import javax.ws.rs.core.Response;
@SwaggerDefinition( @SwaggerDefinition(
info = @Info( info = @Info(
version = "1.0.0", version = "1.0.0",
title = "ApplicationDTO Management Common Service", title = "Application Management Artifact Download Service",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = "name", value = "ApplicationManagementArtifactDownloadService"), @ExtensionProperty(name = "name", value = "ApplicationManagementArtifactDownloadService"),

@ -40,17 +40,17 @@ import javax.ws.rs.core.Response;
@SwaggerDefinition( @SwaggerDefinition(
info = @Info( info = @Info(
version = "1.0.0", version = "1.0.0",
title = "ApplicationDTO Management Common Service", title = "Application Management Config Retrieve Service",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = "name", value = "ApplicationManagementCommonService"), @ExtensionProperty(name = "name", value = "ApplicationManagementConfigRetrieveService"),
@ExtensionProperty(name = "context", value = "/api/application-mgt/v1.0/configt"), @ExtensionProperty(name = "context", value = "/api/application-mgt/v1.0/config"),
}) })
} }
) )
) )
@Path("/config") @Path("/config")
@Api(value = "ApplicationDTO Management Common Service", description = "This API carries all application management common services") @Api(value = "ApplicationDTO Management Common Service")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
public interface ConfigRetrieveAPI { public interface ConfigRetrieveAPI {

@ -55,7 +55,6 @@ public class ArtifactDownloadAPIImpl implements ArtifactDownloadAPI {
Response.ResponseBuilder response = Response Response.ResponseBuilder response = Response
.ok(fileInputStream, MediaType.APPLICATION_OCTET_STREAM); .ok(fileInputStream, MediaType.APPLICATION_OCTET_STREAM);
response.status(Response.Status.OK); response.status(Response.Status.OK);
// response.type("application/html");
response.header("Content-Disposition", "attachment; filename=\"" + fileName + "\""); response.header("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
return response.build(); return response.build();
} catch (NotFoundException e) { } catch (NotFoundException e) {

@ -43,7 +43,7 @@
</session-config> </session-config>
<context-param> <context-param>
<param-name>doAuthentication</param-name> <param-name>doAuthentication</param-name>
<param-value>false</param-value> <param-value>true</param-value>
</context-param> </context-param>
<!-- Below configuration is used to redirect http requests to https --> <!-- Below configuration is used to redirect http requests to https -->
@ -117,4 +117,12 @@
<url-pattern>/*</url-pattern> <url-pattern>/*</url-pattern>
</filter-mapping> </filter-mapping>
<context-param>
<param-name>nonSecuredEndPoints</param-name>
<param-value>
/api/application-mgt/v1.0/artifact/.*,
/api/application-mgt/v1.0/config/.*
</param-value>
</context-param>
</web-app> </web-app>

@ -79,12 +79,6 @@ public class ApplicationDTO {
example = "1, 2, 3") example = "1, 2, 3")
private int deviceTypeId; private int deviceTypeId;
@ApiModelProperty(name = "deviceTypeName",
value = "Related device type of the application",
required = true,
example = "IoS, Android, Arduino, RaspberryPi etc")
private String deviceTypeName;
@ApiModelProperty(name = "appRating", @ApiModelProperty(name = "appRating",
value = "Rating of the aplication") value = "Rating of the aplication")
private int appRating; private int appRating;
@ -168,12 +162,6 @@ public class ApplicationDTO {
this.unrestrictedRoles = unrestrictedRoles; this.unrestrictedRoles = unrestrictedRoles;
} }
public String getDeviceTypeName() {
return deviceTypeName;
}
public void setDeviceTypeName(String deviceTypeName) { this.deviceTypeName = deviceTypeName; }
public int getDeviceTypeId() { public int getDeviceTypeId() {
return deviceTypeId; return deviceTypeId;
} }

@ -66,6 +66,12 @@ public class ApplicationRelease {
example = "alpha, beta etc") example = "alpha, beta etc")
private String releaseType; private String releaseType;
@ApiModelProperty(name = "currentStatus",
value = "CurrentStatus of the Application Release.",
required = true,
example = "CREATED, IN-REVIEW, PUBLISHED etc")
private String currentStatus;
@ApiModelProperty(name = "price", @ApiModelProperty(name = "price",
value = "Price of the application release", value = "Price of the application release",
required = true) required = true)
@ -172,4 +178,8 @@ public class ApplicationRelease {
public String getSupportedOsVersions() { return supportedOsVersions; } public String getSupportedOsVersions() { return supportedOsVersions; }
public void setSupportedOsVersions(String supportedOsVersions) { this.supportedOsVersions = supportedOsVersions; } public void setSupportedOsVersions(String supportedOsVersions) { this.supportedOsVersions = supportedOsVersions; }
public String getCurrentStatus() { return currentStatus; }
public void setCurrentStatus(String currentStatus) { this.currentStatus = currentStatus; }
} }

@ -30,6 +30,7 @@ import org.wso2.carbon.device.application.mgt.common.exception.RequestValidating
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.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.ApplicationUpdateWrapper;
import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper; import org.wso2.carbon.device.application.mgt.common.wrapper.ApplicationWrapper;
import java.io.InputStream; import java.io.InputStream;
@ -53,12 +54,13 @@ public interface ApplicationManager {
/** /**
* Updates an already existing application. * Updates an already existing application.
* *
* @param applicationWrapper Application that need to be updated. * @param applicationUpdateWrapper Application data 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
*/ */
void updateApplication(int applicationId, ApplicationWrapper applicationWrapper) throws ApplicationManagementException; void updateApplication(int applicationId, ApplicationUpdateWrapper applicationUpdateWrapper)
throws ApplicationManagementException;
/** /**
* Delete an application identified by the unique ID. * Delete an application identified by the unique ID.

@ -0,0 +1,99 @@
/*
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.wso2.carbon.device.application.mgt.common.wrapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
@ApiModel(value = "ApplicationWrapper", description = "ApplicationWrapper represents the an ApplicationDTO in ApplicationDTO Store")
public class ApplicationUpdateWrapper {
@ApiModelProperty(name = "name",
value = "Name of the application",
required = true)
private String name;
@ApiModelProperty(name = "description",
value = "Description of the application",
required = true)
private String description;
@ApiModelProperty(name = "appCategory",
value = "CategoryDTO of the application",
required = true,
example = "Educational, Gaming, Travel, Entertainment etc")
private String appCategory;
@ApiModelProperty(name = "subType",
value = "Subscription type of the application",
required = true,
example = "PAID, FREE")
private String subType;
@ApiModelProperty(name = "paymentCurrency",
value = "Payment currency of the application",
required = true,
example = "$")
private String paymentCurrency;
@ApiModelProperty(name = "tags",
value = "List of application tags")
private List<String> tags;
@ApiModelProperty(name = "unrestrictedRoles",
value = "List of roles that users should have to access the application")
private List<String> unrestrictedRoles;
public String getName() {
return name;
}
public void setName(String name) { this.name = name; }
public String getAppCategory() {
return appCategory;
}
public void setAppCategory(String appCategory) {
this.appCategory = appCategory;
}
public List<String> getTags() { return tags; }
public void setTags(List<String> tags) { this.tags = tags; }
public String getSubType() { return subType; }
public void setSubType(String subType) { this.subType = subType; }
public String getPaymentCurrency() { return paymentCurrency; }
public void setPaymentCurrency(String paymentCurrency) { this.paymentCurrency = paymentCurrency; }
public List<String> getUnrestrictedRoles() { return unrestrictedRoles; }
public void setUnrestrictedRoles(List<String> unrestrictedRoles) { this.unrestrictedRoles = unrestrictedRoles; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
}

@ -57,9 +57,9 @@ public interface ApplicationDAO {
List<String> getAppTags(int appId, int tenantId) throws ApplicationManagementDAOException; List<String> getAppTags(int appId, int tenantId) throws ApplicationManagementDAOException;
List<String> getAppCategories (int appId, int tenantId) throws ApplicationManagementDAOException; void deleteTagMapping (List<Integer> tagIds, int applicationId, int tenantId) throws ApplicationManagementDAOException;
List<String> getAppCategories (int appId, int tenantId) throws ApplicationManagementDAOException;
List<CategoryDTO> getAllCategories(int tenantId) throws ApplicationManagementDAOException; List<CategoryDTO> getAllCategories(int tenantId) throws ApplicationManagementDAOException;
@ -168,7 +168,7 @@ public interface ApplicationDAO {
* @return Updated ApplicationDTO. * @return Updated ApplicationDTO.
* @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception. * @throws ApplicationManagementDAOException ApplicationDTO Management DAO Exception.
*/ */
ApplicationDTO editApplication(ApplicationDTO application, int tenantId) throws ApplicationManagementDAOException; boolean updateApplication(ApplicationDTO application, int tenantId) throws ApplicationManagementDAOException;
/** /**
* To delete the application * To delete the application

@ -507,10 +507,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, "
@ -583,66 +585,36 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
} }
@Override @Override
public ApplicationDTO editApplication(ApplicationDTO application, int tenantId) public boolean updateApplication(ApplicationDTO applicationDTO, int tenantId)
throws ApplicationManagementDAOException { throws ApplicationManagementDAOException {
int paramIndex = 1;
Connection conn; Connection conn;
PreparedStatement stmt = null;
//todo this is wrong
ApplicationDTO existingApplication = this.getApplicationById(application.getId(), tenantId);
if (existingApplication == null) {
throw new ApplicationManagementDAOException("There doesn't have an application for updating");
}
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
String sql = "UPDATE AP_APP SET "; String sql = "UPDATE AP_APP AP " +
"SET " +
if (application.getName() != null && !application.getName().equals(existingApplication.getName())) { "AP.NAME = ?, " +
sql += "NAME = ?, "; "AP.DESCRIPTION = ?, " +
} "AP.SUB_TYPE = ?, " +
if (application.getType() != null && !application.getType().equals(existingApplication.getType())) { "AP.CURRENCY = ? " +
sql += "TYPE = ?, "; "WHERE AP.ID = ? AND AP.TENANT_ID = ?";
}
if (application.getAppCategory() != null && !application.getAppCategory().equals( try (PreparedStatement stmt = conn.prepareStatement(sql)) {
existingApplication.getAppCategory())) { stmt.setString(1, applicationDTO.getName());
sql += "APP_CATEGORY = ?, "; stmt.setString(2, applicationDTO.getDescription());
} stmt.setString(3, applicationDTO.getSubType());
// if (application.getIsRestricted() != existingApplication.getIsRestricted()) { stmt.setString(4, applicationDTO.getPaymentCurrency());
// sql += "RESTRICTED = ? "; stmt.setInt(5, applicationDTO.getId());
// } stmt.setInt(6, tenantId);
if (!application.getSubType().equals(existingApplication.getSubType())) { return stmt.executeUpdate() > 0;
sql += "SUB_TYPE = ? ";
}
sql += "WHERE ID = ?";
stmt = conn.prepareStatement(sql);
if (application.getName() != null && !application.getName().equals(existingApplication.getName())) {
stmt.setString(paramIndex++, application.getName());
}
if (application.getType() != null && !application.getType().equals(existingApplication.getType())) {
stmt.setString(paramIndex++, application.getType());
}
if (application.getAppCategory() != null && !application.getAppCategory().equals(
existingApplication.getAppCategory())) {
stmt.setString(paramIndex++, application.getAppCategory());
}
// if (application.getIsRestricted() != existingApplication.getIsRestricted()) {
// stmt.setBoolean(paramIndex++, application.getIsRestricted());
// }
if (!application.getSubType().equals(existingApplication.getSubType())) {
stmt.setString(paramIndex++, application.getSubType());
} }
stmt.setInt(paramIndex, application.getId());
stmt.executeUpdate();
return application;
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); String msg = "Error occurred while obtaining the DB connection to update the application.";
log.error(msg);
throw new ApplicationManagementDAOException(msg, e);
} catch (SQLException e) { } catch (SQLException e) {
throw new ApplicationManagementDAOException("Error occurred while adding the application", e); String msg = "Error occurred when obtaining database connection for updating the application.";
} finally { log.error(msg);
Util.cleanupResources(stmt, null); throw new ApplicationManagementDAOException(msg, e);
} }
} }
@ -934,6 +906,37 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
} }
} }
@Override
public void deleteTagMapping (List<Integer> tagIds, int applicationId, int tenantId) throws ApplicationManagementDAOException{
if (log.isDebugEnabled()) {
log.debug("Request received in DAO Layer to delete Tag mappings.");
}
Connection conn;
String sql = "DELETE FROM "
+ "AP_APP_TAG_MAPPING tm "
+ "WHERE "
+ "tm.AP_APP_TAG_ID = ? AND "
+ "tm.AP_APP_ID = ? AND "
+ "tm.TENANT_ID = ?";
try {
conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)){
for (Integer tagId : tagIds){
stmt.setInt(1, tagId);
stmt.setInt(2, applicationId);
stmt.setInt(3, tenantId);
stmt.addBatch();
}
stmt.executeBatch();
}
} catch (DBConnectionException e) {
throw new ApplicationManagementDAOException(
"Error occurred while obtaining the DB connection when deleting tag mapppig", e);
} catch (SQLException e) {
throw new ApplicationManagementDAOException("Error occurred when deleting tag mapping", e);
}
}
@Override @Override
public List<String> getAppCategories(int appId, int tenantId) throws ApplicationManagementDAOException { public List<String> getAppCategories(int appId, int tenantId) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {

@ -53,6 +53,7 @@ import org.wso2.carbon.device.application.mgt.common.response.ApplicationRelease
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
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.ApplicationUpdateWrapper;
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.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO;
@ -145,8 +146,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
ApplicationReleaseDTO initialApplicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0); ApplicationReleaseDTO initialApplicationReleaseDTO = applicationDTO.getApplicationReleaseDTOs().get(0);
applicationDTO.getApplicationReleaseDTOs().clear(); applicationDTO.getApplicationReleaseDTOs().clear();
ApplicationReleaseDTO applicationReleaseDTO = addApplicationReleaseArtifacts(applicationDTO.getType(), applicationDTO.getDeviceTypeName(), ApplicationReleaseDTO applicationReleaseDTO = addApplicationReleaseArtifacts(applicationDTO.getType(),
initialApplicationReleaseDTO, applicationArtifact); applicationWrapper.getDeviceType(), initialApplicationReleaseDTO, applicationArtifact);
applicationDTO.getApplicationReleaseDTOs().add(addImageArtifacts(applicationReleaseDTO, applicationArtifact)); applicationDTO.getApplicationReleaseDTOs().add(addImageArtifacts(applicationReleaseDTO, applicationArtifact));
} catch (UnexpectedServerErrorException e) { } catch (UnexpectedServerErrorException e) {
String msg = "Error occurred when getting Device Type data."; String msg = "Error occurred when getting Device Type data.";
@ -550,7 +551,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
if (!haveAllUserRoles(filteringUnrestrictedRoles, userName)) { if (!haveAllUserRoles(filteringUnrestrictedRoles, userName)) {
String msg = String msg =
"At least one filtering role is not assigned for the user: " + userName + ". Hence user " + userName "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"; + " Can't filter applications by giving these unrestricted role list";
log.error(msg); log.error(msg);
throw new BadRequestException(msg); throw new BadRequestException(msg);
} }
@ -582,8 +583,9 @@ public class ApplicationManagerImpl implements ApplicationManager {
log.error(msg); log.error(msg);
throw new NotFoundException(msg); throw new NotFoundException(msg);
} }
DeviceType deviceType = getDeviceTypeData(applicationDTO.getDeviceTypeId());
ApplicationReleaseDTO applicationReleaseDTO = addApplicationReleaseArtifacts(applicationDTO.getType(), ApplicationReleaseDTO applicationReleaseDTO = addApplicationReleaseArtifacts(applicationDTO.getType(),
applicationDTO.getDeviceTypeName(), releaseWrapperToReleaseDTO(applicationReleaseWrapper), deviceType.getName(), releaseWrapperToReleaseDTO(applicationReleaseWrapper),
applicationArtifact); applicationArtifact);
applicationReleaseDTO = addImageArtifacts(applicationReleaseDTO, applicationArtifact); applicationReleaseDTO = addImageArtifacts(applicationReleaseDTO, applicationArtifact);
@ -630,18 +632,23 @@ public class ApplicationManagerImpl implements ApplicationManager {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
ApplicationDTO applicationDTO; ApplicationDTO applicationDTO;
List<ApplicationReleaseDTO> filteredApplicationReleaseDTOs;
boolean isVisibleApp = false; boolean isVisibleApp = false;
try { try {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
applicationDTO = this.applicationDAO.getApplicationById(appId, tenantId); applicationDTO = this.applicationDAO.getApplicationById(appId, tenantId);
if (applicationDTO == null) { if (applicationDTO == null) {
throw new NotFoundException("Couldn't find an application for application Id: " + appId); String msg = "Couldn't find an application for application Id: " + appId;
log.error(msg);
throw new NotFoundException(msg);
} }
filteredApplicationReleaseDTOs = applicationDTO.getApplicationReleaseDTOs().stream() List<ApplicationReleaseDTO> filteredApplicationReleaseDTOs = new ArrayList<>();
.filter(applicationReleaseDTO -> applicationReleaseDTO.getCurrentState().equals(state)) for (ApplicationReleaseDTO applicationReleaseDTO : applicationDTO.getApplicationReleaseDTOs()) {
.collect(Collectors.toList()); if (!applicationReleaseDTO.getCurrentState().equals(lifecycleStateManager.getEndState()) && (
state == null || applicationReleaseDTO.getCurrentState().equals(state))) {
filteredApplicationReleaseDTOs.add(applicationReleaseDTO);
}
}
applicationDTO.setApplicationReleaseDTOs(filteredApplicationReleaseDTOs); applicationDTO.setApplicationReleaseDTOs(filteredApplicationReleaseDTOs);
if (applicationDTO.getApplicationReleaseDTOs().isEmpty()){ if (applicationDTO.getApplicationReleaseDTOs().isEmpty()){
return null; return null;
@ -674,9 +681,14 @@ public class ApplicationManagerImpl implements ApplicationManager {
throw new ForbiddenException(msg); throw new ForbiddenException(msg);
} }
return appDtoToAppResponse(applicationDTO); return appDtoToAppResponse(applicationDTO);
} catch (UserStoreException e) { } catch (LifecycleManagementException e){
throw new ApplicationManagementException( String msg = "Error occurred when getting the last state of the application lifecycle flow";
"User-store exception while getting application with the application id " + appId); log.error(msg);
throw new ApplicationManagementException(msg, e);
}catch (UserStoreException e) {
String msg = "User-store exception while getting application with the application id " + appId;
log.error(msg);
throw new ApplicationManagementException(msg, e);
} finally { } finally {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
@ -1412,7 +1424,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
} }
@Override @Override
public void updateApplication(int applicationId, ApplicationWrapper applicationWrapper) public void updateApplication(int applicationId, ApplicationUpdateWrapper applicationUpdateWrapper)
throws ApplicationManagementException { throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
@ -1430,81 +1442,63 @@ public class ApplicationManagerImpl implements ApplicationManager {
throw new NotFoundException(msg); throw new NotFoundException(msg);
} }
if (!StringUtils.isEmpty(applicationWrapper.getType()) && !applicationDTO.getType() if (!StringUtils.isEmpty(applicationUpdateWrapper.getName())){
.equals(applicationWrapper.getType())) { Filter filter = new Filter();
String msg = "You are trying to change the application type and it is not " filter.setFullMatch(true);
+ "possible after you create an application. Therefore please remove this application and " filter.setAppName(applicationUpdateWrapper.getName().trim());
+ "publish new application with type: " + applicationWrapper.getType(); 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 " + applicationUpdateWrapper.getName()
+ ". Hence you can't update the application name from " + applicationDTO.getName() + " to "
+ applicationUpdateWrapper.getName();
log.error(msg); log.error(msg);
throw new BadRequestException(msg); throw new BadRequestException(msg);
} }
if (!StringUtils.isEmpty(applicationWrapper.getDeviceType()) && !applicationDTO.getDeviceTypeName() applicationDTO.setName(applicationUpdateWrapper.getName());
.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() if (!StringUtils.isEmpty(applicationUpdateWrapper.getSubType()) && !applicationDTO.getSubType()
.equals(applicationWrapper.getSubType())) { .equals(applicationUpdateWrapper.getSubType())) {
if (!ApplicationSubscriptionType.PAID.toString().equals(applicationWrapper.getSubType()) if (!ApplicationSubscriptionType.PAID.toString().equals(applicationUpdateWrapper.getSubType())
&& !ApplicationSubscriptionType.FREE.toString().equals(applicationWrapper.getSubType())) { && !ApplicationSubscriptionType.FREE.toString().equals(applicationUpdateWrapper.getSubType())) {
String msg = "Invalid application subscription type is found with application updating request " String msg = "Invalid application subscription type is found with application updating request "
+ applicationWrapper.getSubType(); + applicationUpdateWrapper.getSubType();
log.error(msg); log.error(msg);
throw new BadRequestException(msg); throw new BadRequestException(msg);
} else if (ApplicationSubscriptionType.FREE.toString().equals(applicationWrapper.getSubType()) && !StringUtils } else if (ApplicationSubscriptionType.FREE.toString().equals(applicationUpdateWrapper.getSubType())
.isEmpty(applicationWrapper.getPaymentCurrency())) { && !StringUtils.isEmpty(applicationUpdateWrapper.getPaymentCurrency())) {
String msg = "If you are going to change Non-Free app as Free app, " 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 \"\""; + "currency attribute in the application updating payload should be null or \"\"";
log.error(msg); log.error(msg);
throw new ApplicationManagementException(msg); throw new ApplicationManagementException(msg);
} else if (ApplicationSubscriptionType.PAID.toString().equals(applicationWrapper.getSubType()) } else if (ApplicationSubscriptionType.PAID.toString().equals(applicationUpdateWrapper.getSubType())
&& StringUtils.isEmpty(applicationWrapper.getPaymentCurrency()) ){ && StringUtils.isEmpty(applicationUpdateWrapper.getPaymentCurrency()) ){
String msg = "If you are going to change Free app as Non-Free app, " 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 \"\""; + "currency attribute in the application payload should not be null or \"\"";
log.error(msg); log.error(msg);
throw new ApplicationManagementException(msg); throw new ApplicationManagementException(msg);
} }
applicationDTO.setSubType(applicationUpdateWrapper.getSubType());
applicationDTO.setSubType(applicationWrapper.getSubType()); applicationDTO.setPaymentCurrency(applicationUpdateWrapper.getPaymentCurrency());
applicationDTO.setPaymentCurrency(applicationWrapper.getPaymentCurrency());
} }
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 if (!StringUtils.isEmpty(applicationUpdateWrapper.getDescription())){
.getApplications(filter, applicationDTO.getDeviceTypeId(), tenantId); applicationDTO.setDescription(applicationUpdateWrapper.getDescription());
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 (!StringUtils.isEmpty(applicationWrapper.getDescription())){
applicationDTO.setDescription(applicationWrapper.getDescription());
} }
List<String> appUnrestrictedRoles = this.visibilityDAO.getUnrestrictedRoles(applicationId, tenantId); List<String> appUnrestrictedRoles = this.visibilityDAO.getUnrestrictedRoles(applicationId, tenantId);
List<String> appCategories = this.applicationDAO.getAppCategories(applicationId, tenantId);
boolean isExistingAppRestricted = !appUnrestrictedRoles.isEmpty(); boolean isExistingAppRestricted = !appUnrestrictedRoles.isEmpty();
boolean isUpdatingAppRestricted = !applicationWrapper.getUnrestrictedRoles().isEmpty(); boolean isUpdatingAppRestricted = !applicationUpdateWrapper.getUnrestrictedRoles().isEmpty();
if (isExistingAppRestricted && !isUpdatingAppRestricted) { if (isExistingAppRestricted && !isUpdatingAppRestricted) {
visibilityDAO.deleteUnrestrictedRoles(appUnrestrictedRoles, applicationId, tenantId); visibilityDAO.deleteUnrestrictedRoles(appUnrestrictedRoles, applicationId, tenantId);
} else if (isUpdatingAppRestricted) { } else if (isUpdatingAppRestricted) {
if (!hasUserRole(applicationWrapper.getUnrestrictedRoles(), userName)) { if (!hasUserRole(applicationUpdateWrapper.getUnrestrictedRoles(), userName)) {
String msg = String msg =
"You are trying to restrict the visibility of visible application.But you are trying to " "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 " + "restrict the visibility to roles that there isn't at least one role is assigned "
@ -1517,12 +1511,12 @@ public class ApplicationManagerImpl implements ApplicationManager {
if (!isExistingAppRestricted) { if (!isExistingAppRestricted) {
visibilityDAO visibilityDAO
.addUnrestrictedRoles(applicationWrapper.getUnrestrictedRoles(), applicationId, tenantId); .addUnrestrictedRoles(applicationUpdateWrapper.getUnrestrictedRoles(), applicationId, tenantId);
} else { } else {
List<String> addingRoleList = getDifference(applicationWrapper.getUnrestrictedRoles(), List<String> addingRoleList = getDifference(applicationUpdateWrapper.getUnrestrictedRoles(),
applicationDTO.getUnrestrictedRoles()); applicationDTO.getUnrestrictedRoles());
List<String> removingRoleList = getDifference(applicationDTO.getUnrestrictedRoles(), List<String> removingRoleList = getDifference(applicationDTO.getUnrestrictedRoles(),
applicationWrapper.getUnrestrictedRoles()); applicationUpdateWrapper.getUnrestrictedRoles());
if (!addingRoleList.isEmpty()) { if (!addingRoleList.isEmpty()) {
visibilityDAO.addUnrestrictedRoles(addingRoleList, applicationId, tenantId); visibilityDAO.addUnrestrictedRoles(addingRoleList, applicationId, tenantId);
} }
@ -1531,18 +1525,56 @@ public class ApplicationManagerImpl implements ApplicationManager {
} }
} }
} }
applicationDTO.setUnrestrictedRoles(applicationWrapper.getUnrestrictedRoles()); applicationDTO.setUnrestrictedRoles(applicationUpdateWrapper.getUnrestrictedRoles());
String updatingAppCategory = applicationUpdateWrapper.getAppCategory();
if ( updatingAppCategory != null){
List<String> appCategories = this.applicationDAO.getAppCategories(applicationId, tenantId);
if (!appCategories.contains(updatingAppCategory)){
List<CategoryDTO> allCategories = this.applicationDAO.getAllCategories(tenantId);
List<Integer> categoryIds = allCategories.stream()
.filter(category -> category.getCategoryName().equals(updatingAppCategory))
.map(CategoryDTO::getId).collect(Collectors.toList());
if (categoryIds.isEmpty()){
ConnectionManagerUtil.rollbackDBTransaction();
String msg =
"You are trying to update application category into invalid application category, "
+ "it is not registered in the system. Therefore please register the category "
+ updatingAppCategory + " and perform the action";
log.error(msg);
throw new BadRequestException(msg);
}
this.applicationDAO.addCategoryMapping(categoryIds, applicationId, tenantId);
}
}
List<String> updatingAppTags = applicationUpdateWrapper.getTags();
if ( updatingAppTags!= null){
List<String> appTags = this.applicationDAO.getAppTags(applicationId, tenantId); List<String> appTags = this.applicationDAO.getAppTags(applicationId, tenantId);
List<String> addingTagList = getDifference(appTags, applicationWrapper.getTags()); List<String> addingTagList = getDifference(appTags, updatingAppTags);
List<String> removingTagList = getDifference(applicationWrapper.getTags(), appTags); List<String> removingTagList = getDifference(updatingAppTags, appTags);
if (!addingTagList.isEmpty()) { if (!addingTagList.isEmpty()) {
// applicationDAO.addTags(addingTags, application.getId(), tenantId); List<TagDTO> allTags = this.applicationDAO.getAllTags(tenantId);
List<String> newTags = addingTagList.stream().filter(updatingTagName -> allTags.stream()
.noneMatch(tag -> tag.getTagName().equals(updatingTagName))).collect(Collectors.toList());
if (!newTags.isEmpty()){
this.applicationDAO.addTags(newTags, tenantId);
}
List<Integer> addingTagIds = this.applicationDAO.getTagIdsForTagNames(addingTagList, tenantId);
this.applicationDAO.addTagMapping(addingTagIds, applicationId, tenantId);
} }
if (!removingTagList.isEmpty()) { if (!removingTagList.isEmpty()) {
List<Integer> removingTagIds = this.applicationDAO.getTagIdsForTagNames(removingTagList, tenantId);
this.applicationDAO.deleteTagMapping(removingTagIds, applicationId, tenantId);
applicationDAO.deleteTags(removingTagList, applicationId, tenantId); applicationDAO.deleteTags(removingTagList, applicationId, tenantId);
} }
applicationDAO.editApplication(applicationDTO, tenantId); }
if (!applicationDAO.updateApplication(applicationDTO, tenantId)){
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Any application is not updated for the application ID: " + applicationId;
log.error(msg);
throw new ApplicationManagementException(msg);
}
} catch (UserStoreException e) { } catch (UserStoreException e) {
ConnectionManagerUtil.rollbackDBTransaction(); ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException( throw new ApplicationManagementException(
@ -1904,7 +1936,6 @@ public class ApplicationManagerImpl implements ApplicationManager {
applicationDTO.setTags(applicationWrapper.getTags()); applicationDTO.setTags(applicationWrapper.getTags());
applicationDTO.setUnrestrictedRoles(applicationWrapper.getUnrestrictedRoles()); applicationDTO.setUnrestrictedRoles(applicationWrapper.getUnrestrictedRoles());
applicationDTO.setDeviceTypeId(deviceType.getId()); applicationDTO.setDeviceTypeId(deviceType.getId());
applicationDTO.setDeviceTypeName(deviceType.getName());
List<ApplicationReleaseDTO> applicationReleaseEntities = applicationWrapper.getApplicationReleaseWrappers() List<ApplicationReleaseDTO> applicationReleaseEntities = applicationWrapper.getApplicationReleaseWrappers()
.stream().map(this::releaseWrapperToReleaseDTO).collect(Collectors.toList()); .stream().map(this::releaseWrapperToReleaseDTO).collect(Collectors.toList());
applicationDTO.setApplicationReleaseDTOs(applicationReleaseEntities); applicationDTO.setApplicationReleaseDTOs(applicationReleaseEntities);
@ -1923,9 +1954,11 @@ public class ApplicationManagerImpl implements ApplicationManager {
return applicationReleaseDTO; return applicationReleaseDTO;
} }
private Application appDtoToAppResponse(ApplicationDTO applicationDTO) { private Application appDtoToAppResponse(ApplicationDTO applicationDTO)
throws BadRequestException, UnexpectedServerErrorException {
Application application = new Application(); Application application = new Application();
DeviceType deviceType = getDeviceTypeData(applicationDTO.getDeviceTypeId());
application.setId(applicationDTO.getId()); application.setId(applicationDTO.getId());
application.setName(applicationDTO.getName()); application.setName(applicationDTO.getName());
application.setDescription(applicationDTO.getDescription()); application.setDescription(applicationDTO.getDescription());
@ -1935,7 +1968,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
application.setPaymentCurrency(applicationDTO.getPaymentCurrency()); application.setPaymentCurrency(applicationDTO.getPaymentCurrency());
application.setTags(applicationDTO.getTags()); application.setTags(applicationDTO.getTags());
application.setUnrestrictedRoles(applicationDTO.getUnrestrictedRoles()); application.setUnrestrictedRoles(applicationDTO.getUnrestrictedRoles());
application.setDeviceType(applicationDTO.getDeviceTypeName()); application.setDeviceType(deviceType.getName());
List<ApplicationRelease> applicationReleases = applicationDTO.getApplicationReleaseDTOs() List<ApplicationRelease> applicationReleases = applicationDTO.getApplicationReleaseDTOs()
.stream().map(this::releaseDtoToRelease).collect(Collectors.toList()); .stream().map(this::releaseDtoToRelease).collect(Collectors.toList());
application.setApplicationReleases(applicationReleases); application.setApplicationReleases(applicationReleases);
@ -1943,7 +1976,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
} }
private ApplicationRelease releaseDtoToRelease(ApplicationReleaseDTO applicationReleaseDTO){ private ApplicationRelease releaseDtoToRelease(ApplicationReleaseDTO applicationReleaseDTO){
String artifactDownloadEndpoint = ConfigurationManager.getInstance().getConfiguration().getArtifactDownloadEndpoint(); String artifactDownloadEndpoint = ConfigurationManager.getInstance().getConfiguration()
.getArtifactDownloadEndpoint();
String basePath = artifactDownloadEndpoint + Constants.FORWARD_SLASH + applicationReleaseDTO.getUuid(); String basePath = artifactDownloadEndpoint + Constants.FORWARD_SLASH + applicationReleaseDTO.getUuid();
ApplicationRelease applicationRelease = new ApplicationRelease(); ApplicationRelease applicationRelease = new ApplicationRelease();
applicationRelease.setDescription(applicationReleaseDTO.getDescription()); applicationRelease.setDescription(applicationReleaseDTO.getDescription());
@ -1953,8 +1987,11 @@ public class ApplicationManagerImpl implements ApplicationManager {
applicationRelease.setIsSharedWithAllTenants(applicationReleaseDTO.getIsSharedWithAllTenants()); applicationRelease.setIsSharedWithAllTenants(applicationReleaseDTO.getIsSharedWithAllTenants());
applicationRelease.setMetaData(applicationReleaseDTO.getMetaData()); applicationRelease.setMetaData(applicationReleaseDTO.getMetaData());
applicationRelease.setUrl(applicationReleaseDTO.getUrl()); applicationRelease.setUrl(applicationReleaseDTO.getUrl());
applicationRelease.setCurrentStatus(applicationReleaseDTO.getCurrentState());
applicationRelease.setIsSharedWithAllTenants(applicationReleaseDTO.getIsSharedWithAllTenants());
applicationRelease.setSupportedOsVersions(applicationReleaseDTO.getSupportedOsVersions()); applicationRelease.setSupportedOsVersions(applicationReleaseDTO.getSupportedOsVersions());
applicationRelease.setInstallerPath(basePath + Constants.FORWARD_SLASH + applicationReleaseDTO.getInstallerName()); applicationRelease
.setInstallerPath(basePath + Constants.FORWARD_SLASH + applicationReleaseDTO.getInstallerName());
applicationRelease.setIconPath(basePath + Constants.FORWARD_SLASH + applicationReleaseDTO.getIconName()); applicationRelease.setIconPath(basePath + Constants.FORWARD_SLASH + applicationReleaseDTO.getIconName());
applicationRelease.setBannerPath(basePath + Constants.FORWARD_SLASH + applicationReleaseDTO.getBannerName()); applicationRelease.setBannerPath(basePath + Constants.FORWARD_SLASH + applicationReleaseDTO.getBannerName());

@ -211,28 +211,29 @@ public class LifecycleStateManager {
return endState; return endState;
} }
public boolean isStateExist(String currentState) { public String getInstallableState() throws LifecycleManagementException {
String installableState = null;
for (Map.Entry<String, State> stringStateEntry : lifecycleStates.entrySet()) { for (Map.Entry<String, State> stringStateEntry : lifecycleStates.entrySet()) {
if (stringStateEntry.getKey().equalsIgnoreCase(currentState)) { if (stringStateEntry.getValue().isAppInstallable()) {
return true; installableState = stringStateEntry.getKey();
break;
} }
} }
return false; if (installableState == null){
} String msg = "Haven't defined the installable state in the application-manager.xml. Please add installable "
+ "state to the <LifecycleStates> section in the app-manager.xml";
public boolean isUpdatable(String state) { log.error(msg);
State currentState = getMatchingState(state); throw new LifecycleManagementException(msg);
if (currentState.isAppUpdatable()) {
return true;
} }
return false; return installableState;
} }
public boolean isInstallable(String state) { public boolean isStateExist(String currentState) {
State currentState = getMatchingState(state); for (Map.Entry<String, State> stringStateEntry : lifecycleStates.entrySet()) {
if (currentState.isAppInstallable()) { if (stringStateEntry.getKey().equalsIgnoreCase(currentState)) {
return true; return true;
} }
}
return false; return false;
} }

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

@ -32,12 +32,14 @@ import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.Multipart; import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.wso2.carbon.apimgt.annotations.api.Scope; import org.wso2.carbon.apimgt.annotations.api.Scope;
import org.wso2.carbon.apimgt.annotations.api.Scopes; import org.wso2.carbon.apimgt.annotations.api.Scopes;
import org.wso2.carbon.device.application.mgt.common.*; import org.wso2.carbon.device.application.mgt.common.ApplicationList;
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.Filter;
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.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.ApplicationUpdateWrapper;
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;
@ -60,17 +62,16 @@ import javax.ws.rs.core.Response;
@SwaggerDefinition( @SwaggerDefinition(
info = @Info( info = @Info(
version = "1.0.0", version = "1.0.0",
title = "ApplicationDTO Management Service", title = "ApplicationDTO Management Publisher Service",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = "name", value = "ApplicationManagementService"), @ExtensionProperty(name = "name", value = "ApplicationManagementPublisherService"),
@ExtensionProperty(name = "context", value = "/api/application-mgt/v1.0/applications"), @ExtensionProperty(name = "context", value = "/api/application-mgt-publisher/v1.0/applications"),
}) })
} }
), ),
tags = { tags = {
@Tag(name = "application_management, device_management", description = "ApplicationDTO Management related " @Tag(name = "application_management, device_management", description = "App publisher related APIs")
+ "APIs")
} }
) )
@Scopes( @Scopes(
@ -79,21 +80,21 @@ import javax.ws.rs.core.Response;
name = "Get ApplicationDTO Details", name = "Get ApplicationDTO Details",
description = "Get application details", description = "Get application details",
key = "perm:app:publisher:view", key = "perm:app:publisher:view",
permissions = {"/device-mgt/application/view"} permissions = {"/app-mgt/publisher/application/update"}
), ),
@Scope( @Scope(
name = "Update an ApplicationDTO", name = "Update an ApplicationDTO",
description = "Update an application", description = "Update an application",
key = "perm:app:publisher:update", key = "perm:app:publisher:update",
permissions = {"/device-mgt/application/update"} permissions = {"/app-mgt/publisher/application/update"}
) )
} }
) )
@Path("/publisher/applications") @Path("/applications")
@Api(value = "ApplicationDTO Management", description = "This API carries all application management related operations " + @Api(value = "ApplicationDTO Management", description = "This API carries all application management related operations " +
"such as get all the applications, add application, etc.") "such as get all the applications, add application, etc.")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
public interface ApplicationManagementAPI { public interface ApplicationManagementPublisherAPI {
String SCOPE = "scope"; String SCOPE = "scope";
@ -176,8 +177,7 @@ public interface ApplicationManagementAPI {
@PathParam("appId") int appId, @PathParam("appId") int appId,
@ApiParam( @ApiParam(
name = "state", name = "state",
value = "state", value = "state")
defaultValue = "PUBLISHED")
@QueryParam("state") String state @QueryParam("state") String state
); );
@ -194,7 +194,7 @@ public interface ApplicationManagementAPI {
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:update")
}) })
} }
) )
@ -221,9 +221,9 @@ public interface ApplicationManagementAPI {
@PathParam("appId") int appId, @PathParam("appId") int appId,
@ApiParam( @ApiParam(
name = "application", name = "application",
value = "The application that need to be edited.", value = "Application data that need to be edited.",
required = true) required = true)
@Valid ApplicationWrapper applicationWrapper @Valid ApplicationUpdateWrapper applicationUpdateWrapper
); );
@POST @POST
@ -238,7 +238,7 @@ public interface ApplicationManagementAPI {
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:update")
}) })
} }
) )
@ -308,7 +308,7 @@ public interface ApplicationManagementAPI {
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:update")
}) })
} }
) )
@ -387,7 +387,7 @@ public interface ApplicationManagementAPI {
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:update")
}) })
} }
) )
@ -399,7 +399,7 @@ public interface ApplicationManagementAPI {
response = List.class), response = List.class),
@ApiResponse( @ApiResponse(
code = 500, code = 500,
message = "Internal Server Error. \n Error occurred while deleteing the application.", message = "Internal Server Error. \n Error occurred while deleting the application.",
response = ErrorResponse.class) response = ErrorResponse.class)
}) })
Response deleteApplication( Response deleteApplication(
@ -423,7 +423,7 @@ public interface ApplicationManagementAPI {
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:update")
}) })
} }
) )
@ -494,7 +494,7 @@ public interface ApplicationManagementAPI {
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:update")
}) })
} }
) )
@ -547,7 +547,7 @@ public interface ApplicationManagementAPI {
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:update")
}) })
} }
) )
@ -595,7 +595,7 @@ public interface ApplicationManagementAPI {
tags = "Lifecycle Management", tags = "Lifecycle Management",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:publisher:view") @ExtensionProperty(name = SCOPE, value = "perm:app:update")
}) })
} }
) )
@ -627,7 +627,7 @@ public interface ApplicationManagementAPI {
tags = "Lifecycle Management", tags = "Lifecycle Management",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:publisher:update") @ExtensionProperty(name = SCOPE, value = "perm:app:update")
}) })
} }
) )

@ -23,7 +23,6 @@ import org.apache.commons.logging.LogFactory;
import org.apache.cxf.jaxrs.ext.multipart.Attachment; import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.Multipart; import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.wso2.carbon.device.application.mgt.common.*; import org.wso2.carbon.device.application.mgt.common.*;
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.dto.LifecycleStateDTO; 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;
@ -31,12 +30,12 @@ import org.wso2.carbon.device.application.mgt.common.exception.RequestValidating
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.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.ApplicationUpdateWrapper;
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;
import org.wso2.carbon.device.application.mgt.core.exception.ValidationException;
import org.wso2.carbon.device.application.mgt.core.util.APIUtil; import org.wso2.carbon.device.application.mgt.core.util.APIUtil;
import org.wso2.carbon.device.application.mgt.publisher.api.services.ApplicationManagementAPI; import org.wso2.carbon.device.application.mgt.publisher.api.services.ApplicationManagementPublisherAPI;
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.services.ApplicationManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
@ -52,7 +51,6 @@ import javax.activation.DataHandler;
import javax.validation.Valid; import javax.validation.Valid;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE; import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.PUT; import javax.ws.rs.PUT;
@ -68,9 +66,7 @@ import javax.ws.rs.core.Response;
*/ */
@Produces({"application/json"}) @Produces({"application/json"})
@Path("/applications") @Path("/applications")
public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { public class ApplicationManagementPublisherAPIImpl implements ApplicationManagementPublisherAPI {
private static Log log = LogFactory.getLog(ApplicationManagementAPIImpl.class);
@POST @POST
@Override @Override
@ -102,15 +98,14 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@Path("/{appId}") @Path("/{appId}")
public Response getApplication( public Response getApplication(
@PathParam("appId") int appId, @PathParam("appId") int appId,
@DefaultValue("PUBLISHED") @QueryParam("state") String state) { @QueryParam("state") String state) {
ApplicationManager applicationManager = APIUtil.getApplicationManager(); ApplicationManager applicationManager = APIUtil.getApplicationManager();
try { try {
Application application = applicationManager.getApplicationById(appId, state); Application application = applicationManager.getApplicationById(appId, state);
if (application == null){ if (application == null){
String msg = "Couldn't found an application release which is in " + state + " state for application id " String msg = "Could not found an application release which is in " + state + " state.";
+ appId;
log.error(msg); log.error(msg);
return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); return Response.status(Response.Status.OK).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) {
@ -317,31 +312,36 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
} }
} }
@PUT @PUT
@Consumes("application/json") @Consumes("application/json")
@Path("/{appId}") @Path("/{appId}")
public Response updateApplication( public Response updateApplication(
@PathParam("appId") int applicationId, @PathParam("appId") int applicationId,
@Valid ApplicationWrapper applicationWrapper) { @Valid ApplicationUpdateWrapper applicationUpdateWrapper) {
ApplicationManager applicationManager = APIUtil.getApplicationManager(); ApplicationManager applicationManager = APIUtil.getApplicationManager();
try { try {
//todo wrong applicationManager.updateApplication(applicationId, applicationUpdateWrapper);
applicationManager.updateApplication(applicationId, applicationWrapper);
return Response.status(Response.Status.OK) return Response.status(Response.Status.OK)
.entity("Application was updated successfully. ApplicationID " + applicationId).build(); .entity("Application was updated successfully for 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();
} catch (ForbiddenException e) { } catch (BadRequestException e) {
log.error(e.getMessage()); String msg = "Error occurred while modifying the application. Found bad request payload for updating the "
return Response.status(Response.Status.FORBIDDEN).entity(e.getMessage()).build(); + "application";
} catch (ApplicationManagementException e) {
String msg = "Error occurred while modifying the application";
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();
} }
catch (ApplicationManagementException e) {
String msg = "Internal Error occurred while modifying the application.";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} }
}
/*
//todo ----------------------
*/
@Override @Override
@PUT @PUT

@ -52,7 +52,7 @@
<bean id="swaggerWriter" class="io.swagger.jaxrs.listing.SwaggerSerializers" /> <bean id="swaggerWriter" class="io.swagger.jaxrs.listing.SwaggerSerializers" />
<bean id="swaggerResource" class="io.swagger.jaxrs.listing.ApiListingResource" /> <bean id="swaggerResource" class="io.swagger.jaxrs.listing.ApiListingResource" />
<bean id="applicationMgtServiceBean" class="org.wso2.carbon.device.application.mgt.publisher.api.services.impl.ApplicationManagementAPIImpl"/> <bean id="applicationMgtServiceBean" class="org.wso2.carbon.device.application.mgt.publisher.api.services.impl.ApplicationManagementPublisherAPIImpl"/>
<bean id="jsonProvider" class="org.wso2.carbon.device.application.mgt.addons.JSONMessageHandler"/> <bean id="jsonProvider" class="org.wso2.carbon.device.application.mgt.addons.JSONMessageHandler"/>
<bean id="multipartProvider" class="org.wso2.carbon.device.application.mgt.addons.MultipartCustomProvider"/> <bean id="multipartProvider" class="org.wso2.carbon.device.application.mgt.addons.MultipartCustomProvider"/>

@ -68,7 +68,7 @@ import javax.ws.rs.core.Response;
name = "Get ApplicationDTO Details", name = "Get ApplicationDTO Details",
description = "Get application details", description = "Get application details",
key = "perm:app:store:view", key = "perm:app:store:view",
permissions = {"/device-mgt/application/get"} permissions = {"/app-mgt/store/application/view"}
) )
} }
) )
@ -92,7 +92,7 @@ public interface ApplicationManagementAPI {
tags = "ApplicationDTO Management", tags = "ApplicationDTO Management",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:application:get") @ExtensionProperty(name = SCOPE, value = "perm:app:store:view")
}) })
} }
) )
@ -155,7 +155,7 @@ public interface ApplicationManagementAPI {
tags = "ApplicationDTO Management", tags = "ApplicationDTO Management",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:application:get") @ExtensionProperty(name = SCOPE, value = "perm:app:store:view")
}) })
} }
) )

@ -72,13 +72,13 @@ import java.util.List;
name = "Get Review Details", name = "Get Review Details",
description = "Get review details", description = "Get review details",
key = "perm:app:review:view", key = "perm:app:review:view",
permissions = {"/device-mgt/review/view"} permissions = {"/app-mgt/store/review/view"}
), ),
@Scope( @Scope(
name = "Update a Review", name = "Update a Review",
description = "Update a comment", description = "Update a comment",
key = "perm:app:review:update", key = "perm:app:review:update",
permissions = {"/device-mgt/review/update"} permissions = {"/app-mgt/store/review/update"}
), ),
} }
) )

@ -31,13 +31,14 @@ import org.wso2.carbon.webapp.authenticator.framework.authenticator.WebappAuthen
import org.wso2.carbon.webapp.authenticator.framework.authorizer.WebappTenantAuthorizer; import org.wso2.carbon.webapp.authenticator.framework.authorizer.WebappTenantAuthorizer;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.regex.Pattern;
public class WebappAuthenticationValve extends CarbonTomcatValve { public class WebappAuthenticationValve extends CarbonTomcatValve {
private static final Log log = LogFactory.getLog(WebappAuthenticationValve.class); private static final Log log = LogFactory.getLog(WebappAuthenticationValve.class);
private static HashMap<String, String> nonSecuredEndpoints = new HashMap<>(); private static TreeMap<String, String> nonSecuredEndpoints = new TreeMap<>();
@Override @Override
public void invoke(Request request, Response response, CompositeValve compositeValve) { public void invoke(Request request, Response response, CompositeValve compositeValve) {
@ -126,6 +127,7 @@ public class WebappAuthenticationValve extends CarbonTomcatValve {
if (!nonSecuredEndpoints.containsKey(contextPath)) { if (!nonSecuredEndpoints.containsKey(contextPath)) {
String param = request.getContext().findParameter("nonSecuredEndPoints"); String param = request.getContext().findParameter("nonSecuredEndPoints");
String skippedEndPoint; String skippedEndPoint;
boolean isUriUnsecured = false;
if (param != null && !param.isEmpty()) { if (param != null && !param.isEmpty()) {
//Add the nonSecured end-points to cache //Add the nonSecured end-points to cache
StringTokenizer tokenizer = new StringTokenizer(param, ","); StringTokenizer tokenizer = new StringTokenizer(param, ",");
@ -137,10 +139,23 @@ public class WebappAuthenticationValve extends CarbonTomcatValve {
skippedEndPoint = skippedEndPoint + "/"; skippedEndPoint = skippedEndPoint + "/";
} }
nonSecuredEndpoints.put(skippedEndPoint, "true"); nonSecuredEndpoints.put(skippedEndPoint, "true");
if (uri.equals(skippedEndPoint) || Pattern.matches(skippedEndPoint, uri)){
isUriUnsecured = true;
} }
} }
return isUriUnsecured;
} }
return nonSecuredEndpoints.containsKey(uri); } else {
if (nonSecuredEndpoints.containsKey(uri)) {
return true;
}
for (String endpoint : nonSecuredEndpoints.keySet()) {
if (Pattern.matches(endpoint, uri)) {
return true;
}
}
}
return false;
} }
private void processRequest(Request request, Response response, CompositeValve compositeValve, private void processRequest(Request request, Response response, CompositeValve compositeValve,

@ -149,6 +149,7 @@
<Scope>perm:app:review:update</Scope> <Scope>perm:app:review:update</Scope>
<Scope>perm:app:publisher:view</Scope> <Scope>perm:app:publisher:view</Scope>
<Scope>perm:app:publisher:update</Scope> <Scope>perm:app:publisher:update</Scope>
<Scope>perm:app:store:view</Scope>
</Scopes> </Scopes>
<SSOConfiguration> <SSOConfiguration>
<Issuer>app-mgt</Issuer> <Issuer>app-mgt</Issuer>

Loading…
Cancel
Save