package fr.openwide.core.wicket.more.util.validate.validators;
import java.util.Collection;
import javax.annotation.Nonnull;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.model.IModel;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
public abstract class AbstractPartialUnicityValidator<T, V> extends Behavior implements IValidator<V> {
private static final long serialVersionUID = -7514727402418569911L;
public static final String MAIN_OBJECT_VARIABLE_NAME = "main";
public static final String CONFLICTING_OBJECTS_VARIABLE_NAME = "conflicting";
private final IModel<? extends T> mainObjectModel;
private final String errorKey;
public AbstractPartialUnicityValidator(IModel<? extends T> mainObjectModel, String errorKey) {
super();
this.mainObjectModel = mainObjectModel;
this.errorKey = errorKey;
}
@Override
public void detach(Component component) {
super.detach(component);
mainObjectModel.detach();
}
@Override
public void validate(IValidatable<V> validatable) {
T mainObject = mainObjectModel.getObject();
Collection<T> matchingObjects = listByUniqueField(validatable.getValue());
if (matchingObjects != null && !matchingObjects.isEmpty() && !contains(matchingObjects, mainObject)) {
validatable.error(decorate(
new ValidationError(this).addKey(errorKey)
.setVariable(MAIN_OBJECT_VARIABLE_NAME, mainObject)
.setVariable(CONFLICTING_OBJECTS_VARIABLE_NAME, matchingObjects)
));
}
}
protected boolean contains(@Nonnull Collection<T> matchingObjects, T mainObject) {
return matchingObjects.contains(mainObject);
}
protected ValidationError decorate(ValidationError error) {
// Does nothing by default
return error;
}
protected abstract Collection<T> listByUniqueField(V value);
}