From 8a6411bac6ec5feb8fdc79d6e31700c9b945aec2 Mon Sep 17 00:00:00 2001 From: lasanthaDLPDS Date: Mon, 13 May 2019 17:48:23 +0530 Subject: [PATCH] Add APPM store APIs for getting application data --- .../common/services/ApplicationManager.java | 4 +- .../GenericApplicationDAOImpl.java | 45 +++++++-- .../mgt/core/impl/ApplicationManagerImpl.java | 93 +++++++++++------- .../ApplicationManagementPublisherAPI.java | 6 +- ...ApplicationManagementPublisherAPIImpl.java | 8 +- .../services/ApplicationManagementAPI.java | 71 +++++--------- .../impl/ApplicationManagementAPIImpl.java | 97 +++++++++---------- 7 files changed, 176 insertions(+), 148 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java index 04144d47d1..9b9874062e 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationManager.java @@ -124,7 +124,7 @@ public interface ApplicationManager { * @return the ApplicationDTO identified by the ID * @throws ApplicationManagementException ApplicationDTO Management Exception. */ - ApplicationDTO getApplicationByUuid(String uuid, String state) throws ApplicationManagementException; + Application getApplicationByUuid(String uuid, String state) throws ApplicationManagementException; /** * To get an application associated with the release. @@ -252,4 +252,6 @@ public interface ApplicationManager { void updateCategory(String oldCategoryName, String newCategoryName) throws ApplicationManagementException; + String getInstallableLifecycleState() throws ApplicationManagementException; + } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java index fddb1c25ac..0120cccf6b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/GenericApplicationDAOImpl.java @@ -444,20 +444,45 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic ResultSet rs = null; try { 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.SUB_TYPE AS SUB_TYPE, AP_APP.CURRENCY AS CURRENCY, " - + "AP_APP.RESTRICTED AS RESTRICTED, AP_APP.DEVICE_TYPE_ID AS DEVICE_TYPE_ID, " - + "AP_APP_TAG.TAG AS APP_TAG, AP_UNRESTRICTED_ROLE.ROLE AS " - + "ROLE FROM ((AP_APP LEFT JOIN AP_APP_TAG ON AP_APP.ID = AP_APP_TAG.AP_APP_ID) " - + "LEFT JOIN AP_UNRESTRICTED_ROLE ON AP_APP.ID = AP_UNRESTRICTED_ROLE.AP_APP_ID) " - + "WHERE AP_APP.ID = (SELECT AP_APP_ID FROM AP_APP_RELEASE WHERE UUID =? ) AND " - + "AP_APP.TENANT_ID = ? AND AP_APP.STATUS != ?;"; + String sql = "SELECT " + + "AP_APP.ID AS APP_ID, " + + "AP_APP.NAME AS APP_NAME, " + + "AP_APP.DESCRIPTION AS APP_DESCRIPTION, " + + "AP_APP.TYPE AS APP_TYPE, " + + "AP_APP.STATUS AS APP_STATUS, " + + "AP_APP.SUB_TYPE AS APP_SUB_TYPE, " + + "AP_APP.CURRENCY AS APP_CURRENCY, " + + "AP_APP.RATING AS APP_RATING, " + + "AP_APP.DEVICE_TYPE_ID AS APP_DEVICE_TYPE_ID, " + + "AP_APP_RELEASE.ID AS RELEASE_ID, " + + "AP_APP_RELEASE.DESCRIPTION AS RELEASE_DESCRIPTION, " + + "AP_APP_RELEASE.VERSION AS RELEASE_VERSION, " + + "AP_APP_RELEASE.UUID AS RELEASE_UUID, " + + "AP_APP_RELEASE.RELEASE_TYPE AS RELEASE_TYPE, " + + "AP_APP_RELEASE.INSTALLER_LOCATION AS AP_RELEASE_STORED_LOC, " + + "AP_APP_RELEASE.ICON_LOCATION AS AP_RELEASE_ICON_LOC, " + + "AP_APP_RELEASE.BANNER_LOCATION AS AP_RELEASE_BANNER_LOC, " + + "AP_APP_RELEASE.SC_1_LOCATION AS AP_RELEASE_SC1, " + + "AP_APP_RELEASE.SC_2_LOCATION AS AP_RELEASE_SC2, " + + "AP_APP_RELEASE.SC_3_LOCATION AS AP_RELEASE_SC3, " + + "AP_APP_RELEASE.APP_HASH_VALUE AS RELEASE_HASH_VALUE, " + + "AP_APP_RELEASE.APP_PRICE AS RELEASE_PRICE, " + + "AP_APP_RELEASE.APP_META_INFO AS RELEASE_META_INFO, " + + "AP_APP_RELEASE.SUPPORTED_OS_VERSIONS AS RELEASE_SUP_OS_VERSIONS, " + + "AP_APP_RELEASE.RATING AS RELEASE_RATING, " + + "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, " + + "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT " + + "FROM AP_APP " + + "INNER JOIN AP_APP_RELEASE ON " + + "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID AND " + + "AP_APP.TENANT_ID = AP_APP_RELEASE.TENANT_ID " + + "WHERE " + + "AP_APP.ID = (SELECT AP_APP_RELEASE.AP_APP_ID FROM AP_APP_RELEASE WHERE AP_APP_RELEASE.UUID = ?) " + + "AND AP_APP.TENANT_ID = ?"; stmt = conn.prepareStatement(sql); stmt.setString(1, releaseUuid); stmt.setInt(2, tenantId); - stmt.setString(3, AppLifecycleState.RETIRED.toString()); rs = stmt.executeQuery(); if (log.isDebugEnabled()) { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java index 7cd4adb516..c29040d809 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationManagerImpl.java @@ -625,11 +625,6 @@ public class ApplicationManagerImpl implements ApplicationManager { @Override public ApplicationList getApplications(Filter filter) throws ApplicationManagementException { - if (filter == null) { - String msg = "Request Payload is null"; - log.error(msg); - throw new BadRequestException(msg); - } int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); ApplicationList applicationList = new ApplicationList(); @@ -845,10 +840,10 @@ public class ApplicationManagerImpl implements ApplicationManager { filteredApplicationReleaseDTOs.add(applicationReleaseDTO); } } - applicationDTO.setApplicationReleaseDTOs(filteredApplicationReleaseDTOs); - if (applicationDTO.getApplicationReleaseDTOs().isEmpty()){ + if (state != null && filteredApplicationReleaseDTOs.isEmpty()) { return null; } + applicationDTO.setApplicationReleaseDTOs(filteredApplicationReleaseDTOs); List tags = this.applicationDAO.getAppTags(appId, tenantId); List categories = this.applicationDAO.getAppCategories(appId, tenantId); @@ -856,9 +851,6 @@ public class ApplicationManagerImpl implements ApplicationManager { if (!categories.isEmpty()){ applicationDTO.setAppCategories(categories); } - if (isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION)) { - return appDtoToAppResponse(applicationDTO); - } List unrestrictedRoles = this.visibilityDAO.getUnrestrictedRoles(appId, tenantId); if (!unrestrictedRoles.isEmpty()) { @@ -944,44 +936,66 @@ public class ApplicationManagerImpl implements ApplicationManager { @Override - public ApplicationDTO getApplicationByUuid(String uuid, String state) throws ApplicationManagementException { + public Application getApplicationByUuid(String uuid, String state) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - ApplicationDTO application; - boolean isAppAllowed = false; - List applicationReleases; + boolean isVisibleApp = false; + try { ConnectionManagerUtil.openDBConnection(); - application = this.applicationDAO.getApplicationByUUID(uuid, tenantId); - if (application == null) { - throw new NotFoundException("Couldn't find an application for application release UUID:: " + uuid); + ApplicationDTO applicationDTO = applicationDAO.getApplicationByUUID(uuid, tenantId); + + if (applicationDTO == null) { + String msg = "Couldn't found an application for application release UUID: " + uuid; + log.error(msg); + throw new NotFoundException(msg); } - if (isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION)) { - applicationReleases = getReleases(application, state); - application.setApplicationReleaseDTOs(applicationReleases); - return application; + + List filteredApplicationReleaseDTOs = new ArrayList<>(); + for (ApplicationReleaseDTO applicationReleaseDTO : applicationDTO.getApplicationReleaseDTOs()) { + if (!applicationReleaseDTO.getCurrentState().equals(lifecycleStateManager.getEndState()) && ( + state == null || applicationReleaseDTO.getCurrentState().equals(state))) { + filteredApplicationReleaseDTOs.add(applicationReleaseDTO); + } + } + if (state != null && filteredApplicationReleaseDTOs.isEmpty()) { + return null; } + applicationDTO.setApplicationReleaseDTOs(filteredApplicationReleaseDTOs); - if (!application.getUnrestrictedRoles().isEmpty()) { - if (hasUserRole(application.getUnrestrictedRoles(), userName)) { - isAppAllowed = true; + List tags = this.applicationDAO.getAppTags(applicationDTO.getId(), tenantId); + List categories = this.applicationDAO.getAppCategories(applicationDTO.getId(), tenantId); + applicationDTO.setTags(tags); + applicationDTO.setAppCategories(categories); + + List unrestrictedRoles = this.visibilityDAO.getUnrestrictedRoles(applicationDTO.getId(), tenantId); + if (!unrestrictedRoles.isEmpty()) { + if (hasUserRole(unrestrictedRoles, userName)) { + isVisibleApp = true; } } else { - isAppAllowed = true; + isVisibleApp = true; } - if (!isAppAllowed) { - return null; + if (!isVisibleApp) { + String msg = "You are trying to access visibility restricted application. You don't have required " + + "roles to view this application,"; + log.error(msg); + throw new ForbiddenException(msg); } - applicationReleases = getReleases(application, state); - application.setApplicationReleaseDTOs(applicationReleases); - return application; + return appDtoToAppResponse(applicationDTO); + } catch (LifecycleManagementException e) { + String msg = "Error occurred when getting the last state of the application lifecycle flow"; + log.error(msg); + throw new ApplicationManagementException(msg, e); } catch (UserStoreException e) { - throw new ApplicationManagementException( - "User-store exception while getting application with the application release UUID " + uuid); + String msg = "User-store exception while getting application with the application release UUID " + uuid; + log.error(msg); + throw new ApplicationManagementException(msg, e); } catch (ApplicationManagementDAOException e) { - //todo - throw new ApplicationManagementException(""); + String msg = "Error occurred while getting, application data."; + log.error(msg); + throw new ApplicationManagementException(msg); } finally { ConnectionManagerUtil.closeDBConnection(); } @@ -2198,6 +2212,17 @@ public class ApplicationManagerImpl implements ApplicationManager { } } + @Override + public String getInstallableLifecycleState() throws ApplicationManagementException { + if (lifecycleStateManager == null) { + String msg = "Application lifecycle manager is not initialed. Please contact the administrator."; + log.error(msg); + throw new ApplicationManagementException(msg); + } + return lifecycleStateManager.getInstallableState(); + } + + private void validateFilter(Filter filter) throws BadRequestException { if (filter == null) { String msg = "Filter validation is failed, Filter shouldn't be null, hence please verify the request payload"; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java index 8cf60a8430..19323962e1 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java @@ -121,9 +121,9 @@ public interface ApplicationManagementPublisherAPI { message = "OK. \n Successfully got application list.", response = ApplicationList.class), @ApiResponse( - code = 404, - message = "Not Found. There doesn't have an application which is matched with requested " + - "query."), + code = 400, + message = "Bad Request. \n " + + "Application retrieving request payload contains unacceptable or vulnerable data"), @ApiResponse( code = 500, message = "Internal Server Error. \n Error occurred while getting the application list.", diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java index 57b1e5c1e5..57f91e0720 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java @@ -74,10 +74,14 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @Override @Consumes("application/json") public Response getApplications( - @Valid Filter filter ){ + @Valid Filter filter) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); - try { + if (filter == null) { + String msg = "Request Payload is null"; + log.error(msg); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } ApplicationList applications = applicationManager.getApplications(filter); if (applications.getApplications().isEmpty()) { return Response.status(Response.Status.OK) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ApplicationManagementAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ApplicationManagementAPI.java index d42665033f..68548f4640 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ApplicationManagementAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ApplicationManagementAPI.java @@ -1,20 +1,18 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) 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 + * 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. + * 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.store.api.services; @@ -31,15 +29,17 @@ import io.swagger.annotations.Tag; import org.wso2.carbon.apimgt.annotations.api.Scope; import org.wso2.carbon.apimgt.annotations.api.Scopes; 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.ApplicationList; +import javax.validation.Valid; import javax.ws.rs.Consumes; import javax.ws.rs.GET; +import javax.ws.rs.POST; 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; @@ -72,7 +72,7 @@ import javax.ws.rs.core.Response; ) } ) -@Path("/store/applications") +@Path("/applications") @Api(value = "ApplicationDTO Management", description = "This API carries all app store management related operations " + "such as get all the applications etc.") @Produces(MediaType.APPLICATION_JSON) @@ -80,7 +80,7 @@ public interface ApplicationManagementAPI { String SCOPE = "scope"; - @GET + @POST @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @ApiOperation( @@ -103,8 +103,9 @@ public interface ApplicationManagementAPI { message = "OK. \n Successfully got application list.", response = ApplicationList.class), @ApiResponse( - code = 404, - message = "Not Found. Not Found Applications."), + code = 400, + message = "Bad Request. \n " + + "Application retrieving request payload contains unacceptable or vulnerable data"), @ApiResponse( code = 500, message = "Internal Server Error. \n Error occurred while getting the application list.", @@ -112,34 +113,10 @@ public interface ApplicationManagementAPI { }) Response getApplications( @ApiParam( - name = "name", - value = "Name of the application") - @QueryParam("name") String appName, - @ApiParam( - name = "type", - value = "Type of the application") - @QueryParam("type") String appType, - @ApiParam( - name = "category", - value = "CategoryDTO of the application") - @QueryParam("category") String appCategory, - @ApiParam( - name = "exact-match", - value = "Is it requesting exactly matching application or partially matching application.") - @QueryParam("exact-match") boolean isFullMatch, - @ApiParam( - name = "offset", - value = "Provide from which position apps should return", defaultValue = "0") - @QueryParam("offset") int offset, - @ApiParam( - name = "limit", - value = "Provide how many apps it should return", defaultValue = "20") - @QueryParam("limit") int limit, - @ApiParam( - name = "limit", - value = "Provide how many apps it should return", defaultValue = "ASC") - @QueryParam("sort") String sortBy - + name = "filter", + value = "Application filtering data", + required = true) + @Valid Filter filter ); @GET diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/ApplicationManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/ApplicationManagementAPIImpl.java index 3a2e11d08f..accda96f57 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/ApplicationManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/impl/ApplicationManagementAPIImpl.java @@ -1,90 +1,80 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) 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 + * 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. + * 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.store.api.services.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.device.application.mgt.common.AppLifecycleState; -import org.wso2.carbon.device.application.mgt.common.dto.ApplicationDTO; import org.wso2.carbon.device.application.mgt.common.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.response.Application; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; +import org.wso2.carbon.device.application.mgt.core.exception.BadRequestException; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; +import org.wso2.carbon.device.application.mgt.core.exception.UnexpectedServerErrorException; import org.wso2.carbon.device.application.mgt.core.util.APIUtil; import org.wso2.carbon.device.application.mgt.store.api.services.ApplicationManagementAPI; +import javax.validation.Valid; import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; +import javax.ws.rs.POST; 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.Response; /** - * Implementation of Application Management related APIs. + * Implementation of Application Management STORE APIs. */ @Produces({ "application/json" }) -@Path("/store/applications") +@Path("/applications") public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { private static Log log = LogFactory.getLog(ApplicationManagementAPIImpl.class); - @GET + @POST @Override @Consumes("application/json") - public Response getApplications( - @QueryParam("name") String appName, - @QueryParam("type") String appType, - @QueryParam("category") String appCategory, - @QueryParam("exact-match") boolean isFullMatch, - @DefaultValue("0") @QueryParam("offset") int offset, - @DefaultValue("20") @QueryParam("limit") int limit, - @DefaultValue("ASC") @QueryParam("sort") String sortBy) { - + public Response getApplications(@Valid Filter filter) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); try { - Filter filter = new Filter(); - filter.setOffset(offset); - filter.setLimit(limit); - filter.setSortBy(sortBy); - filter.setFullMatch(isFullMatch); - filter.setAppReleaseState(AppLifecycleState.PUBLISHED.toString()); - if (appName != null && !appName.isEmpty()) { - filter.setAppName(appName); - } - if (appType != null && !appType.isEmpty()) { - filter.setAppType(appType); + if (filter == null) { + String msg = "Request Payload is null"; + log.error(msg); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); } -// if (appCategory != null && !appCategory.isEmpty()) { -// filter.setAppCategories(appCategory); -// } + filter.setAppReleaseState(applicationManager.getInstallableLifecycleState()); ApplicationList applications = applicationManager.getApplications(filter); if (applications.getApplications().isEmpty()) { - return Response.status(Response.Status.NOT_FOUND) - .entity("Couldn't find any application for requested query.").build(); + return Response.status(Response.Status.OK) + .entity("Couldn't find any application for the requested query.").build(); } return Response.status(Response.Status.OK).entity(applications).build(); + } catch (BadRequestException e) { + String msg = e.getMessage(); + log.error(msg, e); + return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); + } catch (UnexpectedServerErrorException e) { + String msg = e.getMessage(); + log.error(msg); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } catch (ApplicationManagementException e) { - String msg = "Error occurred while getting the application list for publisher "; + String msg = e.getMessage(); log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } @@ -93,12 +83,17 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { @GET @Consumes("application/json") @Path("/{uuid}") - public Response getApplication( - @PathParam("uuid") String uuid) { + public Response getApplication(@PathParam("uuid") String uuid) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); try { - ApplicationDTO application = applicationManager - .getApplicationByUuid(uuid, AppLifecycleState.PUBLISHED.toString()); + Application application = applicationManager + .getApplicationByUuid(uuid, applicationManager.getInstallableLifecycleState()); + if (application == null) { + String msg = "Could not found an application release which is in " + applicationManager + .getInstallableLifecycleState() + " state."; + log.error(msg); + return Response.status(Response.Status.OK).entity(msg).build(); + } return Response.status(Response.Status.OK).entity(application).build(); } catch (NotFoundException e) { String msg = "Application with application release UUID: " + uuid + " is not found";