from MIFOSX-38, tidy up serialisation around additional data and reports.2

This commit is contained in:
Keith Woodlock
2012-08-21 20:45:44 +01:00
parent c7c5198206
commit b44e53c3b7
10 changed files with 71 additions and 106 deletions
@@ -192,28 +192,26 @@ public class ReadExtraDataAndReportingServiceImpl implements
private GenericResultsetData fillReportingGenericResultSet(final String sql) {
GenericResultsetData result = new GenericResultsetData();
Connection db_connection = null;
Statement db_statement = null;
try {
db_connection = dataSource.getConnection();
db_statement = db_connection.createStatement();
ResultSet rs = db_statement.executeQuery(sql);
List<ResultsetColumnHeader> columnHeaders = new ArrayList<ResultsetColumnHeader>();
List<ResultsetDataRow> resultsetDataRows = new ArrayList<ResultsetDataRow>();
ResultSetMetaData rsmd = rs.getMetaData();
String columnName = null;
String columnValue = null;
List<ResultsetColumnHeader> columnHeaders = new ArrayList<ResultsetColumnHeader>();
for (int i = 0; i < rsmd.getColumnCount(); i++) {
ResultsetColumnHeader rsch = new ResultsetColumnHeader();
rsch.setColumnName(rsmd.getColumnName(i + 1));
rsch.setColumnType(rsmd.getColumnTypeName(i + 1));
columnHeaders.add(rsch);
}
result.setColumnHeaders(columnHeaders);
List<ResultsetDataRow> resultsetDataRows = new ArrayList<ResultsetDataRow>();
ResultsetDataRow resultsetDataRow;
while (rs.next()) {
resultsetDataRow = new ResultsetDataRow();
@@ -226,16 +224,13 @@ public class ReadExtraDataAndReportingServiceImpl implements
resultsetDataRow.setRow(columnValues);
resultsetDataRows.add(resultsetDataRow);
}
result.setData(resultsetDataRows);
return new GenericResultsetData(columnHeaders, resultsetDataRows);
} catch (SQLException e) {
throw new PlatformDataIntegrityException("error.msg.sql.error",
e.getMessage(), "Sql: " + sql);
throw new PlatformDataIntegrityException("error.msg.sql.error", e.getMessage(), "Sql: " + sql);
} finally {
dbClose(db_statement, db_connection);
}
return result;
}
private String getSQLtoRun(final String name, final String type,
@@ -470,10 +465,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
return result;
}
private GenericResultsetData fillExtraDataGenericResultSet(String type,
String set, Long id) {
GenericResultsetData result = new GenericResultsetData();
private GenericResultsetData fillExtraDataGenericResultSet(final String type, final String set, final Long id) {
Connection db_connection = null;
Statement db_statement1 = null;
@@ -487,11 +479,14 @@ public class ReadExtraDataAndReportingServiceImpl implements
ResultSet rsmd = db_statement1.executeQuery(sql);
List<ResultsetColumnHeader> columnHeaders = null;
List<ResultsetDataRow> resultsetDataRows = null;
if (rsmd.next()) {
String fullDatasetName = getFullDatasetName(type, set);
db_statement2 = db_connection.createStatement();
List<ResultsetColumnHeader> columnHeaders = new ArrayList<ResultsetColumnHeader>();
columnHeaders = new ArrayList<ResultsetColumnHeader>();
Boolean firstColumn = true;
Integer allowedListId;
String selectFieldList = "";
@@ -528,8 +523,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
}
columnHeaders.add(rsch);
} while (rsmd.next());
result.setColumnHeaders(columnHeaders);
sql = "select " + selectFieldList + " from `" + type
+ "` t left join `" + fullDatasetName
+ "` s on s.id = t.id " + " where t.id = " + id;
@@ -540,7 +534,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
if (rs.next()) {
String columnName = null;
String columnValue = null;
List<ResultsetDataRow> resultsetDataRows = new ArrayList<ResultsetDataRow>();
resultsetDataRows = new ArrayList<ResultsetDataRow>();
ResultsetDataRow resultsetDataRow;
do {
resultsetDataRow = new ResultsetDataRow();
@@ -554,13 +548,15 @@ public class ReadExtraDataAndReportingServiceImpl implements
resultsetDataRow.setRow(columnValues);
resultsetDataRows.add(resultsetDataRow);
} while (rs.next());
result.setData(resultsetDataRows);
} else {
throw new AdditionalFieldsNotFoundException(type, id);
}
} else {
throw new AdditionalFieldsNotFoundException(type, set);
}
return new GenericResultsetData(columnHeaders, resultsetDataRows);
} catch (SQLException e) {
throw new PlatformDataIntegrityException("error.msg.sql.error",
e.getMessage(), "Additional Fields Type: " + type
@@ -570,8 +566,6 @@ public class ReadExtraDataAndReportingServiceImpl implements
dbClose(db_statement3, null);
dbClose(db_statement1, db_connection);
}
return result;
}
private String getFullDatasetName(final String type, final String set) {
@@ -780,7 +774,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
}
private void dbClose(Statement db_statement, Connection db_connection) {
logger.info("dbClose");
logger.debug("dbClose");
try {
if (db_statement != null) {
db_statement.close();
@@ -791,8 +785,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
db_connection = null;
}
} catch (SQLException e) {
throw new PlatformDataIntegrityException("error.msg.sql.error",
e.getMessage(), "Error closing database connection");
throw new PlatformDataIntegrityException("error.msg.sql.error", e.getMessage(), "Error closing database connection");
}
}
@@ -28,7 +28,7 @@ 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.GenericResultsetData;
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.exceptions.PlatformApiDataValidationException;
import org.slf4j.Logger;
@@ -48,7 +48,7 @@ public class AdditionalFieldsApiResource {
private ReadExtraDataAndReportingService readExtraDataAndReportingService;
@Autowired
private ApiDataConversionService apiDataConversionService;
private ApiJsonSerializerService apiJsonSerializerService;
@GET
@Consumes({MediaType.APPLICATION_JSON})
@@ -58,7 +58,7 @@ public class AdditionalFieldsApiResource {
List<AdditionalFieldsSetData> result = this.readExtraDataAndReportingService.retrieveExtraDatasetNames(type);
boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
return this.apiDataConversionService.convertAdditionalFieldsSetDataToJson(prettyPrint, result.toArray(new AdditionalFieldsSetData[result.size()]));
return this.apiJsonSerializerService.serializeAdditionalFieldsSetDataToJson(prettyPrint, result);
}
@GET
@@ -73,7 +73,7 @@ public class AdditionalFieldsApiResource {
GenericResultsetData result = this.readExtraDataAndReportingService.retrieveExtraData(type, set, id);
boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
return this.apiDataConversionService.convertGenericResultsetDataToJson(prettyPrint, result);
return this.apiJsonSerializerService.serializeGenericResultsetDataToJson(prettyPrint, result);
} catch (InvalidSqlException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError(
@@ -9,17 +9,12 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
import org.mifosng.platform.InvalidSqlException;
import org.mifosng.platform.ReadExtraDataAndReportingService;
import org.mifosng.platform.api.data.ApiParameterError;
import org.mifosng.platform.api.infrastructure.ApiDataConversionService;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@@ -29,15 +24,11 @@ import org.springframework.stereotype.Component;
@Scope("singleton")
public class DataTableApiResource {
private final static Logger logger = LoggerFactory.getLogger(DataTableApiResource.class);
// private final static Logger logger = LoggerFactory.getLogger(DataTableApiResource.class);
@Autowired
private ReadExtraDataAndReportingService readExtraDataAndReportingService;
@Autowired
private ApiDataConversionService apiDataConversionService;
@GET
@Path("{datatable}")
@Consumes({MediaType.APPLICATION_JSON})
@@ -45,8 +36,9 @@ public class DataTableApiResource {
public String extraData(@PathParam("datatable") final String datatable,
@QueryParam("sqlFields") final String sqlFields,
@QueryParam("sqlSearch") final String sqlSearch,
@QueryParam("sqlOrder") final String sqlOrder,
@Context final UriInfo uriInfo) {
@QueryParam("sqlOrder") final String sqlOrder
// ,@Context final UriInfo uriInfo
) {
try {
//GenericResultsetData result = this.readExtraDataAndReportingService.retrieveDataTable(datatable);
@@ -18,7 +18,7 @@ import javax.ws.rs.core.UriInfo;
import org.mifosng.platform.ReadExtraDataAndReportingService;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.infrastructure.ApiDataConversionService;
import org.mifosng.platform.api.infrastructure.ApiJsonSerializerService;
import org.mifosng.platform.api.infrastructure.ApiParameterHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@@ -33,7 +33,7 @@ public class ReportsApiResource {
private ReadExtraDataAndReportingService readExtraDataAndReportingService;
@Autowired
private ApiDataConversionService apiDataConversionService;
private ApiJsonSerializerService apiJsonSerializerService;
@GET
@Consumes({MediaType.APPLICATION_JSON})
@@ -48,7 +48,7 @@ public class ReportsApiResource {
if (!exportCsv) {
GenericResultsetData result = this.readExtraDataAndReportingService.retrieveGenericResultset(".", ".", extractedQueryParams);
final String json = this.apiDataConversionService.convertGenericResultsetDataToJson(prettyPrint, result);
final String json = this.apiJsonSerializerService.serializeGenericResultsetDataToJson(prettyPrint, result);
return Response.ok().entity(json).build();
}
@@ -93,7 +93,7 @@ public class ReportsApiResource {
GenericResultsetData result = this.readExtraDataAndReportingService.retrieveGenericResultset(reportName, parameterTypeValue, reportParams);
final String json = this.apiDataConversionService.convertGenericResultsetDataToJson(prettyPrint, result);
final String json = this.apiJsonSerializerService.serializeGenericResultsetDataToJson(prettyPrint, result);
return Response.ok().entity(json).type(MediaType.APPLICATION_JSON).build();
}
@@ -1,5 +1,8 @@
package org.mifosng.platform.api.data;
/**
* Immutable data object for 'additional data'.
*/
public class AdditionalFieldsSetData {
private final Integer id;
@@ -1,30 +1,25 @@
package org.mifosng.platform.api.data;
import java.util.ArrayList;
import java.util.List;
/**
* Immutable data object for generic resultset data.
*/
public class GenericResultsetData {
private List<ResultsetColumnHeader> columnHeaders = new ArrayList<ResultsetColumnHeader>();
private List<ResultsetDataRow> data = new ArrayList<ResultsetDataRow>();
private final List<ResultsetColumnHeader> columnHeaders;
private final List<ResultsetDataRow> data;
public GenericResultsetData() {
public GenericResultsetData(final List<ResultsetColumnHeader> columnHeaders, final List<ResultsetDataRow> resultsetDataRows) {
this.columnHeaders = columnHeaders;
this.data = resultsetDataRows;
}
public List<ResultsetColumnHeader> getColumnHeaders() {
return columnHeaders;
}
public void setColumnHeaders(List<ResultsetColumnHeader> columnHeaders) {
this.columnHeaders = columnHeaders;
}
public List<ResultsetDataRow> getData() {
return data;
}
public void setData(List<ResultsetDataRow> data) {
this.data = data;
}
}
@@ -21,13 +21,11 @@ import org.mifosng.platform.api.commands.RoleCommand;
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.ChargeData;
import org.mifosng.platform.api.data.ClientData;
import org.mifosng.platform.api.data.ClientLoanAccountSummaryCollectionData;
import org.mifosng.platform.api.data.DepositAccountData;
import org.mifosng.platform.api.data.DepositProductData;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.data.GroupData;
import org.mifosng.platform.api.data.LoanAccountData;
import org.mifosng.platform.api.data.LoanProductData;
@@ -63,10 +61,6 @@ 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);
//
ChargeCommand convertJsonToChargeCommand(Long resourceIdentifier, String json);
@@ -37,14 +37,12 @@ import org.mifosng.platform.api.commands.RoleCommand;
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.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.DepositAccountData;
import org.mifosng.platform.api.data.DepositProductData;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.data.GroupData;
import org.mifosng.platform.api.data.LoanAccountData;
import org.mifosng.platform.api.data.LoanProductData;
@@ -77,34 +75,6 @@ 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();
// even if only a single result, its passed back as an array.
return gsonDeserializer.toJson(additionalFields);
}
@Override
public String convertLoanTransactionDataToJson(final boolean prettyPrint, final Set<String> responseParameters, final LoanTransactionData... transactions) {
final Set<String> supportedParameters = new HashSet<String>(
@@ -3,10 +3,12 @@ package org.mifosng.platform.api.infrastructure;
import java.util.Collection;
import java.util.Set;
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.ConfigurationData;
import org.mifosng.platform.api.data.FundData;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.data.OfficeData;
import org.mifosng.platform.api.data.OfficeTransactionData;
import org.mifosng.platform.api.data.PermissionData;
@@ -14,6 +16,12 @@ import org.mifosng.platform.api.data.RoleData;
public interface ApiJsonSerializerService {
String serializeAuthenticatedUserDataToJson(boolean prettyPrint, AuthenticatedUserData authenticatedUserData);
String serializeGenericResultsetDataToJson(boolean prettyPrint, GenericResultsetData result);
String serializeAdditionalFieldsSetDataToJson(boolean prettyPrint, Collection<AdditionalFieldsSetData> result);
String serializePermissionDataToJson(boolean prettyPrint, Set<String> responseParameters, Collection<PermissionData> permissions);
String serializeRoleDataToJson(boolean prettyPrint, Set<String> responseParameters, Collection<RoleData> roles);
@@ -24,8 +32,6 @@ public interface ApiJsonSerializerService {
String serializeAppUserDataToJson(boolean prettyPrint, Set<String> responseParameters, AppUserData user);
String serializeAuthenticatedUserDataToJson(boolean prettyPrint, AuthenticatedUserData authenticatedUserData);
String serializeOfficeDataToJson(boolean prettyPrint, Set<String> responseParameters, Collection<OfficeData> offices);
String serializeOfficeDataToJson(boolean prettyPrint, Set<String> responseParameters, OfficeData office);
@@ -5,10 +5,12 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
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.ConfigurationData;
import org.mifosng.platform.api.data.FundData;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.data.OfficeData;
import org.mifosng.platform.api.data.OfficeTransactionData;
import org.mifosng.platform.api.data.PermissionData;
@@ -34,9 +36,7 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ
"hierarchy", "parentId", "parentName", "allowedParents")
);
private static final Set<String> OFFICE_TRANSACTIONS_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("transactionDate", "allowedOffices", "currencyOptions"));
private static final Set<String> CONFIGURATION_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("selectedCurrencyOptions", "currencyOptions"));
private static final Set<String> FUND_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("id", "name", "externalId"));
private final GoogleGsonSerializerHelper helper;
@@ -46,6 +46,24 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ
this.helper = helper;
}
@Override
public String serializeAuthenticatedUserDataToJson(final boolean prettyPrint, final AuthenticatedUserData authenticatedUserData) {
final Gson gsonDeserializer = helper.createGsonBuilder(prettyPrint);
return helper.serializedJsonFrom(gsonDeserializer, authenticatedUserData);
}
@Override
public String serializeGenericResultsetDataToJson(final boolean prettyPrint, final GenericResultsetData resultsetData) {
final Gson gsonDeserializer = helper.createGsonBuilder(prettyPrint);
return helper.serializedJsonFrom(gsonDeserializer, resultsetData);
}
@Override
public String serializeAdditionalFieldsSetDataToJson(final boolean prettyPrint, final Collection<AdditionalFieldsSetData> datasets) {
final Gson gsonDeserializer = helper.createGsonBuilder(prettyPrint);
return helper.serializedJsonFrom(gsonDeserializer, datasets.toArray(new AdditionalFieldsSetData[datasets.size()]));
}
@Override
public String serializePermissionDataToJson(final boolean prettyPrint, final Set<String> responseParameters, final Collection<PermissionData> permissions) {
final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(PERMISSION_DATA_PARAMETERS, prettyPrint, responseParameters);
@@ -76,12 +94,6 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ
return helper.serializedJsonFrom(gsonDeserializer, user);
}
@Override
public String serializeAuthenticatedUserDataToJson(final boolean prettyPrint, final AuthenticatedUserData authenticatedUserData) {
final Gson gsonDeserializer = helper.createGsonBuilder(prettyPrint);
return helper.serializedJsonFrom(gsonDeserializer, authenticatedUserData);
}
@Override
public String serializeOfficeDataToJson(final boolean prettyPrint, final Set<String> responseParameters, final Collection<OfficeData> offices) {
final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(OFFICE_DATA_PARAMETERS, prettyPrint, responseParameters);