From 1e8d4b8c9d266369c43a292e253711656db57a5b Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Thu, 6 Sep 2012 22:02:33 +1000 Subject: [PATCH] WIP extra data --- .../platform/api/DataTableApiResource.java | 42 +++++++---------- .../DataTableNotFoundException.java | 17 +++++++ .../noncore/ReadWriteNonCoreDataService.java | 2 +- .../ReadWriteNonCoreDataServiceImpl.java | 46 ++++++++++++++----- 4 files changed, 70 insertions(+), 37 deletions(-) create mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/exceptions/DataTableNotFoundException.java diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/DataTableApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/DataTableApiResource.java index 838a08481..6e9d1e8a2 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/DataTableApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/DataTableApiResource.java @@ -31,37 +31,29 @@ public class DataTableApiResource { private ReadWriteNonCoreDataService readWriteNonCoreDataService; @GET - @Path("{datatable}") + @Path("{datatable}/{id}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String extraData(@PathParam("datatable") final String datatable, + @PathParam("id") final Long id, @QueryParam("sqlFields") final String sqlFields, @QueryParam("sqlSearch") final String sqlSearch, - @QueryParam("sqlOrder") final String sqlOrder - // ,@Context final UriInfo uriInfo - ) { + @QueryParam("sqlOrder") final String sqlOrder) { - try { - // GenericResultsetData result = - // this.readExtraDataAndReportingService.retrieveDataTable(datatable); - return this.readWriteNonCoreDataService.retrieveDataTable( - datatable, sqlFields, sqlSearch, sqlOrder); - - // boolean prettyPrint = - // ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - // return - // this.apiDataConversionService.convertGenericResultsetDataToJson(prettyPrint, - // result); - } catch (InvalidSqlException e) { - List dataValidationErrors = new ArrayList(); - ApiParameterError error = ApiParameterError.parameterError( - "extradata.invalid.sql", "The sql is invalid.", "sql", - e.getSql()); - dataValidationErrors.add(error); - throw new PlatformApiDataValidationException( - "validation.msg.validation.errors.exist", - "Validation errors exist.", dataValidationErrors); - } + return this.readWriteNonCoreDataService.retrieveDataTable(datatable, id, + sqlFields, sqlSearch, sqlOrder); + /* + * try { return this.readWriteNonCoreDataService.retrieveDataTable( + * datatable, sqlFields, sqlSearch, sqlOrder); } catch + * (InvalidSqlException e) { List + * dataValidationErrors = new ArrayList(); + * ApiParameterError error = ApiParameterError.parameterError( + * "extradata.invalid.sql", "The sql is invalid.", "sql", e.getSql()); + * dataValidationErrors.add(error); throw new + * PlatformApiDataValidationException( + * "validation.msg.validation.errors.exist", "Validation errors exist.", + * dataValidationErrors); } + */ } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/exceptions/DataTableNotFoundException.java b/mifosng-provider/src/main/java/org/mifosng/platform/exceptions/DataTableNotFoundException.java new file mode 100644 index 000000000..6bc7feedd --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/exceptions/DataTableNotFoundException.java @@ -0,0 +1,17 @@ +package org.mifosng.platform.exceptions; + +/** + * A {@link RuntimeException} thrown when client resources are not found. + */ +public class DataTableNotFoundException extends AbstractPlatformResourceNotFoundException { + + public DataTableNotFoundException(final String datatable, Long id) { + super("error.msg.datatable.data.not.found", "Data Not Found for Data Table: ", + datatable + " Id:" + id); + } + + public DataTableNotFoundException(final String datatable) { + super("error.msg.datatable.not.found", "Data Table Not Found", + datatable); + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataService.java b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataService.java index 753087a55..04c20c5dc 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataService.java @@ -15,6 +15,6 @@ public interface ReadWriteNonCoreDataService { void updateExtraData(String type, String set, Long id, Map queryParams); - String retrieveDataTable(String datatable, String sqlFields, String sqlSearch, String sqlOrder); + String retrieveDataTable(String datatable, Long id, String sqlFields, String sqlSearch, String sqlOrder); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java index afdc1b281..446229e9a 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java @@ -15,6 +15,7 @@ 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; +import org.mifosng.platform.exceptions.DataTableNotFoundException; import org.mifosng.platform.exceptions.PlatformDataIntegrityException; import org.mifosng.platform.security.PlatformSecurityContext; import org.mifosng.platform.user.domain.AppUser; @@ -93,8 +94,8 @@ public class ReadWriteNonCoreDataServiceImpl implements @Override public GenericResultsetData retrieveExtraData(String type, String set, - Long id) { - + Long id) { + long startTime = System.currentTimeMillis(); checkMainResourceExistsWithinScope(type, id); @@ -423,19 +424,18 @@ public class ReadWriteNonCoreDataServiceImpl implements + " not found"); } - private void checkMainResourceExistsWithinScope(String type, Long id) { + private void checkMainResourceExistsWithinScope(String tableName, Long id) { - String unscopedSql = "select t.id from " + type + String unscopedSql = "select t.id from " + tableName + " t ${dataScopeCriteria} where t.id = " + id; - String sql = dataScopedSQL(unscopedSql, type); + String sql = dataScopedSQL(unscopedSql, tableName); CachedRowSet rs = genericDataService.getCachedResultSet(sql, "SQL : " + sql); if (rs.size() == 0) - throw new AdditionalFieldsNotFoundException(type, id); - + throw new DataTableNotFoundException(tableName, id); } private String dataScopedSQL(String unscopedSQL, String type) { @@ -475,23 +475,29 @@ public class ReadWriteNonCoreDataServiceImpl implements } @Override - public String retrieveDataTable(String datatable, String sqlFields, + public String retrieveDataTable(String datatable, Long id, String sqlFields, String sqlSearch, String sqlOrder) { long startTime = System.currentTimeMillis(); + String applicationTableName = getApplicationTableName(datatable); + + checkMainResourceExistsWithinScope(applicationTableName, id); + + String fkField = applicationTableName.substring(2) + "_id"; + String sql = "select "; if (sqlFields != null) sql = sql + sqlFields; else sql = sql + " * "; - sql = sql + " from " + datatable; + sql = sql + " from " + datatable + " where " + fkField + " = " + id; if (sqlSearch != null) - sql = sql + " where " + sqlSearch; + sql = sql + " and ( " + sqlSearch + ")"; if (sqlOrder != null) sql = sql + " order by " + sqlOrder; - + logger.info(sql); GenericResultsetData result = genericDataService .fillGenericResultSet(sql); @@ -503,6 +509,24 @@ public class ReadWriteNonCoreDataServiceImpl implements + elapsed); return jsonString; } + + private String getApplicationTableName(String datatable) { + String sql = "SELECT application_table_name FROM x_registered_table where registered_table_name = '" + datatable + "'"; + + CachedRowSet rs = genericDataService.getCachedResultSet(sql, "SQL : " + + sql); + + if (rs.size() == 0) + throw new DataTableNotFoundException(datatable); + + try { + rs.next(); + return rs.getString("application_table_name"); + } catch (SQLException e) { + throw new PlatformDataIntegrityException("error.msg.sql.error", + e.getMessage()); + } + } private static String generateJsonFromGenericResultsetData( GenericResultsetData result) {