WIP Additional Fields API

This commit is contained in:
John Woodlock
2012-05-17 01:25:42 +10:00
parent e4e1062f35
commit 75054feeee
7 changed files with 300 additions and 1971 deletions
+169 -1839
View File
File diff suppressed because it is too large Load Diff
@@ -1,29 +0,0 @@
package org.mifosng.data;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class AdditionalFieldSets {
private List<AdditionalFieldSet> additionalFieldsSets = new ArrayList<AdditionalFieldSet>();
protected AdditionalFieldSets() {
//
}
public AdditionalFieldSets(final List<AdditionalFieldSet> additionalFieldsSets) {
this.additionalFieldsSets = additionalFieldsSets;
}
public List<AdditionalFieldSet> getAdditionalFieldsSets() {
return additionalFieldsSets;
}
public void setAdditionalFieldsSets(List<AdditionalFieldSet> additionalFieldsSets) {
this.additionalFieldsSets = additionalFieldsSets;
}
}
@@ -3,16 +3,16 @@ package org.mifosng.data;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement @XmlRootElement
public class AdditionalFieldSet { public class AdditionalFieldsSet {
private Integer id; private Integer id;
private String name; private String name;
private String type; private String type;
protected AdditionalFieldSet() { protected AdditionalFieldsSet() {
// //
} }
public AdditionalFieldSet(final Integer id, final String name, final String type) { public AdditionalFieldsSet(final Integer id, final String name, final String type) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.type = type; this.type = type;
@@ -0,0 +1,29 @@
package org.mifosng.data;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class AdditionalFieldsSets {
private List<AdditionalFieldsSet> additionalFieldsSets = new ArrayList<AdditionalFieldsSet>();
protected AdditionalFieldsSets() {
//
}
public AdditionalFieldsSets(final List<AdditionalFieldsSet> additionalFieldsSets) {
this.additionalFieldsSets = additionalFieldsSets;
}
public List<AdditionalFieldsSet> getAdditionalFieldsSets() {
return additionalFieldsSets;
}
public void setAdditionalFieldsSets(List<AdditionalFieldsSet> additionalFieldsSets) {
this.additionalFieldsSets = additionalFieldsSets;
}
}
@@ -4,7 +4,7 @@ import java.util.Map;
import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.StreamingOutput;
import org.mifosng.data.AdditionalFieldSets; import org.mifosng.data.AdditionalFieldsSets;
import org.mifosng.data.reports.GenericResultset; import org.mifosng.data.reports.GenericResultset;
public interface ReadExtraDataAndReportingService { public interface ReadExtraDataAndReportingService {
@@ -13,14 +13,13 @@ public interface ReadExtraDataAndReportingService {
Map<String, String> extractedQueryParams); Map<String, String> extractedQueryParams);
// @PreAuthorize(value = "hasAnyRole('REPORTING_SUPER_USER_ROLE')") // @PreAuthorize(value = "hasAnyRole('REPORTING_SUPER_USER_ROLE')")
GenericResultset retrieveGenericResultset(String name, GenericResultset retrieveGenericResultset(String name, String type,
String type, Map<String, String> extractedQueryParams); Map<String, String> extractedQueryParams);
AdditionalFieldSets retrieveExtraDatasetNames(String datasetType); AdditionalFieldsSets retrieveExtraDatasetNames(String type);
GenericResultset retrieveExtraData(String datasetType, String datasetName, GenericResultset retrieveExtraData(String type, String set, String id);
String datasetPKValue);
void tempSaveExtraData(String datasetType, String datasetName, void updateExtraData(String type, String set, String id,
String datasetPKValue, Map<String, String> queryParams); Map<String, String> queryParams);
} }
@@ -20,8 +20,8 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.StreamingOutput;
import org.mifosng.data.AdditionalFieldSet; import org.mifosng.data.AdditionalFieldsSet;
import org.mifosng.data.AdditionalFieldSets; import org.mifosng.data.AdditionalFieldsSets;
import org.mifosng.data.reports.GenericResultset; import org.mifosng.data.reports.GenericResultset;
import org.mifosng.data.reports.ResultsetColumnHeader; import org.mifosng.data.reports.ResultsetColumnHeader;
import org.mifosng.data.reports.ResultsetDataRow; import org.mifosng.data.reports.ResultsetDataRow;
@@ -159,12 +159,12 @@ public class ReadExtraDataAndReportingServiceImpl implements
String sql; String sql;
if (name.equals(".")) { if (name.equals(".")) {
sql = "select r.report_id, r.report_name, r.report_type, r.report_subtype, r.report_category," + sql = "select r.report_id, r.report_name, r.report_type, r.report_subtype, r.report_category,"
" rp.parameter_id, rp.report_parameter_name, p.parameter_name" + + " rp.parameter_id, rp.report_parameter_name, p.parameter_name"
" from stretchy_report r" + + " from stretchy_report r"
" left join stretchy_report_parameter rp on rp.report_id = r.report_id" + + " left join stretchy_report_parameter rp on rp.report_id = r.report_id"
" left join stretchy_parameter p on p.parameter_id = rp.parameter_id" + + " left join stretchy_parameter p on p.parameter_id = rp.parameter_id"
" order by r.report_name, rp.parameter_id"; + " order by r.report_name, rp.parameter_id";
} else { } else {
try { try {
sql = getSQLtoRun(name, type, queryParams); sql = getSQLtoRun(name, type, queryParams);
@@ -237,8 +237,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
} }
private String getSQLtoRun(final String name, final String type, private String getSQLtoRun(final String name, final String type,
final Map<String, String> queryParams) final Map<String, String> queryParams) throws SQLException {
throws SQLException {
String sql = null; String sql = null;
String rptDB = queryParams.get("${rptDB}"); String rptDB = queryParams.get("${rptDB}");
if ((rptDB == null) || rptDB.equals("")) { if ((rptDB == null) || rptDB.equals("")) {
@@ -334,9 +333,9 @@ public class ReadExtraDataAndReportingServiceImpl implements
} }
@Override @Override
public AdditionalFieldSets retrieveExtraDatasetNames(String type) { public AdditionalFieldsSets retrieveExtraDatasetNames(String type) {
List<AdditionalFieldSet> additionalFieldsSets = new ArrayList<AdditionalFieldSet>(); List<AdditionalFieldsSet> additionalFieldsSets = new ArrayList<AdditionalFieldsSet>();
Connection db_connection; Connection db_connection;
try { try {
db_connection = dataSource.getConnection(); db_connection = dataSource.getConnection();
@@ -348,16 +347,15 @@ public class ReadExtraDataAndReportingServiceImpl implements
} else { } else {
whereClause = "where t.`name` = '" + type + "'"; whereClause = "where t.`name` = '" + type + "'";
} }
String sql = "select d.id, d.`name` as datasetName, t.`name` as datasetType from stretchydata_dataset d join stretchydata_datasettype t on t.id = d.datasettype_id " String sql = "select d.id, d.`name` as 'set', t.`name` as 'type' from stretchydata_dataset d join stretchydata_datasettype t on t.id = d.datasettype_id "
+ whereClause + " order by d.`name`"; + whereClause + " order by d.`name`";
ResultSet rs = db_statement.executeQuery(sql); ResultSet rs = db_statement.executeQuery(sql);
while (rs.next()) { while (rs.next()) {
additionalFieldsSets additionalFieldsSets.add(new AdditionalFieldsSet(rs
.add(new AdditionalFieldSet(rs.getInt("id"), rs .getInt("id"), rs.getString("set"), rs
.getString("datasetName"), rs .getString("type")));
.getString("datasetType")));
} }
db_statement.close(); db_statement.close();
@@ -370,37 +368,35 @@ public class ReadExtraDataAndReportingServiceImpl implements
.status(Status.BAD_REQUEST).entity(e.getMessage()).build()); .status(Status.BAD_REQUEST).entity(e.getMessage()).build());
} }
return new AdditionalFieldSets(additionalFieldsSets); return new AdditionalFieldsSets(additionalFieldsSets);
} }
@Override @Override
public GenericResultset retrieveExtraData(String datasetType, public GenericResultset retrieveExtraData(String type, String set, String id) {
String datasetName, String datasetPKValue) {
if (datasetType == null) { if (type == null) {
logger.info("Extra Data Table Type not Found"); logger.info("Type not Found");
return null; return null;
} }
if (datasetName == null) { if (set == null) {
logger.info("Extra Data Table Name not Found"); logger.info("Set not Found");
return null; return null;
} }
if (datasetPKValue == null) { if (id == null) {
logger.info("Extra Data Table ID not Found"); logger.info("Id not Found");
return null; return null;
} }
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
logger.info("STARTING EXTRA DATA TABLE: " + datasetName + " ID: " logger.info("STARTING SET: " + set + " ID: " + id);
+ datasetPKValue);
try { try {
GenericResultset result = fillExtraDataGenericResultSet( GenericResultset result = fillExtraDataGenericResultSet(type, set,
datasetType, datasetName, datasetPKValue); id);
long elapsed = System.currentTimeMillis() - startTime; long elapsed = System.currentTimeMillis() - startTime;
logger.info("FINISHING EXTRA DATA TABLE: " + datasetName logger.info("FINISHING SET: " + set + " Elapsed Time: "
+ " Elapsed Time: " + elapsed); + elapsed);
return result; return result;
} catch (SQLException e) { } catch (SQLException e) {
logger.info("Error - SQL: " + e.toString()); logger.info("Error - SQL: " + e.toString());
@@ -408,22 +404,18 @@ public class ReadExtraDataAndReportingServiceImpl implements
} }
} }
private GenericResultset fillExtraDataGenericResultSet(String datasetType, private GenericResultset fillExtraDataGenericResultSet(String type,
String datasetName, String datasetPKValue) throws SQLException { String set, String id) throws SQLException {
GenericResultset result = new GenericResultset(); GenericResultset result = new GenericResultset();
String fullDatasetName = getFullDatasetName(datasetType, datasetName); String fullDatasetName = getFullDatasetName(type, set);
Connection db_connection = dataSource.getConnection(); Connection db_connection = dataSource.getConnection();
Statement db_statement1 = db_connection.createStatement(); Statement db_statement1 = db_connection.createStatement();
Statement db_statement2 = db_connection.createStatement(); Statement db_statement2 = db_connection.createStatement();
Statement db_statement3 = db_connection.createStatement(); Statement db_statement3 = db_connection.createStatement();
String sql = "select f.`name`, f.data_type, f.data_length, f.display_type, f.allowed_list_id from stretchydata_datasettype t join stretchydata_dataset d on d.datasettype_id = t.id join stretchydata_dataset_fields f on f.dataset_id = d.id where d.`name` = '" String sql = "select f.`name`, f.data_type, f.data_length, f.display_type, f.allowed_list_id from stretchydata_datasettype t join stretchydata_dataset d on d.datasettype_id = t.id join stretchydata_dataset_fields f on f.dataset_id = d.id where d.`name` = '"
+ datasetName + set + "' and t.`name` = '" + type + "' order by f.id";
+ "' and t.`name` = '"
+ datasetType
+ "' order by f.id";
// logger.info("specific: " + sql);
ResultSet rsmd = db_statement1.executeQuery(sql); ResultSet rsmd = db_statement1.executeQuery(sql);
List<ResultsetColumnHeader> columnHeaders = new ArrayList<ResultsetColumnHeader>(); List<ResultsetColumnHeader> columnHeaders = new ArrayList<ResultsetColumnHeader>();
@@ -461,7 +453,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
result.setColumnHeaders(columnHeaders); result.setColumnHeaders(columnHeaders);
sql = "select " + selectFieldList + " from `" + fullDatasetName sql = "select " + selectFieldList + " from `" + fullDatasetName
+ "` where id = " + datasetPKValue; + "` where id = " + id;
ResultSet rs = db_statement3.executeQuery(sql); ResultSet rs = db_statement3.executeQuery(sql);
String columnName = null; String columnName = null;
@@ -495,9 +487,8 @@ public class ReadExtraDataAndReportingServiceImpl implements
} }
private String getFullDatasetName(final String datasetType, private String getFullDatasetName(final String type, final String set) {
final String datasetName) { return type + "_extra_" + set;
return datasetType + "_extra_" + datasetName;
} }
private static String replace(String str, String pattern, String replace) { private static String replace(String str, String pattern, String replace) {
@@ -515,11 +506,10 @@ public class ReadExtraDataAndReportingServiceImpl implements
} }
@Override @Override
public void tempSaveExtraData(String datasetType, String datasetName, public void updateExtraData(String type, String set, String id,
String datasetPKValue, Map<String, String> queryParams) { Map<String, String> queryParams) {
logger.info("SaveExtraData - DatasetType: " + datasetType logger.info("updateExtraData - type: " + type + " set: " + set
+ " DatasetName: " + datasetName + " datasetPKValue: " + " id: " + id);
+ datasetPKValue);
logger.info("startjpw: "); logger.info("startjpw: ");
Set<String> keys = queryParams.keySet(); Set<String> keys = queryParams.keySet();
@@ -531,9 +521,8 @@ public class ReadExtraDataAndReportingServiceImpl implements
logger.info("endjpw: "); logger.info("endjpw: ");
String fullDatasetName = getFullDatasetName(datasetType, datasetName); String fullDatasetName = getFullDatasetName(type, set);
String saveSql = getSaveSql(fullDatasetName, datasetPKValue, String saveSql = getSaveSql(fullDatasetName, id, queryParams);
queryParams);
try { try {
Connection db_connection = dataSource.getConnection(); Connection db_connection = dataSource.getConnection();
Statement db_statement = db_connection.createStatement(); Statement db_statement = db_connection.createStatement();
@@ -550,7 +539,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
} }
private String getSaveSql(String fullDatasetName, String datasetPKValue, private String getSaveSql(String fullSetName, String id,
Map<String, String> queryParams) { Map<String, String> queryParams) {
String errMsg = ""; String errMsg = "";
@@ -572,7 +561,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
if (transType.equals("E")) { if (transType.equals("E")) {
boolean firstColumn = true; boolean firstColumn = true;
saveSql = "update `" + fullDatasetName + "` "; saveSql = "update `" + fullSetName + "` ";
for (String key : keys) { for (String key : keys) {
if (!(key.equals("ed_transType") || key.equals("id"))) { if (!(key.equals("ed_transType") || key.equals("id"))) {
@@ -596,7 +585,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
} }
} }
saveSql += " where id = " + datasetPKValue; saveSql += " where id = " + id;
} else { } else {
String insertColumns = ""; String insertColumns = "";
String selectColumns = ""; String selectColumns = "";
@@ -619,9 +608,8 @@ public class ReadExtraDataAndReportingServiceImpl implements
} }
} }
saveSql = "insert into `" + fullDatasetName + "` (id" saveSql = "insert into `" + fullSetName + "` (id" + insertColumns
+ insertColumns + ")" + " select " + datasetPKValue + ")" + " select " + id + " as id" + selectColumns;
+ " as id" + selectColumns;
} }
// logger.info("Save SQL: " + saveSql); // logger.info("Save SQL: " + saveSql);
return saveSql; return saveSql;
@@ -22,10 +22,10 @@ import javax.ws.rs.core.UriInfo;
import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject; import org.codehaus.jettison.json.JSONObject;
import org.mifosng.data.AdditionalFieldsSets;
import org.mifosng.data.EntityIdentifier; import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.ErrorResponse; import org.mifosng.data.ErrorResponse;
import org.mifosng.data.ErrorResponseList; import org.mifosng.data.ErrorResponseList;
import org.mifosng.data.AdditionalFieldSets;
import org.mifosng.data.reports.GenericResultset; import org.mifosng.data.reports.GenericResultset;
import org.mifosng.platform.InvalidSqlException; import org.mifosng.platform.InvalidSqlException;
import org.mifosng.platform.ReadExtraDataAndReportingService; import org.mifosng.platform.ReadExtraDataAndReportingService;
@@ -34,42 +34,50 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Path("/v1/additionalfields") @Path("/v1/additionalfields")
@Component @Component
@Scope("singleton") @Scope("singleton")
public class AdditionalFieldsApiResource { public class AdditionalFieldsApiResource {
private final static Logger logger = LoggerFactory.getLogger(AdditionalFieldsApiResource.class); private final static Logger logger = LoggerFactory
.getLogger(AdditionalFieldsApiResource.class);
@Autowired @Autowired
private ReadExtraDataAndReportingService readExtraDataAndReportingService; private ReadExtraDataAndReportingService readExtraDataAndReportingService;
@GET @GET
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public Response datasets(@Context UriInfo uriInfo) { public Response datasets(@Context UriInfo uriInfo) {
MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
String type = queryParams.getFirst("type");
AdditionalFieldSets result = this.readExtraDataAndReportingService.retrieveExtraDatasetNames(type); MultivaluedMap<String, String> queryParams = uriInfo
.getQueryParameters();
String type = queryParams.getFirst("type");
AdditionalFieldsSets result = this.readExtraDataAndReportingService
.retrieveExtraDatasetNames(type);
return Response.ok().entity(result).build(); return Response.ok().entity(result).build();
} }
@GET @GET
@Path("{datasetType}/{datasetName}/{datasetPKValue}") @Path("{type}/{set}/{id}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public Response extraData(@PathParam("datasetType") final String datasetType,@PathParam("datasetName") final String datasetName, @PathParam("datasetPKValue") final String datasetPKValue, @Context UriInfo uriInfo) { public Response extraData(@PathParam("type") final String type,
@PathParam("set") final String set,
@PathParam("id") final String id, @Context UriInfo uriInfo) {
try { try {
GenericResultset result = this.readExtraDataAndReportingService.retrieveExtraData(datasetType, datasetName, datasetPKValue); GenericResultset result = this.readExtraDataAndReportingService
.retrieveExtraData(type, set, id);
return Response.ok().entity(result).build(); return Response.ok().entity(result).build();
} catch (InvalidSqlException e) { } catch (InvalidSqlException e) {
List<ErrorResponse> allErrors = new ArrayList<ErrorResponse>(); List<ErrorResponse> allErrors = new ArrayList<ErrorResponse>();
ErrorResponse err = new ErrorResponse("extradata.invalid.sql", "sql", e.getSql()); ErrorResponse err = new ErrorResponse("extradata.invalid.sql",
"sql", e.getSql());
allErrors.add(err); allErrors.add(err);
throw new WebApplicationException(Response throw new WebApplicationException(Response
@@ -77,18 +85,20 @@ public class AdditionalFieldsApiResource {
.entity(new ErrorResponseList(allErrors)).build()); .entity(new ErrorResponseList(allErrors)).build());
} }
} }
@POST @POST
@Path("{datasetType}/{datasetName}/{datasetPKValue}") @Path("{type}/{set}/{id}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public Response saveExtraData(@PathParam("datasetType") final String datasetType,@PathParam("datasetName") final String datasetName, @PathParam("datasetPKValue") final String datasetPKValue, String reqbody) { public Response saveExtraData(@PathParam("type") final String type,
@PathParam("set") final String set,
try { @PathParam("id") final String id, String reqbody) {
try {
Map<String, String> queryParams = new HashMap<String, String>(); Map<String, String> queryParams = new HashMap<String, String>();
String pValue = ""; String pValue = "";
String pName; String pName;
try { try {
JSONObject jsonObj = new JSONObject(reqbody); JSONObject jsonObj = new JSONObject(reqbody);
JSONArray jsonArr = jsonObj.names(); JSONArray jsonArr = jsonObj.names();
@@ -96,7 +106,7 @@ public class AdditionalFieldsApiResource {
for (int i = 0; i < jsonArr.length(); i++) { for (int i = 0; i < jsonArr.length(); i++) {
pName = (String) jsonArr.get(i); pName = (String) jsonArr.get(i);
pValue = jsonObj.getString(pName); pValue = jsonObj.getString(pName);
logger.info( pName + " - " + pValue); logger.info(pName + " - " + pValue);
queryParams.put(pName, pValue); queryParams.put(pName, pValue);
} }
} else { } else {
@@ -106,20 +116,22 @@ public class AdditionalFieldsApiResource {
} }
} catch (JSONException e) { } catch (JSONException e) {
throw new WebApplicationException(Response throw new WebApplicationException(Response
.status(Status.BAD_REQUEST) .status(Status.BAD_REQUEST)
.entity("JSON body is wrong").build()); .entity("JSON body is wrong").build());
} }
this.readExtraDataAndReportingService.updateExtraData(type, set,
this.readExtraDataAndReportingService.tempSaveExtraData(datasetType, datasetName, datasetPKValue, queryParams); id, queryParams);
EntityIdentifier entityIdentifier = new EntityIdentifier(Long.valueOf(datasetPKValue)); EntityIdentifier entityIdentifier = new EntityIdentifier(
Long.valueOf(id));
return Response.ok().entity(entityIdentifier).build(); return Response.ok().entity(entityIdentifier).build();
} catch (InvalidSqlException e) { } catch (InvalidSqlException e) {
List<ErrorResponse> allErrors = new ArrayList<ErrorResponse>(); List<ErrorResponse> allErrors = new ArrayList<ErrorResponse>();
ErrorResponse err = new ErrorResponse("extradata.invalid.sql", "sql", e.getSql()); ErrorResponse err = new ErrorResponse("extradata.invalid.sql",
"sql", e.getSql());
allErrors.add(err); allErrors.add(err);
logger.info("way bad: " + err.toString()); logger.info("way bad: " + err.toString());