From 1b24a991244bc7d82ed664f0fd495830e16a46c3 Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Tue, 25 Sep 2012 11:40:46 +1000 Subject: [PATCH] wip data tables registration --- .../platform/api/DataTableApiResource.java | 53 ++++- .../noncore/ReadWriteNonCoreDataService.java | 7 + .../ReadWriteNonCoreDataServiceImpl.java | 206 +++++++++++++----- 3 files changed, 198 insertions(+), 68 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 761371c10..49c47e7e1 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 @@ -62,7 +62,7 @@ public class DataTableApiResource { @GET @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String datasets(@QueryParam("appTable") final String appTable, + public String getDatatables(@QueryParam("appTable") final String appTable, @Context final UriInfo uriInfo) { List result = this.readWriteNonCoreDataService @@ -74,6 +74,33 @@ public class DataTableApiResource { prettyPrint, result); } + @POST + @Path("{datatable}/register/{appTable}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public Response registerDatatable( + @PathParam("datatable") final String datatable, + @PathParam("appTable") final String appTable) { + + this.readWriteNonCoreDataService.registerDatatable(datatable, appTable); + + EntityIdentifier entityIdentifier = new EntityIdentifier(); + return Response.ok().entity(entityIdentifier).build(); + } + + @POST + @Path("{datatable}/deregister") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public Response deregisterDatatable( + @PathParam("datatable") final String datatable) { + + this.readWriteNonCoreDataService.deregisterDatatable(datatable); + + EntityIdentifier entityIdentifier = new EntityIdentifier(); + return Response.ok().entity(entityIdentifier).build(); + } + @GET @Path("{datatable}/{appTableId}") @Consumes({ MediaType.APPLICATION_JSON }) @@ -125,7 +152,6 @@ public class DataTableApiResource { return Response.ok().entity(entityIdentifier).build(); } - @PUT @Path("{datatable}/{appTableId}") @@ -135,12 +161,15 @@ public class DataTableApiResource { @PathParam("datatable") final String datatable, @PathParam("appTableId") final Long appTableId, final String jsonRequestBody) { -/* for updating one to one relationships (where foreign key is the primary key)*/ + /* + * for updating one to one relationships (where foreign key is the + * primary key) + */ checkUserPermissionForDatatable(datatable, "UPDATE"); Map queryParams = getQueryParamsFromJsonRequestBody(jsonRequestBody); - this.readWriteNonCoreDataService.updateDatatableEntryOnetoOne(datatable, - appTableId, queryParams); + this.readWriteNonCoreDataService.updateDatatableEntryOnetoOne( + datatable, appTableId, queryParams); EntityIdentifier entityIdentifier = new EntityIdentifier( Long.valueOf(appTableId)); @@ -148,7 +177,7 @@ public class DataTableApiResource { return Response.ok().entity(entityIdentifier).build(); } - + @PUT @Path("{datatable}/{appTableId}/{datatableId}") @Consumes({ MediaType.APPLICATION_JSON }) @@ -158,12 +187,15 @@ public class DataTableApiResource { @PathParam("appTableId") final Long appTableId, @PathParam("datatableId") final Long datatableId, final String jsonRequestBody) { -/* for updating one to many relationships (where foreign key isn't the primary key)*/ + /* + * for updating one to many relationships (where foreign key isn't the + * primary key) + */ checkUserPermissionForDatatable(datatable, "UPDATE"); Map queryParams = getQueryParamsFromJsonRequestBody(jsonRequestBody); - this.readWriteNonCoreDataService.updateDatatableEntryOnetoMany(datatable, - appTableId, datatableId, queryParams); + this.readWriteNonCoreDataService.updateDatatableEntryOnetoMany( + datatable, appTableId, datatableId, queryParams); EntityIdentifier entityIdentifier = new EntityIdentifier( Long.valueOf(appTableId)); @@ -227,7 +259,8 @@ public class DataTableApiResource { for (int i = 0; i < jsonArr.length(); i++) { pName = (String) jsonArr.get(i); pValue = jsonObj.getString(pName); - logger.info("getQueryParamsFromJsonRequestBody: " + pName + " - " + pValue); + logger.info("getQueryParamsFromJsonRequestBody: " + pName + + " - " + pValue); queryParams.put(pName, pValue); } return queryParams; 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 06a8d20af..32a61a6c9 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 @@ -5,11 +5,18 @@ import java.util.Map; import org.mifosng.platform.api.data.DatatableData; import org.mifosng.platform.api.data.GenericResultsetData; +import org.springframework.security.access.prepost.PreAuthorize; public interface ReadWriteNonCoreDataService { List retrieveDatatableNames(String appTable); + @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'CAN_REGISTER_DATATABLE')") + void registerDatatable(String datatable, String appTable); + + @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'CAN_DEREGISTER_DATATABLE')") + void deregisterDatatable(String datatable); + GenericResultsetData retrieveDataTableGenericResultSet(String datatable, Long appTableId, String sqlFields, String sqlOrder, Long id); 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 310910199..4a9842d18 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 @@ -46,6 +46,135 @@ public class ReadWriteNonCoreDataServiceImpl implements @Autowired private GenericDataService genericDataService; + @Override + public List retrieveDatatableNames(String appTable) { + + long startTime = System.currentTimeMillis(); + + String andClause; + if (appTable == null) { + andClause = ""; + } else { + andClause = " and application_table_name = '" + appTable + "'"; + } + // PERMITTED datatables + String sql = "select application_table_name, registered_table_name" + + " from x_registered_table " + + " where exists" + + " (select 'f'" + + " from m_appuser_role ur " + + " join m_role r on r.id = ur.role_id" + + " left join m_role_permission rp on rp.role_id = r.id" + + " left join m_permission p on p.id = rp.permission_id" + + " where ur.appuser_id = " + + context.authenticatedUser().getId() + + " and (p.code in ('ALL_FUNCTIONS', 'ALL_FUNCTIONS_READ') or p.code = concat('CAN_READ_', registered_table_name))) " + + andClause + + " order by application_table_name, registered_table_name"; + + String sqlErrorMsg = "Application Table Name: " + appTable + " sql: " + + sql; + CachedRowSet rs = genericDataService.getCachedResultSet(sql, + sqlErrorMsg); + + List datatables = new ArrayList(); + try { + while (rs.next()) { + datatables.add(new DatatableData(rs + .getString("application_table_name"), rs + .getString("registered_table_name"))); + } + + } catch (SQLException e) { + throw new PlatformDataIntegrityException("error.msg.sql.error", + e.getMessage(), sqlErrorMsg); + } + + long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING retrieveDatatableNames: Elapsed Time: " + + elapsed); + + return datatables; + } + + @Override + public void registerDatatable(String datatable, String appTable) { + + long startTime = System.currentTimeMillis(); + + validateAppTable(appTable); + + String createPermission = "'CAN_CREATE_" + datatable + "'"; + String readPermission = "'CAN_READ_" + datatable + "'"; + String updatePermission = "'CAN_UPDATE_" + datatable + "'"; + String deletePermission = "'CAN_DELETE_" + datatable + "'"; + // TODO - put in batch command later + String sql = "insert into x_registered_table (registered_table_name, application_table_name) values ('" + + datatable + "', '" + appTable + "')"; + + genericDataService.updateSQL(sql, "SQL: " + sql); + + sql = "insert into m_permission (group_enum, code, default_description, default_name) values " + + "(3, " + + createPermission + + ", " + + createPermission + + ", " + + createPermission + + ")," + + "(3, " + + readPermission + + ", " + + readPermission + + ", " + + readPermission + + ")," + + "(3, " + + updatePermission + + ", " + + updatePermission + + ", " + + updatePermission + + ")," + + "(3, " + + deletePermission + + ", " + + deletePermission + ", " + deletePermission + ")"; + + genericDataService.updateSQL(sql, "SQL: " + sql); + + long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING registerDatatable: Elapsed Time: " + + elapsed + " - datatable: " + datatable + + " application table: " + appTable); + } + + @Override + public void deregisterDatatable(String datatable) { + long startTime = System.currentTimeMillis(); + + // TODO - put in batch command later + + String permissionList = "('CAN_CREATE_" + datatable + "', 'CAN_READ_" + + datatable + "', 'CAN_UPDATE_" + datatable + "', 'CAN_DELETE_" + + datatable + "')"; + + String sql = "delete from m_role_permission where m_role_permission.permission_id in (select id from m_permission where code in " + + permissionList + ")"; + genericDataService.updateSQL(sql, "SQL: " + sql); + + sql = "delete from m_permission where code in " + permissionList; + genericDataService.updateSQL(sql, "SQL: " + sql); + + sql = "delete from x_registered_table where registered_table_name = '" + + datatable + "'"; + genericDataService.updateSQL(sql, "SQL: " + sql); + + long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING deregisterDatatable: Elapsed Time: " + + elapsed + " - datatable: " + datatable); + } + @Override public void newDatatableEntry(String datatable, Long appTableId, Map queryParams) { @@ -165,58 +294,6 @@ public class ReadWriteNonCoreDataServiceImpl implements } - @Override - public List retrieveDatatableNames(String appTable) { - - long startTime = System.currentTimeMillis(); - - String andClause; - if (appTable == null) { - andClause = ""; - } else { - andClause = " and application_table_name = '" + appTable + "'"; - } - // PERMITTED datatables - String sql = "select application_table_name, registered_table_name" - + " from x_registered_table " - + " where exists" - + " (select 'f'" - + " from m_appuser_role ur " - + " join m_role r on r.id = ur.role_id" - + " left join m_role_permission rp on rp.role_id = r.id" - + " left join m_permission p on p.id = rp.permission_id" - + " where ur.appuser_id = " - + context.authenticatedUser().getId() - + " and (p.code in ('ALL_FUNCTIONS', 'ALL_FUNCTIONS_READ') or p.code = concat('CAN_READ_', registered_table_name))) " - + andClause - + " order by application_table_name, registered_table_name"; - - // sql = genericDataService.wrapSQL(sql); - String sqlErrorMsg = "Application Table Name: " + appTable + " sql: " - + sql; - CachedRowSet rs = genericDataService.getCachedResultSet(sql, - sqlErrorMsg); - - List datatables = new ArrayList(); - try { - while (rs.next()) { - datatables.add(new DatatableData(rs - .getString("application_table_name"), rs - .getString("registered_table_name"))); - } - - } catch (SQLException e) { - throw new PlatformDataIntegrityException("error.msg.sql.error", - e.getMessage(), sqlErrorMsg); - } - - long elapsed = System.currentTimeMillis() - startTime; - logger.info("FINISHING retrieveDatatableNames: Elapsed Time: " - + elapsed); - - return datatables; - } - @Override public String retrieveDataTableJSONObject(String datatable, Long appTableId, String sqlFields, String sqlOrder) { @@ -254,8 +331,8 @@ public class ReadWriteNonCoreDataServiceImpl implements // id only used for reading a specific entry in a one to many datatable // (when updating) if (id == null) { - sql = sql + " from `" + datatable + "` where " + getFKField(appTable) - + " = " + appTableId; + sql = sql + " from `" + datatable + "` where " + + getFKField(appTable) + " = " + appTableId; } else { sql = sql + " from `" + datatable + "` where id = " + id; } @@ -321,6 +398,18 @@ public class ReadWriteNonCoreDataServiceImpl implements } + private void validateAppTable(String appTable) { + + if (appTable.equalsIgnoreCase("m_client")) + return; + if (appTable.equalsIgnoreCase("m_loan")) + return; + + throw new PlatformDataIntegrityException( + "error.msg.invalid.application.table", + "Invalid Application Table: " + appTable); + } + private List fillDatatableResultSetDataRows( final String sql) { @@ -762,7 +851,7 @@ public class ReadWriteNonCoreDataServiceImpl implements "validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); } - + if (!StringUtils.isEmpty(paramValue)) { if (columnHeader.getColumnValuesNew().size() > 0) { @@ -813,8 +902,8 @@ public class ReadWriteNonCoreDataServiceImpl implements + " (neither varchar nor int)"); } - JsonParserHelper helper = new JsonParserHelper(); - + JsonParserHelper helper = new JsonParserHelper(); + if (columnHeader.getColumnDisplayTypeNew().equals("DATE")) paramValue = helper.convertFrom(paramValue, columnHeader.getColumnName(), dateFormat, @@ -829,7 +918,8 @@ public class ReadWriteNonCoreDataServiceImpl implements paramValue = helper.convertFrom(paramValue, columnHeader.getColumnName(), clientApplicationLocale) .toString(); - //logger.info("Converted Value: " + paramValue + " - was: " + pValue); + // logger.info("Converted Value: " + paramValue + " - was: " + + // pValue); }