wip data table api

This commit is contained in:
John Woodlock
2012-08-14 00:38:43 +10:00
parent 93e088a4f8
commit 3d136095a4
3 changed files with 174 additions and 0 deletions
@@ -25,6 +25,8 @@ public interface ReadExtraDataAndReportingService {
void updateExtraData(String type, String set, Long id,
Map<String, String> queryParams);
String retrieveDataTable(String datatable);
Response processPentahoRequest(String reportName, String outputType,
Map<String, String> queryParams);
@@ -17,14 +17,23 @@ import java.util.Map;
import java.util.Set;
import javax.sql.DataSource;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import javax.ws.rs.core.Response.Status;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.mifosng.platform.api.data.AdditionalFieldsSetData;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.data.ResultsetColumnHeader;
import org.mifosng.platform.api.data.ResultsetDataRow;
import org.mifosng.platform.api.infrastructure.JodaDateTimeAdapter;
import org.mifosng.platform.api.infrastructure.JodaLocalDateAdapter;
import org.mifosng.platform.exceptions.AdditionalFieldsNotFoundException;
import org.mifosng.platform.exceptions.PlatformDataIntegrityException;
import org.mifosng.platform.exceptions.ReportNotFoundException;
@@ -47,6 +56,9 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@Service
public class ReadExtraDataAndReportingServiceImpl implements
ReadExtraDataAndReportingService {
@@ -367,6 +379,87 @@ public class ReadExtraDataAndReportingServiceImpl implements
return additionalFieldsSets;
}
@Override
public String retrieveDataTable(String datatable) {
long startTime = System.currentTimeMillis();
String sql = "select * from " + datatable;
GenericResultsetData result = fillReportingGenericResultSet(sql);
String jsonString = generateJsonFromGenericResultsetData(result);
logger.info("JSON is: " + jsonString);
long elapsed = System.currentTimeMillis() - startTime;
logger.info("FINISHING DATATABLE: " + datatable + " Elapsed Time: "
+ elapsed);
return jsonString;
}
private static String generateJsonFromGenericResultsetData(
GenericResultsetData result) {
StringBuffer writer = new StringBuffer();
writer.append("[");
List<ResultsetColumnHeader> columnHeaders = result.getColumnHeaders();
logger.info("NO. of Columns: " + columnHeaders.size());
List<ResultsetDataRow> data = result.getData();
List<String> row;
Integer rSize;
String currColType;
String currVal;
logger.info("NO. of Rows: " + data.size());
for (int i = 0; i < data.size(); i++) {
writer.append("\n{");
row = data.get(i).getRow();
rSize = row.size();
for (int j = 0; j < rSize; j++) {
writer.append('\"' + columnHeaders.get(j).getColumnName() + '\"'
+ ": ");
currColType = columnHeaders.get(j).getColumnType();
currVal = row.get(j);
if (currVal != null) {
if (currColType.equals("DECIMAL")
|| currColType.equals("DOUBLE")
|| currColType.equals("BIGINT")
|| currColType.equals("SMALLINT")
|| currColType.equals("INT"))
writer.append(currVal);
else
writer.append('\"' + currVal + '\"');
} else
writer.append("null");
if (j < (rSize - 1))
writer.append(",\n");
}
if (i < (data.size() - 1)) writer.append("},");
else writer.append("}");
}
writer.append("\n]");
return writer.toString();
/*
JSONObject js = null;
try {
js = new JSONObject(writer.toString());
} catch (JSONException e) {
throw new WebApplicationException(Response
.status(Status.BAD_REQUEST).entity("JSON body is wrong")
.build());
}
return js.toString();*/
}
@Override
public GenericResultsetData retrieveExtraData(String type, String set,
Long id) {
@@ -0,0 +1,79 @@
package org.mifosng.platform.api;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.mifosng.platform.InvalidSqlException;
import org.mifosng.platform.ReadExtraDataAndReportingService;
import org.mifosng.platform.api.data.AdditionalFieldsSetData;
import org.mifosng.platform.api.data.ApiParameterError;
import org.mifosng.platform.api.data.EntityIdentifier;
import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.infrastructure.ApiDataConversionService;
import org.mifosng.platform.api.infrastructure.ApiParameterHelper;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Path("/datatables")
@Component
@Scope("singleton")
public class DataTableApiResource {
private final static Logger logger = LoggerFactory.getLogger(DataTableApiResource.class);
@Autowired
private ReadExtraDataAndReportingService readExtraDataAndReportingService;
@Autowired
private ApiDataConversionService apiDataConversionService;
@GET
@Path("{datatable}")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public String extraData(@PathParam("datatable") final String datatable,
@Context final UriInfo uriInfo) {
try {
//GenericResultsetData result = this.readExtraDataAndReportingService.retrieveDataTable(datatable);
return this.readExtraDataAndReportingService.retrieveDataTable(datatable);
//boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
//return this.apiDataConversionService.convertGenericResultsetDataToJson(prettyPrint, result);
} catch (InvalidSqlException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError(
"extradata.invalid.sql", "The sql is invalid.", "sql",
e.getSql());
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
}