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 index 31eaade3d..39aeb54fc 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/DataTableApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/DataTableApiResource.java @@ -1,5 +1,7 @@ package org.mifosng.platform.api; +import java.util.List; + import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -10,6 +12,7 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; +import org.mifosng.platform.api.data.DatatableData; import org.mifosng.platform.api.data.GenericResultsetData; import org.mifosng.platform.api.infrastructure.ApiJsonSerializerService; import org.mifosng.platform.api.infrastructure.ApiParameterHelper; @@ -42,6 +45,21 @@ public class DataTableApiResource { @Autowired private ApiJsonSerializerService apiJsonSerializerService; + @GET + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String datasets(@QueryParam("appTable") final String appTable, + @Context final UriInfo uriInfo) { + + List result = this.readWriteNonCoreDataService + .retrieveDatatableNames(appTable); + + boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo + .getQueryParameters()); + return this.apiJsonSerializerService.serializeDatatableDataToJson( + prettyPrint, result); + } + @GET @Path("{datatable}/{id}") @Consumes({ MediaType.APPLICATION_JSON }) @@ -49,7 +67,6 @@ public class DataTableApiResource { public String getDatatable(@PathParam("datatable") final String datatable, @PathParam("id") final Long id, @QueryParam("sqlFields") final String sqlFields, - @QueryParam("sqlSearch") final String sqlSearch, @QueryParam("sqlOrder") final String sqlOrder, @Context final UriInfo uriInfo) { @@ -59,13 +76,12 @@ public class DataTableApiResource { * Dont use this for now... but its the code for returning data as json * objects rather than a generic resultset String resultStr = * this.readWriteNonCoreDataService - * .retrieveDataTableJSONObject(datatable, id, sqlFields, sqlSearch, - * sqlOrder); + * .retrieveDataTableJSONObject(datatable, id, sqlFields, sqlOrder); */ GenericResultsetData results = this.readWriteNonCoreDataService .retrieveDataTableGenericResultSet(datatable, id, sqlFields, - sqlSearch, sqlOrder); + sqlOrder); boolean prettyPrints = ApiParameterHelper.prettyPrint(uriInfo .getQueryParameters()); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/DatatableData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/DatatableData.java new file mode 100644 index 000000000..6c174c73a --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/DatatableData.java @@ -0,0 +1,28 @@ +package org.mifosng.platform.api.data; + +public class DatatableData { + + private final String applicationTableName; + private final String registeredTableName; + private final String registeredTableLabel; + + public DatatableData(final String applicationTableName, + final String registeredTableName, final String registeredTableLabel) { + this.applicationTableName = applicationTableName; + this.registeredTableName = registeredTableName; + this.registeredTableLabel = registeredTableLabel; + } + + public String getApplicationTableName() { + return applicationTableName; + } + + public String getRegisteredTableName() { + return registeredTableName; + } + + public String getRegisteredTableLabel() { + return registeredTableLabel; + } + +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java index d497a5936..77112dd64 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiJsonSerializerService.java @@ -10,6 +10,7 @@ import org.mifosng.platform.api.data.ChargeData; import org.mifosng.platform.api.data.ClientAccountSummaryCollectionData; import org.mifosng.platform.api.data.ClientData; import org.mifosng.platform.api.data.ConfigurationData; +import org.mifosng.platform.api.data.DatatableData; import org.mifosng.platform.api.data.DepositAccountData; import org.mifosng.platform.api.data.DepositProductData; import org.mifosng.platform.api.data.FundData; @@ -34,6 +35,8 @@ public interface ApiJsonSerializerService { String serializeAdditionalFieldsSetDataToJson(boolean prettyPrint, Collection result); + String serializeDatatableDataToJson(boolean prettyPrint, Collection result); + String serializePermissionDataToJson(boolean prettyPrint, Set responseParameters, Collection permissions); String serializeRoleDataToJson(boolean prettyPrint, Set responseParameters, Collection roles); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java index c4172b203..5ee90239e 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonApiJsonSerializerService.java @@ -12,6 +12,7 @@ import org.mifosng.platform.api.data.ChargeData; import org.mifosng.platform.api.data.ClientAccountSummaryCollectionData; import org.mifosng.platform.api.data.ClientData; import org.mifosng.platform.api.data.ConfigurationData; +import org.mifosng.platform.api.data.DatatableData; import org.mifosng.platform.api.data.DepositAccountData; import org.mifosng.platform.api.data.DepositProductData; import org.mifosng.platform.api.data.FundData; @@ -192,6 +193,15 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ return helper.serializedJsonFrom(gsonDeserializer, datasets.toArray(new AdditionalFieldsSetData[datasets.size()])); } + + @Override + public String serializeDatatableDataToJson( + final boolean prettyPrint, + final Collection datatables) { + final Gson gsonDeserializer = helper.createGsonBuilder(prettyPrint); + return helper.serializedJsonFrom(gsonDeserializer, + datatables.toArray(new DatatableData[datatables.size()])); + } @Override public String serializePermissionDataToJson(final boolean prettyPrint, diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataService.java b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataService.java index b7aa61015..58611fc15 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataService.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; import org.mifosng.platform.api.data.AdditionalFieldsSetData; +import org.mifosng.platform.api.data.DatatableData; import org.mifosng.platform.api.data.GenericResultsetData; public interface ReadWriteNonCoreDataService { @@ -15,10 +16,12 @@ public interface ReadWriteNonCoreDataService { void updateExtraData(String type, String set, Long id, Map queryParams); + List retrieveDatatableNames(String appTable); + GenericResultsetData retrieveDataTableGenericResultSet(String datatable, - Long id, String sqlFields, String sqlSearch, String sqlOrder); + Long id, String sqlFields, String sqlOrder); String retrieveDataTableJSONObject(String datatable, Long id, - String sqlFields, String sqlSearch, String sqlOrder); + String sqlFields, String sqlOrder); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java index 2907bd6c1..8d57eb55a 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/noncore/ReadWriteNonCoreDataServiceImpl.java @@ -11,6 +11,7 @@ import javax.sql.rowset.CachedRowSet; import org.apache.commons.lang.StringUtils; import org.mifosng.platform.api.data.AdditionalFieldsSetData; +import org.mifosng.platform.api.data.DatatableData; import org.mifosng.platform.api.data.GenericResultsetData; import org.mifosng.platform.api.data.ResultsetColumnHeader; import org.mifosng.platform.api.data.ResultsetColumnValue; @@ -475,13 +476,64 @@ public class ReadWriteNonCoreDataServiceImpl implements return type + "_x" + set; } + @Override + public List retrieveDatatableNames(String appTable) { + + long startTime = System.currentTimeMillis(); + + String andClause; + if (appTable == null) { + andClause = ""; + } else { + andClause = " and application_table_name = '" + appTable + "'"; + } + // PERMITTED datatables + String sql = "select application_table_name, registered_table_name, registered_table_label" + + " from x_registered_table " + + " where exists" + + " (select 'f'" + + " from m_appuser_role ur " + + " join m_role r on r.id = ur.role_id" + + " left join m_role_permission rp on rp.role_id = r.id" + + " left join m_permission p on p.id = rp.permission_id" + + " where ur.appuser_id = " + + context.authenticatedUser().getId() + + " and (p.code in ('ALL_FUNCTIONS', 'ALL_FUNCTIONS_READ') or p.code = concat('CAN_READ_', registered_table_name))) " + + andClause + " order by application_table_name, registered_table_name"; + + //sql = genericDataService.wrapSQL(sql); + String sqlErrorMsg = "Application Table Name: " + appTable + " sql: " + + sql; + CachedRowSet rs = genericDataService.getCachedResultSet(sql, + sqlErrorMsg); + + List datatables = new ArrayList(); + try { + while (rs.next()) { + datatables.add(new DatatableData(rs + .getString("application_table_name"), rs.getString("registered_table_name"), rs + .getString("registered_table_label"))); + } + + } catch (SQLException e) { + throw new PlatformDataIntegrityException("error.msg.sql.error", + e.getMessage(), sqlErrorMsg); + } + + long elapsed = System.currentTimeMillis() - startTime; + logger.info("FINISHING retrieveDatatableNames: Elapsed Time: " + + elapsed); + + return datatables; + } + @Override public String retrieveDataTableJSONObject(String datatable, Long id, - String sqlFields, String sqlSearch, String sqlOrder) { + String sqlFields, String sqlOrder) { long startTime = System.currentTimeMillis(); GenericResultsetData result = retrieveDataTableGenericResultSet( - datatable, id, sqlFields, sqlSearch, sqlOrder); + datatable, id, sqlFields, sqlOrder); String jsonString = generateJsonFromGenericResultsetData(result); @@ -493,7 +545,7 @@ public class ReadWriteNonCoreDataServiceImpl implements @Override public GenericResultsetData retrieveDataTableGenericResultSet( - String datatable, Long id, String sqlFields, String sqlSearch, + String datatable, Long id, String sqlFields, String sqlOrder) { long startTime = System.currentTimeMillis(); @@ -517,8 +569,6 @@ public class ReadWriteNonCoreDataServiceImpl implements sql = sql + " from " + datatable + " where " + fkField + " = " + id; - if (sqlSearch != null) - sql = sql + " and ( " + sqlSearch + ")"; if (sqlOrder != null) sql = sql + " order by " + sqlOrder; logger.info(sql);