WIP data tables

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