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 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<String, String> 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();
@@ -16,15 +16,21 @@ public interface ReadWriteNonCoreDataService {
void updateExtraData(String type, String set, Long id,
Map<String, String> queryParams);
/* remove the additional fields functionality above when datatables complete */
List<DatatableData> 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<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");
}
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<String, String> queryParams) {
long startTime = System.currentTimeMillis();
String applicationTableName = getApplicationTableName(datatable);
checkMainResourceExistsWithinScope(applicationTableName, id);
String appTable = getWithinScopeApplicationTableName(datatable,
appTableId);
List<ResultsetColumnHeader> 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<ResultsetColumnHeader> 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<ResultsetColumnHeader> columnHeaders,
String datatable, String FKField, Long id,
String datatable, String FKField, Long appTableId,
Map<String, String> queryParams) {
Map<String, String> 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<String, String> 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;
}
}