diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/FromJsonHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/FromJsonHelper.java index 7d35adc8f..7a4a36033 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/FromJsonHelper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/FromJsonHelper.java @@ -98,6 +98,31 @@ public class FromJsonHelper { if (!unsupportedParameterList.isEmpty()) { throw new UnsupportedParameterException(unsupportedParameterList); } } + /** + * @param parentPropertyName + * The full json path to this property,the value is appended to + * the parameter name while generating an error message
+ * Ex: property "name" in Object "person" would be named as + * "person.name" + * @param object + * @param supportedParams + */ + public void checkForUnsupportedNestedParameters(final String parentPropertyName, final JsonObject object, + final Set supportedParams) { + try { + checkForUnsupportedParameters(object, supportedParams); + } catch (UnsupportedParameterException exception) { + List unsupportedParameters = exception.getUnsupportedParameters(); + List updatedUnsupportedParameters = new ArrayList<>(); + for (String unsupportedParameter : unsupportedParameters) { + String updatedUnsupportedParameter = parentPropertyName + "." + unsupportedParameter; + updatedUnsupportedParameters.add(updatedUnsupportedParameter); + } + throw new UnsupportedParameterException(updatedUnsupportedParameters); + } + + } + public JsonElement parse(final String json) { JsonElement parsedElement = null; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java index 533509c51..c17414b63 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java @@ -49,7 +49,7 @@ public class LoanProductConfigurableAttributes extends AbstractPersistable public static String[] supportedloanConfigurableAttributes = { "amortizationType", "interestType", "transactionProcessingStrategyId", "interestCalculationPeriodType", "inArrearsTolerance", "repaymentEvery", "graceOnPrincipalAndInterestPayment", - "graceOnArrearsAging" }; + "graceOnArrearsAgeing" }; public static LoanProductConfigurableAttributes createFrom(JsonCommand command) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/serialization/LoanProductDataValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/serialization/LoanProductDataValidator.java index ae9193faa..36e97eff5 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/serialization/LoanProductDataValidator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/serialization/LoanProductDataValidator.java @@ -9,6 +9,7 @@ import java.lang.reflect.Type; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Locale; @@ -28,11 +29,11 @@ import org.mifosplatform.portfolio.loanproduct.LoanProductConstants; import org.mifosplatform.portfolio.loanproduct.domain.InterestMethod; import org.mifosplatform.portfolio.loanproduct.domain.LoanPreClosureInterestCalculationStrategy; import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; +import org.mifosplatform.portfolio.loanproduct.domain.LoanProductConfigurableAttributes; import org.mifosplatform.portfolio.loanproduct.domain.LoanProductValueConditionType; import org.mifosplatform.portfolio.loanproduct.domain.RecalculationFrequencyType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.mifosplatform.portfolio.loanproduct.domain.LoanProductConfigurableAttributes; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -442,7 +443,7 @@ public final class LoanProductDataValidator { validateMultiDisburseLoanData(baseDataValidator, element); - // validateLoanConfigurableAttributes(baseDataValidator,element); + validateLoanConfigurableAttributes(baseDataValidator, element); throwExceptionIfValidationWarningsExist(dataValidationErrors); } @@ -453,22 +454,23 @@ public final class LoanProductDataValidator { final JsonObject object = element.getAsJsonObject().getAsJsonObject(LoanProductConstants.allowAttributeOverridesParamName); - Integer length = LoanProductConfigurableAttributes.supportedloanConfigurableAttributes.length; + // Validate that parameter names are allowed + Set supportedConfigurableAttributes = new HashSet<>(); + Collections.addAll(supportedConfigurableAttributes, LoanProductConfigurableAttributes.supportedloanConfigurableAttributes); + this.fromApiJsonHelper.checkForUnsupportedNestedParameters(LoanProductConstants.allowAttributeOverridesParamName, object, + supportedConfigurableAttributes); - Boolean bool[] = new Boolean[length]; + Integer length = LoanProductConfigurableAttributes.supportedloanConfigurableAttributes.length; for (int i = 0; i < length; i++) { /* Validate the attribute names */ - if (!this.fromApiJsonHelper.parameterExists(LoanProductConfigurableAttributes.supportedloanConfigurableAttributes[i], - object)) { - baseDataValidator.reset().parameter(LoanProductConstants.allowAttributeOverridesParamName) - .failWithCode("invalid.loan.configuration.attribute.passed"); - } else { - bool[i] = this.fromApiJsonHelper.extractBooleanNamed( + if (this.fromApiJsonHelper + .parameterExists(LoanProductConfigurableAttributes.supportedloanConfigurableAttributes[i], object)) { + Boolean loanConfigurationAttributeValue = this.fromApiJsonHelper.extractBooleanNamed( LoanProductConfigurableAttributes.supportedloanConfigurableAttributes[i], object); /* Validate the boolean value */ - baseDataValidator.reset().parameter(LoanProductConstants.allowAttributeOverridesParamName).value(bool[i]) - .ignoreIfNull().validateForBooleanValue(); + baseDataValidator.reset().parameter(LoanProductConstants.allowAttributeOverridesParamName) + .value(loanConfigurationAttributeValue).notNull().validateForBooleanValue(); } }