Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ allprojects {
spotless {
format 'misc', {
target '**/*.md', '**/*.properties', '**/.gitignore', '**/.openapi-generator-ignore', '**/*.yml', '**/*.xml', '**/**.json', '**/*.sql'
targetExclude '**/build/**', '**/bin/**', '**/.settings/**', '**/.idea/**', '**/.gradle/**', '**/gradlew.bat', '**/licenses/**', '**/banner.txt'
targetExclude '**/build/**', '**/bin/**', '**/.settings/**', '**/.idea/**', '**/.gradle/**', '**/gradlew.bat', '**/licenses/**', '**/banner.txt', '.vscode/**'
indentWithSpaces(4)
endWithNewline()
trimTrailingWhitespace()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@

public final class DateUtils {

public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final DateTimeFormatter DEFAULT_DATETIME_FORMATER = DateTimeFormatter.ofPattern(DEFAULT_DATETIME_FORMAT);

private DateUtils() {

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@
import org.apache.fineract.infrastructure.dataqueries.service.GenericDataService;
import org.apache.fineract.infrastructure.dataqueries.service.ReadWriteNonCoreDataService;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
Expand All @@ -71,7 +70,6 @@ public class DatatablesApiResource {
private final ReadWriteNonCoreDataService readWriteNonCoreDataService;
private final ToApiJsonSerializer<GenericResultsetData> toApiJsonSerializer;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(DatatablesApiResource.class);

@Autowired
public DatatablesApiResource(final PlatformSecurityContext context, final GenericDataService genericDataService,
Expand Down Expand Up @@ -259,8 +257,6 @@ public String getDatatable(@PathParam("datatable") @Parameter(description = "dat
public String getDatatableManyEntry(@PathParam("datatable") final String datatable, @PathParam("apptableId") final Long apptableId,
@PathParam("datatableId") final Long datatableId, @QueryParam("order") final String order, @Context final UriInfo uriInfo) {

LOG.debug("::1 we came in the getDatatbleManyEntry apiRessource method");

this.context.authenticatedUser().validateHasDatatableReadPermission(datatable);

final GenericResultsetData results = this.readWriteNonCoreDataService.retrieveDataTableGenericResultSet(datatable, apptableId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,14 @@
import java.util.List;
import javax.sql.DataSource;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
import org.apache.fineract.infrastructure.core.service.database.DatabaseIndependentQueryService;
import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData;
import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnHeaderData;
import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnValueData;
import org.apache.fineract.infrastructure.dataqueries.data.ResultsetRowData;
import org.apache.fineract.infrastructure.dataqueries.exception.DatatableNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
Expand All @@ -47,7 +46,6 @@ public class GenericDataServiceImpl implements GenericDataService {
private final JdbcTemplate jdbcTemplate;
private final DataSource dataSource;
private final DatabaseIndependentQueryService databaseIndependentQueryService;
private static final Logger LOG = LoggerFactory.getLogger(GenericDataServiceImpl.class);

@Autowired
public GenericDataServiceImpl(final RoutingDataSource dataSource, final JdbcTemplate jdbcTemplate,
Expand Down Expand Up @@ -169,9 +167,10 @@ public String generateJsonFromGenericResultsetData(final GenericResultsetData gr
writer.append(
"[" + localDate.getYear() + ", " + localDate.getMonthValue() + ", " + localDate.getDayOfMonth() + "]");
} else if (currColType.equals("DATETIME")) {
final LocalDateTime localDateTime = LocalDateTime.parse(currVal);
final LocalDateTime localDateTime = LocalDateTime.parse(formatDateTimeValue(currVal),
DateUtils.DEFAULT_DATETIME_FORMATER);
writer.append("[" + localDateTime.getYear() + ", " + localDateTime.getMonthValue() + ", "
+ localDateTime.getDayOfMonth() + " " + localDateTime.getHour() + ", " + localDateTime.getMinute()
+ localDateTime.getDayOfMonth() + ", " + localDateTime.getHour() + ", " + localDateTime.getMinute()
+ ", " + localDateTime.getSecond() + ", " + localDateTime.get(ChronoField.MILLI_OF_SECOND) + "]");
} else {
writer.append(doubleQuote + replace(currVal, doubleQuote, slashDoubleQuote) + doubleQuote);
Expand Down Expand Up @@ -262,4 +261,14 @@ private SqlRowSet getDatatableMetaData(final String datatable) {
throw new DatatableNotFoundException(datatable);
}
}

private String formatDateTimeValue(String dateTimeValue) {
if (dateTimeValue.length() > 19) {
dateTimeValue = dateTimeValue.substring(0, 19);
}
if (dateTimeValue.contains("T")) {
dateTimeValue = dateTimeValue.replace("T", " ");
}
return dateTimeValue;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1710,7 +1710,8 @@ public Map<String, String> getAffectedColumns(final List<ResultsetColumnHeaderDa
// ignores id and foreign key fields
// also ignores locale and dateformat fields that are used for
// validating numeric and date data
if (!(key.equalsIgnoreCase("id") || key.equalsIgnoreCase(keyFieldName) || key.equals("locale") || key.equals("dateFormat"))) {
if (!(key.equalsIgnoreCase("id") || key.equalsIgnoreCase(keyFieldName) || key.equals("locale") || key.equals("dateFormat")
|| key.equals(DataTableApiConstant.CREATEDAT_FIELD_NAME) || key.equals(DataTableApiConstant.UPDATEDAT_FIELD_NAME))) {
notFound = true;
// matches incoming fields with and without underscores (spaces
// and underscores considered the same)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.fail;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
Expand All @@ -37,8 +40,12 @@
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import org.apache.commons.lang3.StringUtils;
import org.apache.fineract.infrastructure.core.service.DateUtils;
Expand All @@ -59,6 +66,7 @@ private Utils() {

private static final Logger LOG = LoggerFactory.getLogger(Utils.class);
private static final SecureRandom random = new SecureRandom();
private static final Gson gson = new Gson();

public static final String TENANT_PARAM_NAME = "tenantIdentifier";
public static final String DEFAULT_TENANT = "default";
Expand Down Expand Up @@ -157,6 +165,20 @@ public static <T> T performServerGet(final RequestSpecification requestSpec, fin
return (T) JsonPath.from(json).get(jsonAttributeToGetBack);
}

public static List<String> performServerGetList(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
final String getURL, final String jsonAttributeToGetBack) {
final JsonPath jsonPath = given().spec(requestSpec).expect().spec(responseSpec).log().ifError().when().get(getURL).jsonPath();
List<String> items = jsonPath.getList(jsonAttributeToGetBack);
return items;
}

public static JsonElement performServerGetArray(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
final String getURL, final int position, final String jsonAttributeToGetBack) {
final JsonPath jsonPath = given().spec(requestSpec).expect().spec(responseSpec).log().ifError().when().get(getURL).jsonPath();
List<Map<String, Object>> items = jsonPath.getList("$");
return gson.fromJson(((ArrayList) items.get(position).get(jsonAttributeToGetBack)).toString(), JsonArray.class);
}

public static String performGetTextResponse(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
final String getURL) {
return given().spec(requestSpec).expect().spec(responseSpec).log().ifError().when().get(getURL).andReturn().asString();
Expand Down Expand Up @@ -251,6 +273,12 @@ public static String convertDateToURLFormat(final Calendar dateToBeConvert) {
return dateFormat.format(dateToBeConvert.getTime());
}

public static String convertDateToURLFormat(final Calendar dateToBeConvert, final String dateGormat) {
DateFormat dateFormat = new SimpleDateFormat(dateGormat);
dateFormat.setTimeZone(Utils.getTimeZoneOfTenant());
return dateFormat.format(dateToBeConvert.getTime());
}

public static LocalDate getLocalDateOfTenant() {
LocalDate today = LocalDate.now(DateUtils.getDateTimeZoneOfTenant());
final ZoneId zone = ZoneId.of(TENANT_TIME_ZONE);
Expand All @@ -264,6 +292,24 @@ public static TimeZone getTimeZoneOfTenant() {
return TimeZone.getTimeZone(TENANT_TIME_ZONE);
}

public static Date convertJsonElementAsDate(JsonElement jsonElement) {
if (jsonElement.isJsonArray()) {
JsonArray jsonArray = jsonElement.getAsJsonArray();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, jsonArray.get(0).getAsInt());
calendar.set(Calendar.MONTH, jsonArray.get(1).getAsInt() - 1);
calendar.set(Calendar.DATE, jsonArray.get(2).getAsInt());
// If the Array includes Time
if (jsonArray.size() > 3) {
calendar.set(Calendar.HOUR, jsonArray.get(3).getAsInt());
calendar.set(Calendar.MINUTE, jsonArray.get(4).getAsInt());
calendar.set(Calendar.SECOND, jsonArray.get(5).getAsInt());
}
return calendar.getTime();
}
return null;
}

public static String performServerTemplatePost(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
final String postURL, final String legalFormType, final File file, final String locale, final String dateFormat) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,26 @@ public void setup() {
this.datatableHelper = new DatatableHelper(this.requestSpec, this.responseSpec);
}

@Test
public void validateCreateDeleteDatatableCheck() {
// creating datatable
String datatableName = this.datatableHelper.createDatatable(CLIENT_APP_TABLE_NAME, false);
DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, datatableName);

// creating new entity datatable check
Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(CLIENT_APP_TABLE_NAME, datatableName,
100, null);
assertNotNull(entityDatatableCheckId, "ERROR IN CREATING THE ENTITY DATATABLE CHECK");

// deleting entity datatable check
entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
assertNotNull(entityDatatableCheckId, "ERROR IN DELETING THE ENTITY DATATABLE CHECK");

// deleting the datatable
String deletedDataTableName = this.datatableHelper.deleteDatatable(datatableName);
assertEquals(datatableName, deletedDataTableName, "ERROR IN DELETING THE DATATABLE");
}

@Test
public void validateCreateDeleteEntityDatatableCheck() {
// creating datatable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,12 @@
import static org.junit.jupiter.api.Assertions.assertEquals;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.fineract.integrationtests.common.Utils;
Expand All @@ -48,6 +51,33 @@ public String createDatatable(final String apptableName, final boolean multiRow)
getTestDatatableAsJSON(apptableName, multiRow), "resourceIdentifier");
}

public Integer createDatatableEntry(final String apptableName, final String datatableName, final Integer apptableId,
final boolean genericResultSet, final String dateFormat) {
return Utils.performServerPost(
this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId + "?genericResultSet="
+ Boolean.toString(genericResultSet) + "&" + Utils.TENANT_IDENTIFIER,
getTestDatatableEntryAsJSON(dateFormat), "resourceId");
}

public String readDatatableEntry(final String datatableName, final Integer resourceId, final boolean genericResultset) {
return Utils.performServerGet(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + resourceId
+ "?genericResultSet=" + String.valueOf(genericResultset) + "&" + Utils.TENANT_IDENTIFIER);
}

public List<String> readDatatableEntry(final String datatableName, final Integer resourceId, final boolean genericResultset,
final String jsonAttributeToGetBack) {
return Utils.performServerGetList(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + resourceId
+ "?genericResultSet=" + String.valueOf(genericResultset) + "&" + Utils.TENANT_IDENTIFIER, jsonAttributeToGetBack);
}

public Date readDatatableEntry(final String datatableName, final Integer resourceId, final boolean genericResultset, final int position,
final String jsonAttributeToGetBack) {
final JsonElement jsonElement = Utils.performServerGetArray(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName
+ "/" + resourceId + "?genericResultSet=" + String.valueOf(genericResultset) + "&" + Utils.TENANT_IDENTIFIER, position,
jsonAttributeToGetBack);
return Utils.convertJsonElementAsDate(jsonElement);
}

public String deleteDatatable(final String datatableName) {
return Utils.performServerDelete(this.requestSpec, this.responseSpec,
DATATABLE_URL + "/" + datatableName + "?" + Utils.TENANT_IDENTIFIER, "resourceIdentifier");
Expand Down Expand Up @@ -84,6 +114,19 @@ public static String getTestDatatableAsJSON(final String apptableName, final boo
return requestJsonString;
}

public static String getTestDatatableEntryAsJSON(final String dateFormat) {
final HashMap<String, Object> map = new HashMap<>();
map.put("Spouse Name", Utils.randomNameGenerator("Spouse_Name_", 5));
map.put("Number of Dependents", Utils.randomNumberGenerator(1));
map.put("Date of Approval", Utils.convertDateToURLFormat(Calendar.getInstance(), dateFormat));
map.put("locale", "en");
map.put("dateFormat", dateFormat);

String requestJsonString = new Gson().toJson(map);
LOG.info("map : {}", requestJsonString);
return requestJsonString;
}

public static List<HashMap<String, Object>> addDatatableColumns(List<HashMap<String, Object>> datatableColumnsList, String columnName,
String columnType, boolean isMandatory, Integer length) {

Expand Down
Loading