WIP fields parameter additionfields

This commit is contained in:
John Woodlock
2012-05-25 14:57:09 +10:00
parent 8612aef9e6
commit e43f007bd4
9 changed files with 89 additions and 97 deletions
@@ -2,7 +2,10 @@ package org.mifosng.data;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.map.annotate.JsonFilter;
@XmlRootElement @XmlRootElement
@JsonFilter("myFilter")
public class AdditionalFieldsSet { public class AdditionalFieldsSet {
private Integer id; private Integer id;
@@ -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 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;
}
}
@@ -53,28 +53,28 @@
headingClassStr = ' class="' + displayAllVars.headingClass + '" '; headingClassStr = ' class="' + displayAllVars.headingClass + '" ';
var extraDataNamesVar = ""; var extraDataNamesVar = "";
for ( var i in data.additionalFieldsSets) { for ( var i in data) {
var dsnDivName = generateDsnDivName(displayAllVars.datasetType, i, var dsnDivName = generateDsnDivName(displayAllVars.datasetType, i,
displayAllVars.datasetTypeDiv); displayAllVars.datasetTypeDiv);
extraDataNamesVar += '<br><span ' + headingClassStr + '><b>' extraDataNamesVar += '<br><span ' + headingClassStr + '><b>'
+ doI18N(displayAllVars.headingPrefix) + doI18N(displayAllVars.headingPrefix)
+ doI18N(data.additionalFieldsSets[i].name) + doI18N(data[i].name)
+ ' - </span></b> '; + ' - </span></b> ';
extraDataNamesVar += editExtraDataLink(displayAllVars.url, displayAllVars.basicAuthKey, extraDataNamesVar += editExtraDataLink(displayAllVars.url, displayAllVars.basicAuthKey,
displayAllVars.datasetType, displayAllVars.datasetType,
data.additionalFieldsSets[i].name, data[i].name,
displayAllVars.datasetPKValue, dsnDivName); displayAllVars.datasetPKValue, dsnDivName);
extraDataNamesVar += '<div id="' + dsnDivName + '">'; extraDataNamesVar += '<div id="' + dsnDivName + '">';
extraDataNamesVar += '</div>'; extraDataNamesVar += '</div>';
} }
$('#' + displayAllVars.datasetTypeDiv).html(extraDataNamesVar); $('#' + displayAllVars.datasetTypeDiv).html(extraDataNamesVar);
for ( var i in data.additionalFieldsSets) { for ( var i in data) {
var dsnDivName = generateDsnDivName(displayAllVars.datasetType, i, var dsnDivName = generateDsnDivName(displayAllVars.datasetType, i,
displayAllVars.datasetTypeDiv); displayAllVars.datasetTypeDiv);
viewExtraData(displayAllVars.url, displayAllVars.basicAuthKey, displayAllVars.datasetType, viewExtraData(displayAllVars.url, displayAllVars.basicAuthKey, displayAllVars.datasetType,
data.additionalFieldsSets[i].name, data[i].name,
displayAllVars.datasetPKValue, dsnDivName); displayAllVars.datasetPKValue, dsnDivName);
} }
@@ -1,10 +1,11 @@
package org.mifosng.platform; package org.mifosng.platform;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.StreamingOutput;
import org.mifosng.data.AdditionalFieldsSets; import org.mifosng.data.AdditionalFieldsSet;
import org.mifosng.data.reports.GenericResultset; import org.mifosng.data.reports.GenericResultset;
public interface ReadExtraDataAndReportingService { public interface ReadExtraDataAndReportingService {
@@ -16,7 +17,7 @@ public interface ReadExtraDataAndReportingService {
GenericResultset retrieveGenericResultset(String name, String type, GenericResultset retrieveGenericResultset(String name, String type,
Map<String, String> extractedQueryParams); Map<String, String> extractedQueryParams);
AdditionalFieldsSets retrieveExtraDatasetNames(String type); List<AdditionalFieldsSet> retrieveExtraDatasetNames(String type);
GenericResultset retrieveExtraData(String type, String set, Long id); GenericResultset retrieveExtraData(String type, String set, Long id);
@@ -17,7 +17,6 @@ import javax.sql.DataSource;
import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.StreamingOutput;
import org.mifosng.data.AdditionalFieldsSet; import org.mifosng.data.AdditionalFieldsSet;
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;
@@ -331,7 +330,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
} }
@Override @Override
public AdditionalFieldsSets retrieveExtraDatasetNames(String type) { public List<AdditionalFieldsSet> retrieveExtraDatasetNames(String type) {
List<AdditionalFieldsSet> additionalFieldsSets = new ArrayList<AdditionalFieldsSet>(); List<AdditionalFieldsSet> additionalFieldsSets = new ArrayList<AdditionalFieldsSet>();
@@ -366,7 +365,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
"Additional Fields Type: " + type); "Additional Fields Type: " + type);
} }
return new AdditionalFieldsSets(additionalFieldsSets); return additionalFieldsSets;
} }
@Override @Override
@@ -598,8 +597,7 @@ public class ReadExtraDataAndReportingServiceImpl implements
String transType = null; String transType = null;
String sql = "select s.id from `" + type + "` t left join `" String sql = "select s.id from `" + type + "` t left join `"
+ fullDatasetName + "` s on s.id = t.id where t.id = " + fullDatasetName + "` s on s.id = t.id where t.id = " + id;
+ id;
try { try {
Connection db_connection = dataSource.getConnection(); Connection db_connection = dataSource.getConnection();
@@ -11,23 +11,22 @@ import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException; import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response; 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.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.AdditionalFieldsSet;
import org.mifosng.data.ApiParameterError; import org.mifosng.data.ApiParameterError;
import org.mifosng.data.EntityIdentifier; import org.mifosng.data.EntityIdentifier;
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;
import org.mifosng.platform.api.infrastructure.ApiJSONFormattingService;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException; import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -40,23 +39,35 @@ import org.springframework.stereotype.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;
@Autowired
private ApiJSONFormattingService jsonFormattingService;
@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 String datasets(@QueryParam("type") String type,
@QueryParam("fields") String fields,
@QueryParam("pretty") String pretty) {
MultivaluedMap<String, String> queryParams = uriInfo List<AdditionalFieldsSet> result = this.readExtraDataAndReportingService
.getQueryParameters();
String type = queryParams.getFirst("type");
AdditionalFieldsSets result = this.readExtraDataAndReportingService
.retrieveExtraDatasetNames(type); .retrieveExtraDatasetNames(type);
return Response.ok().entity(result).build();
String filterType = "E";
String fieldList = "";
if (this.jsonFormattingService.isPassed(fields)) {
filterType = "I";
fieldList = fields;
}
return this.jsonFormattingService.convertDataObjectJSON(result,
filterType, fieldList,
this.jsonFormattingService.isTrue(pretty));
} }
@GET @GET
@@ -64,8 +75,7 @@ public class AdditionalFieldsApiResource {
@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("type") final String type, public Response extraData(@PathParam("type") final String type,
@PathParam("set") final String set, @PathParam("set") final String set, @PathParam("id") final Long id) {
@PathParam("id") final Long id) {
try { try {
GenericResultset result = this.readExtraDataAndReportingService GenericResultset result = this.readExtraDataAndReportingService
@@ -74,9 +84,13 @@ public class AdditionalFieldsApiResource {
return Response.ok().entity(result).build(); return Response.ok().entity(result).build();
} catch (InvalidSqlException e) { } catch (InvalidSqlException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>(); List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError("extradata.invalid.sql", "The sql is invalid.", "sql", e.getSql()); ApiParameterError error = ApiParameterError.parameterError(
"extradata.invalid.sql", "The sql is invalid.", "sql",
e.getSql());
dataValidationErrors.add(error); dataValidationErrors.add(error);
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
} }
} }
@@ -85,8 +99,8 @@ public class AdditionalFieldsApiResource {
@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("type") final String type, public Response saveExtraData(@PathParam("type") final String type,
@PathParam("set") final String set, @PathParam("set") final String set, @PathParam("id") final Long id,
@PathParam("id") final Long id, String reqbody) { String reqbody) {
try { try {
@@ -122,11 +136,15 @@ public class AdditionalFieldsApiResource {
return Response.ok().entity(entityIdentifier).build(); return Response.ok().entity(entityIdentifier).build();
} catch (InvalidSqlException e) { } catch (InvalidSqlException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>(); List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError("extradata.invalid.sql", "The sql is invalid.", "sql", e.getSql()); ApiParameterError error = ApiParameterError.parameterError(
"extradata.invalid.sql", "The sql is invalid.", "sql",
e.getSql());
dataValidationErrors.add(error); dataValidationErrors.add(error);
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
} }
} }
} }
@@ -1,8 +1,6 @@
package org.mifosng.platform.api; package org.mifosng.platform.api;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.GET; import javax.ws.rs.GET;
@@ -53,11 +51,15 @@ public class OfficeApiResource {
Collection<OfficeData> offices = this.readPlatformService Collection<OfficeData> offices = this.readPlatformService
.retrieveAllOffices(); .retrieveAllOffices();
Set<String> excludeFields = new HashSet<String>(); String filterType = "E";
excludeFields.add("allowedParents"); String fieldList = "allowedParents";
if (this.jsonFormattingService.isPassed(fields)) {
filterType = "I";
fieldList = fields;
}
return this.jsonFormattingService.convertDataObjectJSON(offices, return this.jsonFormattingService.convertDataObjectJSON(offices,
fields, excludeFields, filterType, fieldList,
this.jsonFormattingService.isTrue(pretty)); this.jsonFormattingService.isTrue(pretty));
} }
@@ -70,11 +72,11 @@ public class OfficeApiResource {
OfficeData officeData = this.readPlatformService OfficeData officeData = this.readPlatformService
.retrieveNewOfficeTemplate(); .retrieveNewOfficeTemplate();
Set<String> excludeFields = new HashSet<String>(); String filterType = "I";
String includeFields = "openingDate,allowedParents"; String fieldList = "openingDate,allowedParents";
return this.jsonFormattingService.convertDataObjectJSON(officeData, return this.jsonFormattingService.convertDataObjectJSON(officeData,
includeFields, excludeFields, filterType, fieldList,
this.jsonFormattingService.isTrue(pretty)); this.jsonFormattingService.isTrue(pretty));
} }
@@ -102,26 +104,31 @@ public class OfficeApiResource {
@QueryParam("template") String template, @QueryParam("template") String template,
@QueryParam("pretty") String pretty) { @QueryParam("pretty") String pretty) {
String includeFields = fields;
Set<String> excludeFields = new HashSet<String>();
OfficeData office = this.readPlatformService.retrieveOffice(officeId); OfficeData office = this.readPlatformService.retrieveOffice(officeId);
String filterType = "E";
String fieldList = "";
if (this.jsonFormattingService.isPassed(fields)) {
filterType = "I";
fieldList = fields;
}
if (this.jsonFormattingService.isTrue(template)) { if (this.jsonFormattingService.isTrue(template)) {
office.setAllowedParents(this.readPlatformService office.setAllowedParents(this.readPlatformService
.retrieveAllowedParents(officeId)); .retrieveAllowedParents(officeId));
if (this.jsonFormattingService.isPassed(includeFields)) { if (this.jsonFormattingService.isPassed(fields)) {
includeFields += ",allowedParents"; fieldList += ",allowedParents";
} }
} else { } else {
if (!(this.jsonFormattingService.isPassed(includeFields))) { if (!(this.jsonFormattingService.isPassed(fields))) {
excludeFields.add("allowedParents"); fieldList = "allowedParents";
} }
} }
return this.jsonFormattingService.convertDataObjectJSON(office, return this.jsonFormattingService.convertDataObjectJSON(office,
includeFields, excludeFields, filterType, fieldList,
this.jsonFormattingService.isTrue(pretty)); this.jsonFormattingService.isTrue(pretty));
} }
@@ -4,8 +4,8 @@ import java.util.Set;
public interface ApiJSONFormattingService { public interface ApiJSONFormattingService {
String convertDataObjectJSON(Object dataObject, String fields, String convertDataObjectJSON(Object dataObject, String filterType,
Set<String> excludeFields, boolean prettyOutput); String fields, boolean prettyOutput);
Boolean isTrue(String param); Boolean isTrue(String param);
@@ -13,44 +13,38 @@ import org.codehaus.jackson.map.ser.FilterProvider;
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter; import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider; import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
import org.mifosng.platform.exceptions.PlatformInternalServerException; import org.mifosng.platform.exceptions.PlatformInternalServerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
public class ApiJSONFormattingServiceImpl implements ApiJSONFormattingService { public class ApiJSONFormattingServiceImpl implements ApiJSONFormattingService {
private final static Logger logger = LoggerFactory
.getLogger(ApiJSONFormattingServiceImpl.class);
@Override @Override
public String convertDataObjectJSON(Object dataObject, String fields, public String convertDataObjectJSON(Object dataObject, String filterType,
Set<String> excludeFields, boolean prettyOutput) { String fields, boolean prettyOutput) {
try { try {
String json = ""; String json = "";
String myFilter = "myFilter"; String myFilter = "myFilter";
Set<String> includeFields = new HashSet<String>();
FilterProvider filters = null; FilterProvider filters = null;
Set<String> filterFields = new HashSet<String>();
if (fields == null || fields.equals("")) { StringTokenizer st = new StringTokenizer(fields, ",");
while (st.hasMoreTokens()) {
filterFields.add(st.nextToken().trim());
}
if (filterType.equals("I")) {
filters = new SimpleFilterProvider().addFilter(myFilter, filters = new SimpleFilterProvider().addFilter(myFilter,
SimpleBeanPropertyFilter SimpleBeanPropertyFilter
.serializeAllExcept(excludeFields)); .filterOutAllExcept(filterFields));
} else { } else {
StringTokenizer st = new StringTokenizer(fields, ",");
while (st.hasMoreTokens()) {
includeFields.add(st.nextToken().trim());
}
filters = new SimpleFilterProvider().addFilter(myFilter, filters = new SimpleFilterProvider().addFilter(myFilter,
SimpleBeanPropertyFilter SimpleBeanPropertyFilter
.filterOutAllExcept(includeFields)); .serializeAllExcept(filterFields));
} }
ObjectWriter jsonWriter = null;
ObjectWriter jsonWriter = null;
if (prettyOutput) { if (prettyOutput) {
jsonWriter = new ObjectMapper() jsonWriter = new ObjectMapper()
.writerWithDefaultPrettyPrinter(); .writerWithDefaultPrettyPrinter();