package org.openmrs.module.reporting.web.validator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.module.reporting.evaluation.parameter.Parameter;
import org.openmrs.module.reporting.web.model.IndicatorForm;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
/**
* TODO Rename validate methods to specify what data is being validated.
*
* Step 1 - validateIndicatorType()
* Step 2 - validateCohortDefinition()
* Step 3 - validateParameterMapping()
* Step 4 - validateCohortIndicator() or validate()
*
*
*/
public class IndicatorFormValidator implements Validator {
private Log log = LogFactory.getLog(this.getClass());
public boolean supports(Class type) {
return IndicatorForm.class.isAssignableFrom(type);
}
/**
* Should validate all data in the form.
*/
public void validate(Object obj, Errors errors) {
IndicatorForm indicatorForm = (IndicatorForm) obj;
validateCohortIndicator(indicatorForm, errors);
if ("COUNT".equals(indicatorForm.getIndicatorType())) {
validateCountIndicator(indicatorForm, errors);
}
else if ("FRACTION".equals(indicatorForm.getIndicatorType())) {
validateFractionIndicator(indicatorForm, errors);
}
else if ("LOGIC".equals(indicatorForm.getIndicatorType())) {
//validateLogicIndicator(indicatorForm, errors);
}
else {
// unknown indicator type
errors.rejectValue("indicatorType", "cohortIndicator.errors.unknownIndicatorType",
new Object[] { indicatorForm.getIndicatorType() }, "Unknown indicator type");
}
}
/**
* Should validate all data submitted in step 1.
* @param indicatorForm
* @param errors
*/
public void validateCohortIndicator(IndicatorForm indicatorForm, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "cohortIndicator.name", "cohortIndicator.errors.name.required", "Must specify indicator name");
ValidationUtils.rejectIfEmpty(errors, "indicatorType", "cohortIndicator.errors.type.required", "Must specify indicator calculation type");
ValidationUtils.rejectIfEmpty(errors, "cohortIndicator.description", "cohortIndicator.errors.description.required", "Must specify description");
}
/**
*
* @param indicatorForm
* @param errors
*/
public void validateLocationFilter(IndicatorForm indicatorForm, Errors errors) {
List<Parameter> parameters = indicatorForm.getLocationFilter().getParameters();
for(Parameter parameter : parameters) {
Object value = indicatorForm.getLocationFilterParameterMapping().get(parameter.getName());
if (value == null || value.equals("")) {
errors.rejectValue("locationFilterParameterMapping", "cohortIndicator.errors.parameterMapping.required",
new Object[] { value }, "Must map each parameter on the location filter");
}
}
}
/**
* Should validate whether all parameter mappings have been specified.
*
* @param indicatorForm
* @param errors
*
*/
public void validateCountIndicator(IndicatorForm indicatorForm, Errors errors) {
if (indicatorForm != null) {
validateCohortIndicator(indicatorForm, errors);
if (indicatorForm.getCohortDefinition() == null) {
// errors, field, errorKey, defaultMessage
ValidationUtils.rejectIfEmpty(errors, "cohortDefinition", "cohortDefinition.required", "Must specify a cohort definition for simple indiator");
}
List<Parameter> parameters = indicatorForm.getCohortDefinition().getParameters();
for(Parameter parameter : parameters) {
Object value = indicatorForm.getParameterMapping().get(parameter.getName());
log.debug("value = '" + value + "'");
if (value == null || value.equals("")) {
errors.rejectValue("denominatorParameterMapping", "cohortIndicator.errors.parameterMapping.required",
new Object[] { value }, "Must map each parameter on the count indicator");
}
}
}
}
/**
*
* @param indicatorForm
* @param errors
*/
public void validateFractionIndicator(IndicatorForm indicatorForm, Errors errors) {
if (indicatorForm.getNumerator() == null) {
ValidationUtils.rejectIfEmpty(errors, "numerator", "cohortDefinition.required", "Must specify a numerator for fractional indicator");
}
if (indicatorForm.getDenominator() == null) {
ValidationUtils.rejectIfEmpty(errors, "denominator", "cohortDefinition.required", "Must specify a denominator for fractional indicator");
}
List<Parameter> parameters = indicatorForm.getNumerator().getParameters();
for(Parameter parameter : parameters) {
Object value = indicatorForm.getNumeratorParameterMapping().get(parameter.getName());
log.debug("value = '" + value + "'");
if (value == null || value.equals("")) {
errors.rejectValue("numeratorParameterMapping", "cohortIndicator.errors.parameterMappingRequired",
new Object[] { value }, "Must map each parameter on the numerator");
}
}
parameters = indicatorForm.getDenominator().getParameters();
for(Parameter parameter : parameters) {
Object value = indicatorForm.getDenominatorParameterMapping().get(parameter.getName());
log.debug("value = '" + value + "'");
if (value == null || value.equals("")) {
errors.rejectValue("denominatorParameterMapping", "cohortIndicator.errors.parameterMappingRequired",
new Object[] { value }, "Must map each parameter on the denominator");
}
}
}
}