diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/PermissionsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/PermissionsApiResource.java index 4dbf7bf4d..8531bd5dc 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/PermissionsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/PermissionsApiResource.java @@ -12,7 +12,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; import org.mifosng.platform.api.data.PermissionData; -import org.mifosng.platform.api.infrastructure.ApiDataConversionService; +import org.mifosng.platform.api.infrastructure.ApiJsonSerializerService; import org.mifosng.platform.api.infrastructure.ApiParameterHelper; import org.mifosng.platform.user.service.PermissionReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +28,7 @@ public class PermissionsApiResource { private PermissionReadPlatformService permissionReadPlatformService; @Autowired - private ApiDataConversionService apiDataConversionService; + private ApiJsonSerializerService apiJsonSerializerService; @GET @Consumes({MediaType.APPLICATION_JSON}) @@ -40,6 +40,6 @@ public class PermissionsApiResource { Collection permissions = this.permissionReadPlatformService.retrieveAllPermissions(); - return this.apiDataConversionService.convertPermissionDataToJson(prettyPrint, responseParameters, permissions.toArray(new PermissionData[permissions.size()])); + return this.apiJsonSerializerService.serializePermissionDataToJson(prettyPrint, responseParameters, permissions); } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/RolesApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/RolesApiResource.java index 523b56e02..e8c3edb64 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/RolesApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/RolesApiResource.java @@ -1,5 +1,6 @@ package org.mifosng.platform.api; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; @@ -22,6 +23,7 @@ import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.api.data.PermissionData; import org.mifosng.platform.api.data.RoleData; import org.mifosng.platform.api.infrastructure.ApiDataConversionService; +import org.mifosng.platform.api.infrastructure.ApiJsonSerializerService; import org.mifosng.platform.api.infrastructure.ApiParameterHelper; import org.mifosng.platform.user.service.PermissionReadPlatformService; import org.mifosng.platform.user.service.RoleReadPlatformService; @@ -46,6 +48,9 @@ public class RolesApiResource { @Autowired private ApiDataConversionService apiDataConversionService; + + @Autowired + private ApiJsonSerializerService apiJsonSerializerService; @GET @Consumes({MediaType.APPLICATION_JSON}) @@ -62,7 +67,7 @@ public class RolesApiResource { Collection roles = this.roleReadPlatformService.retrieveAllRoles(); - return this.apiDataConversionService.convertRoleDataToJson(prettyPrint, responseParameters, roles.toArray(new RoleData[roles.size()])); + return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, roles); } @GET @@ -81,10 +86,9 @@ public class RolesApiResource { Collection allPermissions = this.permissionReadPlatformService.retrieveAllPermissions(); - RoleData role = new RoleData(); - role.setAvailablePermissions(allPermissions); + RoleData role = new RoleData(allPermissions, new ArrayList()); - return this.apiDataConversionService.convertRoleDataToJson(prettyPrint, responseParameters, role); + return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, role); } @POST @@ -119,13 +123,13 @@ public class RolesApiResource { if (template) { Collection availablePermissions = this.permissionReadPlatformService.retrieveAllPermissions(); availablePermissions.removeAll(role.getSelectedPermissions()); - role.setAvailablePermissions(availablePermissions); + + role = new RoleData(role, availablePermissions); responseParameters.add("availablePermissions"); responseParameters.add("selectedPermissions"); } - - return this.apiDataConversionService.convertRoleDataToJson(prettyPrint, responseParameters, role); + return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, role); } @PUT diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/UsersApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/UsersApiResource.java index 73bd8f769..03a742496 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/UsersApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/UsersApiResource.java @@ -25,6 +25,7 @@ import org.mifosng.platform.api.data.AppUserData; import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.api.data.OfficeLookup; import org.mifosng.platform.api.infrastructure.ApiDataConversionService; +import org.mifosng.platform.api.infrastructure.ApiJsonSerializerService; import org.mifosng.platform.api.infrastructure.ApiParameterHelper; import org.mifosng.platform.organisation.service.OfficeReadPlatformService; import org.mifosng.platform.security.PlatformSecurityContext; @@ -52,6 +53,9 @@ public class UsersApiResource { @Autowired private ApiDataConversionService apiDataConversionService; + @Autowired + private ApiJsonSerializerService apiJsonSerializerService; + @Autowired private PlatformSecurityContext context; @@ -70,7 +74,7 @@ public class UsersApiResource { Collection users = this.appUserReadPlatformService.retrieveAllUsers(); - return this.apiDataConversionService.convertAppUserDataToJson(prettyPrint, responseParameters, users.toArray(new AppUserData[users.size()])); + return this.apiJsonSerializerService.serializeAppUserDataToJson(prettyPrint, responseParameters, users); } @GET @@ -91,13 +95,13 @@ public class UsersApiResource { AppUserData user = this.appUserReadPlatformService.retrieveUser(userId); if (template) { List offices = new ArrayList(this.officeReadPlatformService.retrieveAllOfficesForLookup()); - user.setAllowedOffices(offices); + user = new AppUserData(user, offices); responseParameters.add("allowedOffices"); responseParameters.add("availableRoles"); responseParameters.add("selectedRoles"); } - return this.apiDataConversionService.convertAppUserDataToJson(prettyPrint, responseParameters, user); + return this.apiJsonSerializerService.serializeAppUserDataToJson(prettyPrint, responseParameters, user); } @GET @@ -117,7 +121,7 @@ public class UsersApiResource { AppUserData user = this.appUserReadPlatformService.retrieveNewUserDetails(); - return this.apiDataConversionService.convertAppUserDataToJson(prettyPrint, responseParameters, user); + return this.apiJsonSerializerService.serializeAppUserDataToJson(prettyPrint, responseParameters, user); } @POST diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/AppUserData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/AppUserData.java index c7f01513e..18bb7b260 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/AppUserData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/AppUserData.java @@ -3,112 +3,104 @@ package org.mifosng.platform.api.data; import java.util.ArrayList; import java.util.List; +/** + * Immutable data object for application user data. + */ public class AppUserData { - private Long id; - private String username; - private Long officeId; - private String officeName; - private String firstname; - private String lastname; - private String email; + private final Long id; + private final String username; + private final Long officeId; + private final String officeName; + private final String firstname; + private final String lastname; + private final String email; - private List allowedOffices = new ArrayList(); - - private List availableRoles = new ArrayList(); - private List selectedRoles = new ArrayList(); - - public AppUserData() { - // - } + private final List allowedOffices; + private final List availableRoles; + private final List selectedRoles; public AppUserData(final Long id, final String username, final String email, final Long officeId, - final String officeName) { + final String officeName, final String firstname, final String lastname, final List availableRoles, final List selectedRoles) { this.id = id; this.username = username; - this.email = email; this.officeId = officeId; this.officeName = officeName; + this.firstname = firstname; + this.lastname = lastname; + this.email = email; + + this.allowedOffices = new ArrayList(); + this.availableRoles = availableRoles; + this.selectedRoles = selectedRoles; + } + + public AppUserData(AppUserData user, List allowedOffices) { + this.id = user.getId(); + this.username = user.getUsername(); + this.officeId = user.getOfficeId(); + this.officeName = user.getOfficeName(); + this.firstname = user.getFirstname(); + this.lastname = user.getLastname(); + this.email = user.getEmail(); + + this.allowedOffices = allowedOffices; + this.availableRoles = user.getAvailableRoles(); + this.selectedRoles = user.getSelectedRoles(); + } + + public AppUserData(final List allowedOffices, final List availableRoles) { + this.id = null; + this.username = null; + this.officeId = null; + this.officeName = null; + this.firstname = null; + this.lastname = null; + this.email = null; + + this.allowedOffices = allowedOffices; + this.availableRoles = availableRoles; + this.selectedRoles = new ArrayList(); } public Long getId() { - return this.id; + return id; } public String getUsername() { - return this.username; - } - - public String getEmail() { - return this.email; + return username; } public Long getOfficeId() { - return this.officeId; + return officeId; } public String getOfficeName() { - return this.officeName; - } - - public void setId(final Long id) { - this.id = id; - } - - public void setUsername(final String username) { - this.username = username; - } - - public void setEmail(final String email) { - this.email = email; - } - - public void setOfficeId(final Long officeId) { - this.officeId = officeId; - } - - public void setOfficeName(final String officeName) { - this.officeName = officeName; - } - - public List getAllowedOffices() { - return allowedOffices; - } - - public void setAllowedOffices(List allowedOffices) { - this.allowedOffices = allowedOffices; - } - - public List getAvailableRoles() { - return availableRoles; - } - - public void setAvailableRoles(List availableRoles) { - this.availableRoles = availableRoles; - } - - public List getSelectedRoles() { - return selectedRoles; - } - - public void setSelectedRoles(List selectedRoles) { - this.selectedRoles = selectedRoles; + return officeName; } public String getFirstname() { return firstname; } - public void setFirstname(String firstname) { - this.firstname = firstname; - } - public String getLastname() { return lastname; } - public void setLastname(String lastname) { - this.lastname = lastname; + public String getEmail() { + return email; + } + + public List getAllowedOffices() { + return allowedOffices; + } + + public List getAvailableRoles() { + return availableRoles; + } + + public List getSelectedRoles() { + return selectedRoles; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionData.java index 033300387..11b8d1d1b 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionData.java @@ -1,17 +1,14 @@ package org.mifosng.platform.api.data; -import java.io.Serializable; +/** + * Immutable data object for permission data. + */ +public class PermissionData { -public class PermissionData implements Serializable { - - private Long id; - private String name; - private String description; - private String code; - - public PermissionData() { - // - } + private final Long id; + private final String name; + private final String description; + private final String code; public PermissionData(final Long id, final String name, final String description, final String code) { this.id = id; @@ -32,34 +29,18 @@ public class PermissionData implements Serializable { } public Long getId() { - return this.id; + return id; } public String getName() { - return this.name; + return name; } public String getDescription() { - return this.description; + return description; } public String getCode() { - return this.code; - } - - public void setId(final Long id) { - this.id = id; - } - - public void setName(final String name) { - this.name = name; - } - - public void setDescription(final String description) { - this.description = description; - } - - public void setCode(final String code) { - this.code = code; + return code; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RoleData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RoleData.java index f2109e637..a33bf4bd3 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RoleData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RoleData.java @@ -3,27 +3,44 @@ package org.mifosng.platform.api.data; import java.util.ArrayList; import java.util.Collection; +/** + * Immutable data object for role data. + */ public class RoleData { - private Long id; - private String name; - private String description; + private final Long id; + private final String name; + private final String description; - private Collection availablePermissions = new ArrayList(); - private Collection selectedPermissions = new ArrayList(); + private final Collection availablePermissions; + private final Collection selectedPermissions; - public RoleData() { - // - } - - public RoleData(final Long id, final String name, final String description) { + public RoleData(final Long id, final String name, final String description, final Collection selectedPermissions) { this.id = id; this.name = name; this.description = description; + this.availablePermissions = new ArrayList(); + this.selectedPermissions = new ArrayList(selectedPermissions); } + public RoleData(final Collection availablePermissions, final Collection selectedPermissions) { + this.id = null; + this.name = null; + this.description = null; + this.availablePermissions = new ArrayList(availablePermissions); + this.selectedPermissions = new ArrayList(selectedPermissions); + } + + public RoleData(RoleData role, final Collection availablePermissions) { + this.id = role.getId(); + this.name = role.getName(); + this.description = role.getDescription(); + this.availablePermissions = new ArrayList(availablePermissions); + this.selectedPermissions = role.getSelectedPermissions(); + } + @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { RoleData role = (RoleData) obj; return this.id.equals(role.getId()); } @@ -34,44 +51,22 @@ public class RoleData { } public Long getId() { - return this.id; + return id; } public String getName() { - return this.name; + return name; } public String getDescription() { - return this.description; - } - - public void setId(final Long id) { - this.id = id; - } - - public void setName(final String name) { - this.name = name; - } - - public void setDescription(final String description) { - this.description = description; + return description; } public Collection getAvailablePermissions() { return availablePermissions; } - public void setAvailablePermissions( - Collection availablePermissions) { - this.availablePermissions = availablePermissions; - } - public Collection getSelectedPermissions() { return selectedPermissions; } - - public void setSelectedPermissions( - Collection selectedPermissions) { - this.selectedPermissions = selectedPermissions; - } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionService.java index dce185438..712dce71f 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionService.java @@ -7,8 +7,8 @@ import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand; import org.mifosng.platform.api.commands.BranchMoneyTransferCommand; import org.mifosng.platform.api.commands.ChargeCommand; import org.mifosng.platform.api.commands.ClientCommand; -import org.mifosng.platform.api.commands.DepositProductCommand; import org.mifosng.platform.api.commands.DepositAccountCommand; +import org.mifosng.platform.api.commands.DepositProductCommand; import org.mifosng.platform.api.commands.FundCommand; import org.mifosng.platform.api.commands.GroupCommand; import org.mifosng.platform.api.commands.LoanProductCommand; @@ -22,14 +22,13 @@ import org.mifosng.platform.api.commands.SavingProductCommand; import org.mifosng.platform.api.commands.SubmitLoanApplicationCommand; import org.mifosng.platform.api.commands.UserCommand; import org.mifosng.platform.api.data.AdditionalFieldsSetData; -import org.mifosng.platform.api.data.AppUserData; import org.mifosng.platform.api.data.AuthenticatedUserData; import org.mifosng.platform.api.data.ChargeData; import org.mifosng.platform.api.data.ClientData; import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData; import org.mifosng.platform.api.data.ConfigurationData; -import org.mifosng.platform.api.data.DepositProductData; import org.mifosng.platform.api.data.DepositAccountData; +import org.mifosng.platform.api.data.DepositProductData; import org.mifosng.platform.api.data.FundData; import org.mifosng.platform.api.data.GenericResultsetData; import org.mifosng.platform.api.data.GroupData; @@ -40,19 +39,11 @@ import org.mifosng.platform.api.data.NewLoanData; import org.mifosng.platform.api.data.NoteData; import org.mifosng.platform.api.data.OfficeData; import org.mifosng.platform.api.data.OfficeTransactionData; -import org.mifosng.platform.api.data.PermissionData; -import org.mifosng.platform.api.data.RoleData; import org.mifosng.platform.api.data.SavingProductData; public interface ApiDataConversionService { // - String convertPermissionDataToJson(boolean prettyPrint, Set responseParameters, PermissionData... permissions); - - String convertRoleDataToJson(boolean prettyPrint, Set responseParameters, RoleData... roles); - - String convertAppUserDataToJson(boolean prettyPrint, Set responseParameters, AppUserData... users); - String convertOfficeTransactionDataToJson(boolean prettyPrint, Set responseParameters, OfficeTransactionData... officeTransactions); String convertConfigurationDataToJson(boolean prettyPrint, Set responseParameters, ConfigurationData... configuration); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java index bd1172bcc..bfc051533 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java @@ -23,8 +23,8 @@ import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand; import org.mifosng.platform.api.commands.BranchMoneyTransferCommand; import org.mifosng.platform.api.commands.ChargeCommand; import org.mifosng.platform.api.commands.ClientCommand; -import org.mifosng.platform.api.commands.DepositProductCommand; import org.mifosng.platform.api.commands.DepositAccountCommand; +import org.mifosng.platform.api.commands.DepositProductCommand; import org.mifosng.platform.api.commands.FundCommand; import org.mifosng.platform.api.commands.GroupCommand; import org.mifosng.platform.api.commands.LoanProductCommand; @@ -39,14 +39,13 @@ import org.mifosng.platform.api.commands.SubmitLoanApplicationCommand; import org.mifosng.platform.api.commands.UserCommand; import org.mifosng.platform.api.data.AdditionalFieldsSetData; import org.mifosng.platform.api.data.ApiParameterError; -import org.mifosng.platform.api.data.AppUserData; import org.mifosng.platform.api.data.AuthenticatedUserData; import org.mifosng.platform.api.data.ChargeData; import org.mifosng.platform.api.data.ClientData; import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData; import org.mifosng.platform.api.data.ConfigurationData; -import org.mifosng.platform.api.data.DepositProductData; import org.mifosng.platform.api.data.DepositAccountData; +import org.mifosng.platform.api.data.DepositProductData; import org.mifosng.platform.api.data.FundData; import org.mifosng.platform.api.data.GenericResultsetData; import org.mifosng.platform.api.data.GroupData; @@ -57,8 +56,6 @@ import org.mifosng.platform.api.data.NewLoanData; import org.mifosng.platform.api.data.NoteData; import org.mifosng.platform.api.data.OfficeData; import org.mifosng.platform.api.data.OfficeTransactionData; -import org.mifosng.platform.api.data.PermissionData; -import org.mifosng.platform.api.data.RoleData; import org.mifosng.platform.api.data.SavingProductData; import org.mifosng.platform.api.errorhandling.InvalidJsonException; import org.mifosng.platform.api.errorhandling.UnsupportedParameterException; @@ -493,110 +490,6 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { return json; } - - @Override - public String convertAppUserDataToJson(final boolean prettyPrint, final Set responseParameters, final AppUserData... users) { - - final Set supportedParameters = new HashSet(Arrays.asList("id", "officeId", "officeName", "username", "firstname", "lastname", "email", - "allowedOffices", "availableRoles", "selectedRoles")); - - final Set parameterNamesToSkip = new HashSet(); - - if (!responseParameters.isEmpty()) { - if (!supportedParameters.containsAll(responseParameters)) { - throw new UnsupportedParameterException(new ArrayList(responseParameters)); - } - - parameterNamesToSkip.addAll(supportedParameters); - parameterNamesToSkip.removeAll(responseParameters); - } - - ExclusionStrategy strategy = new ParameterListExclusionStrategy(parameterNamesToSkip); - - GsonBuilder builder = new GsonBuilder().addSerializationExclusionStrategy(strategy); - builder.registerTypeAdapter(LocalDate.class, new JodaLocalDateAdapter()); - if (prettyPrint) { - builder.setPrettyPrinting(); - } - Gson gsonDeserializer = builder.create(); - - String json = ""; - if (users != null && users.length == 1) { - json = gsonDeserializer.toJson(users[0]); - } else { - json = gsonDeserializer.toJson(users); - } - - return json; - } - - @Override - public String convertRoleDataToJson(final boolean prettyPrint, final Set responseParameters, final RoleData... roles) { - final Set supportedParameters = new HashSet(Arrays.asList("id", "name", "description", "availablePermissions", "selectedPermissions")); - - final Set parameterNamesToSkip = new HashSet(); - - if (!responseParameters.isEmpty()) { - if (!supportedParameters.containsAll(responseParameters)) { - throw new UnsupportedParameterException(new ArrayList(responseParameters)); - } - - parameterNamesToSkip.addAll(supportedParameters); - parameterNamesToSkip.removeAll(responseParameters); - } - - ExclusionStrategy strategy = new ParameterListExclusionStrategy(parameterNamesToSkip); - - GsonBuilder builder = new GsonBuilder().addSerializationExclusionStrategy(strategy); - builder.registerTypeAdapter(LocalDate.class, new JodaLocalDateAdapter()); - if (prettyPrint) { - builder.setPrettyPrinting(); - } - Gson gsonDeserializer = builder.create(); - - String json = ""; - if (roles != null && roles.length == 1) { - json = gsonDeserializer.toJson(roles[0]); - } else { - json = gsonDeserializer.toJson(roles); - } - - return json; - } - - @Override - public String convertPermissionDataToJson(final boolean prettyPrint, final Set responseParameters, final PermissionData... permissions) { - final Set supportedParameters = new HashSet(Arrays.asList("id", "name", "description", "code")); - - final Set parameterNamesToSkip = new HashSet(); - - if (!responseParameters.isEmpty()) { - if (!supportedParameters.containsAll(responseParameters)) { - throw new UnsupportedParameterException(new ArrayList(responseParameters)); - } - - parameterNamesToSkip.addAll(supportedParameters); - parameterNamesToSkip.removeAll(responseParameters); - } - - ExclusionStrategy strategy = new ParameterListExclusionStrategy(parameterNamesToSkip); - - GsonBuilder builder = new GsonBuilder().addSerializationExclusionStrategy(strategy); - builder.registerTypeAdapter(LocalDate.class, new JodaLocalDateAdapter()); - if (prettyPrint) { - builder.setPrettyPrinting(); - } - Gson gsonDeserializer = builder.create(); - - String json = ""; - if (permissions != null && permissions.length == 1) { - json = gsonDeserializer.toJson(permissions[0]); - } else { - json = gsonDeserializer.toJson(permissions); - } - - return json; - } @Override public String convertOfficeDataToJson(final boolean prettyPrint, final Set responseParameters, final OfficeData... offices) { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java new file mode 100644 index 000000000..6414ec586 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java @@ -0,0 +1,22 @@ +package org.mifosng.platform.api.infrastructure; + +import java.util.Collection; +import java.util.Set; + +import org.mifosng.platform.api.data.AppUserData; +import org.mifosng.platform.api.data.PermissionData; +import org.mifosng.platform.api.data.RoleData; + +public interface ApiJsonSerializerService { + + String serializePermissionDataToJson(boolean prettyPrint, Set responseParameters, Collection permissions); + + String serializeRoleDataToJson(boolean prettyPrint, Set responseParameters, Collection roles); + + String serializeRoleDataToJson(boolean prettyPrint, Set responseParameters, RoleData role); + + String serializeAppUserDataToJson(boolean prettyPrint, Set responseParameters, Collection users); + + String serializeAppUserDataToJson(boolean prettyPrint, Set responseParameters, AppUserData user); + +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java new file mode 100644 index 000000000..b0b0b7193 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java @@ -0,0 +1,64 @@ +package org.mifosng.platform.api.infrastructure; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import org.mifosng.platform.api.data.AppUserData; +import org.mifosng.platform.api.data.PermissionData; +import org.mifosng.platform.api.data.RoleData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.gson.Gson; + +/** + * Implementation of {@link ApiJsonSerializerService} that uses google-gson to serialize Java object representation into JSON. + */ +@Service +public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerService { + + private static final Set PERMISSION_DATA_PARAMETERS = new HashSet(Arrays.asList("id", "name", "description", "code")); + private static final Set ROLE_DATA_PARAMETERS = new HashSet(Arrays.asList("id", "name", "description", "availablePermissions", "selectedPermissions")); + private static final Set APP_USER_DATA_PARAMETERS = new HashSet( + Arrays.asList("id", "officeId", "officeName", "username", "firstname", "lastname", "email", + "allowedOffices", "availableRoles", "selectedRoles")); + + private final GoogleGsonSerializerHelper helper; + + @Autowired + public GoogleGsonApiJsonSerializerService(final GoogleGsonSerializerHelper helper) { + this.helper = helper; + } + + @Override + public String serializePermissionDataToJson(final boolean prettyPrint, final Set responseParameters, final Collection permissions) { + final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(PERMISSION_DATA_PARAMETERS, prettyPrint, responseParameters); + return helper.serializedJsonFrom(gsonDeserializer, permissions.toArray(new PermissionData[permissions.size()])); + } + + @Override + public String serializeRoleDataToJson(final boolean prettyPrint, final Set responseParameters, final Collection roles) { + final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(ROLE_DATA_PARAMETERS, prettyPrint, responseParameters); + return helper.serializedJsonFrom(gsonDeserializer, roles.toArray(new RoleData[roles.size()])); + } + + @Override + public String serializeRoleDataToJson(final boolean prettyPrint, final Set responseParameters, final RoleData role) { + final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(ROLE_DATA_PARAMETERS, prettyPrint, responseParameters); + return helper.serializedJsonFrom(gsonDeserializer, role); + } + + @Override + public String serializeAppUserDataToJson(final boolean prettyPrint, final Set responseParameters, final Collection users) { + final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(APP_USER_DATA_PARAMETERS, prettyPrint, responseParameters); + return helper.serializedJsonFrom(gsonDeserializer, users.toArray(new AppUserData[users.size()])); + } + + @Override + public String serializeAppUserDataToJson(final boolean prettyPrint, final Set responseParameters, final AppUserData user) { + final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(APP_USER_DATA_PARAMETERS, prettyPrint, responseParameters); + return helper.serializedJsonFrom(gsonDeserializer, user); + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonSerializerHelper.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonSerializerHelper.java new file mode 100644 index 000000000..60e838357 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonSerializerHelper.java @@ -0,0 +1,62 @@ +package org.mifosng.platform.api.infrastructure; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.mifosng.platform.api.errorhandling.UnsupportedParameterException; +import org.springframework.stereotype.Service; + +import com.google.gson.ExclusionStrategy; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +/** + * Helper class for serialization of java objects into JSON using google-gson. + */ +@Service +public class GoogleGsonSerializerHelper { + + public Gson createGsonBuilderWithParameterExclusionSerializationStrategy( + final Set supportedParameters, + final boolean prettyPrint, + final Set responseParameters) { + + final Set parameterNamesToSkip = new HashSet(); + + if (!responseParameters.isEmpty()) { + + // strip out all know support parameters from expected response to + // see if unsupported parameters requested for response. + final Set differentParametersDetectedSet = new HashSet(responseParameters); + differentParametersDetectedSet.removeAll(supportedParameters); + + if (!differentParametersDetectedSet.isEmpty()) { + throw new UnsupportedParameterException(new ArrayList(differentParametersDetectedSet)); + } + + parameterNamesToSkip.addAll(supportedParameters); + parameterNamesToSkip.removeAll(responseParameters); + } + + final ExclusionStrategy strategy = new ParameterListExclusionStrategy(parameterNamesToSkip); + + final GsonBuilder builder = new GsonBuilder().addSerializationExclusionStrategy(strategy); + builder.registerTypeAdapter(LocalDate.class, new JodaLocalDateAdapter()); + builder.registerTypeAdapter(DateTime.class, new JodaDateTimeAdapter()); + if (prettyPrint) { + builder.setPrettyPrinting(); + } + return builder.create(); + } + + public String serializedJsonFrom(final Gson serializer, final Object[] dataObjects) { + return serializer.toJson(dataObjects); + } + + public String serializedJsonFrom(final Gson serializer, final Object singleDataObject) { + return serializer.toJson(singleDataObject); + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/Role.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/Role.java index 6f19da693..20f07b747 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/Role.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/Role.java @@ -62,16 +62,13 @@ public class Role extends AbstractAuditableCustom { public RoleData toData() { - RoleData data = new RoleData(this.getId(), this.name, this.description); - Collection rolePermissions = new ArrayList(); for (Permission permission : this.permissions) { PermissionData permissionData = permission.toData(); rolePermissions.add(permissionData); } - data.setSelectedPermissions(rolePermissions); - return data; + return new RoleData(this.getId(), this.name, this.description, rolePermissions); } public void update(final RoleCommand command, final List selectedPermissions) { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformServiceImpl.java index 1b167331a..b754044ac 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformServiceImpl.java @@ -79,9 +79,7 @@ public class AppUserReadPlatformServiceImpl implements AppUserReadPlatformServic List availableRoles = new ArrayList(this.roleReadPlatformService.retrieveAllRoles()); - AppUserData userData = new AppUserData(); - userData.setAllowedOffices(offices); - userData.setAvailableRoles(availableRoles); + AppUserData userData = new AppUserData(offices, availableRoles); return userData; } @@ -98,21 +96,17 @@ public class AppUserReadPlatformServiceImpl implements AppUserReadPlatformServic List availableRoles = new ArrayList(this.roleReadPlatformService.retrieveAllRoles()); - List userRoleData = new ArrayList(); + List selectedUserRoles = new ArrayList(); Set userRoles = user.getRoles(); for (Role role : userRoles) { - userRoleData.add(role.toData()); + selectedUserRoles.add(role.toData()); } + availableRoles.removeAll(selectedUserRoles); + AppUserData userData = new AppUserData(user.getId(), user.getUsername(), user.getEmail(), user.getOffice().getId(), user.getOffice() - .getName()); - userData.setFirstname(user.getFirstname()); - userData.setLastname(user.getLastname()); - - availableRoles.removeAll(userRoleData); - userData.setAvailableRoles(availableRoles); - userData.setSelectedRoles(userRoleData); + .getName(), user.getFirstname(), user.getLastname(), availableRoles, selectedUserRoles); return userData; } @@ -139,9 +133,7 @@ public class AppUserReadPlatformServiceImpl implements AppUserReadPlatformServic // FIXME - change sql query to join to get office id and name information. String officeName = fromOfficeList(this.offices, officeId); - AppUserData user = new AppUserData(id, username, email, officeId, officeName); - user.setLastname(lastname); - user.setFirstname(firstname); + AppUserData user = new AppUserData(id, username, email, officeId, officeName, firstname, lastname, new ArrayList(), new ArrayList()); return user; } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleReadPlatformServiceImpl.java index 673d3d73f..363731e86 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleReadPlatformServiceImpl.java @@ -2,8 +2,10 @@ package org.mifosng.platform.user.service; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Collection; +import org.mifosng.platform.api.data.PermissionData; import org.mifosng.platform.api.data.RoleData; import org.mifosng.platform.exceptions.RoleNotFoundException; import org.mifosng.platform.infrastructure.JdbcSupport; @@ -61,7 +63,8 @@ public class RoleReadPlatformServiceImpl implements RoleReadPlatformService { String name = rs.getString("name"); String description = rs.getString("description"); - return new RoleData(id, name, description); + Collection selectedPermissions = new ArrayList(0); + return new RoleData(id, name, description, selectedPermissions); } public String schema() {