package fr.openwide.core.wicket.more.util.validate.validators;
import java.util.Objects;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
import com.google.common.base.Predicate;
import fr.openwide.core.wicket.more.util.model.Detachables;
public class PredicateValidator<T> extends Behavior implements IValidator<T> {
private static final long serialVersionUID = 2351404391379818307L;
private final Predicate<? super T> predicate;
private IModel<String> errorKeyModel;
private IModel<String> errorMessageModel;
public PredicateValidator<T> of(Predicate<? super T> predicate) {
return new PredicateValidator<T>(predicate);
}
/**
* @deprecated Use {@link #of(Predicate)} and {@link PredicateValidator#errorKey(String)}
*/
@Deprecated
public PredicateValidator(Predicate<? super T> predicate, String errorKey) {
this(predicate);
errorKey(errorKey);
}
public PredicateValidator(Predicate<? super T> predicate) {
super();
this.predicate = Objects.requireNonNull(predicate);
}
public Predicate<? super T> getPredicate() {
return predicate;
}
public PredicateValidator<T> errorKey(String errorKey) {
return errorKey(Model.of(errorKey));
}
public PredicateValidator<T> errorKey(IModel<String> errorKeyModel) {
this.errorKeyModel = errorKeyModel;
return this;
}
public PredicateValidator<T> errorMessage(IModel<String> errorMessageModel) {
this.errorMessageModel = errorMessageModel;
return this;
}
@Override
public void validate(IValidatable<T> validatable) {
if (!predicate.apply(validatable.getValue())) {
validatable.error(decorate(new ValidationError(this)));
}
}
private ValidationError decorate(ValidationError validationError) {
if (errorKeyModel != null) {
validationError.addKey(errorKeyModel.getObject());
}
if (errorMessageModel != null) {
validationError.setMessage(errorMessageModel.getObject());
}
return validationError;
}
@Override
public void detach(Component component) {
super.detach(component);
Detachables.detach(errorKeyModel, errorMessageModel);
}
}