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 fec20566e..761371c10 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 @@ -95,7 +95,7 @@ public class DataTableApiResource { GenericResultsetData results = this.readWriteNonCoreDataService .retrieveDataTableGenericResultSet(datatable, appTableId, - sqlFields, sqlOrder); + sqlFields, sqlOrder, null); boolean prettyPrints = ApiParameterHelper.prettyPrint(uriInfo .getQueryParameters()); @@ -135,7 +135,7 @@ 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)*/ checkUserPermissionForDatatable(datatable, "UPDATE"); Map queryParams = getQueryParamsFromJsonRequestBody(jsonRequestBody); @@ -148,6 +148,29 @@ public class DataTableApiResource { return Response.ok().entity(entityIdentifier).build(); } + + @PUT + @Path("{datatable}/{appTableId}/{datatableId}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public Response updateDatatableEntryOnetoOne( + @PathParam("datatable") final String datatable, + @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)*/ + checkUserPermissionForDatatable(datatable, "UPDATE"); + Map queryParams = getQueryParamsFromJsonRequestBody(jsonRequestBody); + + this.readWriteNonCoreDataService.updateDatatableEntryOnetoMany(datatable, + appTableId, datatableId, queryParams); + + EntityIdentifier entityIdentifier = new EntityIdentifier( + Long.valueOf(appTableId)); + + return Response.ok().entity(entityIdentifier).build(); + + } @DELETE @Path("{datatable}/{appTableId}") 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 4967fafad..891650617 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 @@ -20,17 +20,20 @@ public interface ReadWriteNonCoreDataService { List retrieveDatatableNames(String appTable); GenericResultsetData retrieveDataTableGenericResultSet(String datatable, - Long appTableId, String sqlFields, String sqlOrder); + Long appTableId, String sqlFields, String sqlOrder, Long id); String retrieveDataTableJSONObject(String datatable, Long appTableId, String sqlFields, String sqlOrder); void newDatatableEntry(String datatable, Long appTableId, Map queryParams); - + void updateDatatableEntryOnetoOne(String datatable, Long appTableId, Map queryParams); + void updateDatatableEntryOnetoMany(String datatable, Long appTableId, + Long datatableId, Map queryParams); + void deleteDatatableEntries(String datatable, Long appTableId); void deleteDatatableEntry(String datatable, Long appTableId, 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 b7196f84d..dc6814a86 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 @@ -510,13 +510,43 @@ public class ReadWriteNonCoreDataServiceImpl implements long startTime = System.currentTimeMillis(); GenericResultsetData grs = retrieveDataTableGenericResultSet(datatable, - appTableId, null, null); + appTableId, null, null, null); if (grs.getData().size() == 0) throw new DataTableNotFoundException(datatable, appTableId); - String sql = getUpdateSql(grs, datatable, - getFKField(getApplicationTableName(datatable)), appTableId, + String fkName = getFKField(getApplicationTableName(datatable)); + String sql = getUpdateSql(grs, datatable, fkName, appTableId, + queryParams); + + if (sql != null) + genericDataService.updateSQL(sql, "SQL: " + sql); + else + logger.info("No Changes"); + + long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING updateDatatableEntryOnetoOne: Elapsed Time: " + + elapsed + + " - datatable: " + + datatable + + fkName + + ": " + + appTableId); + + } + + @Override + public void updateDatatableEntryOnetoMany(String datatable, + Long appTableId, Long datatableId, Map queryParams) { + long startTime = System.currentTimeMillis(); + + GenericResultsetData grs = retrieveDataTableGenericResultSet(datatable, + appTableId, null, null, datatableId); + + if (grs.getData().size() == 0) + throw new DataTableNotFoundException(datatable, appTableId); + + String sql = getUpdateSql(grs, datatable, "id", datatableId, queryParams); if (sql != null) @@ -530,8 +560,7 @@ public class ReadWriteNonCoreDataServiceImpl implements + " - datatable: " + datatable + " id: " - + appTableId); - + + datatableId); } @Override @@ -631,7 +660,7 @@ public class ReadWriteNonCoreDataServiceImpl implements long startTime = System.currentTimeMillis(); GenericResultsetData result = retrieveDataTableGenericResultSet( - datatable, appTableId, sqlFields, sqlOrder); + datatable, appTableId, sqlFields, sqlOrder, null); String jsonString = generateJsonFromGenericResultsetData(result); @@ -643,7 +672,8 @@ public class ReadWriteNonCoreDataServiceImpl implements @Override public GenericResultsetData retrieveDataTableGenericResultSet( - String datatable, Long appTableId, String sqlFields, String sqlOrder) { + String datatable, Long appTableId, String sqlFields, + String sqlOrder, Long id) { long startTime = System.currentTimeMillis(); @@ -658,17 +688,23 @@ public class ReadWriteNonCoreDataServiceImpl implements else sql = sql + " * "; - sql = sql + " from " + datatable + " where " + getFKField(appTable) - + " = " + appTableId; + // 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; + } else { + sql = sql + " from " + datatable + " where id = " + id; + } + if (sqlOrder != null) sql = sql + " order by " + sqlOrder; - logger.info(sql); List result = fillDatatableResultSetDataRows(sql); long elapsed = System.currentTimeMillis() - startTime; logger.info("FINISHING DATATABLE: " + datatable + " Elapsed Time: " - + elapsed); + + elapsed + " SQL: " + sql); return new GenericResultsetData(columnHeaders, result); @@ -914,11 +950,11 @@ public class ReadWriteNonCoreDataServiceImpl implements } private String getAddSql(List columnHeaders, - String datatable, String FKField, Long appTableId, + String datatable, String fkName, Long appTableId, Map queryParams) { Map affectedColumns = getAffectedColumns(columnHeaders, - queryParams); + queryParams, fkName); String pValueWrite = ""; String addSql = ""; @@ -943,7 +979,7 @@ public class ReadWriteNonCoreDataServiceImpl implements selectColumns += "," + pValueWrite + " as " + columnName; } - addSql = "insert into `" + datatable + "` (`" + FKField + "` " + addSql = "insert into `" + datatable + "` (`" + fkName + "` " + insertColumns + ")" + " select " + appTableId + " as id" + selectColumns; @@ -951,10 +987,10 @@ public class ReadWriteNonCoreDataServiceImpl implements } private String getUpdateSql(GenericResultsetData grs, String datatable, - String fkField, Long appTableId, Map queryParams) { + String keyFieldName, Long keyFieldValue, Map queryParams) { Map affectedAndChangedColumns = getAffectedAndChangedColumns( - grs, queryParams); + grs, queryParams, keyFieldName); // just updating fields that have changed since pre-update read - though // its possible these values are different from the page the user was @@ -991,16 +1027,16 @@ public class ReadWriteNonCoreDataServiceImpl implements sql += "`" + key + "` = " + pValueWrite; } - sql += " where " + fkField + " = " + appTableId; + sql += " where " + keyFieldName + " = " + keyFieldValue; return sql; } private Map getAffectedAndChangedColumns( - GenericResultsetData grs, Map queryParams) { + GenericResultsetData grs, Map queryParams, String fkName) { Map affectedColumns = getAffectedColumns( - grs.getColumnHeaders(), queryParams); + grs.getColumnHeaders(), queryParams, fkName); Map affectedAndChangedColumns = new HashMap(); String columnValue; @@ -1043,7 +1079,7 @@ public class ReadWriteNonCoreDataServiceImpl implements private Map getAffectedColumns( List columnHeaders, - Map queryParams) { + Map queryParams, String keyFieldName) { String underscore = "_"; String space = " "; @@ -1055,10 +1091,11 @@ public class ReadWriteNonCoreDataServiceImpl implements Map affectedColumns = new HashMap(); Set keys = queryParams.keySet(); for (String key : keys) { - // ignores any id field and matches incoming fields with and without - // underscores (spaces and underscores considered the same) - if (!(key.equalsIgnoreCase("id"))) { + // ignores id and foreign key fields + if (!((key.equalsIgnoreCase("id")) || (key.equalsIgnoreCase(keyFieldName)))) { notFound = true; + // ignores any id field and matches incoming fields with and without + // underscores (spaces and underscores considered the same) queryParamColumnUnderscored = genericDataService.replace(key, space, underscore); for (ResultsetColumnHeader columnHeader : columnHeaders) {