package fr.openwide.core.wicket.more.util.validate.validators; import javax.annotation.Nonnull; import org.apache.wicket.Component; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.validation.AbstractFormValidator; import org.apache.wicket.model.IModel; import org.apache.wicket.validation.ValidationError; import fr.openwide.core.commons.util.CloneUtils; public abstract class AbstractUnicityFormValidator<T> extends AbstractFormValidator { private static final long serialVersionUID = 3673024433333068895L; private final FormComponent<?>[] components; private final IModel<? extends T> mainObjectModel; private final String errorKey; public AbstractUnicityFormValidator(IModel<? extends T> mainObjectModel, String errorKey, FormComponent<?>... components) { super(); this.mainObjectModel = mainObjectModel; this.errorKey = errorKey; this.components = CloneUtils.clone(components); } @Override public void detach(Component component) { super.detach(component); mainObjectModel.detach(); } @Override public FormComponent<?>[] getDependentFormComponents() { return CloneUtils.clone(components); } @Override public void validate(Form<?> form) { final FormComponent<?> formComponent1 = components[0]; T mainObject = mainObjectModel.getObject(); T matchingObject = getByUniqueField(); if (matchingObject != null && !isSame(matchingObject, mainObject)) { error(formComponent1, errorKey); } } protected boolean isSame(@Nonnull T matchingObject, T mainObject) { return matchingObject.equals(mainObject); } protected ValidationError decorate(ValidationError error) { // Does nothing by default return error; } protected abstract T getByUniqueField(); }