From ad6fb806ff0127e82306784f899589f3f1e23b54 Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Tue, 18 Sep 2012 13:31:30 +1000 Subject: [PATCH] WIP data tables --- .../platform/api/DataTableApiResource.java | 61 +++++++-- .../noncore/ReadWriteNonCoreDataService.java | 12 +- .../ReadWriteNonCoreDataServiceImpl.java | 120 +++++++++++++----- 3 files changed, 149 insertions(+), 44 deletions(-) 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 837c4aed6..8ff67b705 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 @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -73,11 +74,11 @@ public class DataTableApiResource { } @GET - @Path("{datatable}/{id}") + @Path("{datatable}/{appTableId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String getDatatable(@PathParam("datatable") final String datatable, - @PathParam("id") final Long id, + @PathParam("appTableId") final Long appTableId, @QueryParam("sqlFields") final String sqlFields, @QueryParam("sqlOrder") final String sqlOrder, @Context final UriInfo uriInfo) { @@ -92,8 +93,8 @@ public class DataTableApiResource { */ GenericResultsetData results = this.readWriteNonCoreDataService - .retrieveDataTableGenericResultSet(datatable, id, sqlFields, - sqlOrder); + .retrieveDataTableGenericResultSet(datatable, appTableId, + sqlFields, sqlOrder); boolean prettyPrints = ApiParameterHelper.prettyPrint(uriInfo .getQueryParameters()); @@ -103,21 +104,63 @@ public class DataTableApiResource { } @POST - @Path("{datatable}/{id}") + @Path("{datatable}/{appTableId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public Response newDatatableEntry( @PathParam("datatable") final String datatable, - @PathParam("id") final Long id, final String jsonRequestBody) { + @PathParam("appTableId") final Long appTableId, + final String jsonRequestBody) { checkUserPermissionForDatatable(datatable, "CREATE"); Map queryParams = getQueryParamsFromJsonRequestBody(jsonRequestBody); - this.readWriteNonCoreDataService.newDatatableEntry(datatable, id, - queryParams); + this.readWriteNonCoreDataService.newDatatableEntry(datatable, + appTableId, queryParams); EntityIdentifier entityIdentifier = new EntityIdentifier( - Long.valueOf(id)); + Long.valueOf(appTableId)); + + return Response.ok().entity(entityIdentifier).build(); + + } + + @DELETE + @Path("{datatable}/{appTableId}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public Response deleteDatatableEntries( + @PathParam("datatable") final String datatable, + @PathParam("appTableId") final Long appTableId) { + + checkUserPermissionForDatatable(datatable, "DELETE"); + + this.readWriteNonCoreDataService.deleteDatatableEntries(datatable, + appTableId); + + EntityIdentifier entityIdentifier = new EntityIdentifier( + Long.valueOf(appTableId)); + + return Response.ok().entity(entityIdentifier).build(); + + } + + @DELETE + @Path("{datatable}/{appTableId}/{datatableId}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public Response deleteDatatableEntries( + @PathParam("datatable") final String datatable, + @PathParam("appTableId") final Long appTableId, + @PathParam("datatableId") final Long datatableId) { + + checkUserPermissionForDatatable(datatable, "DELETE"); + + this.readWriteNonCoreDataService.deleteDatatableEntry(datatable, + appTableId, datatableId); + + EntityIdentifier entityIdentifier = new EntityIdentifier( + Long.valueOf(appTableId)); return Response.ok().entity(entityIdentifier).build(); 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 6043e5295..1d64bab8a 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 @@ -16,15 +16,21 @@ public interface ReadWriteNonCoreDataService { void updateExtraData(String type, String set, Long id, Map queryParams); + /* remove the additional fields functionality above when datatables complete */ List retrieveDatatableNames(String appTable); GenericResultsetData retrieveDataTableGenericResultSet(String datatable, - Long id, String sqlFields, String sqlOrder); + Long appTableId, String sqlFields, String sqlOrder); - String retrieveDataTableJSONObject(String datatable, Long id, + String retrieveDataTableJSONObject(String datatable, Long appTableId, String sqlFields, String sqlOrder); - void newDatatableEntry(String datatable, Long id, + void newDatatableEntry(String datatable, Long appTableId, Map queryParams); + void deleteDatatableEntries(String datatable, Long appTableId); + + void deleteDatatableEntry(String datatable, Long appTableId, + Long datatableId); + } \ 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 850d682e2..c42cd18a0 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 @@ -427,10 +427,11 @@ public class ReadWriteNonCoreDataServiceImpl implements + " not found"); } - private void checkMainResourceExistsWithinScope(String tableName, Long id) { + private void checkMainResourceExistsWithinScope(String tableName, + Long appTableId) { String unscopedSql = "select t.id from " + tableName - + " t ${dataScopeCriteria} where t.id = " + id; + + " t ${dataScopeCriteria} where t.id = " + appTableId; String sql = dataScopedSQL(unscopedSql, tableName); @@ -438,10 +439,10 @@ public class ReadWriteNonCoreDataServiceImpl implements + sql); if (rs.size() == 0) - throw new DataTableNotFoundException(tableName, id); + throw new DataTableNotFoundException(tableName, appTableId); } - private String dataScopedSQL(String unscopedSQL, String type) { + private String dataScopedSQL(String unscopedSQL, String appTable) { String dataScopeCriteria = null; /* * unfortunately have to, one way or another, be able to restrict data @@ -452,11 +453,11 @@ public class ReadWriteNonCoreDataServiceImpl implements */ AppUser currentUser = context.authenticatedUser(); - if (type.equalsIgnoreCase("m_client")) { + if (appTable.equalsIgnoreCase("m_client")) { dataScopeCriteria = " join m_office o on o.id = t.office_id and o.hierarchy like '" + currentUser.getOffice().getHierarchy() + "%'"; } - if (type.equalsIgnoreCase("m_loan")) { + if (appTable.equalsIgnoreCase("m_loan")) { dataScopeCriteria = " join m_client c on c.id = t.client_id " + " join m_office o on o.id = c.office_id and o.hierarchy like '" + currentUser.getOffice().getHierarchy() + "%'"; @@ -464,7 +465,8 @@ public class ReadWriteNonCoreDataServiceImpl implements if (dataScopeCriteria == null) { throw new PlatformDataIntegrityException( - "error.msg.invalid.dataScopeCriteria", "Type: " + type + "error.msg.invalid.dataScopeCriteria", + "Application Table: " + appTable + " not catered for in data Scoping"); } @@ -479,25 +481,62 @@ public class ReadWriteNonCoreDataServiceImpl implements // only exclusively datatable functions below here @Override - public void newDatatableEntry(String datatable, Long id, + public void newDatatableEntry(String datatable, Long appTableId, Map queryParams) { long startTime = System.currentTimeMillis(); - String applicationTableName = getApplicationTableName(datatable); - - checkMainResourceExistsWithinScope(applicationTableName, id); + String appTable = getWithinScopeApplicationTableName(datatable, + appTableId); List columnHeaders = getDatatableResultsetColumnHeaders(datatable); - String sql = getAddSql(columnHeaders, datatable, - getFKField(applicationTableName), id, queryParams); + String sql = getAddSql(columnHeaders, datatable, getFKField(appTable), + appTableId, queryParams); - String sqlErrorMsg = "SQL: " + sql; - genericDataService.updateSQL(sql, sqlErrorMsg); + genericDataService.updateSQL(sql, "SQL: " + sql); long elapsed = System.currentTimeMillis() - startTime; logger.info("FINISHING newDatatableEntry: Elapsed Time: " - + elapsed + " - datatable: " + datatable + " id: " + id); + + elapsed + " - datatable: " + datatable + " id: " + + appTableId); + + } + + @Override + public void deleteDatatableEntries(String datatable, Long appTableId) { + long startTime = System.currentTimeMillis(); + + String appTable = getWithinScopeApplicationTableName(datatable, + appTableId); + + String sql = getDeleteEntriesSql(datatable, getFKField(appTable), + appTableId); + + genericDataService.updateSQL(sql, "SQL: " + sql); + + long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING deleteDatatableEntries: Elapsed Time: " + + elapsed + " - datatable: " + datatable + + " App Table Id: " + appTableId); + + } + + @Override + public void deleteDatatableEntry(String datatable, Long appTableId, + Long datatableId) { + long startTime = System.currentTimeMillis(); + + getWithinScopeApplicationTableName(datatable, appTableId); + + String sql = getDeleteEntrySql(datatable, datatableId); + + genericDataService.updateSQL(sql, "SQL: " + sql); + + long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING deleteDatatableEntry: Elapsed Time: " + + elapsed + " - datatable: " + datatable + + " App Table Id: " + appTableId + " Data Table Id: " + + datatableId); } @@ -555,12 +594,12 @@ public class ReadWriteNonCoreDataServiceImpl implements } @Override - public String retrieveDataTableJSONObject(String datatable, Long id, - String sqlFields, String sqlOrder) { + public String retrieveDataTableJSONObject(String datatable, + Long appTableId, String sqlFields, String sqlOrder) { long startTime = System.currentTimeMillis(); GenericResultsetData result = retrieveDataTableGenericResultSet( - datatable, id, sqlFields, sqlOrder); + datatable, appTableId, sqlFields, sqlOrder); String jsonString = generateJsonFromGenericResultsetData(result); @@ -572,13 +611,12 @@ public class ReadWriteNonCoreDataServiceImpl implements @Override public GenericResultsetData retrieveDataTableGenericResultSet( - String datatable, Long id, String sqlFields, String sqlOrder) { + String datatable, Long appTableId, String sqlFields, String sqlOrder) { long startTime = System.currentTimeMillis(); - String applicationTableName = getApplicationTableName(datatable); - - checkMainResourceExistsWithinScope(applicationTableName, id); + String appTable = getWithinScopeApplicationTableName(datatable, + appTableId); List columnHeaders = getDatatableResultsetColumnHeaders(datatable); @@ -588,8 +626,8 @@ public class ReadWriteNonCoreDataServiceImpl implements else sql = sql + " * "; - sql = sql + " from " + datatable + " where " - + getFKField(applicationTableName) + " = " + id; + sql = sql + " from " + datatable + " where " + getFKField(appTable) + + " = " + appTableId; if (sqlOrder != null) sql = sql + " order by " + sqlOrder; logger.info(sql); @@ -640,7 +678,8 @@ public class ReadWriteNonCoreDataServiceImpl implements } } - private String getApplicationTableName(String datatable) { + private String getWithinScopeApplicationTableName(String datatable, + Long appTableId) { String sql = "SELECT application_table_name FROM x_registered_table where registered_table_name = '" + datatable + "'"; @@ -652,7 +691,11 @@ public class ReadWriteNonCoreDataServiceImpl implements try { rs.next(); - return rs.getString("application_table_name"); + String appTable = rs.getString("application_table_name"); + + checkMainResourceExistsWithinScope(appTable, appTableId); + + return appTable; } catch (SQLException e) { throw new PlatformDataIntegrityException("error.msg.sql.error", e.getMessage()); @@ -818,14 +861,14 @@ public class ReadWriteNonCoreDataServiceImpl implements } private String getAddSql(List columnHeaders, - String datatable, String FKField, Long id, + String datatable, String FKField, Long appTableId, Map queryParams) { Map affectedColumns = getAffectedColumns(columnHeaders, queryParams); String pValueWrite = ""; - String saveSql = ""; + String addSql = ""; String singleQuote = "'"; String insertColumns = ""; @@ -847,11 +890,11 @@ public class ReadWriteNonCoreDataServiceImpl implements selectColumns += "," + pValueWrite + " as " + columnName; } - saveSql = "insert into `" + datatable + "` (`" + FKField + "` " - + insertColumns + ")" + " select " + id + " as id" + addSql = "insert into `" + datatable + "` (`" + FKField + "` " + + insertColumns + ")" + " select " + appTableId + " as id" + selectColumns; - return saveSql; + return addSql; } private Map getAffectedColumns( @@ -899,4 +942,17 @@ public class ReadWriteNonCoreDataServiceImpl implements return affectedColumns; } + private String getDeleteEntriesSql(String datatable, String FKField, + Long appTableId) { + + return "delete from `" + datatable + "` where `" + FKField + "` = " + + appTableId; + + } + + private String getDeleteEntrySql(String datatable, Long datatableId) { + + return "delete from `" + datatable + "` where `id` = " + datatableId; + + } } \ No newline at end of file