Improve app managing functionalties and refactor the source

feature/appm-store/pbac
lasanthaDLPDS 6 years ago
parent 9379c2ae47
commit 1cce5d7e34

@ -38,7 +38,7 @@ public class Application {
private String type;
private int isFree;
private String subType;
private String paymentCurrency;
@ -105,12 +105,12 @@ public class Application {
this.type = type;
}
public int getIsFree() {
return isFree;
public String getSubType() {
return subType;
}
public void setIsFree(int isFree) {
this.isFree = isFree;
public void setSubType(String subType) {
this.subType = subType;
}
public String getPaymentCurrency() {

@ -84,6 +84,8 @@ public class ApplicationRelease {
private String url;
private boolean isPublishedRelease;
public int getNoOfRatedUsers() {
return noOfRatedUsers;
}
@ -299,4 +301,12 @@ public class ApplicationRelease {
public void setUrl(String url) {
this.url = url;
}
public boolean isPublishedRelease() {
return isPublishedRelease;
}
public void setPublishedRelease(boolean publishedRelease) {
isPublishedRelease = publishedRelease;
}
}

@ -68,7 +68,8 @@ public class Util {
application.setName(rs.getString("APP_NAME"));
application.setType(rs.getString("APP_TYPE"));
application.setAppCategory(rs.getString("APP_CATEGORY"));
application.setIsFree(rs.getInt("IS_FREE"));
application.setSubType(rs.getString("SUB_TYPE"));
application.setPaymentCurrency(rs.getString("CURRENCY"));
application.setIsRestricted(rs.getInt("RESTRICTED"));
List<Tag> tags = new ArrayList<>();
@ -127,7 +128,8 @@ public class Util {
application.setName(rs.getString("APP_NAME"));
application.setType(rs.getString("APP_TYPE"));
application.setAppCategory(rs.getString("APP_CATEGORY"));
application.setIsFree(rs.getInt("IS_FREE"));
application.setSubType(rs.getString("SUB_TYPE"));
application.setPaymentCurrency(rs.getString("CURRENCY"));
application.setIsRestricted(rs.getInt("RESTRICTED"));
}

@ -66,12 +66,12 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
try {
conn = this.getDBConnection();
stmt = conn.prepareStatement("INSERT INTO AP_APP (NAME, TYPE, APP_CATEGORY, "
+ "IS_FREE, PAYMENT_CURRENCY, RESTRICTED, TENANT_ID) VALUES "
+ "SUB_TYPE, PAYMENT_CURRENCY, RESTRICTED, TENANT_ID) VALUES "
+ "(?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, application.getName());
stmt.setString(2, application.getType());
stmt.setString(3, application.getAppCategory());
stmt.setInt(4, application.getIsFree());
stmt.setString(4, application.getSubType());
stmt.setString(5, application.getPaymentCurrency());
stmt.setInt(6, application.getIsRestricted());
stmt.setInt(7, application.getUser().getTenantId());
@ -133,7 +133,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
log.debug("Getting application data from the database");
log.debug(String.format("Filter: limit=%s, offset=%s", filter.getLimit(), filter.getOffset()));
}
int paramIndex = 1;
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
@ -141,8 +141,8 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
Pagination pagination = new Pagination();
String sql = "SELECT AP_APP.ID AS APP_ID, AP_APP.NAME AS APP_NAME, AP_APP.TYPE AS APP_TYPE, AP_APP.APP_CATEGORY"
+
" AS APP_CATEGORY, AP_APP.IS_FREE, AP_APP.RESTRICTED, AP_APP_TAG.TAG AS APP_TAG, " +
"AP_UNRESTRICTED_ROLES.ROLE "
" AS APP_CATEGORY, AP_APP.SUB_TYPE AS SUB_TYPE, AP_APP.CURRENCY AS CURRENCY, "
+ "AP_APP.RESTRICTED, AP_APP_TAG.TAG AS APP_TAG, AP_UNRESTRICTED_ROLES.ROLE "
+ "AS APP_UNRESTRICTED_ROLES FROM ((AP_APP LEFT JOIN AP_APP_TAG ON AP_APP.ID = AP_APP_TAG.AP_APP_ID) "
+ "LEFT JOIN AP_UNRESTRICTED_ROLES ON AP_APP.ID = AP_UNRESTRICTED_ROLES.AP_APP_ID) "
+ "WHERE AP_APP.TENANT_ID = ? AND AP_APP.STATUS != ?";
@ -165,7 +165,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
}
}
sql += " LIMIT ? OFFSET ? ORDER BY " + filter.getSortBy() + " APP_ID";
sql += " LIMIT ? OFFSET ? ORDER BY " + filter.getSortBy() + " APP_ID;";
pagination.setLimit(filter.getLimit());
pagination.setOffset(filter.getOffset());
@ -173,22 +173,22 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
try {
conn = this.getDBConnection();
stmt = conn.prepareStatement(sql);
stmt.setInt(1, tenantId);
stmt.setString(2, AppLifecycleState.REMOVED.toString());
stmt.setInt(paramIndex, tenantId);
stmt.setString(paramIndex++, AppLifecycleState.REMOVED.toString());
if (filter.getAppType() != null) {
stmt.setString(3, filter.getAppType());
stmt.setString(paramIndex++, filter.getAppType());
}
if (filter.getAppName() != null) {
if (filter.isFullMatch()) {
stmt.setString(4, filter.getAppName().toLowerCase());
stmt.setString(paramIndex++, filter.getAppName().toLowerCase());
} else {
stmt.setString(4, "%" + filter.getAppName().toLowerCase() + "%");
stmt.setString(paramIndex++, "%" + filter.getAppName().toLowerCase() + "%");
}
}
stmt.setInt(5, filter.getLimit());
stmt.setInt(6, filter.getOffset());
stmt.setInt(paramIndex++, filter.getLimit());
stmt.setInt(paramIndex, filter.getOffset());
rs = stmt.executeQuery();
applicationList.setApplications(Util.loadApplications(rs));
applicationList.setPagination(pagination);
@ -251,7 +251,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
log.debug("Getting application count from the database");
log.debug(String.format("Filter: limit=%s, offset=%s", filter.getLimit(), filter.getOffset()));
}
int paramIndex = 1;
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
@ -272,9 +272,9 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
sql += ";";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, tenantId);
stmt.setInt(paramIndex++, tenantId);
if (filter.getAppName() != null) {
stmt.setString(2, "%" + filter.getAppName().toLowerCase() + "%");
stmt.setString(paramIndex, "%" + filter.getAppName().toLowerCase() + "%");
}
rs = stmt.executeQuery();
if (rs.next()) {
@ -304,9 +304,10 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
conn = this.getDBConnection();
String sql =
"SELECT AP_APP.ID AS APP_ID, AP_APP.NAME AS APP_NAME, AP_APP.TYPE AS APP_TYPE, AP_APP.APP_CATEGORY "
+ "AS APP_CATEGORY, AP_APP.IS_FREE AS IS_FREE, AP_APP.RESTRICTED AS RESTRICTED, " +
"AP_APP_TAG.TAG AS APP_TAG, AP_UNRESTRICTED_ROLES.ROLE AS ROLE FROM AP_APP, AP_APP_TAG, " +
"AP_UNRESTRICTED_ROLES WHERE AP_APP.NAME=? AND AP_APP.TYPE= ? AND AP_APP.TENANT_ID=?;";
+ "AS APP_CATEGORY, AP_APP.SUB_TYPE AS SUB_TYPE ,AP_APP.CURRENCY AS CURRENCY,"
+ " AP_APP.RESTRICTED AS RESTRICTED, AP_APP_TAG.TAG AS APP_TAG, AP_UNRESTRICTED_ROLES.ROLE "
+ "AS ROLE FROM AP_APP, AP_APP_TAG, AP_UNRESTRICTED_ROLES WHERE AP_APP.NAME=? AND "
+ "AP_APP.TYPE= ? AND AP_APP.TENANT_ID=?;";
stmt = conn.prepareStatement(sql);
stmt.setString(1, appName);
@ -347,9 +348,10 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
conn = this.getDBConnection();
String sql =
"SELECT AP_APP.ID AS APP_ID, AP_APP.NAME AS APP_NAME, AP_APP.TYPE AS APP_TYPE, AP_APP.APP_CATEGORY "
+ "AS APP_CATEGORY, AP_APP.IS_FREE AS IS_FREE, AP_APP.RESTRICTED AS RESTRICTED, AP_APP_TAG"
+ ".TAG AS APP_TAG, AP_UNRESTRICTED_ROLES.ROLE AS ROLE FROM AP_APP, AP_APP_TAG, " +
"AP_UNRESTRICTED_ROLES WHERE AP_APP.ID=? AND AP_APP.TENANT_ID=?;";
+ "AS APP_CATEGORY, AP_APP.SUB_TYPE AS SUB_TYPE ,AP_APP.CURRENCY AS CURRENCY, "
+ "AP_APP.RESTRICTED AS RESTRICTED, AP_APP_TAG.TAG AS APP_TAG, AP_UNRESTRICTED_ROLES.ROLE "
+ "AS ROLE FROM AP_APP, AP_APP_TAG, AP_UNRESTRICTED_ROLES WHERE AP_APP.ID=? AND "
+ "AP_APP.TENANT_ID=?;";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, applicationId);
@ -389,8 +391,9 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
conn = this.getDBConnection();
String sql =
"SELECT AP_APP.ID AS APP_ID, AP_APP.NAME AS APP_NAME, AP_APP.TYPE AS APP_TYPE, AP_APP.APP_CATEGORY "
+ "AS APP_CATEGORY, AP_APP.IS_FREE, AP_APP_TAG.TAG, AP_UNRESTRICTED_ROLES.ROLE AS RELESE_ID"
+ " FROM AP_APP, AP_APP_TAG, AP_UNRESTRICTED_ROLES WHERE AP_APP.ID = ?;";
+ "AS APP_CATEGORY, AP_APP.SUB_TYPE AS SUB_TYPE, AP_APP_TAG.TAG AS TAG, "
+ "AP_UNRESTRICTED_ROLES.ROLE AS ROLE FROM AP_APP, AP_APP_TAG, AP_UNRESTRICTED_ROLES "
+ "WHERE AP_APP.ID = ?;";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, appId);
@ -419,6 +422,7 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
@Override
public Application editApplication(Application application, int tenantId) throws ApplicationManagementException {
int paramIndex = 1;
Connection conn;
PreparedStatement stmt = null;
Application existingApplication = this.getApplication(application.getName(), application.getType(), tenantId);
@ -443,31 +447,30 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
if (application.getIsRestricted() != existingApplication.getIsRestricted()) {
sql += "RESTRICTED = ? ";
}
if (application.getIsFree() != existingApplication.getIsFree()) {
sql += "IS_FREE = ? ";
if (!application.getSubType().equals(existingApplication.getSubType())) {
sql += "SUB_TYPE = ? ";
}
sql += "WHERE ID = ?";
stmt = conn.prepareStatement(sql);
if (application.getName() != null && !application.getName().equals(existingApplication.getName())) {
stmt.setString(1, application.getName());
stmt.setString(paramIndex++, application.getName());
}
if (application.getType() != null && !application.getType().equals(existingApplication.getType())) {
stmt.setString(2, application.getType());
stmt.setString(paramIndex++, application.getType());
}
if (application.getAppCategory() != null && !application.getAppCategory().equals(
existingApplication.getAppCategory())) {
stmt.setString(3, application.getAppCategory());
stmt.setString(paramIndex++, application.getAppCategory());
}
if (application.getIsRestricted() != existingApplication.getIsRestricted()) {
stmt.setInt(4, application.getIsRestricted());
stmt.setInt(paramIndex++, application.getIsRestricted());
}
if (application.getIsFree() != existingApplication.getIsFree()) {
stmt.setInt(5, application.getIsFree());
if (!application.getSubType().equals(existingApplication.getSubType())) {
stmt.setString(paramIndex++, application.getSubType());
}
stmt.setInt(6, application.getId());
stmt.setInt(paramIndex, application.getId());
stmt.executeUpdate();
return application;
} catch (DBConnectionException e) {
@ -580,8 +583,8 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "AP_APP_RELEASE.CREATED_AT, AP_APP_RELEASE.PUBLISHED_BY, AP_APP_RELEASE.PUBLISHED_AT, "
+ "AP_APP_RELEASE.STARS,"
+ "AP_APP.ID AS APP_ID, AP_APP.NAME AS APP_NAME, AP_APP.TYPE AS APP_TYPE, "
+ "AP_APP.APP_CATEGORY AS APP_CATEGORY, AP_APP.IS_FREE, AP_UNRESTRICTED_ROLES.ROLE AS ROLE "
+ "FROM AP_APP, AP_UNRESTRICTED_ROLES, AP_APP_RELEASE "
+ "AP_APP.APP_CATEGORY AS APP_CATEGORY, AP_APP.SUB_TYPE AS SUB_TYPE, AP_APP.CURRENCY AS CURRENCY, "
+ "AP_UNRESTRICTED_ROLES.ROLE AS ROLE FROM AP_APP, AP_UNRESTRICTED_ROLES, AP_APP_RELEASE "
+ "WHERE AP_APP_RELEASE.UUID=? AND AP_APP.TENANT_ID=?;";
stmt = conn.prepareStatement(sql);
@ -602,7 +605,8 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
application.setName(rs.getString("APP_NAME"));
application.setType(rs.getString("APP_TYPE"));
application.setAppCategory(rs.getString("APP_CATEGORY"));
application.setIsFree(rs.getInt("IS_FREE"));
application.setSubType(rs.getString("SUB_TYPE"));
application.setPaymentCurrency(rs.getString("CURRENCY"));
application.setIsRestricted(rs.getInt("RESTRICTED"));
UnrestrictedRole unrestrictedRole = new UnrestrictedRole();

@ -43,85 +43,5 @@ public class OracleApplicationDAOImpl extends GenericApplicationDAOImpl {
private static final Log log = LogFactory.getLog(OracleApplicationDAOImpl.class);
@Override
public ApplicationList getApplications(Filter filter, int tenantId) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Getting application data from the database");
log.debug(String.format("Filter: limit=%s, offset=%s", filter.getLimit(), filter.getOffset()));
}
Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
ApplicationList applicationList = new ApplicationList();
Pagination pagination = new Pagination();
String sql = "SELECT AP_APP.ID AS APP_ID, AP_APP.NAME AS APP_NAME, AP_APP.TYPE AS APP_TYPE, AP_APP.APP_CATEGORY"
+ " AS APP_CATEGORY, AP_APP.IS_FREE, AP_APP.RESTRICTED, AP_APP_TAG.TAG AS APP_TAG, " +
"AP_UNRESTRICTED_ROLES.ROLE AS APP_UNRESTRICTED_ROLES FROM ((AP_APP LEFT JOIN AP_APP_TAG ON " +
"AP_APP.ID = AP_APP_TAG.AP_APP_ID) LEFT JOIN AP_UNRESTRICTED_ROLES ON " +
"AP_APP.ID = AP_UNRESTRICTED_ROLES.AP_APP_ID) WHERE AP_APP.TENANT_ID = ? AND AP_APP.STATUS != ?";
if (filter == null) {
throw new ApplicationManagementDAOException("Filter need to be instantiated");
}
if (filter.getAppType() != null) {
sql += " AND AP_APP.TYPE ";
sql += "= ?";
}
if (filter.getAppName() != null) {
sql += " AND LOWER (AP_APP.NAME) ";
if (filter.isFullMatch()) {
sql += "= ?";
} else {
sql += "LIKE ?";
}
}
sql += " AND rownum <= ? OFFSET ? " + filter.getSortBy() + " APP_ID";
pagination.setLimit(filter.getLimit());
pagination.setOffset(filter.getOffset());
try {
conn = this.getDBConnection();
stmt = conn.prepareStatement(sql);
stmt.setInt(1, tenantId);
stmt.setString(2, AppLifecycleState.REMOVED.toString());
if (filter.getAppType() != null) {
stmt.setString(3, filter.getAppType());
}
if (filter.getAppName() != null) {
if (filter.isFullMatch()) {
stmt.setString(4, filter.getAppName().toLowerCase());
} else {
stmt.setString(4, "%" + filter.getAppName().toLowerCase() + "%");
}
}
stmt.setInt(5, filter.getLimit());
stmt.setInt(6, filter.getOffset());
rs = stmt.executeQuery();
applicationList.setApplications(Util.loadApplications(rs));
applicationList.setPagination(pagination);
applicationList.getPagination().setSize(filter.getOffset());
applicationList.getPagination().setCount(applicationList.getApplications().size());
} catch (SQLException e) {
throw new ApplicationManagementDAOException("Error occurred while getting application list for the tenant"
+ " " + tenantId + ". While executing " + sql, e);
} catch (DBConnectionException e) {
throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection while "
+ "getting application list for the tenant " + tenantId,
e);
} catch (JSONException e) {
throw new ApplicationManagementDAOException("Error occurred while parsing JSON ", e);
} finally {
Util.cleanupResources(stmt, rs);
}
return applicationList;
}
}

@ -108,7 +108,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
application.setDevicetype(deviceType);
int appId = this.applicationDAO.createApplication(application, deviceType.getId());
if (appId != -1) {
if (appId == -1) {
log.error("Application creation Failed");
ConnectionManagerUtil.rollbackDBTransaction();
return null;
@ -350,6 +350,10 @@ public class ApplicationManagerImpl implements ApplicationManager {
applicationReleases = ApplicationManagementDAOFactory.getApplicationReleaseDAO()
.getReleases(application.getName(), application.getType(), tenantId);
for (ApplicationRelease applicationRelease : applicationReleases) {
if (AppLifecycleState.PUBLISHED.toString().equals(ApplicationManagementDAOFactory.getLifecycleStateDAO().
getLatestLifeCycleStateByReleaseID(applicationRelease.getId()).getCurrentState())){
applicationRelease.setPublishedRelease(true);
}
if (!AppLifecycleState.REMOVED.toString().equals(ApplicationManagementDAOFactory.getLifecycleStateDAO().
getLatestLifeCycleStateByReleaseID(applicationRelease.getId()).getCurrentState())) {
filteredApplicationReleases.add(applicationRelease);
@ -834,14 +838,14 @@ public class ApplicationManagerImpl implements ApplicationManager {
"please remove this application and publish " +
"new application with type: " + application.getType());
}
if (existingApplication.getIsFree() != application.getIsFree()) {
if (existingApplication.getIsFree() == 1) {
if (existingApplication.getSubType() != application.getSubType()) {
if ("PAID".equals(existingApplication.getSubType())) {
if (application.getPaymentCurrency() != null || !application.getPaymentCurrency().equals("")) {
throw new ApplicationManagementException("If you are going to change Non-Free app as Free app, " +
"currency attribute in the application updating " +
"payload should be null or \"\"");
}
} else if (existingApplication.getIsFree() == 0) {
} else if ("FREE".equals(existingApplication.getSubType())) {
if (application.getPaymentCurrency() == null || application.getPaymentCurrency().equals("")) {
throw new ApplicationManagementException("If you are going to change Free app as Non-Free app, " +
"currency attribute in the application payload " +
@ -903,7 +907,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
return null;
}
if (filter.getAppType() != null) {
Boolean isValidRequest = false;
boolean isValidRequest = false;
for (ApplicationType applicationType : ApplicationType.values()) {
if (applicationType.toString().equals(filter.getAppType())) {
isValidRequest = true;

@ -39,7 +39,6 @@ public class APIUtil {
private static SubscriptionManager subscriptionManager;
private static UnrestrictedRoleManager unrestrictedRoleManager;
public static ApplicationManager getApplicationManager() {
if (applicationManager == null) {
synchronized (APIUtil.class) {
@ -55,7 +54,6 @@ public class APIUtil {
}
}
}
return applicationManager;
}

@ -222,9 +222,13 @@ public interface ApplicationManagementAPI {
@ApiResponses(
value = {
@ApiResponse(
code = 201,
code = 200,
message = "OK. \n Successfully edited the application.",
response = Application.class),
@ApiResponse(
code = 400,
message = "Bad Request. \n " +
"Application updating payload contains unacceptable or vulnerable data"),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while editing the application.",
@ -235,7 +239,8 @@ public interface ApplicationManagementAPI {
name = "application",
value = "The application that need to be edited.",
required = true)
@Valid Application application);
@Valid Application application
);
@POST
@Produces(MediaType.APPLICATION_JSON)
@ -265,7 +270,7 @@ public interface ApplicationManagementAPI {
"Application creating payload contains unacceptable or vulnerable data"),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while getting the application list.",
message = "Internal Server Error. \n Error occurred while creating the application.",
response = ErrorResponse.class)
})
Response createApplication(
@ -297,7 +302,8 @@ public interface ApplicationManagementAPI {
name = "screenshot",
value = "Screen Shots of the uploading application",
required = true)
@Multipart(value = "screenshot") List<Attachment> attachmentList);
@Multipart(value = "screenshot") List<Attachment> attachmentList
);
@DELETE
@Consumes("application/json")
@ -331,7 +337,8 @@ public interface ApplicationManagementAPI {
name = "UUID",
value = "Unique identifier of the Application",
required = true)
@PathParam("appid") int applicationId);
@PathParam("appid") int applicationId
);
@POST
@Path("/image-artifacts/{appId}/{uuid}")
@ -353,8 +360,15 @@ public interface ApplicationManagementAPI {
@ApiResponses(
value = {
@ApiResponse(
code = 201,
message = "OK. \n Successfully uploaded artifacts."),
code = 200,
message = "OK. \n Successfully updated artifacts."),
@ApiResponse(
code = 403,
message = "FORBIDDEN. \n Can't Update the application release in PUBLISHED or DEPRECATED "
+ "state. Hence please demote the application and update the application release"),
@ApiResponse(
code = 404,
message = "NOT FOUND. \n Error occurred while updating the application."),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while getting the application list.",
@ -367,10 +381,11 @@ public interface ApplicationManagementAPI {
@PathParam("uuid") String applicationUUID,
@Multipart(value = "icon") Attachment iconFile,
@Multipart(value = "banner") Attachment bannerFile,
@Multipart(value = "screenshot") List<Attachment> screenshots);
@Multipart(value = "screenshot") List<Attachment> screenshots
);
@PUT
@Path("/app-artifacts/{appId}/{uuid}")
@Path("/app-artifacts/{appType}/{appId}/{uuid}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
@ApiOperation(
@ -391,6 +406,10 @@ public interface ApplicationManagementAPI {
@ApiResponse(
code = 201,
message = "OK. \n Successfully uploaded artifacts."),
@ApiResponse(
code = 400,
message = "Bad Request. \n " +
"Application artifact updating payload contains unacceptable or vulnerable data"),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while getting the application list.",
@ -399,11 +418,12 @@ public interface ApplicationManagementAPI {
Response updateApplicationArtifact(
@ApiParam(name = "appType", value = "Type of the application i.e Android, IOS etc", required = true)
@PathParam("appType") String appType,
@ApiParam(name = "id", value = "Id of the application", required = true)
@PathParam("uuid") int applicationId,
@ApiParam(name = "appId", value = "Id of the application", required = true)
@PathParam("appId") int applicationId,
@ApiParam(name = "uuid", value = "UUID of the application", required = true)
@PathParam("uuid") String applicationUUID,
@Multipart("binaryFile") Attachment binaryFile);
@Multipart("binaryFile") Attachment binaryFile
);
@PUT
@Path("/{appId}/{uuid}")
@ -428,6 +448,10 @@ public interface ApplicationManagementAPI {
code = 201,
message = "OK. \n Successfully created an application release.",
response = ApplicationRelease.class),
@ApiResponse(
code = 400,
message = "Bad Request. \n " +
"Application release updating payload contains unacceptable or vulnerable data"),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while releasing the application.",
@ -495,11 +519,6 @@ public interface ApplicationManagementAPI {
code = 201,
message = "OK. \n Successfully add a lifecycle state.",
response = Application.class),
@ApiResponse(
code = 304,
message = "Not Modified. \n " +
"Empty body because the client already has the latest version of the requested "
+ "resource."),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred adding a lifecycle state.",

@ -79,7 +79,7 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
} 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).build();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
@ -120,33 +120,15 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
List<InputStream> attachments = new ArrayList<>();
List<ApplicationRelease> applicationReleases = new ArrayList<>();
try {
if (iconFile == null) {
log.error("Icon file is not uploaded for the application release of " + application.getName() +
" of application type " + application.getType());
return Response.status(Response.Status.BAD_REQUEST).build();
}
if (bannerFile == null) {
log.error("Banner file is not uploaded for the application release of " + application.getName() +
" of application type " + application.getType());
return Response.status(Response.Status.BAD_REQUEST).build();
}
if (attachmentList == null || attachmentList.isEmpty()) {
log.error("Screenshots are not uploaded for the application release of " + application.getName() +
" of application type " + application.getType());
if (!isValidAppCreatingRequest(binaryFile, iconFile, bannerFile, attachmentList, application)) {
return Response.status(Response.Status.BAD_REQUEST).build();
}
if (binaryFile == null && !ApplicationType.WEB_CLIP.toString().equals(application.getType())) {
log.error("Binary file is not uploaded for the application release of " + application.getName() +
" of application type " + application.getType());
return Response.status(Response.Status.BAD_REQUEST).build();
}else if(binaryFile == null && ApplicationType.WEB_CLIP.toString().equals(application.getType())){
applicationRelease = applicationStorageManager.uploadReleaseArtifact(applicationRelease, application.getType(),
null);
}else if (binaryFile != null && !ApplicationType.WEB_CLIP.toString().equals(application.getType())){
applicationRelease = applicationStorageManager.uploadReleaseArtifact(applicationRelease, application.getType(),
} else if (binaryFile == null && ApplicationType.WEB_CLIP.toString().equals(application.getType())) {
applicationRelease = applicationStorageManager
.uploadReleaseArtifact(applicationRelease, application.getType(), null);
} else if (binaryFile != null && !ApplicationType.WEB_CLIP.toString().equals(application.getType())) {
applicationRelease = applicationStorageManager
.uploadReleaseArtifact(applicationRelease, application.getType(),
binaryFile.getDataHandler().getInputStream());
}
@ -240,13 +222,13 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
log.error(msg, e);
return APIUtil.getResponse(e, Response.Status.NOT_FOUND);
} catch (ApplicationManagementException e) {
String msg = "Error occurred while updating the application";
String msg = "Error occurred while updating the application.";
log.error(msg, e);
return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR);
} catch (IOException e) {
log.error("Exception while trying to read icon, banner files for the application " + applicationUuid);
return APIUtil.getResponse(new ApplicationManagementException(
"Exception while trying to read icon, " + "banner files for the application " + applicationUuid, e),
String msg = "Exception while trying to read icon, banner files for the application " + applicationUuid;
log.error(msg);
return APIUtil.getResponse(new ApplicationManagementException(msg, e),
Response.Status.INTERNAL_SERVER_ERROR);
} catch (ResourceManagementException e) {
log.error("Error occurred while uploading the image artifacts of the application with the uuid "
@ -278,11 +260,12 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
binaryFile.getDataHandler().getInputStream());
applicationManager.updateRelease(applicationId, applicationRelease);
return Response.status(Response.Status.OK)
.entity("Successfully uploaded artifacts for the application " + applicationUuid).build();
.entity("Successfully uploaded artifacts for the application release. UUID is " + applicationUuid).build();
} catch (IOException e) {
log.error("Exception while trying to read icon, banner files for the application " + applicationUuid);
return APIUtil.getResponse(new ApplicationManagementException(
"Exception while trying to read icon, banner files for the application " + applicationUuid, e),
String msg =
"Exception while trying to read icon, banner files for the application release" + applicationUuid;
log.error(msg);
return APIUtil.getResponse(new ApplicationManagementException(msg, e),
Response.Status.BAD_REQUEST);
} catch (ResourceManagementException e) {
log.error("Error occurred while uploading the image artifacts of the application with the uuid "
@ -453,4 +436,32 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
return Response.status(Response.Status.CREATED).entity("Lifecycle state added successfully.").build();
}
private boolean isValidAppCreatingRequest(Attachment binaryFile, Attachment iconFile, Attachment bannerFile,
List<Attachment> attachmentList, Application application){
if (iconFile == null) {
log.error("Icon file is not found for the application release. Application name: " +
application.getName() + " and type: " + application.getType());
return false;
}
if (bannerFile == null) {
log.error("Banner file is not found for the application release. Application name: " +
application.getName() + " and application type: " + application.getType());
return false;
}
if (attachmentList == null || attachmentList.isEmpty()) {
log.error("Screenshots are not found for the application release. Application name: " +
application.getName() + " Application type: " + application.getType());
return false;
}
if (binaryFile == null && !ApplicationType.WEB_CLIP.toString().equals(application.getType())) {
log.error("Binary file is not found for the application release. Application name: "
+ application.getName() + " Application type: " + application.getType());
return false;
}
return true;
}
}

@ -32,6 +32,7 @@ import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.wso2.carbon.apimgt.annotations.api.Scope;
import org.wso2.carbon.apimgt.annotations.api.Scopes;
import org.wso2.carbon.device.application.mgt.common.Filter;
import org.wso2.carbon.device.application.mgt.publisher.api.beans.ErrorResponse;
import org.wso2.carbon.device.application.mgt.common.Application;
import org.wso2.carbon.device.application.mgt.common.ApplicationList;
@ -159,9 +160,10 @@ public interface ApplicationManagementAPI {
})
Response getApplications(
@ApiParam(
name = "searchQuery",
value = "Relevant search query to search on", defaultValue = "*")
@QueryParam("query") String searchQuery,
name = "filter",
value = "Filter to get application list",
required = true)
@Valid Filter filter,
@ApiParam(
name = "offset",
value = "Provide from which position apps should return", defaultValue = "20")
@ -217,35 +219,5 @@ public interface ApplicationManagementAPI {
@QueryParam("appName") String appName
);
@GET
@Path("/release/{uuid}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
httpMethod = "GET",
value = "Get all the releases or specific release of an application",
notes = "This will retrieve the all the releases or specific release of an application",
tags = "Application Management",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:application:get")
})
}
)
@ApiResponses(
value = {
@ApiResponse(
code = 200,
message = "OK. \n Successfully retrieved the Application release."),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while releasing the application.",
response = ErrorResponse.class)
})
Response getApplicationRelease(
@ApiParam(name = "ID", value = "Identifier of the Application", required = true) @PathParam("uuid") String applicationUUID,
@ApiParam(name = "version", value = "Version of the application", required = false) @QueryParam("version") String version);
}
}

@ -20,25 +20,26 @@ package org.wso2.carbon.device.application.mgt.store.api.services.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.application.mgt.common.ApplicationRelease;
import org.wso2.carbon.device.application.mgt.store.api.APIUtil;
import org.wso2.carbon.device.application.mgt.common.Application;
import org.wso2.carbon.device.application.mgt.common.ApplicationList;
import org.wso2.carbon.device.application.mgt.common.Filter;
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.ApplicationStorageManager;
import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException;
import org.wso2.carbon.device.application.mgt.store.api.services.ApplicationManagementAPI;
import javax.validation.Valid;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
/**
* Implementation of Application Management related APIs.
@ -54,33 +55,37 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@Consumes("application/json")
@Override
public Response getApplications(
@QueryParam("query") String searchQuery,
@Valid Filter filter,
@QueryParam("offset") int offset,
@QueryParam("limit") int limit) {
ApplicationManager applicationManager = APIUtil.getApplicationManager();
ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
try {
if (limit == 0) {
limit = DEFAULT_LIMIT;
}
Filter filter = new Filter();
filter.setOffset(offset);
filter.setLimit(limit);
filter.setAppName(searchQuery);
ApplicationList applications = applicationManager.getApplications(filter);
List<ApplicationRelease> publishedApplicationRelease = new ArrayList<>();
for (Application application : applications.getApplications()) {
// ToDo : use better approach to solve this
String uuId = applicationManager.getUuidOfLatestRelease(application.getId());
if (uuId != null){
application.setUuidOfLatestRelease(uuId);
// ImageArtifact imageArtifact = applicationStorageManager.getImageArtifact(uuId, Constants.IMAGE_ARTIFACTS[0], 0);
// application.setIconOfLatestRelease(imageArtifact);
}else{
// ToDo set default icon
for (ApplicationRelease appRelease: application.getApplicationReleases()){
if (appRelease.isPublishedRelease()){
publishedApplicationRelease.add(appRelease);
}
}
if (publishedApplicationRelease.size()>1){
String msg = "Application " + application.getName()
+ " has more than one PUBLISHED application releases";
log.error(msg);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity(msg).build();
}
application.setApplicationReleases(publishedApplicationRelease);
publishedApplicationRelease.clear();
}
return Response.status(Response.Status.OK).entity(applications).build();
} catch (NotFoundException e) {
@ -95,57 +100,41 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
@GET
@Consumes("application/json")
@Path("/{appType}")
public Response getApplication(@PathParam("appType") String appType, @QueryParam("appName") String appName) {
public Response getApplication(
@PathParam("appType") String appType,
@QueryParam("appName") String appName) {
ApplicationManager applicationManager = APIUtil.getApplicationManager();
ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
List<ApplicationRelease> publishedApplicationRelease = new ArrayList<>();
try {
Application application = applicationManager.getApplication(appType, appName);
if (application == null) {
return Response.status(Response.Status.NOT_FOUND)
.entity("Application with UUID " + appType + " not found").build();
.entity("Application with application type: " + appType + " not found").build();
}
// ToDo : use better approach to solve this
String uuId = applicationManager.getUuidOfLatestRelease(application.getId());
if (uuId != null){
application.setUuidOfLatestRelease(uuId);
// ImageArtifact imageArtifact = applicationStorageManager.getImageArtifact(uuId, Constants.IMAGE_ARTIFACTS[0], 0);
// application.setIconOfLatestRelease(imageArtifact);
}else{
// ToDo set default icon
for (ApplicationRelease appRelease : application.getApplicationReleases()) {
if (appRelease.isPublishedRelease()) {
publishedApplicationRelease.add(appRelease);
}
}
if (publishedApplicationRelease.size() > 1) {
String msg =
"Application " + application.getName() + " has more than one PUBLISHED application releases";
log.error(msg);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
application.setApplicationReleases(publishedApplicationRelease);
return Response.status(Response.Status.OK).entity(application).build();
} catch (NotFoundException e) {
return Response.status(Response.Status.NOT_FOUND).build();
} catch (ApplicationManagementException e) {
log.error("Error occurred while getting application with the uuid " + appType, e);
log.error("Error occurred while getting application with the application type: " + appType
+ " and application name: " + appName, e);
return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR);
}
}
//todo WIP
@Override
@Path("/{uuid}")
@GET
public Response getApplicationRelease(@PathParam("uuid") String applicationUUID,
@QueryParam("version") String version) {
return null;
// try {
// if (version == null || version.isEmpty()) {
//// List<ApplicationRelease> applicationReleases = applicationReleaseManager.getReleases(applicationUUID);
//// return Response.status(Response.Status.OK).entity(applicationReleases).build();
// } else {
//// ApplicationRelease applicationRelease = applicationReleaseManager.getRelease(applicationUUID, version);
//// return Response.status(Response.Status.OK).entity(applicationRelease).build();
// }
// } catch (NotFoundException e) {
// return Response.status(Response.Status.NOT_FOUND).build();
// } catch (ApplicationManagementException e) {
// log.error("Error while getting all the application releases for the application with the UUID "
// + applicationUUID, e);
// return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR);
// }
}
// todo --> get applications by category
}

Loading…
Cancel
Save