From 2a4d7335cb972a7b007ec1b6327ecc7784a1c6c9 Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Sun, 22 Jul 2012 11:16:07 +0100 Subject: [PATCH] tidy up json serialization for loan products and fix office transfer serialization. --- .../platform/api/ClientsApiResource.java | 2 +- .../platform/api/LoanProductsApiResource.java | 77 +++++++++++++------ .../api/OfficeTransactionsApiResource.java | 2 +- .../platform/api/data/LoanProductData.java | 2 - .../mifosng/platform/api/data/OfficeData.java | 5 +- .../ApiDataConversionService.java | 3 + .../ApiDataConversionServiceImpl.java | 45 ++++++++++- 7 files changed, 105 insertions(+), 31 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientsApiResource.java index 1bd4ffd9f..8140be244 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/ClientsApiResource.java @@ -156,7 +156,7 @@ public class ClientsApiResource { @Path("template") @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) - public String newClientDetails(@Context UriInfo uriInfo) { + public String newClientDetails(@Context final UriInfo uriInfo) { Set typicalResponseParameters = new HashSet( Arrays.asList("id", "officeId", "officeName", "externalId", "firstname", "lastname", "joinedDate", "displayName", "allowedOffices") diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductsApiResource.java index 38dd0005e..bcffb8131 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductsApiResource.java @@ -1,6 +1,9 @@ package org.mifosng.platform.api; +import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -18,7 +21,7 @@ import org.mifosng.platform.api.commands.LoanProductCommand; import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.api.data.LoanProductData; import org.mifosng.platform.api.infrastructure.ApiDataConversionService; -import org.mifosng.platform.api.infrastructure.ApiJSONFormattingService; +import org.mifosng.platform.api.infrastructure.ApiParameterHelper; import org.mifosng.platform.loanproduct.service.LoanProductReadPlatformService; import org.mifosng.platform.loanproduct.service.LoanProductWritePlatformService; import org.springframework.beans.factory.annotation.Autowired; @@ -30,10 +33,6 @@ import org.springframework.stereotype.Component; @Scope("singleton") public class LoanProductsApiResource { - private String defaultFieldList = "principal,inArrearsTolerance,interestRatePerPeriod,annualInterestRate,repaymentFrequencyType,interestRateFrequencyType,amortizationType,interestType,interestCalculationPeriodType,fundId"; - private String allowedFieldList = "currencyOptions,amortizationTypeOptions,interestTypeOptions,interestCalculationPeriodTypeOptions,repaymentFrequencyTypeOptions,interestRateFrequencyTypeOptions,fundOptions"; - private String filterName = "myFilter"; - @Autowired private LoanProductReadPlatformService loanProductReadPlatformService; @@ -43,9 +42,6 @@ public class LoanProductsApiResource { @Autowired private ApiDataConversionService apiDataConversionService; - @Autowired - private ApiJSONFormattingService jsonFormattingService; - @POST @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) @@ -63,11 +59,22 @@ public class LoanProductsApiResource { @Produces({MediaType.APPLICATION_JSON}) public String retrieveAllLoanProducts(@Context final UriInfo uriInfo) { - Collection products = this.loanProductReadPlatformService.retrieveAllLoanProducts(); + Set typicalResponseParameters = new HashSet( + Arrays.asList("id", "name", "description", "fundId", "fundName", "principal", "inArrearsTolerance", "numberOfRepayments", + "repaymentEvery", "interestRatePerPeriod", "annualInterestRate", + "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", + "createdOn", "lastModifedOn") + ); + + Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + if (responseParameters.isEmpty()) { + responseParameters.addAll(typicalResponseParameters); + } + boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - String selectedFields = ""; - return this.jsonFormattingService.convertRequest(products, filterName, - allowedFieldList, selectedFields, uriInfo.getQueryParameters()); + Collection products = this.loanProductReadPlatformService.retrieveAllLoanProducts(); + + return this.apiDataConversionService.convertLoanProductDataToJson(prettyPrint, responseParameters, products.toArray(new LoanProductData[products.size()])); } /* @@ -80,13 +87,24 @@ public class LoanProductsApiResource { @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON}) public String retrieveNewLoanProductDetails(@Context final UriInfo uriInfo) { + + Set typicalResponseParameters = new HashSet( + Arrays.asList("id", "name", "description", "fundId", "fundName", "principal", "inArrearsTolerance", "numberOfRepayments", + "repaymentEvery", "interestRatePerPeriod", "annualInterestRate", + "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", + "createdOn", "lastModifedOn","currencyOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", + "repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions") + ); + + Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + if (responseParameters.isEmpty()) { + responseParameters.addAll(typicalResponseParameters); + } + boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveNewLoanProductDetails(); - - String selectedFields = defaultFieldList + "," + allowedFieldList; - return this.jsonFormattingService.convertRequest(loanProduct, - filterName, allowedFieldList, selectedFields, - uriInfo.getQueryParameters()); + + return this.apiDataConversionService.convertLoanProductDataToJson(prettyPrint, responseParameters, loanProduct); } @GET @@ -95,12 +113,27 @@ public class LoanProductsApiResource { @Produces({MediaType.APPLICATION_JSON}) public String retrieveLoanProductDetails(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) { - LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId); + Set typicalResponseParameters = new HashSet( + Arrays.asList("id", "name", "description", "fundId", "fundName", "principal", "inArrearsTolerance", "numberOfRepayments", + "repaymentEvery", "interestRatePerPeriod", "annualInterestRate", + "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", + "createdOn", "lastModifedOn") + ); + + Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + if (responseParameters.isEmpty()) { + responseParameters.addAll(typicalResponseParameters); + } + boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); - String selectedFields = ""; - return this.jsonFormattingService.convertRequest(loanProduct, - filterName, allowedFieldList, selectedFields, - uriInfo.getQueryParameters()); + LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId); + if (template) { + responseParameters.addAll(Arrays.asList("currencyOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", + "repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions")); + } + + return this.apiDataConversionService.convertLoanProductDataToJson(prettyPrint, responseParameters, loanProduct); } @PUT diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/OfficeTransactionsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/OfficeTransactionsApiResource.java index 44d206001..8ba2ce899 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/OfficeTransactionsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/OfficeTransactionsApiResource.java @@ -45,7 +45,7 @@ public class OfficeTransactionsApiResource { @Produces({MediaType.APPLICATION_JSON}) public String newOfficeTransactionDetails(@Context final UriInfo uriInfo) { - Set typicalResponseParameters = new HashSet(Arrays.asList("id", "transactionDate", "allowedOffices", "currencyOptions")); + Set typicalResponseParameters = new HashSet(Arrays.asList("transactionDate", "allowedOffices", "currencyOptions")); Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); if (responseParameters.isEmpty()) { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductData.java index 15c972503..0b1fdaac5 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductData.java @@ -6,10 +6,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.codehaus.jackson.map.annotate.JsonFilter; import org.joda.time.DateTime; -@JsonFilter("myFilter") public class LoanProductData implements Serializable { private Long id; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/OfficeData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/OfficeData.java index b863c47c3..b2f2ee3c2 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/OfficeData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/OfficeData.java @@ -1,14 +1,11 @@ package org.mifosng.platform.api.data; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import org.codehaus.jackson.map.annotate.JsonFilter; import org.joda.time.LocalDate; -@JsonFilter("myFilter") -public class OfficeData implements Serializable { +public class OfficeData { private Long id; private String name; 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 c139ddb07..b7e011293 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 @@ -20,6 +20,7 @@ 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.FundData; +import org.mifosng.platform.api.data.LoanProductData; import org.mifosng.platform.api.data.NoteData; import org.mifosng.platform.api.data.OfficeData; import org.mifosng.platform.api.data.OfficeTransactionData; @@ -45,6 +46,8 @@ public interface ApiDataConversionService { ClientLoanAccountSummaryCollectionData clientAccountsData); String convertNoteDataToJson(boolean prettyPrint, Set responseParameters, NoteData... notes); + + String convertLoanProductDataToJson(boolean prettyPrint, Set responseParameters, LoanProductData... products); // FundCommand convertJsonToFundCommand(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 87a8efb21..38e17be18 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 @@ -37,6 +37,7 @@ 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.FundData; +import org.mifosng.platform.api.data.LoanProductData; import org.mifosng.platform.api.data.NoteData; import org.mifosng.platform.api.data.OfficeData; import org.mifosng.platform.api.data.OfficeTransactionData; @@ -67,6 +68,48 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { gsonConverter = new Gson(); } + @Override + public String convertLoanProductDataToJson(final boolean prettyPrint, final Set responseParameters, final LoanProductData... products) { + Set supportedParameters = new HashSet( + Arrays.asList("id", "name", "description", "fundId", "fundName", "principal", "inArrearsTolerance", "numberOfRepayments", + "repaymentEvery", "interestRatePerPeriod", "annualInterestRate", + "repaymentFrequencyType", "interestRateFrequencyType", "amortizationType", "interestType", "interestCalculationPeriodType", + "createdOn", "lastModifedOn", + "currencyOptions", "amortizationTypeOptions", "interestTypeOptions", "interestCalculationPeriodTypeOptions", + "repaymentFrequencyTypeOptions", "interestRateFrequencyTypeOptions", "fundOptions") + ); + + 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()); + builder.registerTypeAdapter(DateTime.class, new JodaDateTimeAdapter()); + if (prettyPrint) { + builder.setPrettyPrinting(); + } + Gson gsonDeserializer = builder.create(); + + String json = ""; + if (products != null && products.length == 1) { + json = gsonDeserializer.toJson(products[0]); + } else { + json = gsonDeserializer.toJson(products); + } + + return json; + } + @Override public String convertNoteDataToJson(final boolean prettyPrint, final Set responseParameters, final NoteData... notes) { Set supportedParameters = new HashSet( @@ -207,7 +250,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { @Override public String convertOfficeTransactionDataToJson(final boolean prettyPrint, final Set responseParameters, final OfficeTransactionData... officeTransactions) { - Set supportedParameters = new HashSet(Arrays.asList("transactionDate", "currencyOptions", "allowedOffices")); + Set supportedParameters = new HashSet(Arrays.asList("id", "transactionDate", "allowedOffices", "currencyOptions")); final Set parameterNamesToSkip = new HashSet();