Refactor the source

feature/appm-store/pbac
lasanthaDLPDS 6 years ago
parent b2260b6919
commit 9876d8685c

@ -1,84 +0,0 @@
/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* 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.api.services;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.Extension;
import io.swagger.annotations.ExtensionProperty;
import io.swagger.annotations.Info;
import io.swagger.annotations.SwaggerDefinition;
import org.wso2.carbon.device.application.mgt.common.*;
import org.wso2.carbon.device.application.mgt.common.ErrorResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
/**
* APIs to handle application management related tasks.
*/
@SwaggerDefinition(
info = @Info(
version = "1.0.0",
title = "Application Management Common Service",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = "name", value = "ApplicationManagementCommonService"),
@ExtensionProperty(name = "context", value = "/api/application-mgt/v1.0/app-mgt"),
})
}
)
)
@Path("/app-mgt")
@Api(value = "Application Management Common Service", description = "This API carries all application management common services")
@Produces(MediaType.APPLICATION_JSON)
public interface AppMgtAPI {
@GET
@Path("/ui-config")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
httpMethod = "GET",
value = "get application management UI configuration",
notes = "This will get all UI configuration of application management"
)
@ApiResponses(
value = {
@ApiResponse(
code = 200,
message = "OK. \n Successfully got UI config.",
response = ApplicationList.class),
@ApiResponse(
code = 404,
message = "Not Found. There doesn't have an defined UI config." +
"query."),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while getting the UI config.",
response = ErrorResponse.class)
})
Response getUiConfig();
}

@ -1,60 +0,0 @@
/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* 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.api.services.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.application.mgt.api.services.AppMgtAPI;
import org.wso2.carbon.device.application.mgt.common.config.UIConfiguration;
import org.wso2.carbon.device.application.mgt.common.services.ConfigManager;
import org.wso2.carbon.device.application.mgt.core.util.APIUtil;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
/**
* Implementation of Application Management related APIs.
*/
@Produces({"application/json"})
@Path("/app-mgt")
public class AppMgtAPIImpl implements AppMgtAPI {
private static Log log = LogFactory.getLog(AppMgtAPIImpl.class);
@GET
@Override
@Consumes("application/json")
@Path("/ui-config")
public Response getUiConfig() {
ConfigManager configManager = APIUtil.getConfigManager();
try {
UIConfiguration uiConfiguration = configManager.getUIConfiguration();
return Response.status(Response.Status.OK).entity(uiConfiguration).build();
}catch (ApplicationManagementException e) {
String msg = "Error occurred while getting the application list for publisher ";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
}

@ -0,0 +1,19 @@
package org.wso2.carbon.device.application.mgt.artifact.retrieve.api.services;/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* 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.
*/
public interface AppArtifactRetrievalAPI {
}

@ -0,0 +1,19 @@
package org.wso2.carbon.device.application.mgt.artifact.retrieve.api.services.impl;/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* 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.
*/
public class AppArtifactRetrivaalAPIImpl {
}

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

@ -85,7 +85,7 @@ public class ApplicationRelease {
@ApiModelProperty(name = "isSharedWithAllTenants",
value = "If application release is shared with all tenants it is eqal to 1 otherwise 0",
required = true)
private int isSharedWithAllTenants;
private boolean isSharedWithAllTenants;
@ApiModelProperty(name = "metaData",
value = "Meta data of the application release",
@ -168,7 +168,7 @@ public class ApplicationRelease {
this.appHashValue = appHashValue;
}
public void setIsSharedWithAllTenants(int isSharedWithAllTenants) {
public void setIsSharedWithAllTenants(boolean isSharedWithAllTenants) {
this.isSharedWithAllTenants = isSharedWithAllTenants;
}
@ -196,9 +196,7 @@ public class ApplicationRelease {
return appHashValue;
}
public int getIsSharedWithAllTenants() {
return isSharedWithAllTenants;
}
public boolean getIsSharedWithAllTenants() { return isSharedWithAllTenants; }
public String getMetaData() {
return metaData;

@ -0,0 +1,107 @@
/*
* 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.wrappers;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(value = "ApplicationRelease", description = "This class holds the details when releasing an Application to application store")
public class ApplicationReleaseWrapper {
@ApiModelProperty(name = "description",
value = "Description of the application release")
private String description;
@ApiModelProperty(name = "releaseType",
value = "Release type of the application release",
required = true,
example = "alpha, beta etc")
private String releaseType;
@ApiModelProperty(name = "price",
value = "Price of the application release",
required = true)
private Double price;
@ApiModelProperty(name = "isSharedWithAllTenants",
value = "If application release is shared with all tenants it is eqal to 1 otherwise 0",
required = true)
private boolean isSharedWithAllTenants;
@ApiModelProperty(name = "metaData",
value = "Meta data of the application release",
required = true)
private String metaData;
@ApiModelProperty(name = "url",
value = "URL which is used for WEB-CLIP")
private String url;
@ApiModelProperty(name = "supportedOsVersions",
value = "Application release supported OS versions")
private String supportedOsVersions;
public String getReleaseType() {
return releaseType;
}
public void setReleaseType(String releaseType) {
this.releaseType = releaseType;
}
public void setIsSharedWithAllTenants(boolean isSharedWithAllTenants) {
this.isSharedWithAllTenants = isSharedWithAllTenants;
}
public void setMetaData(String metaData) {
this.metaData = metaData;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public boolean getIsSharedWithAllTenants() {
return isSharedWithAllTenants;
}
public String getMetaData() {
return metaData;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public String getSupportedOsVersions() { return supportedOsVersions; }
public void setSupportedOsVersions(String supportedOsVersions) { this.supportedOsVersions = supportedOsVersions; }
}

@ -0,0 +1,132 @@
/*
* 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.wrappers;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.wso2.carbon.device.application.mgt.common.ApplicationRelease;
import java.util.List;
@ApiModel(value = "Application", description = "Application represents the an Application in Application Store")
public class ApplicationWrapper {
@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 = "Category of the application",
required = true,
example = "Educational, Gaming, Travel, Entertainment etc")
private String appCategory;
@ApiModelProperty(name = "type",
value = "Type of the application",
required = true,
example = "ENTERPRISE, PUBLIC, WEB, WEB_CLIP etc")
private String type;
@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;
@ApiModelProperty(name = "deviceType",
value = "Related device type of the application",
required = true,
example = "IoS, Android, Arduino, RaspberryPi etc")
private String deviceType;
@ApiModelProperty(name = "applicationReleases",
value = "List of application releases",
required = true)
private List<ApplicationRelease> applicationReleases;
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 getType() { return type; }
public void setType(String type) { this.type = type; }
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<ApplicationRelease> getApplicationReleases() { return applicationReleases; }
public void setApplicationReleases(List<ApplicationRelease> applicationReleases) {
this.applicationReleases = applicationReleases; }
public List<String> getUnrestrictedRoles() { return unrestrictedRoles; }
public void setUnrestrictedRoles(List<String> unrestrictedRoles) { this.unrestrictedRoles = unrestrictedRoles; }
public String getDeviceType() { return deviceType; }
public void setDeviceType(String deviceType) { this.deviceType = deviceType; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
}

@ -238,7 +238,7 @@ public class Util {
applicationRelease.setScreenshotLoc2(resultSet.getString("SCREEN_SHOT_2"));
applicationRelease.setScreenshotLoc3(resultSet.getString("SCREEN_SHOT_3"));
applicationRelease.setAppHashValue(resultSet.getString("HASH_VALUE"));
applicationRelease.setIsSharedWithAllTenants(resultSet.getInt("SHARED"));
applicationRelease.setIsSharedWithAllTenants(resultSet.getBoolean("SHARED"));
applicationRelease.setMetaData(resultSet.getString("APP_META_INFO"));
applicationRelease.setRating(resultSet.getDouble("RATING"));
return applicationRelease;

@ -57,33 +57,51 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
PreparedStatement statement = null;
ResultSet resultSet = null;
String sql = "INSERT INTO AP_APP_RELEASE (VERSION,TENANT_ID,UUID,RELEASE_TYPE, PACKAGE_NAME, APP_PRICE, "
+ "STORED_LOCATION, ICON_LOCATION, BANNER_LOCATION, SC_1_LOCATION,SC_2_LOCATION,SC_3_LOCATION,"
+ "APP_HASH_VALUE, SHARED_WITH_ALL_TENANTS, APP_META_INFO,AP_APP_ID) "
+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
String sql = "INSERT INTO AP_APP_RELEASE "
+ "(DESCRIPTION,"
+ "VERSION,"
+ "TENANT_ID,"
+ "UUID,"
+ "RELEASE_TYPE,"
+ "PACKAGE_NAME,"
+ "APP_PRICE, "
+ "STORED_LOCATION,"
+ "ICON_LOCATION,"
+ "BANNER_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,"
+ "AP_APP_ID) "
+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
// TODO : make this readable
int index = 0;
String generatedColumns[] = { "ID" };
try {
connection = this.getDBConnection();
statement = connection.prepareStatement(sql, generatedColumns);
statement.setString(++index, applicationRelease.getVersion());
statement.setInt(++index, tenantId);
statement.setString(++index, applicationRelease.getUuid());
statement.setString(++index, String.valueOf(applicationRelease.getReleaseType()));
statement.setString(++index, String.valueOf(applicationRelease.getPackageName()));
statement.setDouble(++index, applicationRelease.getPrice());
statement.setString(++index, applicationRelease.getAppStoredLoc());
statement.setString(++index, applicationRelease.getIconLoc());
statement.setString(++index, applicationRelease.getBannerLoc());
statement.setString(++index, applicationRelease.getScreenshotLoc1());
statement.setString(++index, applicationRelease.getScreenshotLoc2());
statement.setString(++index, applicationRelease.getScreenshotLoc3());
statement.setString(++index, applicationRelease.getAppHashValue());
statement.setInt(++index, applicationRelease.getIsSharedWithAllTenants());
statement.setString(++index, applicationRelease.getMetaData());
statement.setInt(++index, appId);
statement.setString(1, applicationRelease.getDescription());
statement.setString(2, applicationRelease.getVersion());
statement.setInt(3, tenantId);
statement.setString(4, applicationRelease.getUuid());
statement.setString(5, String.valueOf(applicationRelease.getReleaseType()));
statement.setString(6, String.valueOf(applicationRelease.getPackageName()));
statement.setDouble(7, applicationRelease.getPrice());
statement.setString(8, applicationRelease.getAppStoredLoc());
statement.setString(9, applicationRelease.getIconLoc());
statement.setString(10, applicationRelease.getBannerLoc());
statement.setString(11, applicationRelease.getScreenshotLoc1());
statement.setString(12, applicationRelease.getScreenshotLoc2());
statement.setString(13, applicationRelease.getScreenshotLoc3());
statement.setString(14, applicationRelease.getAppHashValue());
statement.setBoolean(15, applicationRelease.getIsSharedWithAllTenants());
statement.setString(16, applicationRelease.getMetaData());
statement.setString(17, applicationRelease.getSupportedOsVersions());
statement.setString(18, applicationRelease.getCurrentState());
statement.setInt(19, appId);
statement.executeUpdate();
resultSet = statement.getGeneratedKeys();
if (resultSet.next()) {
@ -386,7 +404,7 @@ public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements
statement.setString(10, applicationRelease.getScreenshotLoc2());
statement.setString(11, applicationRelease.getScreenshotLoc3());
statement.setString(12, applicationRelease.getAppHashValue());
statement.setInt(13, applicationRelease.getIsSharedWithAllTenants());
statement.setBoolean(13, applicationRelease.getIsSharedWithAllTenants());
statement.setString(14, applicationRelease.getMetaData());
statement.setInt(15, applicationId);
statement.setInt(16, tenantId);

@ -76,6 +76,7 @@ import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Queue;
import java.util.Set;
import java.util.UUID;
@ -120,19 +121,16 @@ public class ApplicationManagerImpl implements ApplicationManager {
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager();
application.setUser(new User(userName, tenantId));
if (log.isDebugEnabled()) {
log.debug("Create Application received for the tenant : " + tenantId + " From" + " the user : " + userName);
}
DeviceType deviceType = null;
List<DeviceType> deviceTypes;
ApplicationRelease applicationRelease;
List<ApplicationRelease> applicationReleases = new ArrayList<>();
if (log.isDebugEnabled()) {
log.debug("Create Application received for the tenant : " + tenantId + " From" + " the user : " + userName);
}
try {
validateAppCreatingRequest(application, binaryFile, iconFile, bannerFile, attachmentList);
// Getting the device type details to get device type ID for internal mappings
// deviceType = Util.getDeviceManagementService().getDeviceType(application.getDeviceType());
deviceTypes = Util.getDeviceManagementService().getDeviceTypes();
for (DeviceType dt : deviceTypes) {
if (dt.getName().equals(application.getDeviceType())) {
@ -141,11 +139,11 @@ public class ApplicationManagerImpl implements ApplicationManager {
break;
}
}
if (deviceType == null) {
log.error("Invalid device type is found with the request. Requested Device Type is: " + application
.getDeviceType());
return null;
String msg = "Invalid device type is found with the request. Requested Device Type is: " + application
.getDeviceType();
log.error(msg);
throw new RequestValidatingException(msg);
}
applicationRelease = application.getApplicationReleases().get(0);
@ -167,10 +165,12 @@ public class ApplicationManagerImpl implements ApplicationManager {
applicationReleases.add(applicationRelease);
application.setApplicationReleases(applicationReleases);
} catch (ResourceManagementException e) {
throw new ApplicationManagementException("");
String msg = "Error Occured when uploading artifacts of the application.: " + application.getName();
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (DeviceManagementException e) {
throw new ApplicationManagementException(
"Error occurred while getting device type id of " + application.getType(), e);
String msg = "Error occurred while getting device type id of " + application.getType();
throw new ApplicationManagementException(msg, e);
}
try {
@ -185,14 +185,15 @@ public class ApplicationManagerImpl implements ApplicationManager {
ApplicationList applicationList = applicationDAO.getApplications(filter, tenantId);
if (!applicationList.getApplications().isEmpty()) {
throw new RequestValidatingException(
String msg =
"Already an application registered with same name - " + applicationList.getApplications().get(0)
.getName());
.getName();
log.error(msg);
throw new RequestValidatingException(msg);
}
// Insert to application table
int appId = this.applicationDAO.createApplication(application, tenantId);
if (appId == -1) {
log.error("Application creation is Failed");
ConnectionManagerUtil.rollbackDBTransaction();
@ -201,15 +202,15 @@ public class ApplicationManagerImpl implements ApplicationManager {
if (log.isDebugEnabled()) {
log.debug("New Application entry added to AP_APP table. App Id:" + appId);
}
//adding application unrestricted roles
if (!application.getUnrestrictedRoles().isEmpty()) {
if (!isValidRestrictedRole(application.getUnrestrictedRoles())) {
List<String> unrestrictedRoles = application.getUnrestrictedRoles();
if (!unrestrictedRoles.isEmpty()) {
if (!isValidRestrictedRole(unrestrictedRoles)) {
String msg = "Unrestricted role list contain role/roles which are not in the user store.";
log.error(msg);
throw new ApplicationManagementException(msg);
}
this.visibilityDAO.addUnrestrictedRoles(application.getUnrestrictedRoles(), appId, tenantId);
this.visibilityDAO.addUnrestrictedRoles(unrestrictedRoles, appId, tenantId);
if (log.isDebugEnabled()) {
log.debug("New restricted roles to app ID mapping added to AP_UNRESTRICTED_ROLE table."
+ " App Id:" + appId);
@ -217,34 +218,36 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
List<Category> registeredCatehgories = this.applicationDAO.getAllCategories(tenantId);
String categoryName = application.getAppCategory();
Optional<Category> category = registeredCatehgories.stream().filter(obj -> obj.getCategoryName().equals(categoryName)).findAny();
if (registeredCatehgories.isEmpty() || !registeredCatehgories.contains(application.getAppCategory())) {
if (registeredCatehgories.isEmpty()) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Registered application category set is empty.";
String msg = "Registered application category set is empty category: " + categoryName;
log.error(msg);
throw new ApplicationManagementException(msg);
}
if (!category.isPresent()){
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Request contains invalid category: " + categoryName;
log.error(msg);
throw new ApplicationManagementException(msg);
boolean isValidAppCategory = false;
for (Category category : registeredCatehgories) {
if (category.getCategoryName().equals(application.getAppCategory())) {
isValidAppCategory = true;
break;
}
}
// if (!isValidAppCategory){
// ConnectionManagerUtil.rollbackDBTransaction();
// String msg = "Invalid category type is found. Category: " + application. getAppCategory();
// log.error(msg);
// throw new RequestValidatingException(msg);
// }
/*
In current flow, allow to add one category for an application. If it is required to add multiple
categories DAO layer is implemented to match with that requirement. Hence logic is also implemented
this way.
*/
List<Integer> categoryIds = new ArrayList<>();
categoryIds.add(category.get().getId());
this.applicationDAO.addCategoryMapping(categoryIds,appId,tenantId);
// todo add categories
//adding application tags
if (!application.getTags().isEmpty()) {
List<String> tags = application.getTags();
if (!tags.isEmpty()) {
List<Tag> allRegisteredTags = applicationDAO.getAllTags(tenantId);
List<String> allRegisteredTagNames = new ArrayList<>();
List<Integer> tagIds = new ArrayList<>();
@ -252,17 +255,17 @@ public class ApplicationManagerImpl implements ApplicationManager {
for (Tag tag : allRegisteredTags) {
allRegisteredTagNames.add(tag.getTagName());
}
List<String> newTags = getDifference(application.getTags(), allRegisteredTagNames);
List<String> newTags = getDifference(tags, allRegisteredTagNames);
if (!newTags.isEmpty()) {
this.applicationDAO.addTags(newTags, tenantId);
if (log.isDebugEnabled()) {
log.debug("New tags entry added to AP_APP_TAG table. App Id:" + appId);
}
tagIds = this.applicationDAO.getTagIdsForTagNames(application.getTags(), tenantId);
tagIds = this.applicationDAO.getTagIdsForTagNames(tags, tenantId);
} else {
for (Tag tag : allRegisteredTags) {
for (String tagName : application.getTags()) {
for (String tagName : tags) {
if (tagName.equals(tag.getTagName())) {
tagIds.add(tag.getId());
break;
@ -295,25 +298,36 @@ public class ApplicationManagerImpl implements ApplicationManager {
return application;
} catch (LifeCycleManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"Error occured while adding lifecycle state. application name: " + application.getName()
+ " application type: is " + application.getType(), e);
String msg = "Error occured while adding lifecycle state. application name: " + application.getName()
+ " application type: is " + application.getType();
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
String msg =
"Error occured while adding application or application release. application name: " + application
.getName() + " application type: " + application.getType(), e);
.getName() + " application type: " + application.getType();
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (DBConnectionException e) {
throw new ApplicationManagementException("Error occured while getting database connection. ", e);
String msg = "Error occured while getting database connection.";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (VisibilityManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException(
"Error occured while adding unrestricted roles. application name: " + application.getName()
+ " application type: " + application.getType(), e);
String msg = "Error occured while adding unrestricted roles. application name: " + application.getName()
+ " application type: " + application.getType();
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (TransactionManagementException e) {
throw new ApplicationManagementException("Error occured while disabling AutoCommit. ", e);
String msg = "Error occured while disabling AutoCommit.";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} catch (UserStoreException e) {
throw new ApplicationManagementException("Error occured while disabling AutoCommit. ", e);
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occured when validating the unrestricted roles given for the application";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
@ -1363,7 +1377,6 @@ public class ApplicationManagerImpl implements ApplicationManager {
String releaseType = updateRelease.getReleaseType();
Double price = updateRelease.getPrice();
int isSharedWithTenants = updateRelease.getIsSharedWithAllTenants();
String metaData = updateRelease.getMetaData();
if (price < 0.0 || (price == 0.0 && ApplicationSubscriptionType.PAID.toString().equals(app.getSubType()))
@ -1379,10 +1392,6 @@ public class ApplicationManagerImpl implements ApplicationManager {
if (releaseType != null) {
release.setReleaseType(releaseType);
}
//todo change this when isShared with field change to boolean
if (isSharedWithTenants == 0 || isSharedWithTenants == 1) {
release.setIsSharedWithAllTenants(isSharedWithTenants);
}
if (metaData != null) {
release.setMetaData(metaData);
}
@ -1467,24 +1476,31 @@ public class ApplicationManagerImpl implements ApplicationManager {
String applicationType = application.getType();
if (StringUtils.isEmpty(application.getName())) {
String msg = "";
String msg = "Application name cannot be empty";
log.error(msg);
throw new RequestValidatingException("Application name cannot be empty");
throw new RequestValidatingException(msg);
}
if (StringUtils.isEmpty(application.getAppCategory())) {
throw new RequestValidatingException("Application category can't be empty");
String msg = "Application category can't be empty";
log.error(msg);
throw new RequestValidatingException(msg);
}
if (StringUtils.isEmpty(applicationType)) {
throw new RequestValidatingException("Application type can't be empty");
String msg = "Application type can't be empty";
log.error(msg);
throw new RequestValidatingException(msg);
}
if (StringUtils.isEmpty(application.getDeviceType())) {
throw new RequestValidatingException("Device type can't be empty for the application");
String msg = "Device type can't be empty for the application";
log.error(msg);
throw new RequestValidatingException(msg);
}
isValidApplicationType = isValidAppType(application.getType());
if (!isValidApplicationType) {
throw new RequestValidatingException(
"App Type contains in the application creating payload doesn't match with supported app types");
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<ApplicationRelease> appReleases;
@ -1495,6 +1511,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
"Invalid application creating request. Application creating request must have single application "
+ "release. Application name:" + application.getName() + " and type: " + application
.getType();
log.error(msg);
throw new RequestValidatingException(msg);
}
validateReleaseCreatingRequest(appReleases.get(0), applicationType, binaryFile, iconFile, bannerFile,

@ -39,11 +39,13 @@ import org.wso2.carbon.device.application.mgt.common.exception.RequestValidating
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;
import org.wso2.carbon.device.application.mgt.core.internal.DataHolder;
import org.wso2.carbon.device.application.mgt.core.util.ArtifactsParser;
import org.wso2.carbon.device.application.mgt.core.util.Constants;
import org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil;
import org.xml.sax.SAXException;
import javax.activation.DataHandler;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
import java.text.ParseException;
@ -140,35 +142,35 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
InputStream bannerFileStream;
List<InputStream> screenshotStreams = new ArrayList<>();
List<String> scFileExtensions = new ArrayList<>();
String iconFileExtension;
String bannerFileExtension;
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
DataHandler iconFileDataHandler;
DataHandler bannerFileDataHandler;
String artifactDirectoryPath;
String iconStoredLocation;
String bannerStoredLocation;
String scStoredLocation;
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
try {
iconFileDataHandler = iconFile.getDataHandler();
bannerFileDataHandler = bannerFile.getDataHandler();
iconFileStream = iconFile.getDataHandler().getInputStream();
iconFileExtension = iconFile.getDataHandler().getContentType();
bannerFileExtension = bannerFile.getDataHandler().getContentType();
bannerFileStream = bannerFile.getDataHandler().getInputStream();
iconFileStream = iconFileDataHandler.getInputStream();
bannerFileStream = bannerFileDataHandler.getInputStream();
for (Attachment screenshot : screenshots) {
screenshotStreams.add(screenshot.getDataHandler().getInputStream());
scFileExtensions.add(screenshot.getDataHandler().getContentType());
DataHandler scDataHandler = screenshot.getDataHandler();
screenshotStreams.add(scDataHandler.getInputStream());
scFileExtensions.add(scDataHandler.getName());
}
artifactDirectoryPath = storagePath + applicationRelease.getAppHashValue();
StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath);
iconStoredLocation = artifactDirectoryPath + File.separator + Constants.IMAGE_ARTIFACTS[0] + iconFileExtension;
bannerStoredLocation = artifactDirectoryPath + File.separator + Constants.IMAGE_ARTIFACTS[1] + bannerFileExtension;
if (iconFileStream != null) {
iconStoredLocation = artifactDirectoryPath + File.separator + iconFileDataHandler.getName();
saveFile(iconFileStream, iconStoredLocation);
applicationRelease.setIconLoc(iconStoredLocation);
}
if (bannerFileStream != null) {
bannerStoredLocation = artifactDirectoryPath + File.separator + bannerFileDataHandler.getName();
saveFile(bannerFileStream, bannerStoredLocation);
applicationRelease.setBannerLoc(bannerStoredLocation);
}
@ -178,8 +180,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
}
int count = 0;
for (InputStream screenshotStream : screenshotStreams) {
scStoredLocation = artifactDirectoryPath + File.separator + Constants.IMAGE_ARTIFACTS[2] + count
+ scFileExtensions.get(count);
scStoredLocation = artifactDirectoryPath + File.separator + scFileExtensions.get(count);
count ++;
if (count == 1) {
applicationRelease.setScreenshotLoc1(scStoredLocation);
@ -202,7 +203,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
+ "update the screen-shot count for the application " + applicationRelease.getUuid() +
" for the tenant id " + tenantId, e);
}
}
@Override
@ -298,9 +298,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
throw new ApplicationStorageManagementException(msg);
}
if (log.isDebugEnabled()) {
log.debug("Artifact Directory Path for saving the application release related artifacts related with "
+ "application UUID " + applicationRelease.getUuid() + " is " + artifactDirectoryPath);
@ -329,8 +326,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
Attachment binaryFileAttachment) throws ResourceManagementException, RequestValidatingException{
try {
InputStream binaryFile = binaryFileAttachment.getDataHandler().getInputStream();
String installerExtension = binaryFileAttachment.getDataHandler().getContentType();
if (ApplicationType.WEB_CLIP.toString().equals(appType)) {
applicationRelease.setVersion(Constants.DEFAULT_VERSION);
UrlValidator urlValidator = new UrlValidator();
@ -346,6 +341,9 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
String artifactDirectoryPath;
String md5OfApp;
String artifactPath;
DataHandler binaryDataHandler = binaryFileAttachment.getDataHandler();
String fileName = binaryDataHandler.getName();
InputStream binaryFile = binaryDataHandler.getInputStream();
InputStream[] cloneInputStream = cloneInputStream(binaryFile);
md5OfApp = getMD5(binaryFile);
if (md5OfApp == null) {
@ -375,12 +373,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
throw new ApplicationStorageManagementException(msg);
}
artifactPath = artifactDirectoryPath + File.separator + Constants.RELEASE_ARTIFACT
+ installerExtension;
artifactPath = artifactDirectoryPath + File.separator + fileName;
if (log.isDebugEnabled()) {
log.debug("Artifact Directory Path for saving the application release related artifacts related with "
+ "application UUID " + applicationRelease.getUuid() + " is " + artifactDirectoryPath);
@ -403,7 +396,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager
throw new ApplicationStorageManagementException(msg, e);
}
return applicationRelease;
}
private InputStream[] cloneInputStream(InputStream inputStream) throws ApplicationStorageManagementException {

@ -133,7 +133,7 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@Multipart("screenshot3") Attachment screenshot3) {
ApplicationManager applicationManager = APIUtil.getApplicationManager();
List<Attachment> attachmentList = new ArrayList<>();
if (screenshot1 != null){
if (screenshot1 != null) {
attachmentList.add(screenshot1);
}
if (screenshot2 != null) {
@ -158,20 +158,7 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
String msg = "Error occurred while creating the application";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
// catch (ResourceManagementException e) {
// String msg =
// "Error occurred while uploading the releases artifacts of the application " + application.getName();
// log.error(msg, e);
// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
// } catch (IOException e) {
// String msg =
// "Error while uploading binary file and resources for the application release of the application "
// + application.getName();
// log.error(msg, e);
// return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
// }
catch (RequestValidatingException e) {
} catch (RequestValidatingException e) {
String msg = "Error occurred while handling the application creating request";
log.error(msg, e);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();

@ -145,6 +145,9 @@
<bundleDef>
commons-validator:commons-validator:${commons-validator.version}
</bundleDef>
<!--<bundleDef>-->
<!--org.apache.cxf:cxf-rt-frontend-jaxrs:${cxf.version}-->
<!--</bundleDef>-->
<!--<bundleDef>javax.servlet.jsp:javax.servlet.jsp-api</bundleDef>-->
<!--<bundleDef>org.wso2.orbit.org.scannotation:scannotation:${scannotation.version}</bundleDef>-->
</bundles>

@ -35,25 +35,23 @@ CREATE TABLE IF NOT EXISTS APP_MANAGER.AP_APP_RELEASE(
TENANT_ID varchar(45) NOT NULL,
UUID varchar(200) NOT NULL,
RELEASE_TYPE varchar(45) NOT NULL,
PACKAGE_NAME varchar(45) NOT NULL,
APP_PRICE decimal(6, 2) NULL DEFAULT NULL,
STORED_LOCATION varchar(45) NOT NULL,
BANNER_LOCATION varchar(45) NOT NULL,
SC_1_LOCATION varchar(45) NOT NULL,
SC_2_LOCATION varchar(45) NULL DEFAULT NULL,
SC_3_LOCATION varchar(45) NULL DEFAULT NULL,
STORED_LOCATION varchar(100) NOT NULL,
ICON_LOCATION varchar(100) NOT NULL,
BANNER_LOCATION varchar(100) NOT NULL,
SC_1_LOCATION varchar(100) NOT NULL,
SC_2_LOCATION varchar(100) NULL DEFAULT NULL,
SC_3_LOCATION varchar(100) NULL DEFAULT NULL,
APP_HASH_VALUE varchar(1000) NOT NULL,
SHARED_WITH_ALL_TENANTS tinyint NULL DEFAULT NULL,
SHARED_WITH_ALL_TENANTS tinyint NOT NULL,
APP_META_INFO clob NULL DEFAULT NULL,
PACKAGE_NAME varchar(45) NOT NULL,
SUPPORTED_OS_VERSIONS varchar(45) NULL,
SUPPORTED_OS_VERSIONS varchar(45) NOT NULL,
RATING double NULL DEFAULT NULL,
CURRENT_STATE varchar(45) NULL,
CURRENT_STATE varchar(45) NOT NULL,
RATED_USERS int NULL,
AP_APP_ID int NOT NULL,
PRIMARY KEY (
ID,
AP_APP_ID
),
PRIMARY KEY (ID),
CONSTRAINT fk_AP_APP_RELEASE_AP_APP1
FOREIGN KEY (AP_APP_ID)
REFERENCES APP_MANAGER.AP_APP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION,

@ -49,22 +49,23 @@ CREATE TABLE IF NOT EXISTS `APP_MANAGER`.`AP_APP_RELEASE` (
`TENANT_ID` VARCHAR(45) NOT NULL,
`UUID` VARCHAR(200) NOT NULL,
`RELEASE_TYPE` VARCHAR(45) NOT NULL,
`PACKAGE_NAME` VARCHAR(45) NOT NULL,
`APP_PRICE` DECIMAL(6,2) NULL DEFAULT NULL,
`STORED_LOCATION` VARCHAR(45) NOT NULL,
`BANNER_LOCATION` VARCHAR(45) NOT NULL,
`SC_1_LOCATION` VARCHAR(45) NOT NULL,
`SC_2_LOCATION` VARCHAR(45) NULL DEFAULT NULL,
`SC_3_LOCATION` VARCHAR(45) NULL DEFAULT NULL,
`STORED_LOCATION` VARCHAR(100) NOT NULL,
`ICON_LOCATION` VARCHAR(100) NOT NULL,
`BANNER_LOCATION` VARCHAR(100) NOT NULL,
`SC_1_LOCATION` VARCHAR(100) NOT NULL,
`SC_2_LOCATION` VARCHAR(100) NULL DEFAULT NULL,
`SC_3_LOCATION` VARCHAR(100) NULL DEFAULT NULL,
`APP_HASH_VALUE` VARCHAR(1000) NOT NULL,
`SHARED_WITH_ALL_TENANTS` TINYINT(1) NULL DEFAULT NULL,
`SHARED_WITH_ALL_TENANTS` TINYINT(1) NOT NULL,
`APP_META_INFO` TEXT NULL DEFAULT NULL,
`PACKAGE_NAME` VARCHAR(45) NOT NULL,
`SUPPORTED_OS_VERSIONS` VARCHAR(45) NULL,
`SUPPORTED_OS_VERSIONS` VARCHAR(45) NOT NULL,
`RATING` DOUBLE NULL DEFAULT NULL,
`CURRENT_STATE` VARCHAR(45) NULL,
`CURRENT_STATE` VARCHAR(45) NOT NULL,
`RATED_USERS` INT(11) NULL,
`AP_APP_ID` INT(11) NOT NULL,
PRIMARY KEY (`ID`, `AP_APP_ID`),
PRIMARY KEY (`ID`),
INDEX `fk_AP_APP_RELEASE_AP_APP1_idx` (`AP_APP_ID` ASC),
CONSTRAINT `fk_AP_APP_RELEASE_AP_APP1`
FOREIGN KEY (`AP_APP_ID`)

Loading…
Cancel
Save