From c07d77b85dfab60be08824e2322a37a5d006fa43 Mon Sep 17 00:00:00 2001 From: charitha Date: Tue, 22 Nov 2016 21:13:18 +0530 Subject: [PATCH] Updated group sharing model --- .../service/api/GroupManagementService.java | 157 +------ .../impl/GroupManagementServiceImpl.java | 69 +-- .../mgt/common/group/mgt/DeviceGroup.java | 21 - .../carbon/device/mgt/core/dao/GroupDAO.java | 102 +++++ .../mgt/core/dao/impl/GroupDAOImpl.java | 360 +++++++++++++-- .../core/dao/util/GroupManagementDAOUtil.java | 2 - .../GroupManagementProviderService.java | 67 +-- .../GroupManagementProviderServiceImpl.java | 411 +++++------------- .../mgt/core/common/TestDataHolder.java | 2 - .../mgt/core/dao/GroupPersistTests.java | 4 - .../src/test/resources/sql/h2.sql | 12 +- .../src/main/resources/dbscripts/cdm/h2.sql | 12 +- .../main/resources/dbscripts/cdm/mssql.sql | 46 ++ .../main/resources/dbscripts/cdm/mysql.sql | 40 ++ .../main/resources/dbscripts/cdm/oracle.sql | 28 +- .../resources/dbscripts/cdm/postgresql.sql | 30 ++ 16 files changed, 735 insertions(+), 628 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GroupManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GroupManagementService.java index b7630f16433..64e56d1254c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GroupManagementService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/api/GroupManagementService.java @@ -19,26 +19,38 @@ package org.wso2.carbon.device.mgt.jaxrs.service.api; -import io.swagger.annotations.SwaggerDefinition; -import io.swagger.annotations.Info; -import io.swagger.annotations.ExtensionProperty; -import io.swagger.annotations.Extension; -import io.swagger.annotations.Tag; import io.swagger.annotations.Api; -import io.swagger.annotations.AuthorizationScope; -import io.swagger.annotations.Authorization; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.Authorization; +import io.swagger.annotations.AuthorizationScope; +import io.swagger.annotations.Extension; +import io.swagger.annotations.ExtensionProperty; +import io.swagger.annotations.Info; import io.swagger.annotations.ResponseHeader; +import io.swagger.annotations.SwaggerDefinition; +import io.swagger.annotations.Tag; import org.apache.axis2.transport.http.HTTPConstants; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; -import org.wso2.carbon.device.mgt.jaxrs.beans.*; +import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceGroupList; +import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceGroupShare; +import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceGroupUsersList; +import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceList; +import org.wso2.carbon.device.mgt.jaxrs.beans.ErrorResponse; import javax.validation.Valid; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.List; @@ -475,126 +487,6 @@ public interface GroupManagementService { required = true) @Valid DeviceGroupShare deviceGroupShare); - @Path("/id/{groupId}/users") - @GET - @ApiOperation( - produces = MediaType.APPLICATION_JSON, - httpMethod = HTTPConstants.HEADER_GET, - value = "View list of users of a device group.", - notes = "Returns details of users which particular group has been shared with.", - tags = "Device Group Management", - authorizations = { - @Authorization( - value="permission", - scopes = { @AuthorizationScope(scope = "/device-mgt/groups/users/view", - description = "View users") } - ) - } - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK. \n Successfully fetched the users.", - response = DeviceGroupUsersList.class, - responseHeaders = { - @ResponseHeader( - name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = "Date and time the resource has been modified the last time.\n" + - "Used by caches, or in conditional requests."), - }), - @ApiResponse( - code = 304, - message = "Not Modified. \n Empty body because the client has already the latest version of " + - "the requested resource."), - @ApiResponse( - code = 404, - message = "No groups found.", - response = ErrorResponse.class), - @ApiResponse( - code = 406, - message = "Not Acceptable.\n The requested media type is not supported."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Server error occurred while fetching the users.", - response = ErrorResponse.class) - }) - Response getUsersOfGroup(@ApiParam( - name = "groupId", - value = "ID of the group.", - required = true) - @PathParam("groupId") int groupId); - - - @Path("id/{groupId}/roles/create") - @POST - @ApiOperation( - produces = MediaType.APPLICATION_JSON, - httpMethod = HTTPConstants.HEADER_GET, - value = "Create a group sharing role to a device group.", - notes = "Group sharing is done through a group sharing role.", - tags = "Device Group Management", - authorizations = { - @Authorization( - value="permission", - scopes = { @AuthorizationScope(scope = "/device-mgt/groups/roles/create", - description = "Create roles") } - ) - } - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK. \n Successfully created the role.", - response = DeviceGroupUsersList.class, - responseHeaders = { - @ResponseHeader( - name = "Content-Type", - description = "The content type of the body"), - @ResponseHeader( - name = "ETag", - description = "Entity Tag of the response resource.\n" + - "Used by caches, or in conditional requests."), - @ResponseHeader( - name = "Last-Modified", - description = "Date and time the resource has been modified the last time.\n" + - "Used by caches, or in conditional requests."), - }), - @ApiResponse( - code = 304, - message = "Not Modified. \n Empty body because the client has already the latest version of " + - "the requested resource."), - @ApiResponse( - code = 404, - message = "No groups found.", - response = ErrorResponse.class), - @ApiResponse( - code = 406, - message = "Not Acceptable.\n The requested media type is not supported."), - @ApiResponse( - code = 500, - message = "Internal Server Error. \n Server error occurred while creating the role.", - response = ErrorResponse.class) - }) - Response createGroupSharingRole( - @ApiParam( - name = "groupId", - value = "ID of the group.", - required = true) - @PathParam("groupId") int groupId, - @ApiParam( - name = "userName", - value = "User name of the current user.", - required = false) - @QueryParam("userName") String userName, - @ApiParam( - name = "roleInfo", - value = "Group role information with permissions and users", - required = true) - @Valid RoleInfo roleInfo); - @Path("/id/{groupId}/roles") @GET @ApiOperation( @@ -647,12 +539,7 @@ public interface GroupManagementService { name = "groupId", value = "ID of the group.", required = true) - @PathParam("groupId") int groupId, - @ApiParam( - name = "userName", - value = "User name of the current user.", - required = false) - @QueryParam("userName") String userName); + @PathParam("groupId") int groupId); @Path("/id/{groupId}/devices") @GET diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GroupManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GroupManagementServiceImpl.java index 90208d4409e..89d8f8cf55b 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GroupManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/GroupManagementServiceImpl.java @@ -31,19 +31,17 @@ import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; import org.wso2.carbon.device.mgt.common.group.mgt.GroupAlreadyExistException; import org.wso2.carbon.device.mgt.common.group.mgt.GroupManagementException; -import org.wso2.carbon.device.mgt.common.group.mgt.GroupUser; import org.wso2.carbon.device.mgt.common.group.mgt.RoleDoesNotExistException; import org.wso2.carbon.device.mgt.core.service.GroupManagementProviderService; -import org.wso2.carbon.device.mgt.jaxrs.beans.*; +import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceGroupList; +import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceGroupShare; +import org.wso2.carbon.device.mgt.jaxrs.beans.DeviceList; +import org.wso2.carbon.device.mgt.jaxrs.beans.RoleList; import org.wso2.carbon.device.mgt.jaxrs.service.api.GroupManagementService; import org.wso2.carbon.device.mgt.jaxrs.service.impl.util.RequestValidationUtil; import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils; -import org.wso2.carbon.user.api.UserStoreException; -import org.wso2.carbon.user.api.UserStoreManager; -import org.wso2.carbon.user.core.multiplecredentials.UserDoesNotExistException; import javax.ws.rs.core.Response; -import java.util.Date; import java.util.List; public class GroupManagementServiceImpl implements GroupManagementService { @@ -100,8 +98,6 @@ public class GroupManagementServiceImpl implements GroupManagementService { return Response.status(Response.Status.BAD_REQUEST).build(); } group.setOwner(owner); - group.setDateOfCreation(new Date().getTime()); - group.setDateOfLastUpdate(new Date().getTime()); try { DeviceMgtAPIUtils.getGroupManagementProviderService().createGroup(group, DEFAULT_ADMIN_ROLE, DEFAULT_ADMIN_PERMISSIONS); return Response.status(Response.Status.CREATED).build(); @@ -171,66 +167,21 @@ public class GroupManagementServiceImpl implements GroupManagementService { public Response manageGroupSharing(int groupId, DeviceGroupShare deviceGroupShare) { try { DeviceMgtAPIUtils.getGroupManagementProviderService() - .manageGroupSharing(groupId, deviceGroupShare.getUsername(), deviceGroupShare.getGroupRoles()); + .manageGroupSharing(groupId, deviceGroupShare.getGroupRoles()); return Response.status(Response.Status.OK).build(); } catch (GroupManagementException e) { String msg = "Error occurred while managing group share."; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } catch (RoleDoesNotExistException | UserDoesNotExistException e) { + } catch (RoleDoesNotExistException e) { return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build(); } } @Override - public Response getUsersOfGroup(int groupId) { + public Response getRolesOfGroup(int groupId) { try { - List groupUsers = DeviceMgtAPIUtils.getGroupManagementProviderService().getUsers(groupId); - if (groupUsers != null && groupUsers.size() > 0) { - DeviceGroupUsersList deviceGroupUsersList = new DeviceGroupUsersList(); - deviceGroupUsersList.setList(groupUsers); - deviceGroupUsersList.setCount(groupUsers.size()); - return Response.status(Response.Status.OK).entity(deviceGroupUsersList).build(); - } else { - return Response.status(Response.Status.NOT_FOUND).build(); - } - } catch (GroupManagementException e) { - String msg = "Error occurred while getting users of the group."; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - } - - @Override - public Response createGroupSharingRole(int groupId, String userName, RoleInfo roleInfo) { - try { - DeviceMgtAPIUtils.getGroupManagementProviderService() - .addGroupSharingRole(userName, groupId, roleInfo.getRoleName(), roleInfo.getPermissions()); - return Response.status(Response.Status.CREATED).build(); - } catch (GroupManagementException e) { - String msg = "Error occurred while creating group sharing role."; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } - } - - @Override - public Response getRolesOfGroup(int groupId, String userName) { - try { - List groupRoles; - if(userName != null) { - UserStoreManager userStoreManager = DeviceMgtAPIUtils.getUserStoreManager(); - if (!userStoreManager.isExistingUser(userName)) { - // returning response with bad request state - return Response.status(Response.Status.CONFLICT).entity( - new ErrorResponse.ErrorResponseBuilder().setMessage("User by username: " + - userName + " doesn't exists. Therefore, request made to get user " + - "was refused.").build()).build(); - } - groupRoles = DeviceMgtAPIUtils.getGroupManagementProviderService().getRoles(userName, groupId); - } else { - groupRoles = DeviceMgtAPIUtils.getGroupManagementProviderService().getRoles(groupId); - } + List groupRoles = DeviceMgtAPIUtils.getGroupManagementProviderService().getRoles(groupId); if(groupRoles != null && groupRoles.size() > 0) { RoleList deviceGroupRolesList = new RoleList(); @@ -244,10 +195,6 @@ public class GroupManagementServiceImpl implements GroupManagementService { String msg = "Error occurred while getting roles of the group."; log.error(msg, e); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); - } catch (UserStoreException e) { - String msg = "Error while retrieving the user."; - log.error(msg, e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/group/mgt/DeviceGroup.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/group/mgt/DeviceGroup.java index d4417bf58a7..c85fa314dff 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/group/mgt/DeviceGroup.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/group/mgt/DeviceGroup.java @@ -20,10 +20,7 @@ package org.wso2.carbon.device.mgt.common.group.mgt; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; -import java.util.List; /** * Holds Device Group details and expose to external access @@ -44,8 +41,6 @@ public class DeviceGroup implements Serializable { required = true) private String name; - private Long dateOfCreation; - private Long dateOfLastUpdate; private String owner; public int getGroupId() { @@ -72,22 +67,6 @@ public class DeviceGroup implements Serializable { this.name = name; } - public Long getDateOfCreation() { - return dateOfCreation; - } - - public void setDateOfCreation(Long dateOfCreation) { - this.dateOfCreation = dateOfCreation; - } - - public Long getDateOfLastUpdate() { - return dateOfLastUpdate; - } - - public void setDateOfLastUpdate(Long dateOfLastUpdate) { - this.dateOfLastUpdate = dateOfLastUpdate; - } - public String getOwner() { return owner; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/GroupDAO.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/GroupDAO.java index b367d2c3477..2536aa40e27 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/GroupDAO.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/GroupDAO.java @@ -86,6 +86,18 @@ public interface GroupDAO { */ List getGroups(GroupPaginationRequest paginationRequest, int tenantId) throws GroupManagementDAOException; + /** + * Get paginated list of Device Groups in tenant with specified device group ids. + * + * @param paginationRequest to filter results. + * @param deviceGroupIds of groups required. + * @param tenantId of user's tenant. + * @return List of all Device Groups in tenant. + * @throws GroupManagementDAOException + */ + List getGroups(GroupPaginationRequest paginationRequest, List deviceGroupIds, + int tenantId) throws GroupManagementDAOException; + /** * Get the list of Device Groups in tenant. * @@ -178,4 +190,94 @@ public interface GroupDAO { List getDevices(int groupId, int startIndex, int rowCount, int tenantId) throws GroupManagementDAOException; + /** + * Get all user roles for device group. + * + * @param groupId of the group + * @param tenantId of user's tenant. + * @return list of roles + * @throws GroupManagementDAOException + */ + List getRoles(int groupId, int tenantId) throws GroupManagementDAOException; + + /** + * Add user role for device group. + * + * @param groupId of the group. + * @param role to be added. + * @param tenantId of user's tenant. + * @throws GroupManagementDAOException + */ + void addRole(int groupId, String role, int tenantId) throws GroupManagementDAOException; + + /** + * Add user role for device group. + * + * @param groupId of the group. + * @param role to be removed. + * @param tenantId of user's tenant. + * @throws GroupManagementDAOException + */ + void removeRole(int groupId, String role, int tenantId) throws GroupManagementDAOException; + + /** + * Get all device groups which shared with a user role. + * + * @param roles of the group. + * @param tenantId of user's tenant. + * @return list of device groups. + * @throws GroupManagementDAOException + */ + List getGroups(String[] roles, int tenantId) throws GroupManagementDAOException; + + /** + * Get all device group ids which shared with a user role. + * + * @param roles of the group. + * @param tenantId of user's tenant. + * @return list of device group ids. + * @throws GroupManagementDAOException + */ + List getGroupIds(String[] roles, int tenantId) throws GroupManagementDAOException; + + /** + * Get count of all device groups which shared with a user role. + * + * @param roles of the group. + * @param tenantId of user's tenant. + * @return count of device groups. + * @throws GroupManagementDAOException + */ + int getGroupsCount(String[] roles, int tenantId) throws GroupManagementDAOException; + + /** + * Get all device groups which owned by user. + * + * @param username of the owner. + * @param tenantId of user's tenant. + * @return list of device groups. + * @throws GroupManagementDAOException + */ + List getOwnGroups(String username, int tenantId) throws GroupManagementDAOException; + + /** + * Get all device group ids which owned by user. + * + * @param username of the owner. + * @param tenantId of user's tenant. + * @return list of device group ids. + * @throws GroupManagementDAOException + */ + List getOwnGroupIds(String username, int tenantId) throws GroupManagementDAOException; + + /** + * Get count of device groups which owned by user. + * + * @param username of the owner. + * @param tenantId of user's tenant. + * @return count of device groups. + * @throws GroupManagementDAOException + */ + int getOwnGroupsCount(String username, int tenantId) throws GroupManagementDAOException; + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/GroupDAOImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/GroupDAOImpl.java index 5a8e089f8f9..7a1fc379115 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/GroupDAOImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/impl/GroupDAOImpl.java @@ -22,9 +22,9 @@ import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.GroupPaginationRequest; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; import org.wso2.carbon.device.mgt.core.dao.GroupDAO; -import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import org.wso2.carbon.device.mgt.core.dao.GroupManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.GroupManagementDAOFactory; +import org.wso2.carbon.device.mgt.core.dao.util.DeviceManagementDAOUtil; import org.wso2.carbon.device.mgt.core.dao.util.GroupManagementDAOUtil; import java.sql.Connection; @@ -32,7 +32,6 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Date; import java.util.List; /** @@ -47,15 +46,12 @@ public class GroupDAOImpl implements GroupDAO { int groupId = -1; try { Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, DATE_OF_CREATE, DATE_OF_LAST_UPDATE, " - + "OWNER, TENANT_ID) VALUES (?, ?, ?, ?, ?, ?)"; + String sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID) VALUES (?, ?, ?, ?)"; stmt = conn.prepareStatement(sql, new String[]{"ID"}); stmt.setString(1, deviceGroup.getDescription()); stmt.setString(2, deviceGroup.getName()); - stmt.setLong(3, new Date().getTime()); - stmt.setLong(4, new Date().getTime()); - stmt.setString(5, deviceGroup.getOwner()); - stmt.setInt(6, tenantId); + stmt.setString(3, deviceGroup.getOwner()); + stmt.setInt(4, tenantId); stmt.executeUpdate(); rs = stmt.getGeneratedKeys(); if (rs.next()) { @@ -76,15 +72,13 @@ public class GroupDAOImpl implements GroupDAO { PreparedStatement stmt = null; try { Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "UPDATE DM_GROUP SET DESCRIPTION = ?, GROUP_NAME = ?, DATE_OF_LAST_UPDATE = ?, OWNER = ? " - + "WHERE ID = ? AND TENANT_ID = ?"; + String sql = "UPDATE DM_GROUP SET DESCRIPTION = ?, GROUP_NAME = ?, OWNER = ? WHERE ID = ? AND TENANT_ID = ?"; stmt = conn.prepareStatement(sql); stmt.setString(1, deviceGroup.getDescription()); stmt.setString(2, deviceGroup.getName()); - stmt.setLong(3, deviceGroup.getDateOfLastUpdate()); - stmt.setString(4, deviceGroup.getOwner()); - stmt.setInt(5, groupId); - stmt.setInt(6, tenantId); + stmt.setString(3, deviceGroup.getOwner()); + stmt.setInt(4, groupId); + stmt.setInt(5, tenantId); stmt.executeUpdate(); } catch (SQLException e) { throw new GroupManagementDAOException("Error occurred while updating deviceGroup '" + @@ -100,7 +94,12 @@ public class GroupDAOImpl implements GroupDAO { PreparedStatement stmt = null; try { conn = GroupManagementDAOFactory.getConnection(); - String sql = "DELETE FROM DM_DEVICE_GROUP_MAP WHERE GROUP_ID = ? AND TENANT_ID = ?"; + String sql = "DELETE FROM DM_ROLE_GROUP_MAP WHERE GROUP_ID = ? AND TENANT_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, groupId); + stmt.setInt(2, tenantId); + stmt.executeUpdate(); + sql = "DELETE FROM DM_DEVICE_GROUP_MAP WHERE GROUP_ID = ? AND TENANT_ID = ?"; stmt = conn.prepareStatement(sql); stmt.setInt(1, groupId); stmt.setInt(2, tenantId); @@ -131,8 +130,7 @@ public class GroupDAOImpl implements GroupDAO { ResultSet resultSet = null; try { Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, DATE_OF_CREATE, DATE_OF_LAST_UPDATE, OWNER " - + "FROM DM_GROUP WHERE ID = ? AND TENANT_ID = ?"; + String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER FROM DM_GROUP WHERE ID = ? AND TENANT_ID = ?"; stmt = conn.prepareStatement(sql); stmt.setInt(1, groupId); stmt.setInt(2, tenantId); @@ -157,9 +155,9 @@ public class GroupDAOImpl implements GroupDAO { List deviceGroupBuilders = new ArrayList<>(); try { Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "SELECT G.ID, G.GROUP_NAME, G.DESCRIPTION, G.DATE_OF_CREATE, G.DATE_OF_LAST_UPDATE, \n" + - "G.OWNER FROM DM_GROUP G INNER JOIN DM_DEVICE_GROUP_MAP GM ON G.ID = GM.GROUP_ID " + - "WHERE GM.DEVICE_ID = ? AND GM.TENANT_ID = ?"; + String sql = "SELECT G.ID, G.GROUP_NAME, G.DESCRIPTION, G.OWNER FROM DM_GROUP G " + + "INNER JOIN DM_DEVICE_GROUP_MAP GM ON G.ID = GM.GROUP_ID " + + "WHERE GM.DEVICE_ID = ? AND GM.TENANT_ID = ?"; stmt = conn.prepareStatement(sql); stmt.setInt(1, deviceId); stmt.setInt(2, tenantId); @@ -190,8 +188,7 @@ public class GroupDAOImpl implements GroupDAO { try { Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, DATE_OF_CREATE, DATE_OF_LAST_UPDATE, OWNER " - + "FROM DM_GROUP WHERE TENANT_ID = ?"; + String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER FROM DM_GROUP WHERE TENANT_ID = ?"; if (groupName != null && !groupName.isEmpty()) { sql += " AND GROUP_NAME LIKE ?"; hasGroupName = true; @@ -230,6 +227,71 @@ public class GroupDAOImpl implements GroupDAO { return deviceGroupList; } + @Override + public List getGroups(GroupPaginationRequest request, List deviceGroupIds, + int tenantId) throws GroupManagementDAOException { + if (deviceGroupIds.size() == 0) { + return new ArrayList<>(); + } + PreparedStatement stmt = null; + ResultSet resultSet = null; + List deviceGroupList = null; + + String groupName = request.getGroupName(); + boolean hasGroupName = false; + String owner = request.getOwner(); + boolean hasOwner = false; + boolean hasLimit = request.getRowCount() != 0; + + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER FROM DM_GROUP WHERE TENANT_ID = ?"; + if (groupName != null && !groupName.isEmpty()) { + sql += " AND GROUP_NAME LIKE ?"; + hasGroupName = true; + } + if (owner != null && !owner.isEmpty()) { + sql += " AND OWNER LIKE ?"; + hasOwner = true; + } + sql += " AND ID IN ("; + for (int i = 0; i < deviceGroupIds.size() - 1; i++) { + sql += "?,"; + } + sql += "?)"; + if (hasLimit) { + sql += " LIMIT ?, ?"; + } + + int paramIndex = 1; + stmt = conn.prepareStatement(sql); + stmt.setInt(paramIndex++, tenantId); + if (hasGroupName) { + stmt.setString(paramIndex++, groupName + "%"); + } + if (hasOwner) { + stmt.setString(paramIndex++, owner + "%"); + } + for (Integer deviceGroupId : deviceGroupIds) { + stmt.setInt(paramIndex++, deviceGroupId); + } + if (hasLimit) { + stmt.setInt(paramIndex++, request.getStartIndex()); + stmt.setInt(paramIndex, request.getRowCount()); + } + resultSet = stmt.executeQuery(); + deviceGroupList = new ArrayList<>(); + while (resultSet.next()) { + deviceGroupList.add(GroupManagementDAOUtil.loadGroup(resultSet)); + } + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while listing all groups in tenant: " + tenantId, e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, resultSet); + } + return deviceGroupList; + } + @Override public List getGroups(int tenantId) throws GroupManagementDAOException { PreparedStatement stmt = null; @@ -237,8 +299,7 @@ public class GroupDAOImpl implements GroupDAO { List deviceGroupList = null; try { Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, DATE_OF_CREATE, DATE_OF_LAST_UPDATE, OWNER " - + "FROM DM_GROUP WHERE TENANT_ID = ?"; + String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER FROM DM_GROUP WHERE TENANT_ID = ?"; stmt = conn.prepareStatement(sql); stmt.setInt(1, tenantId); resultSet = stmt.executeQuery(); @@ -327,8 +388,7 @@ public class GroupDAOImpl implements GroupDAO { ResultSet resultSet = null; try { Connection conn = GroupManagementDAOFactory.getConnection(); - String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, DATE_OF_CREATE, DATE_OF_LAST_UPDATE, OWNER " + - "FROM DM_GROUP WHERE GROUP_NAME = ? AND TENANT_ID = ?"; + String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER FROM DM_GROUP WHERE GROUP_NAME = ? AND TENANT_ID = ?"; stmt = conn.prepareStatement(sql); stmt.setString(1, groupName); stmt.setInt(2, tenantId); @@ -356,7 +416,6 @@ public class GroupDAOImpl implements GroupDAO { stmt.setInt(2, groupId); stmt.setInt(3, tenantId); stmt.executeUpdate(); - stmt.getGeneratedKeys(); } catch (SQLException e) { throw new GroupManagementDAOException("Error occurred while adding device to Group.", e); } finally { @@ -376,7 +435,6 @@ public class GroupDAOImpl implements GroupDAO { stmt.setInt(2, groupId); stmt.setInt(3, tenantId); stmt.executeUpdate(); - stmt.getGeneratedKeys(); } catch (SQLException e) { throw new GroupManagementDAOException("Error occurred while removing device from Group.", e); } finally { @@ -428,7 +486,6 @@ public class GroupDAOImpl implements GroupDAO { } } - //TODO: Move this to device mgt @Override public List getDevices(int groupId, int startIndex, int rowCount, int tenantId) throws GroupManagementDAOException { @@ -470,4 +527,249 @@ public class GroupDAOImpl implements GroupDAO { return devices; } + @Override + public List getRoles(int groupId, int tenantId) throws GroupManagementDAOException { + PreparedStatement stmt = null; + ResultSet resultSet = null; + List userRoles; + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "SELECT ROLE FROM DM_ROLE_GROUP_MAP WHERE GROUP_ID = ? AND TENANT_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, groupId); + stmt.setInt(2, tenantId); + resultSet = stmt.executeQuery(); + userRoles = new ArrayList<>(); + while (resultSet.next()) { + userRoles.add(resultSet.getString("ROLE")); + } + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while listing all groups in tenant: " + tenantId, e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, resultSet); + } + return userRoles; + } + + @Override + public void addRole(int groupId, String role, int tenantId) throws GroupManagementDAOException { + PreparedStatement stmt = null; + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "INSERT INTO DM_ROLE_GROUP_MAP(GROUP_ID, ROLE, TENANT_ID) VALUES (?, ?, ?)"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, groupId); + stmt.setString(2, role); + stmt.setInt(3, tenantId); + stmt.executeUpdate(); + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while adding new user role to Group.", e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, null); + } + } + + @Override + public void removeRole(int groupId, String role, int tenantId) throws GroupManagementDAOException { + PreparedStatement stmt = null; + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "DELETE FROM DM_ROLE_GROUP_MAP WHERE GROUP_ID = ? AND ROLE = ? AND TENANT_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setInt(1, groupId); + stmt.setString(2, role); + stmt.setInt(3, tenantId); + stmt.executeUpdate(); + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while removing device from Group.", e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, null); + } + } + + @Override + public List getGroups(String[] roles, int tenantId) throws GroupManagementDAOException { + if (roles.length == 0) { + return new ArrayList<>(); + } + PreparedStatement stmt = null; + ResultSet resultSet = null; + List deviceGroupList = null; + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER FROM DM_GROUP g, " + + "(SELECT GROUP_ID FROM DM_ROLE_GROUP_MAP WHERE ROLE IN ("; + + int index = 1; + while (index++ <= roles.length) { + sql += "?"; + } + sql += ")) gr WHERE g.ID = gr.GROUP_ID AND TENANT_ID = ? GROUP BY g.ID"; + + stmt = conn.prepareStatement(sql); + index = 1; + while (index++ <= roles.length) { + stmt.setString(index, roles[index++]); + } + stmt.setInt(index, tenantId); + resultSet = stmt.executeQuery(); + deviceGroupList = new ArrayList<>(); + while (resultSet.next()) { + deviceGroupList.add(GroupManagementDAOUtil.loadGroup(resultSet)); + } + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while listing all groups in tenant: " + tenantId, e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, resultSet); + } + return deviceGroupList; + } + + @Override + public List getGroupIds(String[] roles, int tenantId) throws GroupManagementDAOException { + if (roles.length == 0) { + return new ArrayList<>(); + } + PreparedStatement stmt = null; + ResultSet resultSet = null; + List deviceGroupIdList = null; + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "SELECT ID FROM DM_GROUP g, (SELECT GROUP_ID FROM DM_ROLE_GROUP_MAP WHERE ROLE IN ("; + + for (int i = 0; i < roles.length - 1; i++) { + sql += "?,"; + } + sql += "?)) gr WHERE g.ID = gr.GROUP_ID AND TENANT_ID = ? GROUP BY g.ID"; + + stmt = conn.prepareStatement(sql); + int index = 1; + while (index++ <= roles.length) { + stmt.setString(index, roles[index++]); + } + stmt.setInt(index, tenantId); + resultSet = stmt.executeQuery(); + deviceGroupIdList = new ArrayList<>(); + while (resultSet.next()) { + deviceGroupIdList.add(resultSet.getInt("ID")); + } + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while listing all groups in tenant: " + tenantId, e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, resultSet); + } + return deviceGroupIdList; + } + + @Override + public int getGroupsCount(String[] roles, int tenantId) throws GroupManagementDAOException { + if (roles.length == 0) { + return 0; + } + PreparedStatement stmt = null; + ResultSet resultSet = null; + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "SELECT COUNT(ID) AS GROUP_COUNT FROM DM_GROUP g, " + + "(SELECT GROUP_ID FROM DM_ROLE_GROUP_MAP WHERE ROLE IN ("; + + int index = 1; + while (index++ <= roles.length) { + sql += "?"; + } + sql += ")) gr WHERE g.ID = gr.GROUP_ID AND TENANT_ID = ? GROUP BY g.ID"; + + stmt = conn.prepareStatement(sql); + index = 1; + while (index++ <= roles.length) { + stmt.setString(index, roles[index++]); + } + stmt.setInt(index, tenantId); + resultSet = stmt.executeQuery(); + if (resultSet.next()) { + return resultSet.getInt("GROUP_COUNT"); + } else { + return 0; + } + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while getting permitted groups count.", e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, resultSet); + } + } + + @Override + public List getOwnGroups(String username, int tenantId) throws GroupManagementDAOException { + PreparedStatement stmt = null; + ResultSet resultSet = null; + List deviceGroupList = null; + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER FROM DM_GROUP WHERE OWNER = ? AND TENANT_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setString(1, username); + stmt.setInt(2, tenantId); + resultSet = stmt.executeQuery(); + deviceGroupList = new ArrayList<>(); + while (resultSet.next()) { + deviceGroupList.add(GroupManagementDAOUtil.loadGroup(resultSet)); + } + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while getting own groups of user '" + + username + "'", e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, resultSet); + } + return deviceGroupList; + } + + @Override + public List getOwnGroupIds(String username, int tenantId) throws GroupManagementDAOException { + PreparedStatement stmt = null; + ResultSet resultSet = null; + List deviceGroupIdList = null; + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "SELECT ID FROM DM_GROUP WHERE OWNER = ? AND TENANT_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setString(1, username); + stmt.setInt(2, tenantId); + resultSet = stmt.executeQuery(); + deviceGroupIdList = new ArrayList<>(); + while (resultSet.next()) { + deviceGroupIdList.add(resultSet.getInt("ID")); + } + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while getting own groups of user '" + + username + "'", e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, resultSet); + } + return deviceGroupIdList; + } + + @Override + public int getOwnGroupsCount(String username, int tenantId) throws GroupManagementDAOException { + PreparedStatement stmt = null; + ResultSet resultSet = null; + try { + Connection conn = GroupManagementDAOFactory.getConnection(); + String sql = "SELECT COUNT(ID) AS GROUP_COUNT FROM DM_GROUP WHERE OWNER = ? AND TENANT_ID = ?"; + stmt = conn.prepareStatement(sql); + stmt.setString(1, username); + stmt.setInt(2, tenantId); + resultSet = stmt.executeQuery(); + if (resultSet.next()) { + return resultSet.getInt("GROUP_COUNT"); + } else { + return 0; + } + } catch (SQLException e) { + throw new GroupManagementDAOException("Error occurred while getting own groups count of user '" + + username + "'", e); + } finally { + GroupManagementDAOUtil.cleanupResources(stmt, resultSet); + } + } + } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/util/GroupManagementDAOUtil.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/util/GroupManagementDAOUtil.java index a7b0fa09777..3923bf5de06 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/util/GroupManagementDAOUtil.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/dao/util/GroupManagementDAOUtil.java @@ -84,8 +84,6 @@ public final class GroupManagementDAOUtil { group.setGroupId(resultSet.getInt("ID")); group.setDescription(resultSet.getString("DESCRIPTION")); group.setName(resultSet.getString("GROUP_NAME")); - group.setDateOfCreation(resultSet.getLong("DATE_OF_CREATE")); - group.setDateOfLastUpdate(resultSet.getLong("DATE_OF_LAST_UPDATE")); group.setOwner(resultSet.getString("OWNER")); return group; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderService.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderService.java index 4be6e298d83..2e1f4f3d24c 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderService.java @@ -22,14 +22,11 @@ import org.wso2.carbon.device.mgt.common.Device; import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceNotFoundException; import org.wso2.carbon.device.mgt.common.GroupPaginationRequest; -import org.wso2.carbon.device.mgt.common.PaginationRequest; import org.wso2.carbon.device.mgt.common.PaginationResult; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; import org.wso2.carbon.device.mgt.common.group.mgt.GroupAlreadyExistException; import org.wso2.carbon.device.mgt.common.group.mgt.GroupManagementException; -import org.wso2.carbon.device.mgt.common.group.mgt.GroupUser; import org.wso2.carbon.device.mgt.common.group.mgt.RoleDoesNotExistException; -import org.wso2.carbon.user.core.multiplecredentials.UserDoesNotExistException; import java.util.List; @@ -132,36 +129,12 @@ public interface GroupManagementProviderService { /** * Manage device group sharing with user with list of roles. * - * @param username of the user * @param groupId of the group * @param newRoles to be shared * @throws GroupManagementException UserDoesNotExistException */ - void manageGroupSharing(int groupId, String username, List newRoles) - throws GroupManagementException, UserDoesNotExistException, RoleDoesNotExistException; - - /** - * Add new sharing role for device group - * - * @param userName of the user - * @param groupId of the group - * @param roleName to add - * @param permissions to bind with role - * @return is role added - * @throws GroupManagementException - */ - boolean addGroupSharingRole(String userName, int groupId, String roleName, String[] permissions) - throws GroupManagementException; - - /** - * Remove existing sharing role for device group - * - * @param groupId of the group - * @param roleName to remove - * @return is role removed - * @throws GroupManagementException - */ - boolean removeGroupSharingRole(int groupId, String roleName) throws GroupManagementException; + void manageGroupSharing(int groupId, List newRoles) + throws GroupManagementException, RoleDoesNotExistException; /** * Get all sharing roles for device group @@ -172,25 +145,6 @@ public interface GroupManagementProviderService { */ List getRoles(int groupId) throws GroupManagementException; - /** - * Get specific device group sharing roles for user - * - * @param userName of the user - * @param groupId of the group - * @return list of roles - * @throws GroupManagementException UserDoesNotExistException - */ - List getRoles(String userName, int groupId) throws GroupManagementException, UserDoesNotExistException; - - /** - * Get device group users - * - * @param groupId of the group - * @return list of group users - * @throws GroupManagementException - */ - List getUsers(int groupId) throws GroupManagementException; - /** * Get all devices in device group as paginated result. * @@ -230,17 +184,6 @@ public interface GroupManagementProviderService { */ void removeDevice(int groupId, List deviceIdentifiers) throws GroupManagementException, DeviceNotFoundException; - - /** - * Get device group permissions of user. - * - * @param username of the user. - * @param groupId of the group - * @return array of permissions. - * @throws GroupManagementException UserDoesNotExistException - */ - String[] getPermissions(String username, int groupId) throws GroupManagementException, UserDoesNotExistException; - /** * Get device groups of user with permission. * @@ -252,10 +195,10 @@ public interface GroupManagementProviderService { List getGroups(String username, String permission) throws GroupManagementException; /** - * Get the group of device. + * Get groups which contains particular device. * - * @param deviceIdentifier - * @return + * @param deviceIdentifier of the device. + * @return groups contain the device. * @throws GroupManagementException */ List getGroups(DeviceIdentifier deviceIdentifier) throws GroupManagementException; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderServiceImpl.java index 575f19dcbe9..d68863dc8fa 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/service/GroupManagementProviderServiceImpl.java @@ -33,23 +33,18 @@ import org.wso2.carbon.device.mgt.common.TransactionManagementException; import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroup; import org.wso2.carbon.device.mgt.common.group.mgt.GroupAlreadyExistException; import org.wso2.carbon.device.mgt.common.group.mgt.GroupManagementException; -import org.wso2.carbon.device.mgt.common.group.mgt.GroupUser; import org.wso2.carbon.device.mgt.common.group.mgt.RoleDoesNotExistException; import org.wso2.carbon.device.mgt.core.dao.GroupDAO; import org.wso2.carbon.device.mgt.core.dao.GroupManagementDAOException; import org.wso2.carbon.device.mgt.core.dao.GroupManagementDAOFactory; import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; -import org.wso2.carbon.user.api.Permission; import org.wso2.carbon.user.api.UserRealm; import org.wso2.carbon.user.api.UserStoreException; import org.wso2.carbon.user.api.UserStoreManager; -import org.wso2.carbon.user.core.multiplecredentials.UserDoesNotExistException; -import org.wso2.carbon.user.core.util.UserCoreUtil; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -77,12 +72,11 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid throw new GroupManagementException("DeviceGroup cannot be null.", new NullPointerException()); } int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); - int groupId = -1; try { GroupManagementDAOFactory.beginTransaction(); DeviceGroup existingGroup = this.groupDAO.getGroup(deviceGroup.getName(), tenantId); if (existingGroup == null) { - groupId = this.groupDAO.addGroup(deviceGroup, tenantId); + this.groupDAO.addGroup(deviceGroup, tenantId); GroupManagementDAOFactory.commitTransaction(); } else { throw new GroupAlreadyExistException("Group exist with name " + deviceGroup.getName()); @@ -97,7 +91,6 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid GroupManagementDAOFactory.closeConnection(); } - addGroupSharingRole(deviceGroup.getOwner(), groupId, defaultRole, defaultPermissions); if (log.isDebugEnabled()) { log.debug("DeviceGroup added: " + deviceGroup.getName()); } @@ -117,7 +110,6 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid GroupManagementDAOFactory.beginTransaction(); DeviceGroup existingGroup = this.groupDAO.getGroup(deviceGroup.getName(), tenantId); if (existingGroup == null || existingGroup.getGroupId() == groupId) { - deviceGroup.setDateOfLastUpdate(new Date().getTime()); this.groupDAO.updateGroup(deviceGroup, groupId, tenantId); GroupManagementDAOFactory.commitTransaction(); } else { @@ -139,18 +131,10 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid */ @Override public boolean deleteGroup(int groupId) throws GroupManagementException { - String roleName; DeviceGroup deviceGroup = getGroup(groupId); if (deviceGroup == null) { return false; } - List groupRoles = getRoles(groupId); - for (String role : groupRoles) { - if (role != null) { - roleName = role.replace("Internal/group-" + deviceGroup.getGroupId() + "-", ""); - removeGroupSharingRole(deviceGroup.getGroupId(), roleName); - } - } try { GroupManagementDAOFactory.beginTransaction(); this.groupDAO.deleteGroup(groupId, CarbonContext.getThreadLocalCarbonContext().getTenantId()); @@ -208,14 +192,6 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid @Override public PaginationResult getGroups(GroupPaginationRequest request) throws GroupManagementException { request = DeviceManagerUtil.validateGroupListPageSize(request); - List deviceGroups = getPlainDeviceGroups(request); - PaginationResult groupResult = new PaginationResult(); - groupResult.setData(deviceGroups); - groupResult.setRecordsTotal(getGroupCount(request)); - return groupResult; - } - - private List getPlainDeviceGroups(GroupPaginationRequest request) throws GroupManagementException { List deviceGroups = new ArrayList<>(); try { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); @@ -228,7 +204,10 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid } finally { GroupManagementDAOFactory.closeConnection(); } - return deviceGroups; + PaginationResult groupResult = new PaginationResult(); + groupResult.setData(deviceGroups); + groupResult.setRecordsTotal(getGroupCount(request)); + return groupResult; } @Override @@ -240,57 +219,70 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) .getUserStoreManager(); String[] roleList = userStoreManager.getRoleListOfUser(username); - for (String role : roleList) { - if (role != null && role.contains("Internal/group-")) { - DeviceGroup deviceGroup = checkAndExtractNonExistingGroup(groups, role); - if (deviceGroup != null) { - groups.put(deviceGroup.getGroupId(), deviceGroup); - } - } + GroupManagementDAOFactory.openConnection(); + List deviceGroups = this.groupDAO.getOwnGroups(username, tenantId); + for (DeviceGroup deviceGroup : deviceGroups) { + groups.put(deviceGroup.getGroupId(), deviceGroup); + } + deviceGroups = this.groupDAO.getGroups(roleList, tenantId); + for (DeviceGroup deviceGroup : deviceGroups) { + groups.put(deviceGroup.getGroupId(), deviceGroup); } } catch (UserStoreException e) { throw new GroupManagementException("Error occurred while getting user store manager.", e); + } catch (SQLException e) { + throw new GroupManagementException("Error occurred while retrieving all groups accessible to user.", e); + } catch (GroupManagementDAOException e) { + throw new GroupManagementException(e); + } finally { + GroupManagementDAOFactory.closeConnection(); } return new ArrayList<>(groups.values()); } - public PaginationResult getGroups(String currentUser, GroupPaginationRequest request) throws GroupManagementException { - request = DeviceManagerUtil.validateGroupListPageSize(request); - int startIndex = request.getStartIndex(); - int count = request.getRowCount(); - int index = 0; - request.setRowCount(0); - List allMatchingGroups = this.getPlainDeviceGroups(request); - List deviceGroups = new ArrayList<>(); + private List getGroupIds(String username) throws GroupManagementException { + UserStoreManager userStoreManager; + List deviceGroupIds = new ArrayList<>(); try { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); - UserStoreManager userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) + userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) .getUserStoreManager(); - String[] roleList = userStoreManager.getRoleListOfUser(currentUser); - List groupIds = new ArrayList<>(); - for (String role : roleList) { - if (role != null && role.contains("Internal/group-")) { - int groupId = Integer.parseInt(role.split("-")[1]); - if (!groupIds.contains(groupId)) { - groupIds.add(groupId); - } - } - } - for (DeviceGroup group : allMatchingGroups) { - int groupId = group.getGroupId(); - if (groupIds.contains(groupId)) { - if (startIndex <= index && index < count) { - deviceGroups.add(group); - } - index++; - } - } + String[] roleList = userStoreManager.getRoleListOfUser(username); + GroupManagementDAOFactory.openConnection(); + deviceGroupIds = this.groupDAO.getOwnGroupIds(username, tenantId); + deviceGroupIds.addAll(this.groupDAO.getGroupIds(roleList, tenantId)); } catch (UserStoreException e) { throw new GroupManagementException("Error occurred while getting user store manager.", e); + } catch (SQLException e) { + throw new GroupManagementException("Error occurred while retrieving all groups accessible to user.", e); + } catch (GroupManagementDAOException e) { + throw new GroupManagementException(e); + } finally { + GroupManagementDAOFactory.closeConnection(); + } + return deviceGroupIds; + } + + @Override + public PaginationResult getGroups(String currentUser, GroupPaginationRequest request) + throws GroupManagementException { + request = DeviceManagerUtil.validateGroupListPageSize(request); + List allDeviceGroupIdsOfUser = getGroupIds(currentUser); + List allMatchingGroups = new ArrayList<>(); + try { + int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); + GroupManagementDAOFactory.openConnection(); + allMatchingGroups = this.groupDAO.getGroups(request, allDeviceGroupIdsOfUser, tenantId); + } catch (GroupManagementDAOException e) { + throw new GroupManagementException("Error occurred while retrieving all groups in tenant", e); + } catch (SQLException e) { + throw new GroupManagementException("Error occurred while opening a connection to the data source.", e); + } finally { + GroupManagementDAOFactory.closeConnection(); } PaginationResult groupResult = new PaginationResult(); - groupResult.setData(deviceGroups); - groupResult.setRecordsTotal(index); + groupResult.setData(allMatchingGroups); + groupResult.setRecordsTotal(getGroupCount(currentUser)); return groupResult; } @@ -329,25 +321,24 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid @Override public int getGroupCount(String username) throws GroupManagementException { UserStoreManager userStoreManager; - int count = 0; + int count; try { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) .getUserStoreManager(); String[] roleList = userStoreManager.getRoleListOfUser(username); - List groupIds = new ArrayList<>(); - for (String role : roleList) { - if (role != null && role.contains("Internal/group-")) { - int groupId = Integer.parseInt(role.split("-")[1]); - if (!groupIds.contains(groupId)) { - groupIds.add(groupId); - count++; - } - } - } + GroupManagementDAOFactory.openConnection(); + count = groupDAO.getOwnGroupsCount(username, tenantId); + count += groupDAO.getGroupsCount(roleList, tenantId); return count; } catch (UserStoreException e) { throw new GroupManagementException("Error occurred while getting user store manager.", e); + } catch (GroupManagementDAOException e) { + throw new GroupManagementException("Error occurred while retrieving group count of user '" + username + "'", e); + } catch (SQLException e) { + throw new GroupManagementException("Error occurred while opening a connection to the data source.", e); + } finally { + GroupManagementDAOFactory.closeConnection(); } } @@ -355,103 +346,41 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid * {@inheritDoc} */ @Override - @SuppressWarnings("Duplicates") - public void manageGroupSharing(int groupId, String username, List newRoles) - throws GroupManagementException, UserDoesNotExistException, RoleDoesNotExistException { + public void manageGroupSharing(int groupId, List newRoles) + throws GroupManagementException, RoleDoesNotExistException { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); UserStoreManager userStoreManager; try { userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm( tenantId).getUserStoreManager(); - if (!userStoreManager.isExistingUser(username)) { - throw new UserDoesNotExistException("User not exists with name " + username); - } - List currentGroupRoles = getRoles(groupId); - List currentUserRoles = getRoles(username, groupId); - List rolesToAdd = new ArrayList<>(); - List rolesToRemove = new ArrayList<>(); - String roleNamePrefix = "Internal/group-" + groupId + "-"; + List currentUserRoles = getRoles(groupId); + GroupManagementDAOFactory.beginTransaction(); for (String role : newRoles) { - if (currentGroupRoles.contains(role)) { - if (!currentUserRoles.contains(role)) { - rolesToAdd.add(roleNamePrefix + role); - } - } else { - throw new RoleDoesNotExistException("Role '" + role + "' is not exists in requested group."); + if (!userStoreManager.isExistingRole(role)) { + throw new RoleDoesNotExistException("Role '" + role + "' does not exists in the user store."); + } + // Removing role from current user roles of the group will return true if role exist. + // So we don't need to add it to the db again. + if (!currentUserRoles.remove(role)) { + // If group doesn't have the role, it is adding to the db. + groupDAO.addRole(groupId, role, tenantId); } } for (String role : currentUserRoles) { - if (currentGroupRoles.contains(role)) { - if (!newRoles.contains(role)) { - rolesToRemove.add(roleNamePrefix + role); - } - } else { - throw new RoleDoesNotExistException("Role '" + role + "' is not exists in requested group."); - } + // Removing old roles from db which are not available in the new roles list. + groupDAO.removeRole(groupId, role, tenantId); } - userStoreManager.updateRoleListOfUser(username, - rolesToRemove.toArray(new String[rolesToRemove.size()]), - rolesToAdd.toArray(new String[rolesToAdd.size()])); + GroupManagementDAOFactory.commitTransaction(); + } catch (GroupManagementDAOException e) { + GroupManagementDAOFactory.rollbackTransaction(); + throw new GroupManagementException(e); } catch (UserStoreException e) { - if (e instanceof UserDoesNotExistException) { - throw (UserDoesNotExistException) e; - } throw new GroupManagementException("User store error in updating sharing roles.", e); - } - } - - /** - * {@inheritDoc} - */ - @Override - public boolean addGroupSharingRole(String username, int groupId, String roleName, String[] permissions) - throws GroupManagementException { - if (groupId == -1) { - return false; - } - UserStoreManager userStoreManager; - String role; - String[] userNames = new String[1]; - try { - int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); - userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) - .getUserStoreManager(); - role = "Internal/group-" + groupId + "-" + roleName; - userNames[0] = username; - Permission[] carbonPermissions = new Permission[permissions.length]; - for (int i = 0; i < permissions.length; i++) { - carbonPermissions[i] = new Permission(permissions[i], CarbonConstants.UI_PERMISSION_ACTION); - } - userStoreManager.addRole(role, userNames, carbonPermissions); - return true; - } catch (UserStoreException e) { - String errorMsg = "User store error in adding role to group id:" + groupId; - throw new GroupManagementException(errorMsg, e); - } - } - - /** - * {@inheritDoc} - */ - @Override - public boolean removeGroupSharingRole(int groupId, String roleName) throws GroupManagementException { - if (groupId == -1) { - return false; - } - UserStoreManager userStoreManager; - String role; - try { - int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); - userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) - .getUserStoreManager(); - role = "Internal/group-" + groupId + "-" + roleName; - userStoreManager.deleteRole(role); - return true; - } catch (UserStoreException userStoreEx) { - String errorMsg = "User store error in adding role to group id:" + groupId; - log.error(errorMsg, userStoreEx); - throw new GroupManagementException(errorMsg, userStoreEx); + } catch (TransactionManagementException e) { + throw new GroupManagementException(e); + } finally { + GroupManagementDAOFactory.closeConnection(); } } @@ -460,92 +389,16 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid */ @Override public List getRoles(int groupId) throws GroupManagementException { - UserStoreManager userStoreManager; - String[] roles; - List groupRoles; - try { - int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); - userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) - .getUserStoreManager(); - roles = userStoreManager.getRoleNames(); - groupRoles = new ArrayList<>(); - for (String r : roles) { - if (r != null && r.contains("Internal/group-" + groupId + "-")) { - groupRoles.add(r.replace("Internal/group-" + groupId + "-", "")); - } - } - return groupRoles; - } catch (UserStoreException userStoreEx) { - String errorMsg = "User store error in adding role to group id:" + groupId; - log.error(errorMsg, userStoreEx); - throw new GroupManagementException(errorMsg, userStoreEx); - } - } - - /** - * {@inheritDoc} - */ - @Override - public List getRoles(String username, int groupId) - throws GroupManagementException, UserDoesNotExistException { - UserStoreManager userStoreManager; - List groupRoleList = new ArrayList<>(); try { int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); - userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) - .getUserStoreManager(); - if (!userStoreManager.isExistingUser(username)) { - throw new UserDoesNotExistException("User not exists with name " + username); - } - String[] roleList = userStoreManager.getRoleListOfUser(username); - for (String role : roleList) { - if (role != null && role.contains("Internal/group-" + groupId)) { - String roleName = role.replace("Internal/group-" + groupId + "-", ""); - groupRoleList.add(roleName); - } - } - return groupRoleList; - } catch (UserStoreException e) { - if (e instanceof UserDoesNotExistException) { - throw (UserDoesNotExistException) e; - } - throw new GroupManagementException("Error occurred while getting user store manager.", e); - } - } - - /** - * {@inheritDoc} - */ - @Override - public List getUsers(int groupId) throws GroupManagementException { - UserStoreManager userStoreManager; - Map groupUserHashMap = new HashMap<>(); - try { - int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); - userStoreManager = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId) - .getUserStoreManager(); - List rolesForGroup = this.getRoles(groupId); - for (String role : rolesForGroup) { - String[] users = userStoreManager.getUserListOfRole("Internal/group-" + groupId + "-" + role); - for (String user : users) { - GroupUser groupUser; - if (groupUserHashMap.containsKey(user)) { - groupUser = groupUserHashMap.get(user); - groupUser.getGroupRoles().add(role); - } else { - groupUser = new GroupUser(); - groupUser.setUsername(user); - groupUser.setGroupRoles(new ArrayList()); - groupUser.getGroupRoles().add(role); - groupUserHashMap.put(user, groupUser); - } - } - } - return new ArrayList<>(groupUserHashMap.values()); - } catch (UserStoreException e) { - String errorMsg = "User store error in fetching user list for group id:" + groupId; - log.error(errorMsg, e); - throw new GroupManagementException(errorMsg, e); + GroupManagementDAOFactory.openConnection(); + return groupDAO.getRoles(groupId, tenantId); + } catch (GroupManagementDAOException e) { + throw new GroupManagementException("Error occurred while retrieving all groups in tenant", e); + } catch (SQLException e) { + throw new GroupManagementException("Error occurred while opening a connection to the data source.", e); + } finally { + GroupManagementDAOFactory.closeConnection(); } } @@ -653,58 +506,26 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid * {@inheritDoc} */ @Override - public String[] getPermissions(String username, int groupId) - throws GroupManagementException, UserDoesNotExistException { + public List getGroups(String username, String permission) throws GroupManagementException { + List deviceGroups = getGroups(username); + Map permittedDeviceGroups = new HashMap<>(); UserRealm userRealm; - List roles = getRoles(username, groupId); int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); try { userRealm = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId); - List lstPermissions = new ArrayList<>(); - String[] resourceIds = userRealm.getAuthorizationManager().getAllowedUIResourcesForUser(username, "/"); - if (resourceIds != null) { - for (String resourceId : resourceIds) { - for (String roleName : roles) { - if (userRealm.getAuthorizationManager(). - isRoleAuthorized("Internal/group-" + groupId + "-" + roleName, resourceId, - CarbonConstants.UI_PERMISSION_ACTION)) { - lstPermissions.add(resourceId); - } + for (DeviceGroup deviceGroup : deviceGroups) { + List roles = getRoles(deviceGroup.getGroupId()); + for (String roleName : roles) { + if (userRealm.getAuthorizationManager(). + isRoleAuthorized(roleName, permission, CarbonConstants.UI_PERMISSION_ACTION)) { + permittedDeviceGroups.put(deviceGroup.getGroupId(), deviceGroup); } } } - String[] permissions = lstPermissions.toArray(new String[lstPermissions.size()]); - return UserCoreUtil.optimizePermissions(permissions); - } catch (UserStoreException e) { - throw new GroupManagementException("Error occurred while getting user realm.", e); - } - } - - /** - * {@inheritDoc} - */ - @Override - public List getGroups(String username, String permission) - throws GroupManagementException { - UserRealm userRealm; - int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); - Map groups = new HashMap<>(); - try { - userRealm = DeviceManagementDataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId); - String[] roles = userRealm.getUserStoreManager().getRoleListOfUser(username); - for (String role : roles) { - if (role != null && role.contains("Internal/group-") && userRealm.getAuthorizationManager() - .isRoleAuthorized(role, permission, CarbonConstants.UI_PERMISSION_ACTION)) { - DeviceGroup group = checkAndExtractNonExistingGroup(groups, role); - if (group != null) { - groups.put(group.getGroupId(), group); - } - } - } - return new ArrayList<>(groups.values()); } catch (UserStoreException e) { throw new GroupManagementException("Error occurred while getting user realm.", e); } + return new ArrayList<>(permittedDeviceGroups.values()); } @Override @@ -725,26 +546,4 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid GroupManagementDAOFactory.closeConnection(); } } - - /** - * This method returns group belongs to particular role, if it is not existed in groups map. - * - * @param groups existing groups map. - * @param role group related role which needs to evaluate. - * @return device group if it is not existing in the groups map. - * @throws GroupManagementException - */ - private DeviceGroup checkAndExtractNonExistingGroup(Map groups, String role) - throws GroupManagementException { - try { - int groupId = Integer.parseInt(role.split("-")[1]); - if (!groups.containsKey(groupId)) { - return getGroup(groupId); - } - } catch (NumberFormatException e) { - log.error("Unable to extract groupId from role " + role, e); - } - return null; - } - } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/common/TestDataHolder.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/common/TestDataHolder.java index 895deab36c7..812e7c5cf81 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/common/TestDataHolder.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/common/TestDataHolder.java @@ -78,8 +78,6 @@ public class TestDataHolder { DeviceGroup deviceGroup = new DeviceGroup(); deviceGroup.setName("Test device group"); deviceGroup.setDescription("Test description"); - deviceGroup.setDateOfCreation(new Date().getTime()); - deviceGroup.setDateOfLastUpdate(new Date().getTime()); deviceGroup.setOwner(OWNER); return deviceGroup; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/dao/GroupPersistTests.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/dao/GroupPersistTests.java index 1747a2773ba..a82e19d8d41 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/dao/GroupPersistTests.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/dao/GroupPersistTests.java @@ -31,7 +31,6 @@ import org.wso2.carbon.device.mgt.core.common.BaseDeviceManagementTest; import org.wso2.carbon.device.mgt.core.common.TestDataHolder; import java.sql.SQLException; -import java.util.Date; import java.util.List; public class GroupPersistTests extends BaseDeviceManagementTest { @@ -165,12 +164,10 @@ public class GroupPersistTests extends BaseDeviceManagementTest { @Test(dependsOnMethods = {"removeDeviceFromGroupTest"}) public void updateGroupTest() { - long time = new Date().getTime(); String name = "Test Updated"; String desc = "Desc updated"; DeviceGroup group = getGroupById(groupId); Assert.assertNotNull(group, "Group is null"); - group.setDateOfLastUpdate(time); group.setName(name); group.setDescription(desc); try { @@ -195,7 +192,6 @@ public class GroupPersistTests extends BaseDeviceManagementTest { Assert.assertNotNull(group, "Group is null"); Assert.assertEquals(group.getName(), name, "Group name"); Assert.assertEquals(group.getDescription(), desc, "Group description"); - Assert.assertEquals((long) group.getDateOfLastUpdate(), time, "Update time"); } @Test(dependsOnMethods = {"updateGroupTest"}) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/sql/h2.sql b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/sql/h2.sql index a93bc172f4c..eb06e9adcb4 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/sql/h2.sql +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/sql/h2.sql @@ -10,13 +10,21 @@ CREATE TABLE IF NOT EXISTS DM_GROUP ( ID INTEGER AUTO_INCREMENT NOT NULL, GROUP_NAME VARCHAR(100) DEFAULT NULL, DESCRIPTION TEXT DEFAULT NULL, - DATE_OF_CREATE BIGINT DEFAULT NULL, - DATE_OF_LAST_UPDATE BIGINT DEFAULT NULL, OWNER VARCHAR(45) DEFAULT NULL, TENANT_ID INTEGER DEFAULT 0, PRIMARY KEY (ID) ); +CREATE TABLE IF NOT EXISTS DM_ROLE_GROUP_MAP ( + ID INTEGER AUTO_INCREMENT NOT NULL, + GROUP_ID INTEGER DEFAULT NULL, + ROLE VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_ROLE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + CREATE TABLE IF NOT EXISTS DM_DEVICE_CERTIFICATE ( ID INTEGER auto_increment NOT NULL, SERIAL_NUMBER VARCHAR(500) DEFAULT NULL, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql index 848ab0d37c1..8a5195b4cd7 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/h2.sql @@ -10,13 +10,21 @@ CREATE TABLE IF NOT EXISTS DM_GROUP ( ID INTEGER AUTO_INCREMENT NOT NULL, GROUP_NAME VARCHAR(100) DEFAULT NULL, DESCRIPTION TEXT DEFAULT NULL, - DATE_OF_CREATE BIGINT DEFAULT NULL, - DATE_OF_LAST_UPDATE BIGINT DEFAULT NULL, OWNER VARCHAR(45) DEFAULT NULL, TENANT_ID INTEGER DEFAULT 0, PRIMARY KEY (ID) ); +CREATE TABLE IF NOT EXISTS DM_ROLE_GROUP_MAP ( + ID INTEGER AUTO_INCREMENT NOT NULL, + GROUP_ID INTEGER DEFAULT NULL, + ROLE VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_ROLE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + CREATE TABLE IF NOT EXISTS DM_DEVICE ( ID INTEGER auto_increment NOT NULL, DESCRIPTION TEXT DEFAULT NULL, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql index 414cad36620..900eeefde12 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mssql.sql @@ -11,6 +11,33 @@ CREATE TABLE DM_DEVICE_TYPE ( IF NOT EXISTS (SELECT * FROM SYS.INDEXES WHERE NAME = 'IDX_DEVICE_TYPE' AND OBJECT_ID = OBJECT_ID('DM_DEVICE_TYPE')) CREATE INDEX IDX_DEVICE_TYPE ON DM_DEVICE_TYPE (NAME); +IF NOT EXISTS(SELECT * + FROM SYS.OBJECTS + WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[DM_GROUP]') AND TYPE IN (N'U')) + CREATE TABLE DM_GROUP ( + ID INTEGER IDENTITY (1, 1) NOT NULL, + GROUP_NAME VARCHAR(100) DEFAULT NULL, + DESCRIPTION VARCHAR(MAX) DEFAULT NULL, + OWNER VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) + ); + +IF NOT EXISTS(SELECT * + FROM SYS.OBJECTS + WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[DM_ROLE_GROUP_MAP]') AND TYPE IN (N'U')) + CREATE TABLE DM_ROLE_GROUP_MAP ( + ID INTEGER IDENTITY (1, 1) NOT NULL, + GROUP_ID INTEGER DEFAULT NULL, + ROLE VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_ROLE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION + ); + IF NOT EXISTS (SELECT * FROM SYS.OBJECTS WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[DM_DEVICE]') AND TYPE IN (N'U')) CREATE TABLE DM_DEVICE ( ID INTEGER IDENTITY(1,1) NOT NULL, @@ -25,6 +52,25 @@ CREATE TABLE DM_DEVICE ( REFERENCES DM_DEVICE_TYPE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION ); +IF NOT EXISTS(SELECT * + FROM SYS.OBJECTS + WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[DM_DEVICE_GROUP_MAP]') AND TYPE IN (N'U')) + CREATE TABLE DM_DEVICE_GROUP_MAP ( + ID INTEGER IDENTITY (1, 1) NOT NULL, + DEVICE_ID INTEGER DEFAULT NULL, + GROUP_ID INTEGER DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT FK_DM_DEVICE_GROUP_MAP_DM_DEVICE2 FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT FK_DM_DEVICE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION + ); + IF NOT EXISTS (SELECT * FROM SYS.INDEXES WHERE NAME = 'IDX_DM_DEVICE' AND OBJECT_ID = OBJECT_ID('DM_DEVICE')) CREATE INDEX IDX_DM_DEVICE ON DM_DEVICE(TENANT_ID, DEVICE_TYPE_ID); diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql index 75a416018cf..e5c79b2f392 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/mysql.sql @@ -8,6 +8,29 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( CREATE INDEX IDX_DEVICE_TYPE ON DM_DEVICE_TYPE (NAME); +CREATE TABLE IF NOT EXISTS DM_GROUP ( + ID INTEGER AUTO_INCREMENT NOT NULL, + GROUP_NAME VARCHAR(100) DEFAULT NULL, + DESCRIPTION TEXT DEFAULT NULL, + OWNER VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID) +) + ENGINE = InnoDB; + +CREATE TABLE IF NOT EXISTS DM_ROLE_GROUP_MAP ( + ID INTEGER AUTO_INCREMENT NOT NULL, + GROUP_ID INTEGER DEFAULT NULL, + ROLE VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT DM_ROLE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +) + ENGINE = InnoDB; + CREATE TABLE IF NOT EXISTS DM_DEVICE ( ID INTEGER AUTO_INCREMENT NOT NULL, DESCRIPTION TEXT DEFAULT NULL, @@ -23,6 +46,23 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE ( CREATE INDEX IDX_DM_DEVICE ON DM_DEVICE(TENANT_ID, DEVICE_TYPE_ID); +CREATE TABLE IF NOT EXISTS DM_DEVICE_GROUP_MAP ( + ID INTEGER AUTO_INCREMENT NOT NULL, + DEVICE_ID INTEGER DEFAULT NULL, + GROUP_ID INTEGER DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_DEVICE_GROUP_MAP_DM_DEVICE2 FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT fk_DM_DEVICE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) + ON DELETE NO ACTION + ON UPDATE NO ACTION +) + ENGINE = InnoDB; + CREATE TABLE IF NOT EXISTS DM_OPERATION ( ID INTEGER AUTO_INCREMENT NOT NULL, TYPE VARCHAR(20) NOT NULL, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql index 9f5013c47c1..c29c6bcb532 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/oracle.sql @@ -25,8 +25,6 @@ CREATE TABLE DM_GROUP ( ID NUMBER(10) NOT NULL, DESCRIPTION CLOB DEFAULT NULL, GROUP_NAME VARCHAR2(100) DEFAULT NULL, - DATE_OF_CREATE TIMESTAMP(0) DEFAULT NULL, - DATE_OF_LAST_UPDATE TIMESTAMP(0) DEFAULT NULL, OWNER VARCHAR2(45) DEFAULT NULL, TENANT_ID NUMBER(10) DEFAULT 0, CONSTRAINT PK_DM_GROUP PRIMARY KEY (ID) @@ -46,6 +44,32 @@ WHEN (NEW.ID IS NULL) END; / +CREATE TABLE DM_ROLE_GROUP_MAP ( + ID NUMBER(10) NOT NULL, + GROUP_ID NUMBER(10) DEFAULT NULL, + ROLE VARCHAR2(45) DEFAULT NULL, + TENANT_ID NUMBER(10) DEFAULT 0, + CONSTRAINT PK_DM_GROUP PRIMARY KEY (ID), + CONSTRAINT fk_DM_ROLE_GROUP_MAP_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) +) +/ +-- Generate ID using sequence and trigger +CREATE SEQUENCE DM_ROLE_GROUP_MAP_seq START WITH 1 INCREMENT BY 1 NOCACHE +/ +CREATE OR REPLACE TRIGGER DM_ROLE_GROUP_MAP_seq_tr +BEFORE INSERT +ON DM_ROLE_GROUP_MAP +REFERENCING NEW AS NEW +FOR EACH ROW +WHEN (NEW.ID IS NULL) + BEGIN + SELECT DM_ROLE_GROUP_MAP_seq.NEXTVAL + INTO :NEW.ID + FROM DUAL; + END; +/ + CREATE TABLE DM_DEVICE ( ID NUMBER(10) NOT NULL, DESCRIPTION CLOB DEFAULT NULL, diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql index 54489b81579..a5ea7af0421 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/src/main/resources/dbscripts/cdm/postgresql.sql @@ -8,6 +8,24 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE_TYPE ( CREATE INDEX IDX_DEVICE_TYPE ON DM_DEVICE_TYPE (NAME); +CREATE TABLE IF NOT EXISTS DM_GROUP ( + ID BIGSERIAL NOT NULL PRIMARY KEY, + DESCRIPTION TEXT DEFAULT NULL, + NAME VARCHAR(100) DEFAULT NULL, + OWNER VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0 +); + +CREATE TABLE IF NOT EXISTS DM_ROLE_GROUP_MAP ( + ID BIGSERIAL NOT NULL PRIMARY KEY, + GROUP_ID INTEGER DEFAULT NULL, + ROLE VARCHAR(45) DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_ROLE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + CREATE TABLE IF NOT EXISTS DM_DEVICE ( ID BIGSERIAL NOT NULL PRIMARY KEY, DESCRIPTION TEXT DEFAULT NULL, @@ -22,6 +40,18 @@ CREATE TABLE IF NOT EXISTS DM_DEVICE ( CREATE INDEX IDX_DM_DEVICE ON DM_DEVICE(TENANT_ID, DEVICE_TYPE_ID); +CREATE TABLE IF NOT EXISTS DM_DEVICE_GROUP_MAP ( + ID BIGSERIAL NOT NULL PRIMARY KEY, + DEVICE_ID INTEGER DEFAULT NULL, + GROUP_ID INTEGER DEFAULT NULL, + TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (ID), + CONSTRAINT fk_DM_DEVICE_GROUP_MAP_DM_DEVICE2 FOREIGN KEY (DEVICE_ID) + REFERENCES DM_DEVICE (ID) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT fk_DM_DEVICE_GROUP_MAP_DM_GROUP2 FOREIGN KEY (GROUP_ID) + REFERENCES DM_GROUP (ID) ON DELETE NO ACTION ON UPDATE NO ACTION +); + CREATE TABLE IF NOT EXISTS DM_OPERATION ( ID BIGSERIAL NOT NULL PRIMARY KEY, TYPE VARCHAR(50) NOT NULL,