diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/ApplicationManagementAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/ApplicationManagementAPI.java index 9e5927eb1ef..8feb8e2c4fc 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/ApplicationManagementAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/ApplicationManagementAPI.java @@ -52,7 +52,8 @@ import java.util.List; } ), tags = { - @Tag(name = "application_management", description = "Application Management related APIs") + @Tag(name = "application_management, device_management", description = "Application Management related " + + "APIs") } ) @Scopes( @@ -69,11 +70,23 @@ import java.util.List; key = "perm:application:create", permissions = {"/device-mgt/application/create"} ), + @Scope( + name = "Update an Application", + description = "Update an application", + key = "perm:application:update", + permissions = {"/device-mgt/application/update"} + ), @Scope( name = "Create an Application", description = "Create an application", key = "perm:application-mgt:login", permissions = {"/device-mgt/application-mgt/login"} + ), + @Scope( + name = "Delete an Application", + description = "Delete an application", + key = "perm:application:delete", + permissions = {"/device-mgt/application/delete"} ) } @@ -178,6 +191,41 @@ public interface ApplicationManagementAPI { @PathParam("uuid") String uuid ); + @PUT + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "PUT", + value = "Edit an application", + notes = "This will edit the new application", + tags = "Application Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "perm:application:update") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 201, + message = "OK. \n Successfully edited the application.", + response = Application.class), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Error occurred while editing the application.", + response = ErrorResponse.class) + }) + Response editApplication( + @ApiParam( + name = "application", + value = "The application that need to be edited.", + required = true) + @Valid Application application); + + @POST @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @@ -289,4 +337,38 @@ public interface ApplicationManagementAPI { value = "Unique identifier of the Application", required = true) @PathParam("uuid") String applicationUUID); + + @DELETE + @Consumes("application/json") + @Path("/{appuuid}") + @ApiOperation( + consumes = MediaType.APPLICATION_JSON, + produces = MediaType.APPLICATION_JSON, + httpMethod = "DELETE", + value = "Delete the application with the given UUID", + notes = "This will delete the application with the given UUID", + tags = "Application Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "perm:application:delete") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully deleted the application identified by UUID.", + response = List.class), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Error occurred while deleteing the application.", + response = ErrorResponse.class) + }) + Response deleteApplication( + @ApiParam( + name = "UUID", + value = "Unique identifier of the Application", + required = true) + @PathParam("appuuid") String applicationUUID); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ApplicationManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ApplicationManagementAPIImpl.java index ef6e4209fc3..f5a0228ad65 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ApplicationManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ApplicationManagementAPIImpl.java @@ -165,18 +165,13 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { public Response editApplication(@Valid Application application) { ApplicationManager applicationManager = APIUtil.getApplicationManager(); - - //TODO : Get username and tenantId - User user = new User("admin", -1234); - application.setUser(user); - try { application = applicationManager.editApplication(application); } catch (ApplicationManagementException e) { String msg = "Error occurred while creating the application"; log.error(msg, e); - return Response.status(Response.Status.BAD_REQUEST).build(); + return APIUtil.getResponse(e, Response.Status.BAD_REQUEST); } return Response.status(Response.Status.OK).entity(application).build(); } @@ -187,11 +182,10 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { ApplicationManager applicationManager = APIUtil.getApplicationManager(); try { applicationManager.deleteApplication(uuid); - } catch (ApplicationManagementException e) { String msg = "Error occurred while deleting the application: " + uuid; log.error(msg, e); - return Response.status(Response.Status.BAD_REQUEST).build(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } String responseMsg = "Successfully deleted the application: " + uuid; return Response.status(Response.Status.OK).entity(responseMsg).build(); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/webapp/META-INF/permissions.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/webapp/META-INF/permissions.xml index 0a4e39c82b6..8cc36248a1a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/webapp/META-INF/permissions.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/webapp/META-INF/permissions.xml @@ -43,6 +43,24 @@ /application-mgt/applications POST + + Edit Application + /device-mgt/application/update + /application-mgt/applications + PUT + + + Login to Application Management + /device-mgt/application-mgt/login + /application-mgt/applications + PUT + + + Login to Application Management + device-mgt/application/delete + /application-mgt/applications/* + DELETE + diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java index 450c90001f0..3fbd9ea56ba 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/ApplicationDAO.java @@ -41,7 +41,7 @@ public interface ApplicationDAO { int getApplicationId(String uuid) throws ApplicationManagementDAOException; - Application editApplication(Application application) throws ApplicationManagementDAOException; + Application editApplication(Application application, int tenantId) throws ApplicationManagementDAOException; void deleteApplication(String uuid) throws ApplicationManagementDAOException; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/DAOFactory.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/DAOFactory.java index c70e9c8c001..87b485527f4 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/DAOFactory.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/DAOFactory.java @@ -25,8 +25,7 @@ import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; import org.wso2.carbon.device.application.mgt.core.dao.LifecycleStateDAO; import org.wso2.carbon.device.application.mgt.core.dao.PlatformDAO; -import org.wso2.carbon.device.application.mgt.core.dao.impl.application.H2ApplicationDAOImpl; -import org.wso2.carbon.device.application.mgt.core.dao.impl.application.MySQLApplicationDAOImpl; +import org.wso2.carbon.device.application.mgt.core.dao.impl.application.GenericApplicationDAOImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.lifecyclestate.GenericLifecycleStateImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.platform.GenericPlatformDAOImpl; import org.wso2.carbon.device.application.mgt.core.dao.impl.platform.OracleMsSQLPlatformDAOImpl; @@ -58,9 +57,8 @@ public class DAOFactory { if (databaseEngine != null) { switch (databaseEngine) { case Constants.DataBaseTypes.DB_TYPE_H2: - return new H2ApplicationDAOImpl(); case Constants.DataBaseTypes.DB_TYPE_MYSQL: - return new MySQLApplicationDAOImpl(); + return new GenericApplicationDAOImpl(); default: throw new UnsupportedDatabaseEngineException("Unsupported database engine : " + databaseEngine); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java index ddc60a1d491..5b1e0dfaeb9 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/common/Util.java @@ -21,10 +21,7 @@ package org.wso2.carbon.device.application.mgt.core.dao.common; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONException; -import org.wso2.carbon.device.application.mgt.common.Application; -import org.wso2.carbon.device.application.mgt.common.Category; -import org.wso2.carbon.device.application.mgt.common.Platform; -import org.wso2.carbon.device.application.mgt.common.User; +import org.wso2.carbon.device.application.mgt.common.*; import org.wso2.carbon.device.application.mgt.core.util.JSONUtil; import java.sql.PreparedStatement; @@ -35,13 +32,25 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * This class is responsible for handling the utils of the Application Management DAO. + */ public class Util { private static final Log log = LogFactory.getLog(Util.class); + /** + * To create application object from the result set retrieved from the Database. + * + * @param rs ResultSet + * @param rsProperties Properties resultset. + * @param rsTags Tags resultset + * @return Application that is retrieved from the Database. + * @throws SQLException SQL Exception + * @throws JSONException JSONException. + */ public static Application loadApplication(ResultSet rs, ResultSet rsProperties, ResultSet rsTags) throws SQLException, JSONException { - Application application = new Application(); application.setId(rs.getInt("ID")); application.setName(rs.getString("NAME")); @@ -55,7 +64,7 @@ public class Util { application.setScreenshots(JSONUtil.jsonArrayStringToList(rs.getString("SCREENSHOTS"))); application.setCreatedAt(rs.getDate("CREATED_AT")); application.setModifiedAt(rs.getDate("MODIFIED_AT")); - application.setUser(new User(rs.getString("CREATED_AT"), rs.getInt("TENANT_ID"))); + application.setUser(new User(rs.getString("CREATED_BY"), rs.getInt("TENANT_ID"))); Platform platform = new Platform(); platform.setName(rs.getString("APL_NAME")); @@ -69,7 +78,7 @@ public class Util { application.setProperties(properties); List tags = new ArrayList<>(); - while ((rsTags.next())){ + while ((rsTags.next())) { tags.add(rsTags.getString("NAME")); } application.setTags(tags); @@ -78,9 +87,25 @@ public class Util { category.setId(rs.getInt("CAT_ID")); category.setName(rs.getString("CAT_NAME")); application.setCategory(category); + + LifecycleState lifecycleState = new LifecycleState(); + lifecycleState.setId(rs.getInt("LIFECYCLE_STATE_ID")); + lifecycleState.setName(rs.getString("LS_NAME")); + lifecycleState.setIdentifier(rs.getString("LS_IDENTIFIER")); + lifecycleState.setDescription(rs.getString("LS_DESCRIPTION")); + + Lifecycle lifecycle = new Lifecycle(); + lifecycle.setLifecycleState(lifecycleState); + application.setCurrentLifecycle(lifecycle); return application; } + /** + * Cleans up the statement and resultset after executing the query + * + * @param stmt Statement executed. + * @param rs Resultset retrived. + */ public static void cleanupResources(PreparedStatement stmt, ResultSet rs) { if (rs != null) { try { 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/AbstractApplicationDAOImpl.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/AbstractApplicationDAOImpl.java deleted file mode 100644 index 784220f53e3..00000000000 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/AbstractApplicationDAOImpl.java +++ /dev/null @@ -1,315 +0,0 @@ -/* - * 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.core.dao.impl.application; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.json.JSONException; -import org.wso2.carbon.device.application.mgt.common.Application; -import org.wso2.carbon.device.application.mgt.common.Filter; -import org.wso2.carbon.device.application.mgt.common.LifecycleStateTransition; -import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; -import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; -import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; -import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; -import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; -import org.wso2.carbon.device.application.mgt.core.util.JSONUtil; - -import java.sql.*; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -public abstract class AbstractApplicationDAOImpl extends AbstractDAOImpl implements ApplicationDAO { - - private static final Log log = LogFactory.getLog(AbstractApplicationDAOImpl.class); - - public Application createApplication(Application application) throws ApplicationManagementDAOException { - if (log.isDebugEnabled()) { - log.debug("Request received in DAO Layer to create an application"); - log.debug("Application Details : "); - log.debug("UUID : " + application.getUuid() + " Name : " + application.getName() + " User name : " - + application.getUser().getUserName()); - } - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; - String sql = ""; - boolean isBatchExecutionSupported = ConnectionManagerUtil.isBatchQuerySupported(); - - try { - conn = this.getDBConnection(); - sql += "INSERT INTO APPM_APPLICATION (UUID, IDENTIFIER, NAME, SHORT_DESCRIPTION, DESCRIPTION, ICON_NAME, " - + "BANNER_NAME, VIDEO_NAME, SCREENSHOTS, CREATED_BY, CREATED_AT, MODIFIED_AT, " - + "APPLICATION_CATEGORY_ID, PLATFORM_ID, TENANT_ID, LIFECYCLE_STATE_ID, " - + "LIFECYCLE_STATE_MODIFIED_AT, LIFECYCLE_STATE_MODIFIED_BY) VALUES " - + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - - stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); - stmt.setString(1, application.getUuid()); - stmt.setString(2, application.getIdentifier()); - stmt.setString(3, application.getName()); - stmt.setString(4, application.getShortDescription()); - stmt.setString(5, application.getDescription()); - stmt.setString(6, application.getIconName()); - stmt.setString(7, application.getBannerName()); - stmt.setString(8, application.getVideoName()); - stmt.setString(9, JSONUtil.listToJsonArrayString(application.getScreenshots())); - stmt.setString(10, application.getUser().getUserName()); - stmt.setDate(11, new Date(application.getCreatedAt().getTime())); - stmt.setDate(12, new Date(application.getModifiedAt().getTime())); - stmt.setInt(13, application.getCategory().getId()); - stmt.setInt(14, application.getPlatform().getId()); - stmt.setInt(15, application.getUser().getTenantId()); - stmt.setInt(16, application.getCurrentLifecycle().getLifecycleState().getId()); - stmt.setDate(17, new Date( - application.getCurrentLifecycle().getLifecycleStateModifiedAt().getTime())); - stmt.setString(18, application.getCurrentLifecycle().getGetLifecycleStateModifiedBy()); - stmt.executeUpdate(); - - rs = stmt.getGeneratedKeys(); - if (rs.next()) { - application.setId(rs.getInt(1)); - } - - if (application.getTags() != null && application.getTags().size() > 0) { - sql = "INSERT INTO APPM_APPLICATION_TAG (NAME, APPLICATION_ID) VALUES (?, ?); "; - stmt = conn.prepareStatement(sql); - for (String tag : application.getTags()) { - stmt.setString(1, tag); - stmt.setInt(2, application.getId()); - - if (isBatchExecutionSupported) { - stmt.addBatch(); - } else { - stmt.execute(); - } - } - if (isBatchExecutionSupported) { - stmt.executeBatch(); - } - } - - if (application.getProperties() != null && application.getProperties().size() > 0) { - sql = "INSERT INTO APPM_APPLICATION_PROPERTY (PROP_KEY, PROP_VAL, APPLICATION_ID) VALUES (?, ?, ?); "; - stmt = conn.prepareStatement(sql); - Iterator it = application.getProperties().entrySet().iterator(); - while (it.hasNext()) { - Map.Entry property = (Map.Entry) it.next(); - stmt.setString(1, property.getKey()); - stmt.setString(2, property.getValue()); - stmt.setInt(3, application.getId()); - if (isBatchExecutionSupported) { - stmt.addBatch(); - } else { - stmt.execute(); - } - } - if (isBatchExecutionSupported) { - stmt.executeBatch(); - } - } - - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while adding the application", e); - } finally { - Util.cleanupResources(stmt, rs); - } - - return application; - } - - @Override - public int getApplicationCount(Filter filter) throws ApplicationManagementDAOException { - if(log.isDebugEnabled()){ - log.debug("Getting application count from the database"); - log.debug(String.format("Filter: limit=%s, offset=%", filter.getLimit(), filter.getOffset())); - } - - Connection conn; - PreparedStatement stmt = null; - ResultSet rs = null; - String sql = ""; - int count = 0; - - if (filter == null) { - throw new ApplicationManagementDAOException("Filter need to be instantiated"); - } - - try { - conn = this.getConnection(); - sql += "SELECT COUNT(APP.ID) AS APP_COUNT "; - sql += "FROM APPM_APPLICATION AS APP "; - sql += "INNER JOIN APPM_PLATFORM AS APL ON APP.PLATFORM_ID = APL.ID "; - sql += "INNER JOIN APPM_APPLICATION_CATEGORY AS CAT ON APP.APPLICATION_CATEGORY_ID = CAT.ID "; - - if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { - sql += "WHERE APP.NAME LIKE ? "; - } - sql += ";"; - - stmt = conn.prepareStatement(sql); - int index = 0; - if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { - stmt.setString(++index, "%" + filter.getSearchQuery() + "%"); - } - rs = stmt.executeQuery(); - if (rs.next()) { - count = rs.getInt("APP_COUNT"); - } - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while getting application List", e); - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } finally { - Util.cleanupResources(stmt, rs); - } - return count; - } - - @Override - public Application getApplication(String uuid) throws ApplicationManagementDAOException { - if (log.isDebugEnabled()) { - log.debug("Getting application with the UUID(" + uuid + ") from the database"); - } - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; - String sql = ""; - Application application = null; - try { - - conn = this.getDBConnection(); - sql += "SELECT APP.*, APL.NAME AS APL_NAME, APL.IDENTIFIER AS APL_IDENTIFIER, " - + "CAT.ID AS CAT_ID, CAT.NAME AS CAT_NAME FROM APPM_APPLICATION AS APP INNER JOIN APPM_PLATFORM AS " - + "APL ON APP.PLATFORM_ID = APL.ID INNER JOIN APPM_APPLICATION_CATEGORY AS CAT ON " - + "APP.APPLICATION_CATEGORY_ID = CAT.ID WHERE UUID = ?"; - - stmt = conn.prepareStatement(sql); - stmt.setString(1, uuid); - rs = stmt.executeQuery(); - - if (log.isDebugEnabled()) { - log.debug("Successfully retrieved basic details of the application with the UUID " + uuid); - } - - if (rs.next()) { - application = new Application(); - //Getting properties - sql = "SELECT * FROM APPM_APPLICATION_PROPERTY WHERE APPLICATION_ID=?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, rs.getInt("ID")); - ResultSet rsProperties = stmt.executeQuery(); - - //Getting tags - sql = "SELECT * FROM APPM_APPLICATION_TAG WHERE APPLICATION_ID=?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, rs.getInt("ID")); - ResultSet rsTags = stmt.executeQuery(); - - application = Util.loadApplication(rs, rsProperties, rsTags); - Util.cleanupResources(null, rsProperties); - Util.cleanupResources(null, rsTags); - } - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while getting application List", e); - } catch (JSONException e) { - throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } finally { - Util.cleanupResources(stmt, rs); - } - return application; - } - - @Override - public void changeLifecycle(String applicationUUID, String lifecycleIdentifier, String userName) throws - ApplicationManagementDAOException { - if (log.isDebugEnabled()) { - log.debug("Change Life cycle status change " + lifecycleIdentifier + "request received to the DAO " - + "level for the application with " + "the UUID '" + applicationUUID + "' from the user " - + userName); - } - Connection conn; - PreparedStatement stmt = null; - try { - conn = this.getDBConnection(); - String sql = "UPDATE APPM_APPLICATION SET " - + "LIFECYCLE_STATE_ID = (SELECT ID FROM APPM_LIFECYCLE_STATE WHERE IDENTIFIER = ?), " - + "LIFECYCLE_STATE_MODIFIED_BY = ?, LIFECYCLE_STATE_MODIFIED_AT = ? WHERE UUID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setString(1, lifecycleIdentifier); - stmt.setString(2, userName); - stmt.setDate(3, new Date(System.currentTimeMillis())); - stmt.setString(4, applicationUUID); - stmt.executeUpdate(); - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } catch (SQLException e) { - throw new ApplicationManagementDAOException( - "Error occurred while changing lifecycle of application: " + applicationUUID + " to: " - + lifecycleIdentifier + " state.", e); - } finally { - Util.cleanupResources(stmt, null); - } - } - - @Override - public List getNextLifeCycleStates(String applicationUUID, int tenantId) - throws ApplicationManagementDAOException { - Connection connection = null; - PreparedStatement preparedStatement = null; - ResultSet resultSet = null; - - String sql = "SELECT STATE.NAME, TRANSITION.DESCRIPTION, TRANSITION.PERMISSION FROM ( SELECT * FROM " - + "APPM_LIFECYCLE_STATE ) STATE RIGHT JOIN (SELECT * FROM APPM_LIFECYCLE_STATE_TRANSITION WHERE " - + "INITIAL_STATE = (SELECT LIFECYCLE_STATE_ID FROM APPM_APPLICATION WHERE UUID = ?)) " - + "TRANSITION ON TRANSITION.NEXT_STATE = STATE.ID"; - - try { - connection = this.getDBConnection(); - preparedStatement = connection.prepareStatement(sql); - preparedStatement.setString(1, applicationUUID); - resultSet = preparedStatement.executeQuery(); - - List lifecycleStateTransitions = new ArrayList<>(); - - while(resultSet.next()) { - LifecycleStateTransition lifecycleStateTransition = new LifecycleStateTransition(); - lifecycleStateTransition.setDescription(resultSet.getString(2)); - lifecycleStateTransition.setNextState(resultSet.getString(1)); - lifecycleStateTransition.setPermission(resultSet.getString(3)); - lifecycleStateTransitions.add(lifecycleStateTransition); - } - return lifecycleStateTransitions; - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error while getting the DBConnection for getting the life " - + "cycle states for the application with the UUID : " + applicationUUID, e); - } catch (SQLException e) { - throw new ApplicationManagementDAOException("SQL exception while executing the query '" + sql + "'.", e); - } finally { - Util.cleanupResources(preparedStatement, resultSet); - } - } -} 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 new file mode 100644 index 00000000000..ac92cddb1d5 --- /dev/null +++ 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 @@ -0,0 +1,600 @@ +/* + * 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.core.dao.impl.application; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONException; +import org.wso2.carbon.device.application.mgt.common.*; +import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; +import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO; +import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl; +import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; +import org.wso2.carbon.device.application.mgt.core.dao.common.Util; +import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; +import org.wso2.carbon.device.application.mgt.core.util.JSONUtil; + +import java.sql.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class GenericApplicationDAOImpl extends AbstractDAOImpl implements ApplicationDAO { + + private static final Log log = LogFactory.getLog(GenericApplicationDAOImpl.class); + + public Application createApplication(Application application) throws ApplicationManagementDAOException { + if (log.isDebugEnabled()) { + log.debug("Request received in DAO Layer to create an application"); + log.debug("Application Details : "); + log.debug("UUID : " + application.getUuid() + " Name : " + application.getName() + " User name : " + + application.getUser().getUserName()); + } + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; + String sql = ""; + boolean isBatchExecutionSupported = ConnectionManagerUtil.isBatchQuerySupported(); + + try { + conn = this.getDBConnection(); + sql += "INSERT INTO APPM_APPLICATION (UUID, IDENTIFIER, NAME, SHORT_DESCRIPTION, DESCRIPTION, ICON_NAME, " + + "BANNER_NAME, VIDEO_NAME, SCREENSHOTS, CREATED_BY, CREATED_AT, MODIFIED_AT, " + + "APPLICATION_CATEGORY_ID, PLATFORM_ID, TENANT_ID, LIFECYCLE_STATE_ID, " + + "LIFECYCLE_STATE_MODIFIED_AT, LIFECYCLE_STATE_MODIFIED_BY) VALUES " + + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + stmt.setString(1, application.getUuid()); + stmt.setString(2, application.getIdentifier()); + stmt.setString(3, application.getName()); + stmt.setString(4, application.getShortDescription()); + stmt.setString(5, application.getDescription()); + stmt.setString(6, application.getIconName()); + stmt.setString(7, application.getBannerName()); + stmt.setString(8, application.getVideoName()); + stmt.setString(9, JSONUtil.listToJsonArrayString(application.getScreenshots())); + stmt.setString(10, application.getUser().getUserName()); + stmt.setDate(11, new Date(application.getCreatedAt().getTime())); + stmt.setDate(12, new Date(application.getModifiedAt().getTime())); + stmt.setInt(13, application.getCategory().getId()); + stmt.setInt(14, application.getPlatform().getId()); + stmt.setInt(15, application.getUser().getTenantId()); + stmt.setInt(16, application.getCurrentLifecycle().getLifecycleState().getId()); + stmt.setDate(17, new Date( + application.getCurrentLifecycle().getLifecycleStateModifiedAt().getTime())); + stmt.setString(18, application.getCurrentLifecycle().getGetLifecycleStateModifiedBy()); + stmt.executeUpdate(); + + rs = stmt.getGeneratedKeys(); + if (rs.next()) { + application.setId(rs.getInt(1)); + } + insertApplicationTagsAndProperties(application, stmt, conn, isBatchExecutionSupported); + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred while adding the application", e); + } finally { + Util.cleanupResources(stmt, rs); + } + + return application; + } + + + @Override + public ApplicationList getApplications(Filter filter) throws ApplicationManagementDAOException { + if(log.isDebugEnabled()){ + log.debug("Getting application data from the database"); + log.debug(String.format("Filter: limit=%s, offset=%", filter.getLimit(), filter.getOffset())); + } + + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; + String sql = ""; + ApplicationList applicationList = new ApplicationList(); + List applications = new ArrayList<>(); + Pagination pagination = new Pagination(); + + if (filter == null) { + throw new ApplicationManagementDAOException("Filter need to be instantiated"); + } else { + pagination.setLimit(filter.getLimit()); + pagination.setOffset(filter.getOffset()); + } + + try { + conn = this.getDBConnection(); + sql += "SELECT APP.*, APL.NAME AS APL_NAME, APL.IDENTIFIER AS APL_IDENTIFIER, " + + "CAT.ID AS CAT_ID, CAT.NAME AS CAT_NAME, LS.NAME AS LS_NAME, LS.IDENTIFIER AS LS_IDENTIFIER, " + + "LS.DESCRIPTION AS LS_DESCRIPTION FROM APPM_APPLICATION AS APP INNER JOIN APPM_PLATFORM AS " + + "APL ON APP.PLATFORM_ID = APL.ID INNER JOIN APPM_APPLICATION_CATEGORY AS CAT ON " + + "APP.APPLICATION_CATEGORY_ID = CAT.ID INNER JOIN APPM_LIFECYCLE_STATE AS " + + "LS ON APP.LIFECYCLE_STATE_ID = LS.ID "; + + if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { + sql += "WHERE APP.NAME LIKE ? "; + } + sql += "LIMIT ?,?;"; + + stmt = conn.prepareStatement(sql); + int index = 0; + if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { + stmt.setString(++index, "%" + filter.getSearchQuery() + "%"); + } + stmt.setInt(++index, filter.getOffset()); + stmt.setInt(++index, filter.getLimit()); + + rs = stmt.executeQuery(); + + int length = 0; + + while (rs.next()) { + //Getting properties + sql = "SELECT * FROM APPM_APPLICATION_PROPERTY WHERE APPLICATION_ID=?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, rs.getInt("ID")); + ResultSet rsProperties = stmt.executeQuery(); + + //Getting tags + sql = "SELECT * FROM APPM_APPLICATION_TAG WHERE APPLICATION_ID=?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, rs.getInt("ID")); + ResultSet rsTags = stmt.executeQuery(); + + applications.add(Util.loadApplication(rs, rsProperties, rsTags)); + Util.cleanupResources(null, rsProperties); + Util.cleanupResources(null, rsTags); + length++; + } + + pagination.setSize(length); + pagination.setCount(this.getApplicationCount(filter)); + applicationList.setApplications(applications); + applicationList.setPagination(pagination); + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred while getting application List", e); + } catch (JSONException e) { + throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } finally { + Util.cleanupResources(stmt, rs); + } + return applicationList; + } + + @Override + public int getApplicationCount(Filter filter) throws ApplicationManagementDAOException { + if(log.isDebugEnabled()){ + log.debug("Getting application count from the database"); + log.debug(String.format("Filter: limit=%s, offset=%", filter.getLimit(), filter.getOffset())); + } + + Connection conn; + PreparedStatement stmt = null; + ResultSet rs = null; + String sql = ""; + int count = 0; + + if (filter == null) { + throw new ApplicationManagementDAOException("Filter need to be instantiated"); + } + + try { + conn = this.getConnection(); + sql += "SELECT COUNT(APP.ID) AS APP_COUNT "; + sql += "FROM APPM_APPLICATION AS APP "; + sql += "INNER JOIN APPM_PLATFORM AS APL ON APP.PLATFORM_ID = APL.ID "; + sql += "INNER JOIN APPM_APPLICATION_CATEGORY AS CAT ON APP.APPLICATION_CATEGORY_ID = CAT.ID "; + + if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { + sql += "WHERE APP.NAME LIKE ? "; + } + sql += ";"; + + stmt = conn.prepareStatement(sql); + int index = 0; + if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { + stmt.setString(++index, "%" + filter.getSearchQuery() + "%"); + } + rs = stmt.executeQuery(); + if (rs.next()) { + count = rs.getInt("APP_COUNT"); + } + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred while getting application List", e); + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } finally { + Util.cleanupResources(stmt, rs); + } + return count; + } + + @Override + public Application getApplication(String uuid) throws ApplicationManagementDAOException { + if (log.isDebugEnabled()) { + log.debug("Getting application with the UUID(" + uuid + ") from the database"); + } + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; + String sql = ""; + Application application = null; + try { + + conn = this.getDBConnection(); + sql += "SELECT APP.*, APL.NAME AS APL_NAME, APL.IDENTIFIER AS APL_IDENTIFIER, " + + "CAT.ID AS CAT_ID, CAT.NAME AS CAT_NAME, LS.NAME AS LS_NAME, LS.IDENTIFIER AS LS_IDENTIFIER, " + + "LS.DESCRIPTION AS LS_DESCRIPTION FROM APPM_APPLICATION AS APP INNER JOIN APPM_PLATFORM AS " + + "APL ON APP.PLATFORM_ID = APL.ID INNER JOIN APPM_APPLICATION_CATEGORY AS CAT ON " + + "APP.APPLICATION_CATEGORY_ID = CAT.ID INNER JOIN APPM_LIFECYCLE_STATE AS " + + "LS ON APP.LIFECYCLE_STATE_ID = LS.ID WHERE UUID = ?"; + + stmt = conn.prepareStatement(sql); + stmt.setString(1, uuid); + rs = stmt.executeQuery(); + + if (log.isDebugEnabled()) { + log.debug("Successfully retrieved basic details of the application with the UUID " + uuid); + } + + if (rs.next()) { + //Getting properties + sql = "SELECT * FROM APPM_APPLICATION_PROPERTY WHERE APPLICATION_ID=?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, rs.getInt("ID")); + ResultSet rsProperties = stmt.executeQuery(); + + //Getting tags + sql = "SELECT * FROM APPM_APPLICATION_TAG WHERE APPLICATION_ID=?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, rs.getInt("ID")); + ResultSet rsTags = stmt.executeQuery(); + + application = Util.loadApplication(rs, rsProperties, rsTags); + Util.cleanupResources(null, rsProperties); + Util.cleanupResources(null, rsTags); + } + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred while getting application details with UUID " + + uuid, e); + } catch (JSONException e) { + throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } finally { + Util.cleanupResources(stmt, rs); + } + return application; + } + + @Override + public void changeLifecycle(String applicationUUID, String lifecycleIdentifier, String userName) throws + ApplicationManagementDAOException { + if (log.isDebugEnabled()) { + log.debug("Change Life cycle status change " + lifecycleIdentifier + "request received to the DAO " + + "level for the application with " + "the UUID '" + applicationUUID + "' from the user " + + userName); + } + Connection conn; + PreparedStatement stmt = null; + try { + conn = this.getDBConnection(); + String sql = "UPDATE APPM_APPLICATION SET " + + "LIFECYCLE_STATE_ID = (SELECT ID FROM APPM_LIFECYCLE_STATE WHERE IDENTIFIER = ?), " + + "LIFECYCLE_STATE_MODIFIED_BY = ?, LIFECYCLE_STATE_MODIFIED_AT = ? WHERE UUID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setString(1, lifecycleIdentifier); + stmt.setString(2, userName); + stmt.setDate(3, new Date(System.currentTimeMillis())); + stmt.setString(4, applicationUUID); + stmt.executeUpdate(); + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException( + "Error occurred while changing lifecycle of application: " + applicationUUID + " to: " + + lifecycleIdentifier + " state.", e); + } finally { + Util.cleanupResources(stmt, null); + } + } + + @Override + public List getNextLifeCycleStates(String applicationUUID, int tenantId) + throws ApplicationManagementDAOException { + Connection connection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + String sql = "SELECT STATE.NAME, TRANSITION.DESCRIPTION, TRANSITION.PERMISSION FROM ( SELECT * FROM " + + "APPM_LIFECYCLE_STATE ) STATE RIGHT JOIN (SELECT * FROM APPM_LIFECYCLE_STATE_TRANSITION WHERE " + + "INITIAL_STATE = (SELECT LIFECYCLE_STATE_ID FROM APPM_APPLICATION WHERE UUID = ?)) " + + "TRANSITION ON TRANSITION.NEXT_STATE = STATE.ID"; + + try { + connection = this.getDBConnection(); + preparedStatement = connection.prepareStatement(sql); + preparedStatement.setString(1, applicationUUID); + resultSet = preparedStatement.executeQuery(); + + List lifecycleStateTransitions = new ArrayList<>(); + + while(resultSet.next()) { + LifecycleStateTransition lifecycleStateTransition = new LifecycleStateTransition(); + lifecycleStateTransition.setDescription(resultSet.getString(2)); + lifecycleStateTransition.setNextState(resultSet.getString(1)); + lifecycleStateTransition.setPermission(resultSet.getString(3)); + lifecycleStateTransitions.add(lifecycleStateTransition); + } + return lifecycleStateTransitions; + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error while getting the DBConnection for getting the life " + + "cycle states for the application with the UUID : " + applicationUUID, e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException("SQL exception while executing the query '" + sql + "'.", e); + } finally { + Util.cleanupResources(preparedStatement, resultSet); + } + } + + @Override + public Application editApplication(Application application, int tenantId) throws ApplicationManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; + String sql = ""; + boolean isBatchExecutionSupported = ConnectionManagerUtil.isBatchQuerySupported(); + try { + conn = this.getDBConnection(); + int index = 0; + sql += "UPDATE APPM_APPLICATION SET NAME = IFNULL (?, NAME), SHORT_DESCRIPTION = IFNULL " + + "(?, SHORT_DESCRIPTION), DESCRIPTION = IFNULL (?, DESCRIPTION), ICON_NAME = IFNULL (?, ICON_NAME)" + + ", BANNER_NAME = IFNULL (?, BANNER_NAME), VIDEO_NAME = IFNULL (?, VIDEO_NAME), " + + "SCREENSHOTS = IFNULL (?, SCREENSHOTS), MODIFIED_AT = IFNULL (?, MODIFIED_AT), "; + + if (application.getPayment() != null) { + sql += " IS_FREE = IFNULL (?, IS_FREE), "; + if (application.getPayment().getPaymentCurrency() != null) { + sql += "PAYMENT_CURRENCY = IFNULL (?, PAYMENT_CURRENCY), "; + } + sql += "PAYMENT_PRICE = IFNULL (?, PAYMENT_PRICE), "; + } + if (application.getCategory() != null && application.getCategory().getId() != 0) { + sql += "APPLICATION_CATEGORY_ID = IFNULL (?, APPLICATION_CATEGORY_ID), "; + } + if (application.getPlatform() != null && application.getPlatform().getId() != 0) { + sql += "PLATFORM_ID = IFNULL (?, PLATFORM_ID), "; + } + + sql += "TENANT_ID = IFNULL (?, TENANT_ID) WHERE UUID = ?"; + + stmt = conn.prepareStatement(sql); + stmt.setString(++index, application.getName()); + stmt.setString(++index, application.getShortDescription()); + stmt.setString(++index, application.getDescription()); + stmt.setString(++index, application.getIconName()); + stmt.setString(++index, application.getBannerName()); + stmt.setString(++index, application.getVideoName()); + stmt.setString(++index, JSONUtil.listToJsonArrayString(application.getScreenshots())); + stmt.setDate(++index, new Date(application.getModifiedAt().getTime())); + if (application.getPayment() != null) { + stmt.setBoolean(++index, application.getPayment().isFreeApp()); + if (application.getPayment().getPaymentCurrency() != null) { + stmt.setString(++index, application.getPayment().getPaymentCurrency()); + } + stmt.setFloat(++index, application.getPayment().getPaymentPrice()); + } + + if (application.getCategory() != null && application.getCategory().getId() != 0) { + stmt.setInt(++index, application.getCategory().getId()); + } + if (application.getPlatform() != null && application.getPlatform().getId() != 0) { + stmt.setInt(++index, application.getPlatform().getId()); + } + stmt.setInt(++index, tenantId); + stmt.setString(++index, application.getUuid()); + stmt.executeUpdate(); + + application.setId(getApplicationId(application.getUuid())); + + sql = "DELETE FROM APPM_APPLICATION_TAG WHERE APPLICATION_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, application.getId()); + stmt.executeUpdate(); + + // delete existing properties and add new ones. if no properties are set, existing ones will be deleted. + sql = "DELETE FROM APPM_APPLICATION_PROPERTY WHERE APPLICATION_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, application.getId()); + stmt.executeUpdate(); + + insertApplicationTagsAndProperties(application, stmt, conn, isBatchExecutionSupported); + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred while adding the application", e); + } + + return application; + } + + /** + * To insert application properties and Tags + * + * @param application Application in which the properties and tags need to be inserted + */ + private void insertApplicationTagsAndProperties (Application application, PreparedStatement stmt, Connection + conn, boolean isBatchExecutionSupported) throws SQLException { + String sql; + if (application.getTags() != null && application.getTags().size() > 0) { + sql = "INSERT INTO APPM_APPLICATION_TAG (NAME, APPLICATION_ID) VALUES (?, ?); "; + stmt = conn.prepareStatement(sql); + for (String tag : application.getTags()) { + stmt.setString(1, tag); + stmt.setInt(2, application.getId()); + + if (isBatchExecutionSupported) { + stmt.addBatch(); + } else { + stmt.execute(); + } + } + if (isBatchExecutionSupported) { + stmt.executeBatch(); + } + } + + if (application.getProperties() != null && application.getProperties().size() > 0) { + sql = "INSERT INTO APPM_APPLICATION_PROPERTY (PROP_KEY, PROP_VAL, APPLICATION_ID) VALUES (?, ?, ?); "; + stmt = conn.prepareStatement(sql); + Iterator it = application.getProperties().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry property = (Map.Entry) it.next(); + stmt.setString(1, property.getKey()); + stmt.setString(2, property.getValue()); + stmt.setInt(3, application.getId()); + if (isBatchExecutionSupported) { + stmt.addBatch(); + } else { + stmt.execute(); + } + } + if (isBatchExecutionSupported) { + stmt.executeBatch(); + } + } + } + + @Override + public void deleteApplication(String uuid) throws ApplicationManagementDAOException { + Connection conn; + PreparedStatement stmt = null; + try { + conn = this.getDBConnection(); + String sql = "DELETE FROM APPM_APPLICATION WHERE UUID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setString(1, uuid); + stmt.executeUpdate(); + + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred while deleting the application: " + uuid, e); + } finally { + Util.cleanupResources(stmt, null); + } + } + + @Override + public void deleteProperties(int applicationId) throws ApplicationManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + try { + conn = this.getDBConnection(); + String sql = "DELETE FROM APPM_APPLICATION_PROPERTY WHERE APPLICATION_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, applicationId); + stmt.executeUpdate(); + + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException( + "Error occurred while deleting properties of application: " + applicationId, e); + } finally { + Util.cleanupResources(stmt, null); + } + } + + @Override + public void deleteTags(int applicationId) throws ApplicationManagementDAOException { + + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; + try { + conn = this.getDBConnection(); + String sql = "DELETE FROM APPM_APPLICATION_TAG WHERE APPLICATION_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, applicationId); + stmt.executeUpdate(); + + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException( + "Error occurred while deleting tags of application: " + applicationId, e); + } finally { + Util.cleanupResources(stmt, rs); + } + } + + @Override + public int getApplicationId(String uuid) throws ApplicationManagementDAOException { + Connection conn = null; + PreparedStatement stmt = null; + ResultSet rs = null; + String sql = ""; + + int id = 0; + + try { + conn = this.getDBConnection(); + sql += "SELECT ID FROM APPM_APPLICATION WHERE UUID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setString(1, uuid); + rs = stmt.executeQuery(); + if (rs.next()) { + id = rs.getInt(1); + } + } catch (DBConnectionException e) { + throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); + } catch (SQLException e) { + throw new ApplicationManagementDAOException("Error occurred while getting application List", e); + } finally { + Util.cleanupResources(stmt, rs); + } + + return id; + } + + + @Override + public void addProperties(Map properties) throws ApplicationManagementDAOException { + + } + + @Override + public void editProperties(Map properties) throws ApplicationManagementDAOException { + + } + + @Override + public void addRelease(ApplicationRelease release) throws ApplicationManagementDAOException { + + } + + +} 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/H2ApplicationDAOImpl.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/H2ApplicationDAOImpl.java deleted file mode 100644 index 025d96ea2db..00000000000 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/H2ApplicationDAOImpl.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * 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.core.dao.impl.application; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.json.JSONException; -import org.wso2.carbon.device.application.mgt.common.*; -import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; -import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; -import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * This class holds the generic implementation of ApplicationDAO which can be used to support ANSI db syntax. - */ -public class H2ApplicationDAOImpl extends AbstractApplicationDAOImpl { - - private static final Log log = LogFactory.getLog(H2ApplicationDAOImpl.class); - - @Override - public ApplicationList getApplications(Filter filter) throws ApplicationManagementDAOException { - - if(log.isDebugEnabled()){ - log.debug("Getting application data from the database"); - log.debug(String.format("Filter: limit=%s, offset=%", filter.getLimit(), filter.getOffset())); - } - - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; - String sql = ""; - ApplicationList applicationList = new ApplicationList(); - List applications = new ArrayList<>(); - Pagination pagination = new Pagination(); - - if (filter == null) { - throw new ApplicationManagementDAOException("Filter need to be instantiated"); - } else { - pagination.setLimit(filter.getLimit()); - pagination.setOffset(filter.getOffset()); - } - - try { - - conn = this.getConnection(); - - sql += "SELECT APP.*, APL.NAME AS APL_NAME, APL.IDENTIFIER AS APL_IDENTIFIER," + - " CAT.NAME AS CAT_NAME "; - sql += "FROM APPM_APPLICATION AS APP "; - sql += "INNER JOIN APPM_PLATFORM_APPLICATION_MAPPING AS APM ON APP.PLATFORM_APPLICATION_MAPPING_ID = APM.ID "; - sql += "INNER JOIN APPM_PLATFORM AS APL ON APM.PLATFORM_ID = APL.ID "; - sql += "INNER JOIN APPM_APPLICATION_CATEGORY AS CAT ON APP.APPLICATION_CATEGORY_ID = CAT.ID "; - - if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { - sql += "WHERE APP.NAME LIKE ? "; - } - sql += "LIMIT ?,?;"; - - stmt = conn.prepareStatement(sql); - int index = 0; - if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { - stmt.setString(++index, "%" + filter.getSearchQuery() + "%"); - } - stmt.setInt(++index, filter.getOffset()); - stmt.setInt(++index, filter.getLimit()); - - rs = stmt.executeQuery(); - - int length = 0; - - while (rs.next()) { - - //Getting properties - sql = "SELECT * FROM APPM_APPLICATION_PROPERTY WHERE APPLICATION_ID=?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, rs.getInt("ID")); - ResultSet rsProperties = stmt.executeQuery(); - - //Getting tags - sql = "SELECT * FROM APPM_APPLICATION_TAG WHERE APPLICATION_ID=?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, rs.getInt("ID")); - ResultSet rsTags = stmt.executeQuery(); - - applications.add(Util.loadApplication(rs, rsProperties, rsTags)); - Util.cleanupResources(null, rsProperties); - Util.cleanupResources(null, rsTags); - length++; - } - - pagination.setSize(length); - pagination.setCount(this.getApplicationCount(filter)); - applicationList.setApplications(applications); - applicationList.setPagination(pagination); - - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while getting application List", e); - } catch (JSONException e) { - throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } finally { - Util.cleanupResources(stmt, rs); - } - return applicationList; - } - - @Override - public int getApplicationId(String uuid) throws ApplicationManagementDAOException { - return 0; - } - - @Override - public void deleteApplication(String uuid) throws ApplicationManagementDAOException { - - } - - @Override - public void deleteProperties(int applicationId) throws ApplicationManagementDAOException { - - } - - @Override - public void deleteTags(int applicationId) throws ApplicationManagementDAOException { - - } - - @Override - public Application editApplication(Application application) throws ApplicationManagementDAOException { - return null; - } - - @Override - public void addProperties(Map properties) throws ApplicationManagementDAOException { - - } - - @Override - public void editProperties(Map properties) throws ApplicationManagementDAOException { - - } - - @Override - public void addRelease(ApplicationRelease release) throws ApplicationManagementDAOException { - - } - - -} 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/MySQLApplicationDAOImpl.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/MySQLApplicationDAOImpl.java deleted file mode 100644 index bbf30ab2fb5..00000000000 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/application/MySQLApplicationDAOImpl.java +++ /dev/null @@ -1,348 +0,0 @@ -/* - * 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.core.dao.impl.application; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.json.JSONException; -import org.wso2.carbon.device.application.mgt.common.*; -import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; -import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; -import org.wso2.carbon.device.application.mgt.core.dao.common.Util; -import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; -import org.wso2.carbon.device.application.mgt.core.util.JSONUtil; - -import java.sql.*; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * This class holds the generic implementation of ApplicationDAO which can be used to support ANSI db syntax. - */ -public class MySQLApplicationDAOImpl extends AbstractApplicationDAOImpl { - - private static final Log log = LogFactory.getLog(MySQLApplicationDAOImpl.class); - - @Override - public ApplicationList getApplications(Filter filter) throws ApplicationManagementDAOException { - - if (log.isDebugEnabled()) { - log.debug("Getting application data from the database"); - log.debug(String.format("Filter: limit=%s, offset=%", filter.getLimit(), filter.getOffset())); - } - - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; - String sql = ""; - ApplicationList applicationList = new ApplicationList(); - List applications = new ArrayList<>(); - Pagination pagination = new Pagination(); - - if (filter == null) { - throw new ApplicationManagementDAOException("Filter need to be instantiated"); - } else { - pagination.setLimit(filter.getLimit()); - pagination.setOffset(filter.getOffset()); - } - - try { - - conn = this.getConnection(); - - sql += "SELECT SQL_CALC_FOUND_ROWS APP.*, APL.NAME AS APL_NAME, APL.IDENTIFIER AS APL_IDENTIFIER, "; - sql += "CAT.ID AS CAT_ID, CAT.NAME AS CAT_NAME "; - sql += "FROM APPM_APPLICATION AS APP "; - sql += "INNER JOIN APPM_PLATFORM AS APL ON APP.PLATFORM_ID = APL.ID "; - sql += "INNER JOIN APPM_APPLICATION_CATEGORY AS CAT ON APP.APPLICATION_CATEGORY_ID = CAT.ID "; - - if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { - sql += "WHERE APP.NAME LIKE ? "; - } - sql += "LIMIT ?,?;"; - - stmt = conn.prepareStatement(sql); - int index = 0; - if (filter.getSearchQuery() != null && !filter.getSearchQuery().isEmpty()) { - stmt.setString(++index, "%" + filter.getSearchQuery() + "%"); - } - stmt.setInt(++index, filter.getOffset()); - stmt.setInt(++index, filter.getLimit()); - - rs = stmt.executeQuery(); - - int length = 0; - sql = "SELECT FOUND_ROWS() AS COUNT;"; //TODO: from which tables???? - stmt = conn.prepareStatement(sql); - ResultSet rsCount = stmt.executeQuery(); - if (rsCount.next()) { - pagination.setCount(rsCount.getInt("COUNT")); - } - - while (rs.next()) { - - //Getting properties - sql = "SELECT * FROM APPM_APPLICATION_PROPERTY WHERE APPLICATION_ID=?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, rs.getInt("ID")); - ResultSet rsProperties = stmt.executeQuery(); - - //Getting tags - sql = "SELECT * FROM APPM_APPLICATION_TAG WHERE APPLICATION_ID=?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, rs.getInt("ID")); - ResultSet rsTags = stmt.executeQuery(); - - applications.add(Util.loadApplication(rs, rsProperties, rsTags)); - Util.cleanupResources(null, rsProperties); - Util.cleanupResources(null, rsTags); - length++; - } - - pagination.setSize(length); - - applicationList.setApplications(applications); - applicationList.setPagination(pagination); - - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while getting application List", e); - } catch (JSONException e) { - throw new ApplicationManagementDAOException("Error occurred while parsing JSON", e); - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } finally { - Util.cleanupResources(stmt, rs); - } - return applicationList; - } - - - @Override - public void deleteApplication(String uuid) throws ApplicationManagementDAOException { - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; - try { - conn = this.getDBConnection(); - String sql = "DELETE FROM APPM_APPLICATION WHERE UUID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setString(1, uuid); - stmt.executeUpdate(); - - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while deleting the application: " + uuid, e); - } finally { - Util.cleanupResources(stmt, rs); - } - } - - @Override - public int getApplicationId(String uuid) throws ApplicationManagementDAOException { - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; - String sql = ""; - - int id = 0; - - try { - conn = this.getDBConnection(); - sql += "SELECT ID FROM APPM_APPLICATION WHERE UUID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setString(1, uuid); - rs = stmt.executeQuery(); - if (rs.next()) { - id = rs.getInt(1); - } - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while getting application List", e); - } finally { - Util.cleanupResources(stmt, rs); - } - - return id; - } - - @Override - public Application editApplication(Application application) throws ApplicationManagementDAOException { - - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; - String sql = ""; - - try { - conn = this.getConnection(); - sql += "UPDATE APPM_APPLICATION SET "; - sql += "NAME = IFNULL (?, NAME), "; - sql += "SHORT_DESCRIPTION = IFNULL (?, SHORT_DESCRIPTION), DESCRIPTION = IFNULL (?, DESCRIPTION), "; - sql += "ICON_NAME = IFNULL (?, ICON_NAME), BANNER_NAME = IFNULL (?, BANNER_NAME), "; - sql += "VIDEO_NAME = IFNULL (?, VIDEO_NAME), SCREENSHOTS = IFNULL (?, SCREENSHOTS), "; - sql += "MODIFIED_AT = IFNULL (?, MODIFIED_AT), "; - if (application.getPayment() != null) { - sql += " IS_FREE = IFNULL (?, IS_FREE), "; - if (application.getPayment().getPaymentCurrency() != null) { - sql += "PAYMENT_CURRENCY = IFNULL (?, PAYMENT_CURRENCY), "; - } - sql += "PAYMENT_PRICE = IFNULL (?, PAYMENT_PRICE), "; - } - if (application.getCategory() != null && application.getCategory().getId() != 0) { - sql += "APPLICATION_CATEGORY_ID = IFNULL (?, APPLICATION_CATEGORY_ID), "; - } - if (application.getPlatform() != null && application.getPlatform().getId() != 0) { - sql += "PLATFORM_ID = IFNULL (?, PLATFORM_ID), "; - } - - sql += "TENANT_ID = IFNULL (?, TENANT_ID) "; - sql += "WHERE UUID = ?"; - - int i = 0; - stmt = conn.prepareStatement(sql); - stmt.setString(++i, application.getName()); - stmt.setString(++i, application.getShortDescription()); - stmt.setString(++i, application.getDescription()); - stmt.setString(++i, application.getIconName()); - stmt.setString(++i, application.getBannerName()); - stmt.setString(++i, application.getVideoName()); - stmt.setString(++i, JSONUtil.listToJsonArrayString(application.getScreenshots())); - stmt.setDate(++i, new Date(application.getModifiedAt().getTime())); - if (application.getPayment() != null) { - stmt.setBoolean(++i, application.getPayment().isFreeApp()); - if (application.getPayment().getPaymentCurrency() != null) { - stmt.setString(++i, application.getPayment().getPaymentCurrency()); - } - stmt.setFloat(++i, application.getPayment().getPaymentPrice()); - } - - if (application.getCategory() != null && application.getCategory().getId() != 0) { - stmt.setInt(++i, application.getCategory().getId()); - } - if (application.getPlatform() != null && application.getPlatform().getId() != 0) { - stmt.setInt(++i, application.getPlatform().getId()); - } - stmt.setInt(++i, application.getUser().getTenantId()); - stmt.setString(++i, application.getUuid()); - stmt.executeUpdate(); - - application.setId(getApplicationId(application.getUuid())); - - if (application.getTags() != null && application.getTags().size() > 0) { - sql = "DELETE FROM APPM_APPLICATION_TAG WHERE APPLICATION_ID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, application.getId()); - stmt.executeUpdate(); - - sql = "INSERT INTO APPM_APPLICATION_TAG (NAME, APPLICATION_ID) VALUES (?, ?); "; - stmt = conn.prepareStatement(sql); - for (String tag : application.getTags()) { - stmt.setString(1, tag); - stmt.setInt(2, application.getId()); - stmt.addBatch(); - } - stmt.executeBatch(); - } - - // delete existing properties and add new ones. if no properties are set, existing ones will be deleted. - sql = "DELETE FROM APPM_APPLICATION_PROPERTY WHERE APPLICATION_ID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, application.getId()); - stmt.executeUpdate(); - - sql = "INSERT INTO APPM_APPLICATION_PROPERTY (PROP_KEY, PROP_VAL, APPLICATION_ID) VALUES (?, ?, ?); "; - stmt = conn.prepareStatement(sql); - for (String propKey : application.getProperties().keySet()) { - stmt.setString(1, propKey); - stmt.setString(2, application.getProperties().get(propKey)); - stmt.setInt(3, application.getId()); - stmt.addBatch(); - } - stmt.executeBatch(); - - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while adding the application", e); - } - - return application; - } - - @Override - public void addProperties(Map properties) throws ApplicationManagementDAOException { - - } - - @Override - public void editProperties(Map properties) throws ApplicationManagementDAOException { - - } - - @Override - public void deleteProperties(int applicationId) throws ApplicationManagementDAOException { - Connection conn = null; - PreparedStatement stmt = null; - try { - conn = this.getDBConnection(); - String sql = "DELETE FROM APPM_APPLICATION_PROPERTY WHERE APPLICATION_ID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, applicationId); - stmt.executeUpdate(); - - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while deleting properties of application: " + applicationId, e); - } finally { - Util.cleanupResources(stmt, null); - } - } - - @Override - public void deleteTags(int applicationId) throws ApplicationManagementDAOException { - - Connection conn = null; - PreparedStatement stmt = null; - ResultSet rs = null; - try { - conn = this.getDBConnection(); - String sql = "DELETE FROM APPM_APPLICATION_TAG WHERE APPLICATION_ID = ?"; - stmt = conn.prepareStatement(sql); - stmt.setInt(1, applicationId); - stmt.executeUpdate(); - - } catch (DBConnectionException e) { - throw new ApplicationManagementDAOException("Error occurred while obtaining the DB connection.", e); - } catch (SQLException e) { - throw new ApplicationManagementDAOException("Error occurred while deleting tags of application: " + applicationId, e); - } finally { - Util.cleanupResources(stmt, rs); - } - } - - @Override - public void addRelease(ApplicationRelease release) throws ApplicationManagementDAOException { - - } -} 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/platform/GenericPlatformDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/platform/GenericPlatformDAOImpl.java index 25f2d05d3a1..de980fd5ed0 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/platform/GenericPlatformDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/platform/GenericPlatformDAOImpl.java @@ -227,13 +227,14 @@ public class GenericPlatformDAOImpl extends AbstractDAOImpl implements PlatformD public void unregister(int tenantId, String platformIdenfier, boolean isFileBased) throws PlatformManagementDAOException { PreparedStatement preparedStatement = null; + String deletePlatform = null; try { Platform platform = getPlatform(tenantId, platformIdenfier); if (platform != null) { if (isFileBased == platform.isFileBased()) { Connection connection = this.getDBConnection(); - String deletePlatform = "DELETE FROM APPM_PLATFORM WHERE ID = ?"; + deletePlatform = "DELETE FROM APPM_PLATFORM WHERE ID = ?"; preparedStatement = connection.prepareStatement(deletePlatform); preparedStatement.setInt(1, platform.getId()); preparedStatement.execute(); @@ -255,7 +256,8 @@ public class GenericPlatformDAOImpl extends AbstractDAOImpl implements PlatformD "Unable to obtain the connection while trying to register the platform - " + platformIdenfier + " for tenant - " + tenantId, e); } catch (SQLException e) { - throw new PlatformManagementDAOException("Error while executing the SQL query. ", e); + throw new PlatformManagementDAOException("Error while executing the SQL query : " + deletePlatform + " " + + "while trying to un-register the platform with identifier " + platformIdenfier, e); } finally { Util.cleanupResources(preparedStatement, null); } 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 358770320d1..05afbb555c4 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 @@ -89,7 +89,6 @@ public class ApplicationManagerImpl implements ApplicationManager { } Lifecycle lifecycle = new Lifecycle(); lifecycle.setLifecycleState(lifecycleState); - lifecycle.setLifecycleState(lifecycleState); lifecycle.setLifecycleStateModifiedAt(new Date()); lifecycle.setGetLifecycleStateModifiedBy(application.getUser().getUserName()); application.setCurrentLifecycle(lifecycle); @@ -107,50 +106,63 @@ public class ApplicationManagerImpl implements ApplicationManager { @Override public Application editApplication(Application application) throws ApplicationManagementException { - + String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); if (application.getUuid() == null) { throw new ValidationException("Application UUID cannot be empty"); } + if (!isApplicationOwnerOrAdmin(application.getUuid(), userName, tenantId)) { + throw new ApplicationManagementException("User " + userName + " does not have permissions to edit the " + + "application with the UUID " + application.getUuid()); + } try { - ConnectionManagerUtil.openConnection(); - ApplicationDAO applicationDAO = DAOFactory.getApplicationDAO(); - - if (application.getPlatform()!= null && application.getPlatform().getIdentifier() != null) { + ConnectionManagerUtil.beginDBTransaction(); + if (application.getPlatform() != null && application.getPlatform().getIdentifier() != null) { PlatformDAO platformDAO = DAOFactory.getPlatformDAO(); - Platform platform = platformDAO.getPlatform(application.getUser().getTenantId(), application.getPlatform() - .getIdentifier()); - application.setPlatform(platform); + Platform platform = platformDAO + .getPlatform(tenantId, application.getPlatform().getIdentifier()); if (platform == null) { - throw new NotFoundException("Invalid platform"); + ConnectionManagerUtil.commitDBTransaction(); + throw new NotFoundException( + "Platform specified by identifier " + application.getPlatform().getIdentifier() + + " is not found. Please give a valid platform identifier."); } + application.setPlatform(platform); } - + ApplicationDAO applicationDAO = DAOFactory.getApplicationDAO(); application.setModifiedAt(new Date()); - - return applicationDAO.editApplication(application); + Application modifiedApplication = applicationDAO.editApplication(application, tenantId); + ConnectionManagerUtil.commitDBTransaction(); + return modifiedApplication; + } catch (ApplicationManagementDAOException e) { + ConnectionManagerUtil.rollbackDBTransaction(); + throw e; } finally { - ConnectionManagerUtil.closeConnection(); + ConnectionManagerUtil.closeDBConnection(); } - } @Override public void deleteApplication(String uuid) throws ApplicationManagementException { + String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + if (!isApplicationOwnerOrAdmin(uuid, userName, tenantId)) { + throw new ApplicationManagementException("User '" + userName + "' of tenant - " + tenantId + " does have" + + " the permission to delete the application with UUID " + uuid); + } try { ApplicationDAO applicationDAO = DAOFactory.getApplicationDAO(); - int appId = applicationDAO.getApplicationId(uuid); ConnectionManagerUtil.beginDBTransaction(); + int appId = applicationDAO.getApplicationId(uuid); applicationDAO.deleteTags(appId); applicationDAO.deleteProperties(appId); applicationDAO.deleteApplication(uuid); ConnectionManagerUtil.commitDBTransaction(); - } catch (ApplicationManagementDAOException e) { ConnectionManagerUtil.rollbackDBTransaction(); String msg = "Failed to delete application: " + uuid; throw new ApplicationManagementException(msg, e); - } finally { ConnectionManagerUtil.closeDBConnection(); } diff --git a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/mysql.sql b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/mysql.sql index d1dcd6a516f..40766adc0c7 100644 --- a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/mysql.sql +++ b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/dbscripts/cdm/application-mgt/mysql.sql @@ -49,19 +49,72 @@ CREATE TABLE IF NOT EXISTS `APPM_APPLICATION_CATEGORY` ( ENGINE = InnoDB COMMENT = 'This table contains the data related to the application category'; +INSERT INTO APPM_APPLICATION_CATEGORY (NAME, DESCRIPTION, PUBLISHED) VALUES ('Enterprise', 'Enterprise level +applications which the artifacts need to be provided', 1); +INSERT INTO APPM_APPLICATION_CATEGORY (NAME, DESCRIPTION, PUBLISHED) VALUES ('Public', 'Public category in which the +application need to be downloaded from the public application store', 1); -- ----------------------------------------------------- -- Table `APPM_LIFECYCLE_STATE` -- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `APPM_LIFECYCLE_STATE` ( - `ID` INT NOT NULL AUTO_INCREMENT, - `NAME` VARCHAR(100) NOT NULL, - `IDENTIFIER` VARCHAR(100) NOT NULL, - `DESCRIPTION` TEXT NULL, - PRIMARY KEY (`ID`), - UNIQUE INDEX `IDENTIFIER_UNIQUE` (`IDENTIFIER` ASC)) - ENGINE = InnoDB; +CREATE TABLE IF NOT EXISTS APPM_LIFECYCLE_STATE ( + ID INT NOT NULL AUTO_INCREMENT UNIQUE, + NAME VARCHAR(100) NOT NULL, + IDENTIFIER VARCHAR(100) NOT NULL, + DESCRIPTION TEXT NULL, + PRIMARY KEY (ID), + UNIQUE INDEX APPM_LIFECYCLE_STATE_IDENTIFIER_UNIQUE (IDENTIFIER ASC)); + +INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) VALUES ('CREATED', 'CREATED', 'Application creation +initial state'); +INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) +VALUES ('IN REVIEW', 'IN REVIEW', 'Application is in in-review state'); +INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) +VALUES ('APPROVED', 'APPROVED', 'State in which Application is approved after reviewing.'); +INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) +VALUES ('REJECTED', 'REJECTED', 'State in which Application is rejected after reviewing.'); +INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) +VALUES ('PUBLISHED', 'PUBLISHED', 'State in which Application is in published state.'); +INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) +VALUES ('UNPUBLISHED', 'UNPUBLISHED', 'State in which Application is in un published state.'); +INSERT INTO APPM_LIFECYCLE_STATE (NAME, IDENTIFIER, DESCRIPTION) +VALUES ('RETIRED', 'RETIRED', 'Retiring an application to indicate end of life state,'); + + +CREATE TABLE IF NOT EXISTS APPM_LIFECYCLE_STATE_TRANSITION +( + ID INT NOT NULL AUTO_INCREMENT UNIQUE, + INITIAL_STATE INT, + NEXT_STATE INT, + PERMISSION VARCHAR(1024), + DESCRIPTION VARCHAR(2048), + PRIMARY KEY (INITIAL_STATE, NEXT_STATE), + FOREIGN KEY (INITIAL_STATE) REFERENCES APPM_LIFECYCLE_STATE(ID) ON DELETE CASCADE, + FOREIGN KEY (NEXT_STATE) REFERENCES APPM_LIFECYCLE_STATE(ID) ON DELETE CASCADE +); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (1, 2, null, 'Submit for review'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (2, 1, null, 'Revoke from review'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (2, 3, '/permission/admin/manage/device-mgt/application/review', 'APPROVE'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (2, 4, '/permission/admin/manage/device-mgt/application/review', 'REJECT'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (3, 4, '/permission/admin/manage/device-mgt/application/review', 'REJECT'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (3, 5, null, 'PUBLISH'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (5, 6, null, 'UN PUBLISH'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (6, 5, null, 'PUBLISH'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (4, 1, null, 'Return to CREATE STATE'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (6, 1, null, 'Return to CREATE STATE'); +INSERT INTO APPM_LIFECYCLE_STATE_TRANSITION(INITIAL_STATE, NEXT_STATE, PERMISSION, DESCRIPTION) VALUES + (6, 7, null, 'Retire'); -- ----------------------------------------------------- -- Table `APPM_APPLICATION`