From c966892b37453741ff65003a71a4b6bb0d0a8c77 Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Thu, 6 Dec 2012 23:30:36 +0000 Subject: [PATCH] MIFOSX-97: redo permissions for maker-checker and roles. api expects json map of permissions labelled by parameter name 'permissions' --- .../handler/PermissionsCommandHandler.java | 40 ++++++++----- .../commands/handler/RoleCommandHandler.java | 43 +++++++++----- .../infrastructure/core/api/JsonCommand.java | 14 +++++ .../core/data/EntityIdentifier.java | 4 +- .../api/PermissionsApiResource.java | 8 +-- .../api/RolesApiResource.java | 36 +----------- .../command/PermissionsCommand.java | 8 +-- .../command/RolePermissionCommand.java | 32 ---------- .../useradministration/domain/Permission.java | 5 +- .../useradministration/domain/Role.java | 17 +++++- ...issionsCommandFromApiJsonDeserializer.java | 44 ++++++-------- ...onsCommandFromCommandJsonDeserializer.java | 43 -------------- ...issionsCommandFromApiJsonDeserializer.java | 58 ------------------- ...onsCommandFromCommandJsonDeserializer.java | 42 -------------- .../PermissionWritePlatformService.java | 5 +- ...WritePlatformServiceJpaRepositoryImpl.java | 37 ++++++++---- .../service/RoleWritePlatformService.java | 5 +- ...WritePlatformServiceJpaRepositoryImpl.java | 37 ++++++++---- 18 files changed, 170 insertions(+), 308 deletions(-) delete mode 100644 mifosng-provider/src/main/java/org/mifosplatform/useradministration/command/RolePermissionCommand.java delete mode 100644 mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/PermissionsCommandFromCommandJsonDeserializer.java delete mode 100644 mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/RolePermissionsCommandFromApiJsonDeserializer.java delete mode 100644 mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/RolePermissionsCommandFromCommandJsonDeserializer.java diff --git a/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/PermissionsCommandHandler.java b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/PermissionsCommandHandler.java index c6c3b286d..3daba1a7b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/PermissionsCommandHandler.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/PermissionsCommandHandler.java @@ -6,28 +6,35 @@ import java.util.List; import org.joda.time.LocalDate; import org.mifosplatform.commands.domain.CommandSource; import org.mifosplatform.commands.exception.UnsupportedCommandException; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.EntityIdentifier; +import org.mifosplatform.infrastructure.core.serialization.ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson; +import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; -import org.mifosplatform.useradministration.command.PermissionsCommand; import org.mifosplatform.useradministration.domain.AppUser; -import org.mifosplatform.useradministration.serialization.PermissionsCommandFromCommandJsonDeserializer; import org.mifosplatform.useradministration.service.PermissionWritePlatformService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.google.gson.JsonElement; + @Service public class PermissionsCommandHandler implements CommandSourceHandler { private final PlatformSecurityContext context; - private final PermissionsCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer; + private final FromJsonHelper fromApiJsonHelper; + private final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer; private final PermissionWritePlatformService permissionWritePlatformService; @Autowired public PermissionsCommandHandler(final PlatformSecurityContext context, - final PermissionsCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer, + final FromJsonHelper fromApiJsonHelper, + final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer, final PermissionWritePlatformService permissionWritePlatformService) { this.context = context; - this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer; + this.fromApiJsonHelper = fromApiJsonHelper; + this.toApiJsonSerializer = toApiJsonSerializer; this.permissionWritePlatformService = permissionWritePlatformService; } @@ -37,15 +44,18 @@ public class PermissionsCommandHandler implements CommandSourceHandler { final AppUser maker = context.authenticatedUser(); final LocalDate asToday = new LocalDate(); + final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSource.json()); + final JsonCommand command = JsonCommand.from(commandSource.json(), parsedCommand, this.fromApiJsonHelper); + CommandSource commandSourceResult = commandSource.copy(); if (commandSource.isUpdate()) { try { - final PermissionsCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson( - commandSource.resourceId(), commandSource.json()); - - this.permissionWritePlatformService.updateMakerCheckerPermissions(command); + EntityIdentifier result = this.permissionWritePlatformService.updateMakerCheckerPermissions(command); + final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges()); + commandSourceResult.updateJsonTo(jsonOfChangesOnly); + commandSourceResult.markAsChecked(maker, asToday); } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { // swallow this rollback transaction by design @@ -62,15 +72,19 @@ public class PermissionsCommandHandler implements CommandSourceHandler { final AppUser checker = context.authenticatedUser(); + final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSourceResult.json()); + final JsonCommand command = JsonCommand.withMakerCheckerApproval(commandSourceResult.json(), parsedCommand, this.fromApiJsonHelper); + if (commandSourceResult.isUpdate()) { final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER", "UPDATE_PERMISSION_CHECKER"); context.authenticatedUser().validateHasPermissionTo("UPDATE_PERMISSION_CHECKER", allowedPermissions); - final PermissionsCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson( - commandSourceResult.resourceId(), commandSourceResult.json(), true); - - this.permissionWritePlatformService.updateMakerCheckerPermissions(command); + EntityIdentifier result = this.permissionWritePlatformService.updateMakerCheckerPermissions(command); + + final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges()); + commandSourceResult.updateJsonTo(jsonOfChangesOnly); + commandSourceResult.markAsChecked(checker, new LocalDate()); } else { throw new UnsupportedCommandException(commandSourceResult.commandName()); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/RoleCommandHandler.java b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/RoleCommandHandler.java index 27279c78a..5e6bf539e 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/RoleCommandHandler.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/commands/handler/RoleCommandHandler.java @@ -6,33 +6,40 @@ import java.util.List; import org.joda.time.LocalDate; import org.mifosplatform.commands.domain.CommandSource; import org.mifosplatform.commands.exception.UnsupportedCommandException; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.EntityIdentifier; +import org.mifosplatform.infrastructure.core.serialization.ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson; +import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; import org.mifosplatform.useradministration.command.RoleCommand; -import org.mifosplatform.useradministration.command.RolePermissionCommand; import org.mifosplatform.useradministration.domain.AppUser; import org.mifosplatform.useradministration.serialization.RoleCommandFromCommandJsonDeserializer; -import org.mifosplatform.useradministration.serialization.RolePermissionsCommandFromCommandJsonDeserializer; import org.mifosplatform.useradministration.service.RoleWritePlatformService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.google.gson.JsonElement; + @Service public class RoleCommandHandler implements CommandSourceHandler { private final PlatformSecurityContext context; private final RoleWritePlatformService writePlatformService; private final RoleCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer; - private final RolePermissionsCommandFromCommandJsonDeserializer permissionsCommandFromCommandJsonDeserializer; - + private final FromJsonHelper fromApiJsonHelper; + private final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer; + @Autowired public RoleCommandHandler(final PlatformSecurityContext context, final RoleCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer, - final RolePermissionsCommandFromCommandJsonDeserializer permissionsCommandFromCommandJsonDeserializer, + final FromJsonHelper fromApiJsonHelper, + final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer, final RoleWritePlatformService writePlatformService) { this.context = context; this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer; - this.permissionsCommandFromCommandJsonDeserializer = permissionsCommandFromCommandJsonDeserializer; + this.fromApiJsonHelper = fromApiJsonHelper; + this.toApiJsonSerializer = toApiJsonSerializer; this.writePlatformService = writePlatformService; } @@ -72,10 +79,14 @@ public class RoleCommandHandler implements CommandSourceHandler { } } else if (commandSource.isUpdateRolePermissions()) { try { - final RolePermissionCommand command = this.permissionsCommandFromCommandJsonDeserializer.commandFromCommandJson( - resourceId, commandSource.json()); - - newResourceId = this.writePlatformService.updateRolePermissions(command); + + final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSource.json()); + final JsonCommand command = JsonCommand.from(commandSource.json(), parsedCommand, this.fromApiJsonHelper); + + EntityIdentifier result = this.writePlatformService.updateRolePermissions(resourceId, command); + + final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges()); + commandSourceResult.updateJsonTo(jsonOfChangesOnly); commandSourceResult.markAsChecked(maker, asToday); } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { @@ -117,10 +128,14 @@ public class RoleCommandHandler implements CommandSourceHandler { "PERMISSIONS_ROLE_CHECKER"); context.authenticatedUser().validateHasPermissionTo("PERMISSIONS_ROLE_CHECKER", allowedPermissions); - final RolePermissionCommand command = this.permissionsCommandFromCommandJsonDeserializer.commandFromCommandJson(resourceId, - commandSourceResult.json()); - - resourceId = this.writePlatformService.updateRolePermissions(command); + final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSourceResult.json()); + final JsonCommand command = JsonCommand.from(commandSourceResult.json(), parsedCommand, this.fromApiJsonHelper); + + EntityIdentifier result = this.writePlatformService.updateRolePermissions(resourceId, command); + + final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges()); + commandSourceResult.updateJsonTo(jsonOfChangesOnly); + commandSourceResult.markAsChecked(checker, new LocalDate()); } else if (commandSourceResult.isDelete()) { throw new UnsupportedCommandException(commandSourceResult.commandName()); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/JsonCommand.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/JsonCommand.java index 509940996..93427005d 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/JsonCommand.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/JsonCommand.java @@ -1,10 +1,14 @@ package org.mifosplatform.infrastructure.core.api; +import java.lang.reflect.Type; +import java.util.Map; + import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import com.google.gson.JsonElement; +import com.google.gson.reflect.TypeToken; /** * Immutable representation of a command. @@ -91,6 +95,16 @@ public final class JsonCommand { public String locale() { return stringValueOfParameterNamed("locale"); } + + public Map mapValueOfParameterNamed(final String parameterName) { + final Type typeOfMap = new TypeToken>() {}.getType(); + + if (parsedCommand.getAsJsonObject().has(parameterName)) { + parsedCommand.getAsJsonObject().get(parameterName); + } + + return this.fromApiJsonHelper.extractMap(typeOfMap, jsonCommand); + } public boolean isChangeInLongParameterNamed(final String parameterName, final Long existingValue) { boolean isChanged = false; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/EntityIdentifier.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/EntityIdentifier.java index a2da8a0e6..44781d669 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/EntityIdentifier.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/EntityIdentifier.java @@ -24,8 +24,8 @@ public class EntityIdentifier { return new EntityIdentifier(resourceId, makerCheckerId, null); } - public static EntityIdentifier withChanges(final Long resourceId, final Map changesOnly) { - return new EntityIdentifier(resourceId, null, changesOnly); + public static EntityIdentifier withChanges(final Long resourceId, final Map changes) { + return new EntityIdentifier(resourceId, null, changes); } public EntityIdentifier() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/api/PermissionsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/api/PermissionsApiResource.java index 1fa708689..27050cb22 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/api/PermissionsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/api/PermissionsApiResource.java @@ -22,7 +22,6 @@ import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSeriali import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.useradministration.data.PermissionUsageData; -import org.mifosplatform.useradministration.serialization.PermissionsCommandFromApiJsonDeserializer; import org.mifosplatform.useradministration.service.PermissionReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; @@ -39,20 +38,17 @@ public class PermissionsApiResource { private final PlatformSecurityContext context; private final PermissionReadPlatformService permissionReadPlatformService; - private final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final DefaultToApiJsonSerializer toApiJsonSerializer; private final ApiRequestParameterHelper apiRequestParameterHelper; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired public PermissionsApiResource(final PlatformSecurityContext context, final PermissionReadPlatformService readPlatformService, - final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer, final DefaultToApiJsonSerializer toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper, final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { this.context = context; this.permissionReadPlatformService = readPlatformService; - this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.toApiJsonSerializer = toApiJsonSerializer; this.apiRequestParameterHelper = apiRequestParameterHelper; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; @@ -85,10 +81,8 @@ public class PermissionsApiResource { final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER", "UPDATE_PERMISSION"); context.authenticatedUser().validateHasPermissionTo("UPDATE_PERMISSION", allowedPermissions); - final String commandSerializedAsJson = this.fromApiJsonDeserializer.serializedCommandJsonFromApiJson(apiRequestBodyAsJson); - final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "permissions", null, - commandSerializedAsJson); + apiRequestBodyAsJson); return this.toApiJsonSerializer.serialize(result); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/api/RolesApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/api/RolesApiResource.java index 7fde970ff..9459d9f51 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/api/RolesApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/api/RolesApiResource.java @@ -1,6 +1,5 @@ package org.mifosplatform.useradministration.api; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; @@ -28,12 +27,10 @@ import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSeriali import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.useradministration.command.RoleCommand; -import org.mifosplatform.useradministration.command.RolePermissionCommand; import org.mifosplatform.useradministration.data.PermissionUsageData; import org.mifosplatform.useradministration.data.RoleData; import org.mifosplatform.useradministration.data.RolePermissionsData; import org.mifosplatform.useradministration.serialization.RoleCommandFromApiJsonDeserializer; -import org.mifosplatform.useradministration.serialization.RolePermissionsCommandFromApiJsonDeserializer; import org.mifosplatform.useradministration.service.PermissionReadPlatformService; import org.mifosplatform.useradministration.service.RoleReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; @@ -62,10 +59,8 @@ public class RolesApiResource { private final PlatformSecurityContext context; private final RoleReadPlatformService roleReadPlatformService; private final PermissionReadPlatformService permissionReadPlatformService; - private final RoleCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final DefaultToApiJsonSerializer toApiJsonSerializer; - private final RolePermissionsCommandFromApiJsonDeserializer permissionsfromApiJsonDeserializer; private final DefaultToApiJsonSerializer permissionsToApiJsonSerializer; private final ApiRequestParameterHelper apiRequestParameterHelper; private final PortfolioCommandsReadPlatformService commandSourceReadPlatformService; @@ -75,7 +70,6 @@ public class RolesApiResource { public RolesApiResource(final PlatformSecurityContext context, final RoleReadPlatformService readPlatformService, final PermissionReadPlatformService permissionReadPlatformService, final RoleCommandFromApiJsonDeserializer fromApiJsonDeserializer, - final RolePermissionsCommandFromApiJsonDeserializer permissionsfromApiJsonDeserializer, final DefaultToApiJsonSerializer toApiJsonSerializer, final DefaultToApiJsonSerializer permissionsToApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper, @@ -85,7 +79,6 @@ public class RolesApiResource { this.roleReadPlatformService = readPlatformService; this.permissionReadPlatformService = permissionReadPlatformService; this.fromApiJsonDeserializer = fromApiJsonDeserializer; - this.permissionsfromApiJsonDeserializer = permissionsfromApiJsonDeserializer; this.toApiJsonSerializer = toApiJsonSerializer; this.permissionsToApiJsonSerializer = permissionsToApiJsonSerializer; this.apiRequestParameterHelper = apiRequestParameterHelper; @@ -182,35 +175,11 @@ public class RolesApiResource { final RoleData role = this.roleReadPlatformService.retrieveRole(roleId); final Collection permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId); Collection currentChanges = null; - if (settings.isCommandIdPassed()) { - currentChanges = handleRequestToIntegrateProposedChangesFromCommand(roleId, settings.getCommandId()); - } final RolePermissionsData permissionsData = role.toRolePermissionData(permissionUsageData, currentChanges); return this.permissionsToApiJsonSerializer.serialize(settings, permissionsData, PERMISSIONS_RESPONSE_DATA_PARAMETERS); } - private Collection handleRequestToIntegrateProposedChangesFromCommand(final Long roleId, final Long commandId) { - final CommandSourceData entry = this.commandSourceReadPlatformService.retrieveById(commandId); - return assemblePermissionChanges(roleId, entry); - } - - private Collection assemblePermissionChanges(final Long roleId, final CommandSourceData entry) { - - final RolePermissionCommand changesOnly = this.permissionsfromApiJsonDeserializer.commandFromApiJson(roleId, entry.json()); - - // assemble map of string/booleans into PermissionUsageData - Collection proposedChanges = new ArrayList(); - for (final String permissionCode : changesOnly.getPermissions().keySet()) { - final boolean isSelected = changesOnly.getPermissions().get(permissionCode).booleanValue(); - final PermissionUsageData item = PermissionUsageData.from(permissionCode, isSelected); - - proposedChanges.add(item); - } - - return proposedChanges; - } - @PUT @Path("{roleId}/permissions") @Consumes({ MediaType.APPLICATION_JSON }) @@ -220,11 +189,8 @@ public class RolesApiResource { final List allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER", "PERMISSIONS_ROLE"); context.authenticatedUser().validateHasPermissionTo("PERMISSIONS_ROLE", allowedPermissions); - final String commandSerializedAsJson = this.permissionsfromApiJsonDeserializer - .serializedCommandJsonFromApiJson(apiRequestBodyAsJson); - final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATEPERMISSIONS", "roles", roleId, - commandSerializedAsJson); + apiRequestBodyAsJson); return this.toApiJsonSerializer.serialize(result); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/command/PermissionsCommand.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/command/PermissionsCommand.java index 4b4af8b45..60e77d7f3 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/command/PermissionsCommand.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/command/PermissionsCommand.java @@ -8,18 +8,12 @@ import java.util.Map; public class PermissionsCommand { private final Map permissions; - private final transient boolean makerCheckerApproval; - public PermissionsCommand(final Map permissionsMap, final boolean makerCheckerApproval) { + public PermissionsCommand(final Map permissionsMap) { this.permissions = permissionsMap; - this.makerCheckerApproval = makerCheckerApproval; } public Map getPermissions() { return this.permissions; } - - public boolean isApprovedByChecker() { - return this.makerCheckerApproval; - } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/command/RolePermissionCommand.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/command/RolePermissionCommand.java deleted file mode 100644 index a33401a46..000000000 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/command/RolePermissionCommand.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.mifosplatform.useradministration.command; - -import java.util.Map; - -/** - * Immutable command for updating permissions against a role. - */ -public class RolePermissionCommand { - - private final transient Long roleId; - private final Map permissions; - - private final transient boolean makerCheckerApproval; - - public RolePermissionCommand(final Long roleId, final Map permissionsMap, final boolean makerCheckerApproval) { - this.roleId = roleId; - this.permissions = permissionsMap; - this.makerCheckerApproval = makerCheckerApproval; - } - - public Map getPermissions() { - return this.permissions; - } - - public Long getRoleId() { - return this.roleId; - } - - public boolean isApprovedByChecker() { - return this.makerCheckerApproval; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/domain/Permission.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/domain/Permission.java index e5fe31ff5..74d3a844f 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/domain/Permission.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/domain/Permission.java @@ -51,7 +51,10 @@ public class Permission extends AbstractPersistable { return this.grouping; } - public void enableMakerChecker(final boolean canMakerChecker) { + public boolean enableMakerChecker(final boolean canMakerChecker) { + final boolean isUpdatedValueSame = (this.canMakerChecker == canMakerChecker); this.canMakerChecker = canMakerChecker; + + return !isUpdatedValueSame; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/domain/Role.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/domain/Role.java index 7ae1af33e..ebfd671d3 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/domain/Role.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/domain/Role.java @@ -38,7 +38,7 @@ public class Role extends AbstractAuditableCustom { this.name = name.trim(); this.description = description.trim(); } - + public void update(final RoleCommand command) { if (command.isNameChanged()) { this.name = command.getName(); @@ -48,11 +48,11 @@ public class Role extends AbstractAuditableCustom { this.description = command.getDescription(); } } - + public boolean addPermission(final Permission permission) { return this.permissions.add(permission); } - + public boolean removePermission(final Permission permission) { return this.permissions.remove(permission); } @@ -75,4 +75,15 @@ public class Role extends AbstractAuditableCustom { public RoleData toData() { return new RoleData(this.getId(), this.name, this.description, null); } + + public boolean updatePermission(final Permission permission, final boolean isSelected) { + boolean changed = false; + if (isSelected) { + changed = addPermission(permission); + } else { + changed = removePermission(permission); + } + + return changed; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/PermissionsCommandFromApiJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/PermissionsCommandFromApiJsonDeserializer.java index 9cc7596d1..9cabac880 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/PermissionsCommandFromApiJsonDeserializer.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/PermissionsCommandFromApiJsonDeserializer.java @@ -1,8 +1,14 @@ package org.mifosplatform.useradministration.serialization; import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.HashSet; import java.util.Map; +import java.util.Set; +import org.apache.commons.lang.StringUtils; +import org.mifosplatform.infrastructure.core.exception.InvalidJsonException; +import org.mifosplatform.infrastructure.core.serialization.AbstractFromApiJsonDeserializer; import org.mifosplatform.infrastructure.core.serialization.CommandSerializer; import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; @@ -17,41 +23,29 @@ import com.google.gson.reflect.TypeToken; * {@link PermissionsCommand}'s. */ @Component -public final class PermissionsCommandFromApiJsonDeserializer implements FromApiJsonDeserializer { +public final class PermissionsCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer { + /** + * The parameters supported for this command. + */ + private final Set supportedParameters = new HashSet(Arrays.asList("permissions")); private final FromJsonHelper fromApiJsonHelper; - private final CommandSerializer commandSerializerService; @Autowired public PermissionsCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper, final CommandSerializer commandSerializerService) { + super(commandSerializerService); this.fromApiJsonHelper = fromApiJsonHelper; - this.commandSerializerService = commandSerializerService; - } - - @Override - public PermissionsCommand commandFromApiJson(final String json) { - return commandFromApiJson(null, json); } @Override public PermissionsCommand commandFromApiJson(@SuppressWarnings("unused") final Long resourceId, final String json) { - - final Type typeOfMap = new TypeToken>() {}.getType(); - final Map permissionsMap = fromApiJsonHelper.extractMap(typeOfMap, json); - - return new PermissionsCommand(permissionsMap, false); - } - - @Override - public String serializedCommandJsonFromApiJson(final String json) { - final PermissionsCommand command = commandFromApiJson(json); - return this.commandSerializerService.serializeCommandToJson(command); - } - - @Override - public String serializedCommandJsonFromApiJson(final Long roleId, final String json) { - final PermissionsCommand command = commandFromApiJson(roleId, json); - return this.commandSerializerService.serializeCommandToJson(command); + + if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } + + final Type typeOfMap = new TypeToken>() {}.getType(); + fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters); + + return fromApiJsonHelper.fromJson(json, PermissionsCommand.class); } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/PermissionsCommandFromCommandJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/PermissionsCommandFromCommandJsonDeserializer.java deleted file mode 100644 index 8030455f0..000000000 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/PermissionsCommandFromCommandJsonDeserializer.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.mifosplatform.useradministration.serialization; - -import org.apache.commons.lang.StringUtils; -import org.mifosplatform.infrastructure.core.exception.InvalidJsonException; -import org.mifosplatform.infrastructure.core.serialization.FromCommandJsonDeserializer; -import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; -import org.mifosplatform.useradministration.command.PermissionsCommand; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * - */ -@Component -public final class PermissionsCommandFromCommandJsonDeserializer implements FromCommandJsonDeserializer { - - private final FromJsonHelper fromJsonHelper; - - @Autowired - public PermissionsCommandFromCommandJsonDeserializer(final FromJsonHelper fromApiJsonHelper) { - this.fromJsonHelper = fromApiJsonHelper; - } - - @Override - public PermissionsCommand commandFromCommandJson(final String commandAsJson) { - return commandFromCommandJson(null, commandAsJson); - } - - @Override - public PermissionsCommand commandFromCommandJson(final Long roleId, final String commandAsJson) { - return commandFromCommandJson(roleId, commandAsJson, false); - } - - @Override - public PermissionsCommand commandFromCommandJson(@SuppressWarnings("unused") final Long resourceId, final String commandAsJson, - final boolean makerCheckerApproval) { - if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); } - - final PermissionsCommand command = fromJsonHelper.fromJson(commandAsJson, PermissionsCommand.class); - - return new PermissionsCommand(command.getPermissions(), makerCheckerApproval); - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/RolePermissionsCommandFromApiJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/RolePermissionsCommandFromApiJsonDeserializer.java deleted file mode 100644 index bef5f06bb..000000000 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/RolePermissionsCommandFromApiJsonDeserializer.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.mifosplatform.useradministration.serialization; - -import java.lang.reflect.Type; -import java.util.Map; - -import org.mifosplatform.infrastructure.core.serialization.CommandSerializer; -import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer; -import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; -import org.mifosplatform.useradministration.command.RoleCommand; -import org.mifosplatform.useradministration.command.RolePermissionCommand; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.google.gson.reflect.TypeToken; - -/** - * Implementation of {@link FromApiJsonDeserializer} for {@link RoleCommand}'s. - */ -@Component -public final class RolePermissionsCommandFromApiJsonDeserializer implements FromApiJsonDeserializer { - - private final FromJsonHelper fromApiJsonHelper; - private final CommandSerializer commandSerializerService; - - @Autowired - public RolePermissionsCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper, - final CommandSerializer commandSerializerService) { - this.fromApiJsonHelper = fromApiJsonHelper; - this.commandSerializerService = commandSerializerService; - } - - @Override - public RolePermissionCommand commandFromApiJson(final String json) { - return commandFromApiJson(null, json); - } - - @Override - public RolePermissionCommand commandFromApiJson(final Long roleId, final String json) { - - final Type typeOfMap = new TypeToken>() {}.getType(); - - final Map permissionsMap = fromApiJsonHelper.extractMap(typeOfMap, json); - - return new RolePermissionCommand(roleId, permissionsMap, false); - } - - @Override - public String serializedCommandJsonFromApiJson(final String json) { - final RolePermissionCommand command = commandFromApiJson(json); - return this.commandSerializerService.serializeCommandToJson(command); - } - - @Override - public String serializedCommandJsonFromApiJson(final Long roleId, final String json) { - final RolePermissionCommand command = commandFromApiJson(roleId, json); - return this.commandSerializerService.serializeCommandToJson(command); - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/RolePermissionsCommandFromCommandJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/RolePermissionsCommandFromCommandJsonDeserializer.java deleted file mode 100644 index 6b358e086..000000000 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/serialization/RolePermissionsCommandFromCommandJsonDeserializer.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.mifosplatform.useradministration.serialization; - -import org.apache.commons.lang.StringUtils; -import org.mifosplatform.infrastructure.core.exception.InvalidJsonException; -import org.mifosplatform.infrastructure.core.serialization.FromCommandJsonDeserializer; -import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; -import org.mifosplatform.useradministration.command.RolePermissionCommand; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * - */ -@Component -public final class RolePermissionsCommandFromCommandJsonDeserializer implements FromCommandJsonDeserializer { - - private final FromJsonHelper fromJsonHelper; - - @Autowired - public RolePermissionsCommandFromCommandJsonDeserializer(final FromJsonHelper fromApiJsonHelper) { - this.fromJsonHelper = fromApiJsonHelper; - } - - @Override - public RolePermissionCommand commandFromCommandJson(final String commandAsJson) { - return commandFromCommandJson(null, commandAsJson); - } - - @Override - public RolePermissionCommand commandFromCommandJson(final Long roleId, final String commandAsJson) { - return commandFromCommandJson(roleId, commandAsJson, false); - } - - @Override - public RolePermissionCommand commandFromCommandJson(final Long roleId, final String commandAsJson, final boolean makerCheckerApproval) { - if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); } - - final RolePermissionCommand command = fromJsonHelper.fromJson(commandAsJson, RolePermissionCommand.class); - - return new RolePermissionCommand(roleId, command.getPermissions(), makerCheckerApproval); - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/PermissionWritePlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/PermissionWritePlatformService.java index 2a15c5789..b76169fb0 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/PermissionWritePlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/PermissionWritePlatformService.java @@ -1,8 +1,9 @@ package org.mifosplatform.useradministration.service; -import org.mifosplatform.useradministration.command.PermissionsCommand; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.EntityIdentifier; public interface PermissionWritePlatformService { - void updateMakerCheckerPermissions(PermissionsCommand command); + EntityIdentifier updateMakerCheckerPermissions(JsonCommand command); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/PermissionWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/PermissionWritePlatformServiceJpaRepositoryImpl.java index 07b9c7187..00f101463 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/PermissionWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/PermissionWritePlatformServiceJpaRepositoryImpl.java @@ -1,13 +1,17 @@ package org.mifosplatform.useradministration.service; import java.util.Collection; +import java.util.HashMap; import java.util.Map; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.EntityIdentifier; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.useradministration.command.PermissionsCommand; import org.mifosplatform.useradministration.domain.Permission; import org.mifosplatform.useradministration.domain.PermissionRepository; import org.mifosplatform.useradministration.exception.PermissionNotFoundException; +import org.mifosplatform.useradministration.serialization.PermissionsCommandFromApiJsonDeserializer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,39 +21,52 @@ public class PermissionWritePlatformServiceJpaRepositoryImpl implements Permissi private final PlatformSecurityContext context; private final PermissionRepository permissionRepository; + private final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer; @Autowired public PermissionWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, - final PermissionRepository permissionRepository) { + final PermissionRepository permissionRepository, + final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer) { this.context = context; this.permissionRepository = permissionRepository; + this.fromApiJsonDeserializer = fromApiJsonDeserializer; } @Transactional @Override - public void updateMakerCheckerPermissions(final PermissionsCommand command) { + public EntityIdentifier updateMakerCheckerPermissions(final JsonCommand command) { context.authenticatedUser(); final Collection allPermissions = this.permissionRepository.findAll(); + + final PermissionsCommand permissionsCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json()); - final Map commandPermissions = command.getPermissions(); + final Map commandPermissions = permissionsCommand.getPermissions(); + final Map changes = new HashMap(); + final Map changedPermissions = new HashMap(); for (final String permissionCode : commandPermissions.keySet()) { - final Permission permission = findPermissionByCode(allPermissions, permissionCode); + final Permission permission = findPermissionInCollectionByCode(allPermissions, permissionCode); if (permission.getCode().endsWith("_CHECKER") || permission.getCode().startsWith("READ_") || permission.getGrouping().equalsIgnoreCase("special")) { throw new PermissionNotFoundException(permissionCode); } final boolean isSelected = commandPermissions.get(permissionCode).booleanValue(); - permission.enableMakerChecker(isSelected); - - this.permissionRepository.save(permission); - - // Typical rollback if maker-checker enabled not here - does it make sense to have a maker checker task for enabling maker-checker for other tasks? + boolean changed = permission.enableMakerChecker(isSelected); + if (changed) { + changedPermissions.put(permissionCode, isSelected); + this.permissionRepository.save(permission); + } } + + if (!changedPermissions.isEmpty()) { + changes.put("permissions", changedPermissions); + } + + return EntityIdentifier.withChanges(null, changes); } - private Permission findPermissionByCode(Collection allPermissions, String permissionCode) { + private Permission findPermissionInCollectionByCode(final Collection allPermissions, final String permissionCode) { if (allPermissions != null) { for (Permission permission : allPermissions) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/RoleWritePlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/RoleWritePlatformService.java index 4b1926e08..5775ad363 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/RoleWritePlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/RoleWritePlatformService.java @@ -1,7 +1,8 @@ package org.mifosplatform.useradministration.service; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.EntityIdentifier; import org.mifosplatform.useradministration.command.RoleCommand; -import org.mifosplatform.useradministration.command.RolePermissionCommand; public interface RoleWritePlatformService { @@ -9,5 +10,5 @@ public interface RoleWritePlatformService { Long updateRole(RoleCommand command); - Long updateRolePermissions(RolePermissionCommand command); + EntityIdentifier updateRolePermissions(Long roleId, JsonCommand command); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/RoleWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/RoleWritePlatformServiceJpaRepositoryImpl.java index 60f1088be..9094aeaba 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/RoleWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/useradministration/service/RoleWritePlatformServiceJpaRepositoryImpl.java @@ -1,19 +1,23 @@ package org.mifosplatform.useradministration.service; import java.util.Collection; +import java.util.HashMap; import java.util.Map; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.EntityIdentifier; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.organisation.monetary.service.ConfigurationDomainService; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; +import org.mifosplatform.useradministration.command.PermissionsCommand; import org.mifosplatform.useradministration.command.RoleCommand; -import org.mifosplatform.useradministration.command.RolePermissionCommand; import org.mifosplatform.useradministration.domain.Permission; import org.mifosplatform.useradministration.domain.PermissionRepository; import org.mifosplatform.useradministration.domain.Role; import org.mifosplatform.useradministration.domain.RoleRepository; import org.mifosplatform.useradministration.exception.PermissionNotFoundException; import org.mifosplatform.useradministration.exception.RoleNotFoundException; +import org.mifosplatform.useradministration.serialization.PermissionsCommandFromApiJsonDeserializer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,15 +29,18 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf private final RoleRepository roleRepository; private final PermissionRepository permissionRepository; private final ConfigurationDomainService configurationDomainService; + private final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer; @Autowired public RoleWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final RoleRepository roleRepository, final PermissionRepository permissionRepository, - final ConfigurationDomainService configurationDomainService) { + final ConfigurationDomainService configurationDomainService, + final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer) { this.context = context; this.roleRepository = roleRepository; this.permissionRepository = permissionRepository; this.configurationDomainService = configurationDomainService; + this.fromApiJsonDeserializer = fromApiJsonDeserializer; } @Transactional @@ -72,31 +79,37 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf @Transactional @Override - public Long updateRolePermissions(final RolePermissionCommand command) { + public EntityIdentifier updateRolePermissions(final Long roleId, final JsonCommand command) { context.authenticatedUser(); - final Role role = this.roleRepository.findOne(command.getRoleId()); - if (role == null) { throw new RoleNotFoundException(command.getRoleId()); } + final Role role = this.roleRepository.findOne(roleId); + if (role == null) { throw new RoleNotFoundException(roleId); } final Collection allPermissions = this.permissionRepository.findAll(); - final Map commandPermissions = command.getPermissions(); + final PermissionsCommand permissionsCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json()); + + final Map commandPermissions = permissionsCommand.getPermissions(); + final Map changes = new HashMap(); + final Map changedPermissions = new HashMap(); for (final String permissionCode : commandPermissions.keySet()) { final boolean isSelected = commandPermissions.get(permissionCode).booleanValue(); final Permission permission = findPermissionByCode(allPermissions, permissionCode); - if (isSelected) { - role.addPermission(permission); - } else { - role.removePermission(permission); + boolean changed = role.updatePermission(permission, isSelected); + if (changed) { + changedPermissions.put(permissionCode, isSelected); } } - this.roleRepository.save(role); + if (!changedPermissions.isEmpty()) { + changes.put("permissions", changedPermissions); + this.roleRepository.save(role); + } if (this.configurationDomainService.isMakerCheckerEnabledForTask("PERMISSIONS_ROLE") && !command.isApprovedByChecker()) { throw new RollbackTransactionAsCommandIsNotApprovedByCheckerException(); } - return role.getId(); + return EntityIdentifier.withChanges(role.getId(), changes); } private Permission findPermissionByCode(Collection allPermissions, String permissionCode) {