From c7c5198206173d73b6b73cbc3d9a9f7cdc4ea94c Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Tue, 21 Aug 2012 17:56:35 +0100 Subject: [PATCH] from MIFOSX-38 - tidy up serialisation around funds. --- .../api/ConfigurationApiResource.java | 6 +- .../platform/api/FundsApiResource.java | 24 ++++--- .../platform/api/data/ConfigurationData.java | 3 + .../ApiDataConversionService.java | 6 -- .../ApiDataConversionServiceImpl.java | 70 ------------------- .../ApiJsonSerializerService.java | 11 ++- .../GoogleGsonApiJsonSerializerService.java | 24 +++++++ 7 files changed, 55 insertions(+), 89 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/ConfigurationApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/ConfigurationApiResource.java index 2618d214c..966be10d2 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/ConfigurationApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/ConfigurationApiResource.java @@ -17,6 +17,7 @@ import javax.ws.rs.core.UriInfo; import org.mifosng.platform.api.commands.OrganisationCurrencyCommand; import org.mifosng.platform.api.data.ConfigurationData; 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.configuration.service.ConfigurationReadPlatformService; import org.mifosng.platform.configuration.service.ConfigurationWritePlatformService; @@ -38,6 +39,9 @@ public class ConfigurationApiResource { @Autowired private ApiDataConversionService apiDataConversionService; + @Autowired + private ApiJsonSerializerService apiJsonSerializerService; + @GET @Path("currency") @Consumes({MediaType.APPLICATION_JSON}) @@ -55,7 +59,7 @@ public class ConfigurationApiResource { ConfigurationData configurationData = this.configurationReadPlatformService.retrieveCurrencyConfiguration(); - return this.apiDataConversionService.convertConfigurationDataToJson(prettyPrint, responseParameters, configurationData); + return this.apiJsonSerializerService.serializeConfigurationDataToJson(prettyPrint, responseParameters, configurationData); } @PUT diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/FundsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/FundsApiResource.java index 18376440d..d67d088d0 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/FundsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/FundsApiResource.java @@ -19,6 +19,7 @@ import org.mifosng.platform.api.commands.FundCommand; import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.api.data.FundData; 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.fund.service.FundReadPlatformService; import org.mifosng.platform.fund.service.FundWritePlatformService; @@ -40,6 +41,9 @@ public class FundsApiResource { @Autowired private ApiDataConversionService apiDataConversionService; + @Autowired + private ApiJsonSerializerService apiJsonSerializerService; + @GET @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) @@ -48,9 +52,9 @@ public class FundsApiResource { Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - Collection funds = this.readPlatformService.retrieveAllFunds(); + final Collection funds = this.readPlatformService.retrieveAllFunds(); - return this.apiDataConversionService.convertFundDataToJson(prettyPrint, responseParameters, funds.toArray(new FundData[funds.size()])); + return this.apiJsonSerializerService.serializeFundDataToJson(prettyPrint, responseParameters, funds); } @POST @@ -58,9 +62,9 @@ public class FundsApiResource { @Produces({MediaType.APPLICATION_JSON}) public Response createFund(final String jsonRequestBody) { - FundCommand command = this.apiDataConversionService.convertJsonToFundCommand(null, jsonRequestBody); + final FundCommand command = this.apiDataConversionService.convertJsonToFundCommand(null, jsonRequestBody); - Long fundId = this.writePlatformService.createFund(command); + final Long fundId = this.writePlatformService.createFund(command); return Response.ok().entity(new EntityIdentifier(fundId)).build(); } @@ -71,12 +75,12 @@ public class FundsApiResource { @Produces({MediaType.APPLICATION_JSON}) public String retreiveOffice(@PathParam("fundId") final Long fundId, @Context final UriInfo uriInfo) { - Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - FundData fund = this.readPlatformService.retrieveFund(fundId); + final FundData fund = this.readPlatformService.retrieveFund(fundId); - return this.apiDataConversionService.convertFundDataToJson(prettyPrint, responseParameters, fund); + return this.apiJsonSerializerService.serializeFundDataToJson(prettyPrint, responseParameters, fund); } @PUT @@ -85,9 +89,9 @@ public class FundsApiResource { @Produces({MediaType.APPLICATION_JSON}) public Response updateFund(@PathParam("fundId") final Long fundId, final String jsonRequestBody) { - FundCommand command = this.apiDataConversionService.convertJsonToFundCommand(fundId, jsonRequestBody); + final FundCommand command = this.apiDataConversionService.convertJsonToFundCommand(fundId, jsonRequestBody); - Long entityId = this.writePlatformService.updateFund(command); + final Long entityId = this.writePlatformService.updateFund(command); return Response.ok().entity(new EntityIdentifier(entityId)).build(); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ConfigurationData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ConfigurationData.java index f6a88a142..f46565452 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ConfigurationData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ConfigurationData.java @@ -2,6 +2,9 @@ package org.mifosng.platform.api.data; import java.util.List; +/** + * Immutable data object for configuration. + */ public class ConfigurationData { private final List selectedCurrencyOptions; 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 35eeb0e38..3469fdfe0 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 @@ -25,10 +25,8 @@ import org.mifosng.platform.api.data.AdditionalFieldsSetData; 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.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; import org.mifosng.platform.api.data.LoanAccountData; @@ -41,8 +39,6 @@ import org.mifosng.platform.api.data.SavingProductData; public interface ApiDataConversionService { // - String convertConfigurationDataToJson(boolean prettyPrint, Set responseParameters, ConfigurationData... configuration); - String convertClientDataToJson(boolean prettyPrint, Set responseParameters, ClientData... clients); String convertClientLoanAccountSummaryCollectionDataToJson(boolean prettyPrint, Set responseParameters, @@ -79,8 +75,6 @@ public interface ApiDataConversionService { FundCommand convertJsonToFundCommand(Long resourceIdentifier, String json); - String convertFundDataToJson(boolean prettyPrint, Set responseParameters, FundData... funds); - OfficeCommand convertJsonToOfficeCommand(Long resourceIdentifier, String json); RoleCommand convertJsonToRoleCommand(Long resourceIdentifier, String json); 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 d63ea84dd..f8e721aee 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 @@ -42,10 +42,8 @@ import org.mifosng.platform.api.data.ApiParameterError; 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.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; import org.mifosng.platform.api.data.LoanAccountData; @@ -405,74 +403,6 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { return json; } - @Override - public String convertConfigurationDataToJson(final boolean prettyPrint, final Set responseParameters, final ConfigurationData... configuration) { - final Set supportedParameters = new HashSet(Arrays.asList("selectedCurrencyOptions", "currencyOptions")); - - 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 (configuration != null && configuration.length == 1) { - json = gsonDeserializer.toJson(configuration[0]); - } else { - json = gsonDeserializer.toJson(configuration); - } - - return json; - } - - @Override - public String convertFundDataToJson(final boolean prettyPrint, final Set responseParameters, final FundData... funds) { - - Set supportedParameters = new HashSet(Arrays.asList("id", "name", "externalId")); - - 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); - if (prettyPrint) { - builder.setPrettyPrinting(); - } - Gson gsonDeserializer = builder.create(); - - String json = ""; - if (funds != null && funds.length == 1) { - json = gsonDeserializer.toJson(funds[0]); - } else { - json = gsonDeserializer.toJson(funds); - } - - return json; - } - @Override public ChargeCommand convertJsonToChargeCommand(Long resourceIdentifier, String json) { if (StringUtils.isBlank(json)) { 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 index 4f08a320a..127804ad0 100644 --- 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 @@ -5,6 +5,8 @@ import java.util.Set; import org.mifosng.platform.api.data.AppUserData; import org.mifosng.platform.api.data.AuthenticatedUserData; +import org.mifosng.platform.api.data.ConfigurationData; +import org.mifosng.platform.api.data.FundData; import org.mifosng.platform.api.data.OfficeData; import org.mifosng.platform.api.data.OfficeTransactionData; import org.mifosng.platform.api.data.PermissionData; @@ -28,6 +30,11 @@ public interface ApiJsonSerializerService { String serializeOfficeDataToJson(boolean prettyPrint, Set responseParameters, OfficeData office); - String serializeOfficeTransactionDataToJson(boolean prettyPrint, Set responseParameters, OfficeTransactionData officeTransactionData); - + String serializeOfficeTransactionDataToJson(boolean prettyPrint, Set responseParameters, OfficeTransactionData officeTransaction); + + String serializeConfigurationDataToJson(boolean prettyPrint, Set responseParameters, ConfigurationData configuration); + + String serializeFundDataToJson(boolean prettyPrint, Set responseParameters, Collection funds); + + String serializeFundDataToJson(boolean prettyPrint, Set responseParameters, FundData fund); } \ 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 index 6e4efbcc8..dda27d928 100644 --- 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 @@ -7,6 +7,8 @@ import java.util.Set; import org.mifosng.platform.api.data.AppUserData; import org.mifosng.platform.api.data.AuthenticatedUserData; +import org.mifosng.platform.api.data.ConfigurationData; +import org.mifosng.platform.api.data.FundData; import org.mifosng.platform.api.data.OfficeData; import org.mifosng.platform.api.data.OfficeTransactionData; import org.mifosng.platform.api.data.PermissionData; @@ -33,6 +35,10 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ ); private static final Set OFFICE_TRANSACTIONS_DATA_PARAMETERS = new HashSet(Arrays.asList("transactionDate", "allowedOffices", "currencyOptions")); + private static final Set CONFIGURATION_DATA_PARAMETERS = new HashSet(Arrays.asList("selectedCurrencyOptions", "currencyOptions")); + + private static final Set FUND_DATA_PARAMETERS = new HashSet(Arrays.asList("id", "name", "externalId")); + private final GoogleGsonSerializerHelper helper; @Autowired @@ -93,4 +99,22 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(OFFICE_TRANSACTIONS_DATA_PARAMETERS, prettyPrint, responseParameters); return helper.serializedJsonFrom(gsonDeserializer, officeTransaction); } + + @Override + public String serializeConfigurationDataToJson(final boolean prettyPrint, final Set responseParameters, final ConfigurationData configuration) { + final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(CONFIGURATION_DATA_PARAMETERS, prettyPrint, responseParameters); + return helper.serializedJsonFrom(gsonDeserializer, configuration); + } + + @Override + public String serializeFundDataToJson(final boolean prettyPrint, final Set responseParameters, final Collection funds) { + final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(FUND_DATA_PARAMETERS, prettyPrint, responseParameters); + return helper.serializedJsonFrom(gsonDeserializer, funds.toArray(new FundData[funds.size()])); + } + + @Override + public String serializeFundDataToJson(final boolean prettyPrint, final Set responseParameters, final FundData fund) { + final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(FUND_DATA_PARAMETERS, prettyPrint, responseParameters); + return helper.serializedJsonFrom(gsonDeserializer, fund); + } } \ No newline at end of file