diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingService.java b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingService.java index 28bf49d72..3df452dc1 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingService.java @@ -25,6 +25,8 @@ public interface ReadExtraDataAndReportingService { void updateExtraData(String type, String set, Long id, Map queryParams); + String retrieveDataTable(String datatable); + Response processPentahoRequest(String reportName, String outputType, Map queryParams); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java index 4026c6e32..6b5ce4975 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/ReadExtraDataAndReportingServiceImpl.java @@ -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 columnHeaders = result.getColumnHeaders(); + logger.info("NO. of Columns: " + columnHeaders.size()); + + List data = result.getData(); + List 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) { 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 new file mode 100644 index 000000000..12e970fd7 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/DataTableApiResource.java @@ -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 dataValidationErrors = new ArrayList(); + 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); + } + } + +} \ No newline at end of file