package fr.openwide.core.wicket.more.markup.html.form.validation;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collection;
import java.util.Comparator;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.util.lang.Classes;
import org.apache.wicket.validation.ValidationError;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Ordering;
public class ComparableFormModelValidator<T extends Comparable<T>> implements IFormModelValidator {
private static final long serialVersionUID = 2750525584310932237L;
private final Collection<FormComponent<T>> components;
private final Comparator<T> comparator;
private final String errorRessourceKey;
public ComparableFormModelValidator(FormComponent<T> formComponent1, FormComponent<T> formComponent2, String errorKey) {
this(formComponent1, formComponent2, Ordering.<T>natural(), errorKey);
}
public ComparableFormModelValidator(FormComponent<T> formComponent1, FormComponent<T> formComponent2, Comparator<T> comparator, String errorKey) {
checkNotNull(formComponent1);
checkNotNull(formComponent2);
checkNotNull(comparator);
this.components = ImmutableList.of(formComponent1, formComponent2);
this.comparator = comparator;
this.errorRessourceKey = errorKey;
}
@Override
public void detach() {
// Nothing to do here
}
@Override
public void validate(Form<?> form) {
FormComponent<T> formComponent1 = Iterables.get(components, 0);
FormComponent<T> formComponent2 = Iterables.get(components, 1);
if (
formComponent1.getConvertedInput() != null
&& formComponent2.getConvertedInput() != null
&& comparator.compare(formComponent1.getConvertedInput(), formComponent2.getConvertedInput()) > 0
) {
formComponent2.error(new ValidationError().addKey(errorRessourceKey).addKey(Classes.simpleName(getClass())));
}
}
@Override
public FormComponent<?>[] getDependentFormComponents() {
return Iterables.toArray(components, FormComponent.class);
}
}