From fdbb4e62f99ae165e2b0a468db8b51a7e5759373 Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Fri, 25 May 2012 16:43:41 +0100 Subject: [PATCH] some tidy up around client validation in prep for update. --- .../java/org/mifosng/data/ClientData.java | 6 +- .../src/main/webapp/WEB-INF/views/home.jsp | 6 +- .../platform/DataValidatorBuilder.java | 40 +++++++++- .../service/ClientCommandValidator.java | 76 +++++++++++-------- .../ClientReadPlatformServiceImpl.java | 11 +-- ...WritePlatformServiceJpaRepositoryImpl.java | 9 ++- 6 files changed, 102 insertions(+), 46 deletions(-) diff --git a/mifosng-data/src/main/java/org/mifosng/data/ClientData.java b/mifosng-data/src/main/java/org/mifosng/data/ClientData.java index 2b053bc7d..301df6b14 100644 --- a/mifosng-data/src/main/java/org/mifosng/data/ClientData.java +++ b/mifosng-data/src/main/java/org/mifosng/data/ClientData.java @@ -24,7 +24,7 @@ public class ClientData implements Serializable { private String externalId; private LocalDate joinedDate; - private List allowedOffices = new ArrayList(); + private List allowedOffices = new ArrayList(); public ClientData() { // @@ -133,11 +133,11 @@ public class ClientData implements Serializable { this.displayName = displayName; } - public List getAllowedOffices() { + public List getAllowedOffices() { return allowedOffices; } - public void setAllowedOffices(List allowedOffices) { + public void setAllowedOffices(List allowedOffices) { this.allowedOffices = allowedOffices; } } \ No newline at end of file diff --git a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/home.jsp b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/home.jsp index 2521f2978..5dc837d2c 100644 --- a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/home.jsp +++ b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/home.jsp @@ -134,7 +134,6 @@ $(document).ready(function() { argArray[argArrayIndex] = this.value; argArrayIndex++; }); - console.log(argArray); // hardcoded support for six arguments errorObj.message = jQuery.i18n.prop(this.userMessageGlobalisationCode, argArray[0], argArray[1], argArray[2], argArray[3], argArray[4], argArray[5]); errorObj.value = this.value; @@ -211,7 +210,6 @@ $(document).ready(function() { dataType: 'json', cache: false, beforeSend: function(xhr) { - console.log("base64: " + base64); xhr.setRequestHeader("Authorization", "Basic " + base64); }, success: function(data, textStatus, jqXHR) { @@ -244,6 +242,10 @@ $(document).ready(function() { dataType: 'json', data: newFormData, success: saveSuccessFunction, + cache: false, + beforeSend: function(xhr) { + xhr.setRequestHeader("Authorization", "Basic " + base64); + }, error: function(jqXHR, textStatus, errorThrown) { handleXhrError(jqXHR, textStatus, errorThrown, "#formErrorsTemplate", "#formerrors"); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/DataValidatorBuilder.java b/mifosng-provider/src/main/java/org/mifosng/platform/DataValidatorBuilder.java index e33fd7953..013a122f2 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/DataValidatorBuilder.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/DataValidatorBuilder.java @@ -41,6 +41,21 @@ public class DataValidatorBuilder { this.ignoreNullValue = true; return this; } + + + public DataValidatorBuilder andNotBlank(String linkedParameterName, String linkedValue) { + if (value == null && linkedValue == null && ignoreNullValue) { + return this; + } + + if (StringUtils.isBlank(linkedValue)) { + StringBuilder validationErrorCode = new StringBuilder("validation.msg.").append(resource).append(".").append(linkedParameterName).append(".cannot.be.empty.when.").append(parameter).append(".is.populated"); + StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(linkedParameterName).append(" cannot be empty when ").append(parameter).append(" is populated."); + ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), defaultEnglishMessage.toString(), linkedParameterName, linkedValue, value); + dataValidationErrors.add(error); + } + return this; + } public DataValidatorBuilder equalToParameter(String linkedParameterName, Object linkedValue) { if (value == null && linkedValue == null && ignoreNullValue) { @@ -161,10 +176,31 @@ public class DataValidatorBuilder { return this; } - public void inValidValue(String parameterValueCode, Object invalidValue) { + public DataValidatorBuilder inValidValue(String parameterValueCode, Object invalidValue) { StringBuilder validationErrorCode = new StringBuilder("validation.msg.").append(resource).append(".").append(parameter).append(".invalid.").append(parameterValueCode); StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(parameter).append(" has an invalid value."); ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), defaultEnglishMessage.toString(), parameter, invalidValue); - dataValidationErrors.add(error); + dataValidationErrors.add(error); + return this; + } + + public DataValidatorBuilder mustBeBlankWhenParameterProvided(String parameterName, Object parameterValue) { + if (value == null && ignoreNullValue) { + return this; + } + + if (value == null && parameterValue != null) { + return this; + } + + if (value != null && StringUtils.isBlank(value.toString()) && parameterValue != null && StringUtils.isNotBlank(parameterValue.toString())) { + return this; + } + + StringBuilder validationErrorCode = new StringBuilder("validation.msg.").append(resource).append(".").append(parameter).append(".cannot.also.be.provided.when.").append(parameterName).append(".is.populated"); + StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(parameter).append(" cannot also be provided when ").append(parameterName).append(" is populated."); + ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), defaultEnglishMessage.toString(), parameter, value, parameterName, parameterValue); + dataValidationErrors.add(error); + return this; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientCommandValidator.java b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientCommandValidator.java index 11819e2fb..b33e7db4c 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientCommandValidator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientCommandValidator.java @@ -6,6 +6,7 @@ import java.util.List; import org.apache.commons.lang.StringUtils; import org.mifosng.data.ApiParameterError; import org.mifosng.data.command.ClientCommand; +import org.mifosng.platform.DataValidatorBuilder; import org.mifosng.platform.exceptions.PlatformApiDataValidationException; public class ClientCommandValidator { @@ -15,46 +16,61 @@ public class ClientCommandValidator { public ClientCommandValidator(ClientCommand command) { this.command = command; } + + public void validateForUpdate() { + + } - public void validate() { + public void validateForCreate() { List dataValidationErrors = new ArrayList(); - if (command.getOfficeId() == null || command.getOfficeId().equals(Long.valueOf(-1))) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.office.cannot.be.blank", "The parameter officeId cannot be blank.", "officeId"); - dataValidationErrors.add(error); - } + DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("client"); - if (StringUtils.isNotBlank(command.getFullname()) && (StringUtils.isNotBlank(command.getFirstname()) || StringUtils.isNotBlank(command.getLastname()))) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.fullname.cannot.entered.when.firstname.or.lastname.entered", "The parameter fullname cannot be blank.", "fullname"); - dataValidationErrors.add(error); - } - - if (StringUtils.isBlank(command.getFirstname()) && StringUtils.isBlank(command.getLastname()) ) { - - if (StringUtils.isBlank(command.getFullname())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.fullname.must.be.provide.or.firstname.lastname", "The parameter fullname cannot be blank or firstName and lastName must be both provided.", "fullname"); - dataValidationErrors.add(error); - } + if (StringUtils.isNotBlank(command.getFullname())) { + baseDataValidator.reset().parameter("firstname").value(command.getFirstname()).mustBeBlankWhenParameterProvided("fullname", command.getFullname()); + baseDataValidator.reset().parameter("lastname").value(command.getLastname()).mustBeBlankWhenParameterProvided("fullname", command.getFullname()); } else { - if (StringUtils.isBlank(command.getFirstname())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.firstname.cannot.be.blank", "The parameter firstname cannot be blank.", "firstname"); - dataValidationErrors.add(error); - } - - if (StringUtils.isBlank(command.getLastname())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.lastname.cannot.be.blank", "The parameter lastname cannot be blank.", "lastname"); - dataValidationErrors.add(error); - } + baseDataValidator.reset().parameter("firstname").value(command.getFirstname()).notBlank();//.andNotBlank("lastname", command.getLastname()); + baseDataValidator.reset().parameter("lastname").value(command.getLastname()).notBlank();//.andNotBlank("firstname", command.getFirstname()); } - if (command.getJoiningDate() == null) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.joining.date.cannot.be.blank", "The parameter joiningDate cannot be blank.", "joiningDate"); - dataValidationErrors.add(error); - } + baseDataValidator.reset().parameter("openingDateFormatted").value(command.getJoiningDateFormatted()).notBlank(); + baseDataValidator.reset().parameter("externalId").value(command.getExternalId()).notExceedingLengthOf(100); + baseDataValidator.reset().parameter("officeId").value(command.getOfficeId()).notNull().greaterThanZero(); if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); } + +// if (StringUtils.isNotBlank(command.getFullname()) && (StringUtils.isNotBlank(command.getFirstname()) || StringUtils.isNotBlank(command.getLastname()))) { +// ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.fullname.cannot.entered.when.firstname.or.lastname.entered", "The parameter fullname cannot be blank.", "fullname"); +// dataValidationErrors.add(error); +// } +// if (StringUtils.isBlank(command.getFirstname()) && StringUtils.isBlank(command.getLastname()) ) { +// +// if (StringUtils.isBlank(command.getFullname())) { +// ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.fullname.must.be.provide.or.firstname.lastname", "The parameter fullname cannot be blank or firstName and lastName must be both provided.", "fullname"); +// dataValidationErrors.add(error); +// } +// } else { +// if (StringUtils.isBlank(command.getFirstname())) { +// ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.firstname.cannot.be.blank", "The parameter firstname cannot be blank.", "firstname"); +// dataValidationErrors.add(error); +// } +// +// if (StringUtils.isBlank(command.getLastname())) { +// ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.lastname.cannot.be.blank", "The parameter lastname cannot be blank.", "lastname"); +// dataValidationErrors.add(error); +// } +// } +// +// if (command.getJoiningDate() == null) { +// ApiParameterError error = ApiParameterError.parameterError("validation.msg.client.joining.date.cannot.be.blank", "The parameter joiningDate cannot be blank.", "joiningDate"); +// dataValidationErrors.add(error); +// } +// +// if (!dataValidationErrors.isEmpty()) { +// throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); +// } } - } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformServiceImpl.java index 1f187c430..6b1e402f3 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientReadPlatformServiceImpl.java @@ -17,6 +17,7 @@ import org.mifosng.data.ClientLoanAccountSummaryCollectionData; import org.mifosng.data.ClientLoanAccountSummaryData; import org.mifosng.data.NoteData; import org.mifosng.data.OfficeData; +import org.mifosng.data.OfficeLookup; import org.mifosng.platform.exceptions.PlatformResourceNotFoundException; import org.mifosng.platform.organisation.domain.Organisation; import org.mifosng.platform.organisation.service.OfficeReadPlatformService; @@ -101,17 +102,17 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService AppUser currentUser = context.authenticatedUser(); - List offices = new ArrayList(officeReadPlatformService.retrieveAllOffices()); + List offices = new ArrayList(officeReadPlatformService.retrieveAllOfficesForLookup()); ClientData clientData = new ClientData(); clientData.setOfficeId(currentUser.getOffice().getId()); clientData.setOrganisationId(currentUser.getOrganisation().getId()); clientData.setAllowedOffices(offices); - clientData.setDisplayName(""); - clientData.setFirstname(""); - clientData.setLastname(""); - clientData.setId(Long.valueOf(-1)); +// clientData.setDisplayName(""); +// clientData.setFirstname(""); +// clientData.setLastname(""); +// clientData.setId(Long.valueOf(-1)); clientData.setJoinedDate(new LocalDate()); return clientData; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java index 468014b61..b6d6a5c26 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java @@ -1,6 +1,7 @@ package org.mifosng.platform.client.service; -import static org.mifosng.platform.Specifications.*; +import static org.mifosng.platform.Specifications.clientsThatMatch; +import static org.mifosng.platform.Specifications.officesThatMatch; import org.apache.commons.lang.StringUtils; import org.mifosng.data.EntityIdentifier; @@ -42,7 +43,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP AppUser currentUser = context.authenticatedUser(); ClientCommandValidator validator = new ClientCommandValidator(command); - validator.validate(); + validator.validateForCreate(); Office clientOffice = this.officeRepository.findOne(officesThatMatch(currentUser.getOrganisation(), command.getOfficeId())); @@ -66,8 +67,8 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP AppUser currentUser = context.authenticatedUser(); - //EnrollClientCommandValidator validator = new EnrollClientCommandValidator(command); - //validator.validate(); + ClientCommandValidator validator = new ClientCommandValidator(command); + validator.validateForUpdate(); Office clientOffice = this.officeRepository.findOne(officesThatMatch(currentUser.getOrganisation(), command.getOfficeId()));