tidy up json serialization around additional data and reports.

This commit is contained in:
Keith Woodlock
2012-07-23 00:44:53 +01:00
parent d856b78302
commit 31433c2e72
12 changed files with 176 additions and 156 deletions
@@ -6,8 +6,8 @@ import java.util.Map;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import org.mifosng.platform.api.data.AdditionalFieldsSet;
import org.mifosng.platform.api.data.GenericResultset;
import org.mifosng.platform.api.data.AdditionalFieldsSetData;
import org.mifosng.platform.api.data.GenericResultsetData;
public interface ReadExtraDataAndReportingService {
@@ -15,18 +15,18 @@ public interface ReadExtraDataAndReportingService {
Map<String, String> extractedQueryParams);
// @PreAuthorize(value = "hasAnyRole('REPORTING_SUPER_USER_ROLE')")
GenericResultset retrieveGenericResultset(String name, String type,
GenericResultsetData retrieveGenericResultset(String name, String type,
Map<String, String> extractedQueryParams);
List<AdditionalFieldsSet> retrieveExtraDatasetNames(String type);
List<AdditionalFieldsSetData> retrieveExtraDatasetNames(String type);
GenericResultset retrieveExtraData(String type, String set, Long id);
GenericResultsetData retrieveExtraData(String type, String set, Long id);
void updateExtraData(String type, String set, Long id,
Map<String, String> queryParams);
public Response processPentahoRequest(String reportName,
String outputType, Map<String, String> queryParams);
Response processPentahoRequest(String reportName, String outputType,
Map<String, String> queryParams);
String getReportType(String reportName);
}
@@ -20,8 +20,8 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import org.apache.commons.lang.StringUtils;
import org.mifosng.platform.api.data.AdditionalFieldsSet;
import org.mifosng.platform.api.data.GenericResultset;
import org.mifosng.platform.api.data.AdditionalFieldsSetData;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.data.ResultsetColumnHeader;
import org.mifosng.platform.api.data.ResultsetDataRow;
import org.mifosng.platform.exceptions.AdditionalFieldsNotFoundException;
@@ -76,7 +76,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
public void write(OutputStream out) {
try {
GenericResultset result = retrieveGenericResultset(name,
GenericResultsetData result = retrieveGenericResultset(name,
type, queryParams);
StringBuffer sb = generateCsvFileBuffer(result);
@@ -102,7 +102,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
}
private static StringBuffer generateCsvFileBuffer(GenericResultset result) {
private static StringBuffer generateCsvFileBuffer(GenericResultsetData result) {
StringBuffer writer = new StringBuffer();
List<ResultsetColumnHeader> columnHeaders = result.getColumnHeaders();
@@ -149,7 +149,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
}
@Override
public GenericResultset retrieveGenericResultset(final String name,
public GenericResultsetData retrieveGenericResultset(final String name,
final String type, final Map<String, String> queryParams) {
long startTime = System.currentTimeMillis();
@@ -180,7 +180,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
sql = getSQLtoRun(name, type, queryParams);
}
GenericResultset result = fillReportingGenericResultSet(sql);
GenericResultsetData result = fillReportingGenericResultSet(sql);
long elapsed = System.currentTimeMillis() - startTime;
logger.info("FINISHING Report/Request Name: " + name + " - " + type
@@ -188,9 +188,9 @@ public class ReadExtraDataAndReportingServiceImpl implements
return result;
}
private GenericResultset fillReportingGenericResultSet(final String sql) {
private GenericResultsetData fillReportingGenericResultSet(final String sql) {
GenericResultset result = new GenericResultset();
GenericResultsetData result = new GenericResultsetData();
Connection db_connection = null;
Statement db_statement = null;
@@ -328,9 +328,9 @@ public class ReadExtraDataAndReportingServiceImpl implements
}
@Override
public List<AdditionalFieldsSet> retrieveExtraDatasetNames(String type) {
public List<AdditionalFieldsSetData> retrieveExtraDatasetNames(String type) {
List<AdditionalFieldsSet> additionalFieldsSets = new ArrayList<AdditionalFieldsSet>();
List<AdditionalFieldsSetData> additionalFieldsSets = new ArrayList<AdditionalFieldsSetData>();
Connection db_connection = null;
Statement db_statement = null;
@@ -350,7 +350,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
ResultSet rs = db_statement.executeQuery(sql);
while (rs.next()) {
additionalFieldsSets.add(new AdditionalFieldsSet(rs
additionalFieldsSets.add(new AdditionalFieldsSetData(rs
.getInt("id"), rs.getString("set"), rs
.getString("type")));
}
@@ -366,19 +366,19 @@ public class ReadExtraDataAndReportingServiceImpl implements
}
@Override
public GenericResultset retrieveExtraData(String type, String set, Long id) {
public GenericResultsetData retrieveExtraData(String type, String set, Long id) {
long startTime = System.currentTimeMillis();
GenericResultset result = fillExtraDataGenericResultSet(type, set, id);
GenericResultsetData result = fillExtraDataGenericResultSet(type, set, id);
long elapsed = System.currentTimeMillis() - startTime;
logger.info("FINISHING SET: " + set + " Elapsed Time: " + elapsed);
return result;
}
private GenericResultset fillExtraDataGenericResultSet(String type,
private GenericResultsetData fillExtraDataGenericResultSet(String type,
String set, Long id) {
GenericResultset result = new GenericResultset();
GenericResultsetData result = new GenericResultsetData();
Connection db_connection = null;
Statement db_statement1 = null;
@@ -24,11 +24,12 @@ import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.mifosng.platform.InvalidSqlException;
import org.mifosng.platform.ReadExtraDataAndReportingService;
import org.mifosng.platform.api.data.AdditionalFieldsSet;
import org.mifosng.platform.api.data.AdditionalFieldsSetData;
import org.mifosng.platform.api.data.ApiParameterError;
import org.mifosng.platform.api.data.EntityIdentifier;
import org.mifosng.platform.api.data.GenericResultset;
import org.mifosng.platform.api.infrastructure.ApiJSONFormattingService;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.infrastructure.ApiDataConversionService;
import org.mifosng.platform.api.infrastructure.ApiParameterHelper;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,30 +42,23 @@ import org.springframework.stereotype.Component;
@Scope("singleton")
public class AdditionalFieldsApiResource {
private final static Logger logger = LoggerFactory
.getLogger(AdditionalFieldsApiResource.class);
private String allowedFieldList = "";
private String filterName = "myFilter";
private final static Logger logger = LoggerFactory.getLogger(AdditionalFieldsApiResource.class);
@Autowired
private ReadExtraDataAndReportingService readExtraDataAndReportingService;
@Autowired
private ApiJSONFormattingService jsonFormattingService;
private ApiDataConversionService apiDataConversionService;
@GET
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public String datasets(@QueryParam("type") String type,
@Context UriInfo uriInfo) {
public String datasets(@QueryParam("type") final String type, @Context final UriInfo uriInfo) {
List<AdditionalFieldsSet> result = this.readExtraDataAndReportingService
.retrieveExtraDatasetNames(type);
List<AdditionalFieldsSetData> result = this.readExtraDataAndReportingService.retrieveExtraDatasetNames(type);
String selectedFields = "";
return this.jsonFormattingService.convertRequest(result, filterName,
allowedFieldList, selectedFields, uriInfo.getQueryParameters());
boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
return this.apiDataConversionService.convertAdditionalFieldsSetDataToJson(prettyPrint, result.toArray(new AdditionalFieldsSetData[result.size()]));
}
@GET
@@ -73,17 +67,13 @@ public class AdditionalFieldsApiResource {
@Produces({MediaType.APPLICATION_JSON})
public String extraData(@PathParam("type") final String type,
@PathParam("set") final String set, @PathParam("id") final Long id,
@Context UriInfo uriInfo) {
@Context final UriInfo uriInfo) {
try {
GenericResultset result = this.readExtraDataAndReportingService
.retrieveExtraData(type, set, id);
GenericResultsetData result = this.readExtraDataAndReportingService.retrieveExtraData(type, set, id);
String selectedFields = "";
//Note that GenericResultSet doesn't have a filter so all fields are returned (this is correct)
return this.jsonFormattingService.convertRequest(result, filterName,
allowedFieldList, selectedFields,
uriInfo.getQueryParameters());
boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
return this.apiDataConversionService.convertGenericResultsetDataToJson(prettyPrint, result);
} catch (InvalidSqlException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError(
@@ -102,7 +92,7 @@ public class AdditionalFieldsApiResource {
@Produces({MediaType.APPLICATION_JSON})
public Response saveExtraData(@PathParam("type") final String type,
@PathParam("set") final String set, @PathParam("id") final Long id,
String reqbody) {
final String jsonRequestBody) {
try {
@@ -110,7 +100,7 @@ public class AdditionalFieldsApiResource {
String pValue = "";
String pName;
try {
JSONObject jsonObj = new JSONObject(reqbody);
JSONObject jsonObj = new JSONObject(jsonRequestBody);
JSONArray jsonArr = jsonObj.names();
if (jsonArr != null) {
for (int i = 0; i < jsonArr.length(); i++) {
@@ -17,8 +17,9 @@ import javax.ws.rs.core.StreamingOutput;
import javax.ws.rs.core.UriInfo;
import org.mifosng.platform.ReadExtraDataAndReportingService;
import org.mifosng.platform.api.data.GenericResultset;
import org.mifosng.platform.api.infrastructure.ApiJSONFormattingService;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.infrastructure.ApiDataConversionService;
import org.mifosng.platform.api.infrastructure.ApiParameterHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@@ -28,38 +29,31 @@ import org.springframework.stereotype.Component;
@Scope("singleton")
public class ReportsApiResource {
private String allowedFieldList = "";
private String filterName = "myFilter";
@Autowired
private ReadExtraDataAndReportingService readExtraDataAndReportingService;
@Autowired
private ApiJSONFormattingService jsonFormattingService;
private ApiDataConversionService apiDataConversionService;
@GET
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON, "application/x-msdownload" })
public Response retrieveReportList(@Context final UriInfo uriInfo) {
MultivaluedMap<String, String> queryParams = uriInfo
.getQueryParameters();
Map<String, String> extractedQueryParams = new HashMap<String, String>();
boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
boolean exportCsv = ApiParameterHelper.exportCsv(uriInfo.getQueryParameters());
String exportCSV = queryParams.getFirst("exportCSV");
if ((exportCSV == null) || (!(exportCSV.equalsIgnoreCase("true")))) {
GenericResultset result = this.readExtraDataAndReportingService
.retrieveGenericResultset(".", ".", extractedQueryParams);
String selectedFields = "";
String json = this.jsonFormattingService.convertRequest(result,
filterName, allowedFieldList, selectedFields,
uriInfo.getQueryParameters());
if (!exportCsv) {
GenericResultsetData result = this.readExtraDataAndReportingService.retrieveGenericResultset(".", ".", extractedQueryParams);
final String json = this.apiDataConversionService.convertGenericResultsetDataToJson(prettyPrint, result);
return Response.ok().entity(json).build();
}
StreamingOutput result = this.readExtraDataAndReportingService
.retrieveReportCSV(".", ".", extractedQueryParams);
StreamingOutput result = this.readExtraDataAndReportingService.retrieveReportCSV(".", ".", extractedQueryParams);
return Response
.ok()
@@ -71,52 +65,43 @@ public class ReportsApiResource {
@GET
@Path("{reportName}")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON, "application/x-msdownload",
"application/vnd.ms-excel", "application/pdf", "text/html" })
@Produces({MediaType.APPLICATION_JSON, "application/x-msdownload","application/vnd.ms-excel", "application/pdf", "text/html" })
public Response retrieveReport(
@PathParam("reportName") final String reportName,
@Context final UriInfo uriInfo) {
MultivaluedMap<String, String> queryParams = uriInfo
.getQueryParameters();
MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
boolean exportCsv = ApiParameterHelper.exportCsv(uriInfo.getQueryParameters());
boolean parameterType = ApiParameterHelper.parameterType(uriInfo.getQueryParameters());
String parameterType = queryParams.getFirst("parameterType");
if ((parameterType == null)
|| (!(parameterType.equalsIgnoreCase("true")))) {
parameterType = "report";
} else {
parameterType = "parameter";
}
if (parameterType.equals("report")) {
if (this.readExtraDataAndReportingService.getReportType(reportName)
.equalsIgnoreCase("Pentaho")) {
return this.readExtraDataAndReportingService
.processPentahoRequest(reportName,
queryParams.getFirst("output-type"),
getReportParams(queryParams, true));
String parameterTypeValue = null;
if (!parameterType) {
parameterTypeValue = "report";
if (this.readExtraDataAndReportingService.getReportType(reportName).equalsIgnoreCase("Pentaho")) {
Map<String, String> reportParams = getReportParams(queryParams, true);
return this.readExtraDataAndReportingService.processPentahoRequest(reportName, queryParams.getFirst("output-type"), reportParams);
}
} else {
parameterTypeValue = "parameter";
}
String exportCSV = queryParams.getFirst("exportCSV");
if ((exportCSV == null) || (!(exportCSV.equalsIgnoreCase("true")))) {
// JSON
GenericResultset result = this.readExtraDataAndReportingService
.retrieveGenericResultset(reportName, parameterType,
getReportParams(queryParams, false));
if (!exportCsv) {
Map<String, String> reportParams = getReportParams(queryParams, false);
GenericResultsetData result = this.readExtraDataAndReportingService.retrieveGenericResultset(reportName, parameterTypeValue, reportParams);
String selectedFields = "";
String json = this.jsonFormattingService.convertRequest(result,
filterName, allowedFieldList, selectedFields,
uriInfo.getQueryParameters());
return Response.ok().entity(json).type(MediaType.APPLICATION_JSON)
.build();
final String json = this.apiDataConversionService.convertGenericResultsetDataToJson(prettyPrint, result);
return Response.ok().entity(json).type(MediaType.APPLICATION_JSON).build();
}
// CSV Export
StreamingOutput result = this.readExtraDataAndReportingService
.retrieveReportCSV(reportName, parameterType, getReportParams(queryParams, false));
Map<String, String> reportParams = getReportParams(queryParams, false);
StreamingOutput result = this.readExtraDataAndReportingService.retrieveReportCSV(reportName, parameterTypeValue, reportParams);
return Response
.ok()
.entity(result)
@@ -126,8 +111,7 @@ public class ReportsApiResource {
+ ".csv").build();
}
private Map<String, String> getReportParams(
MultivaluedMap<String, String> queryParams, Boolean isPentaho) {
private Map<String, String> getReportParams(final MultivaluedMap<String, String> queryParams, final Boolean isPentaho) {
Map<String, String> reportParams = new HashMap<String, String>();
Set<String> keys = queryParams.keySet();
@@ -1,46 +0,0 @@
package org.mifosng.platform.api.data;
import org.codehaus.jackson.map.annotate.JsonFilter;
@JsonFilter("myFilter")
public class AdditionalFieldsSet {
private Integer id;
private String name;
private String type;
protected AdditionalFieldsSet() {
//
}
public AdditionalFieldsSet(final Integer id, final String name, final String type) {
this.id = id;
this.name = name;
this.type = type;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
@@ -0,0 +1,26 @@
package org.mifosng.platform.api.data;
public class AdditionalFieldsSetData {
private final Integer id;
private final String name;
private final String type;
public AdditionalFieldsSetData(final Integer id, final String name, final String type) {
this.id = id;
this.name = name;
this.type = type;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public String getType() {
return type;
}
}
@@ -3,12 +3,12 @@ package org.mifosng.platform.api.data;
import java.util.ArrayList;
import java.util.List;
public class GenericResultset {
public class GenericResultsetData {
private List<ResultsetColumnHeader> columnHeaders = new ArrayList<ResultsetColumnHeader>();
private List<ResultsetDataRow> data = new ArrayList<ResultsetDataRow>();
public GenericResultset() {
public GenericResultsetData() {
}
@@ -15,11 +15,13 @@ import org.mifosng.platform.api.commands.OrganisationCurrencyCommand;
import org.mifosng.platform.api.commands.RoleCommand;
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.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.GenericResultsetData;
import org.mifosng.platform.api.data.LoanAccountData;
import org.mifosng.platform.api.data.LoanProductData;
import org.mifosng.platform.api.data.LoanTransactionData;
@@ -57,6 +59,10 @@ public interface ApiDataConversionService {
String convertLoanAccountDataToJson(boolean prettyPrint, Set<String> responseParameters, LoanAccountData loanAccount);
String convertLoanTransactionDataToJson(boolean prettyPrint, Set<String> responseParameters, LoanTransactionData... transactions);
String convertAdditionalFieldsSetDataToJson(boolean prettyPrint, AdditionalFieldsSetData... additionalFields);
String convertGenericResultsetDataToJson(boolean prettyPrint, GenericResultsetData result);
//
FundCommand convertJsonToFundCommand(Long resourceIdentifier, String json);
@@ -31,12 +31,14 @@ import org.mifosng.platform.api.commands.OrganisationCurrencyCommand;
import org.mifosng.platform.api.commands.RoleCommand;
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.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.GenericResultsetData;
import org.mifosng.platform.api.data.LoanAccountData;
import org.mifosng.platform.api.data.LoanProductData;
import org.mifosng.platform.api.data.LoanTransactionData;
@@ -71,6 +73,40 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
gsonConverter = new Gson();
}
@Override
public String convertGenericResultsetDataToJson(final boolean prettyPrint, final GenericResultsetData result) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(LocalDate.class, new JodaLocalDateAdapter());
builder.registerTypeAdapter(DateTime.class, new JodaDateTimeAdapter());
if (prettyPrint) {
builder.setPrettyPrinting();
}
Gson gsonDeserializer = builder.create();
return gsonDeserializer.toJson(result);
}
@Override
public String convertAdditionalFieldsSetDataToJson(final boolean prettyPrint, final AdditionalFieldsSetData... additionalFields) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(LocalDate.class, new JodaLocalDateAdapter());
builder.registerTypeAdapter(DateTime.class, new JodaDateTimeAdapter());
if (prettyPrint) {
builder.setPrettyPrinting();
}
Gson gsonDeserializer = builder.create();
String json = "";
if (additionalFields != null && additionalFields.length == 1) {
json = gsonDeserializer.toJson(additionalFields[0]);
} else {
json = gsonDeserializer.toJson(additionalFields);
}
return json;
}
@Override
public String convertLoanTransactionDataToJson(final boolean prettyPrint, final Set<String> responseParameters, final LoanTransactionData... transactions) {
Set<String> supportedParameters = new HashSet<String>(
@@ -2,6 +2,10 @@ package org.mifosng.platform.api.infrastructure;
import javax.ws.rs.core.MultivaluedMap;
/**
* Removed in favour of using google gson within {@link ApiDataConversionService}.
*/
@Deprecated
public interface ApiJSONFormattingService {
String convertRequest(Object dataObject, String filterName,
@@ -15,9 +15,11 @@ import org.codehaus.jackson.map.ser.FilterProvider;
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
import org.mifosng.platform.exceptions.PlatformInternalServerException;
import org.springframework.stereotype.Service;
@Service
/**
*
*/
@Deprecated
public class ApiJSONFormattingServiceImpl implements ApiJSONFormattingService {
@Override
@@ -43,6 +43,24 @@ public class ApiParameterHelper {
return prettyPrint;
}
public static boolean exportCsv(final MultivaluedMap<String, String> queryParams) {
boolean exportCsv = false;
if (queryParams.getFirst("exportCSV") != null) {
String exportCsvValue = queryParams.getFirst("exportCSV");
exportCsv = "true".equalsIgnoreCase(exportCsvValue);
}
return exportCsv;
}
public static boolean parameterType(final MultivaluedMap<String, String> queryParams) {
boolean parameterType = false;
if (queryParams.getFirst("parameterType") != null) {
String parameterTypeValue = queryParams.getFirst("parameterType");
parameterType = "true".equalsIgnoreCase(parameterTypeValue);
}
return parameterType;
}
public static boolean template(final MultivaluedMap<String, String> queryParams) {
boolean template = false;
if (queryParams.getFirst("template") != null) {