diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/DataValidatorBuilder.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/DataValidatorBuilder.java index 4768c1fe3..d8bf38f0e 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/DataValidatorBuilder.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/data/DataValidatorBuilder.java @@ -241,6 +241,27 @@ public class DataValidatorBuilder { return this; } + public DataValidatorBuilder isOneOfTheseStringValues(final Object... values) { + if (this.value == null && this.ignoreNullValue) { return this; } + + final List valuesList = Arrays.asList(values); + final String valuesListStr = StringUtils.join(valuesList, ", "); + + if (this.value == null || !valuesList.contains(this.value.toString().toLowerCase())) { + final StringBuilder validationErrorCode = new StringBuilder("validation.msg.").append(this.resource).append(".") + .append(this.parameter).append(".is.not.one.of.expected.enumerations"); + final StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(this.parameter) + .append(" must be one of [ ").append(valuesListStr).append(" ] ").append("."); + + final ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), + defaultEnglishMessage.toString(), this.parameter, this.value, values); + + this.dataValidationErrors.add(error); + } + + return this; + } + public DataValidatorBuilder isNotOneOfTheseValues(final Object... values) { if (this.value == null && this.ignoreNullValue) { return this; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/DatatableCommandFromApiJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/DatatableCommandFromApiJsonDeserializer.java index 510222fdd..1d43f2dfc 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/DatatableCommandFromApiJsonDeserializer.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/DatatableCommandFromApiJsonDeserializer.java @@ -45,7 +45,7 @@ public class DatatableCommandFromApiJsonDeserializer { private final Set supportedParametersForChangeColumns = new HashSet(Arrays.asList("name", "newName", "length", "mandatory", "after", "code", "newCode")); private final Set supportedParametersForDropColumns = new HashSet(Arrays.asList("name")); - private final Object[] supportedColumnTypes = { "String", "Number", "Decimal", "Date", "Text", "Dropdown" }; + private final Object[] supportedColumnTypes = { "string", "number", "decimal", "date", "text", "dropdown" }; private final Object[] supportedApptableNames = { "m_loan", "m_savings_account", "m_client", "m_group", "m_center", "m_office", "m_savings_product", "m_product_loan" }; @@ -58,9 +58,9 @@ public class DatatableCommandFromApiJsonDeserializer { private void validateType(final DataValidatorBuilder baseDataValidator, final JsonElement column) { final String type = this.fromApiJsonHelper.extractStringNamed("type", column); - baseDataValidator.reset().parameter("type").value(type).notBlank().isOneOfTheseValues(this.supportedColumnTypes); + baseDataValidator.reset().parameter("type").value(type).notBlank().isOneOfTheseStringValues(this.supportedColumnTypes); - if (type != null && type.equals("String")) { + if (type != null && type.equalsIgnoreCase("String")) { if (this.fromApiJsonHelper.parameterExists("length", column)) { final String lengthStr = this.fromApiJsonHelper.extractStringNamed("length", column); if (lengthStr != null && !StringUtils.isWhitespace(lengthStr) && StringUtils.isNumeric(lengthStr) @@ -80,7 +80,7 @@ public class DatatableCommandFromApiJsonDeserializer { } final String code = this.fromApiJsonHelper.extractStringNamed("code", column); - if (type != null && type.equals("Dropdown")) { + if (type != null && type.equalsIgnoreCase("Dropdown")) { if (code != null) { baseDataValidator.reset().parameter("code").value(code).notBlank().matchesRegularExpression(DATATABLE_NAME_REGEX_PATTERN); } else { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java index ff54ad7c3..9e5b41a70 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java @@ -71,12 +71,12 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ private final static HashMap apiTypeToMySQL = new HashMap() { { - put("String", "VARCHAR"); - put("Number", "INT"); - put("Decimal", "DECIMAL"); - put("Date", "DATE"); - put("Text", "TEXT"); - put("Dropdown", "INT"); + put("string", "VARCHAR"); + put("number", "INT"); + put("decimal", "DECIMAL"); + put("date", "DATE"); + put("text", "TEXT"); + put("dropdown", "INT"); } }; @@ -265,15 +265,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ final String deleteRegisteredDatatableSql = "delete from x_registered_table where registered_table_name = '" + datatable + "'"; - String[] sqlArray = null; - if (this.configurationDomainService.isConstraintApproachEnabledForDatatables()) { - final String deleteColumnCodeSql = "delete from x_table_cloumn_code_mappings where column_alias_name like'" - + datatable.toLowerCase().replaceAll("\\s", "_") + "%'"; - sqlArray = new String[4]; - sqlArray[3] = deleteColumnCodeSql; - } else { - sqlArray = new String[3]; - } + String[] sqlArray = new String[3]; sqlArray[0] = deleteRolePermissionsSql; sqlArray[1] = deletePermissionsSql; sqlArray[2] = deleteRegisteredDatatableSql; @@ -362,7 +354,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ final boolean isConstraintApproach) { String name = (column.has("name")) ? column.get("name").getAsString() : null; - final String type = (column.has("type")) ? column.get("type").getAsString() : null; + final String type = (column.has("type")) ? column.get("type").getAsString().toLowerCase() : null; final Integer length = (column.has("length")) ? column.get("length").getAsInt() : null; final Boolean mandatory = (column.has("mandatory")) ? column.get("mandatory").getAsBoolean() : false; final String code = (column.has("code")) ? column.get("code").getAsString() : null; @@ -381,11 +373,11 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ sqlBuilder = sqlBuilder.append("`" + name + "` " + mysqlType); if (type != null) { - if (type.equals("String")) { + if (type.equalsIgnoreCase("String")) { sqlBuilder = sqlBuilder.append("(" + length + ")"); - } else if (type.equals("Decimal")) { + } else if (type.equalsIgnoreCase("Decimal")) { sqlBuilder = sqlBuilder.append("(19,6)"); - } else if (type.equals("Dropdown")) { + } else if (type.equalsIgnoreCase("Dropdown")) { sqlBuilder = sqlBuilder.append("(11)"); } } @@ -526,14 +518,14 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ } else { if (code != null) { removeMappings.add(dataTableNameAlias + "_" + name); - if (newCode == null) { + if (newCode == null || !StringUtils.equalsIgnoreCase(name, newName)) { constrainBuilder.append(", DROP FOREIGN KEY `fk_").append(dataTableNameAlias).append("_").append(name) .append("` "); } } if (newCode != null) { codeMappings.put(dataTableNameAlias + "_" + newName, this.codeReadPlatformService.retriveCode(newCode).getCodeId()); - if (code == null) { + if (code == null || !StringUtils.equalsIgnoreCase(name, newName)) { constrainBuilder.append(",ADD CONSTRAINT `fk_").append(dataTableNameAlias).append("_").append(newName) .append("` ").append("FOREIGN KEY (`" + newName + "`) ").append("REFERENCES `") .append(CODE_VALUES_TABLE).append("` (`id`)"); @@ -596,7 +588,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ final StringBuilder constrainBuilder, final Map codeMappings, final boolean isConstraintApproach) { String name = (column.has("name")) ? column.get("name").getAsString() : null; - final String type = (column.has("type")) ? column.get("type").getAsString() : null; + final String type = (column.has("type")) ? column.get("type").getAsString().toLowerCase() : null; final Integer length = (column.has("length")) ? column.get("length").getAsInt() : null; final Boolean mandatory = (column.has("mandatory")) ? column.get("mandatory").getAsBoolean() : false; final String after = (column.has("after")) ? column.get("after").getAsString() : null; @@ -616,11 +608,11 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ sqlBuilder = sqlBuilder.append(", ADD `" + name + "` " + mysqlType); if (type != null) { - if (type.equals("String") && length != null) { + if (type.equalsIgnoreCase("String") && length != null) { sqlBuilder = sqlBuilder.append("(" + length + ")"); - } else if (type.equals("Decimal")) { + } else if (type.equalsIgnoreCase("Decimal")) { sqlBuilder = sqlBuilder.append("(19,6)"); - } else if (type.equals("Dropdown")) { + } else if (type.equalsIgnoreCase("Dropdown")) { sqlBuilder = sqlBuilder.append("(11)"); } } @@ -828,8 +820,18 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ if (!isRegisteredDataTable(datatableName)) { throw new DatatableNotFoundException(datatableName); } validateDatatableName(datatableName); deregisterDatatable(datatableName); + String[] sqlArray = null; + if (this.configurationDomainService.isConstraintApproachEnabledForDatatables()) { + final String deleteColumnCodeSql = "delete from x_table_cloumn_code_mappings where column_alias_name like'" + + datatableName.toLowerCase().replaceAll("\\s", "_") + "_%'"; + sqlArray = new String[2]; + sqlArray[1] = deleteColumnCodeSql; + }else{ + sqlArray = new String[1]; + } final String sql = "DROP TABLE `" + datatableName + "`"; - this.jdbcTemplate.execute(sql); + sqlArray[0] = sql; + this.jdbcTemplate.batchUpdate(sqlArray); } catch (final SQLGrammarException e) { final Throwable realCause = e.getCause(); final List dataValidationErrors = new ArrayList();