package fr.openwide.core.wicket.more.link.descriptor.parameter.validator; import java.util.Collection; import org.apache.wicket.model.IModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.lang.Args; import org.bindgen.BindingRoot; import org.javatuples.Tuple; import org.javatuples.Unit; import com.google.common.base.Predicate; import fr.openwide.core.wicket.more.condition.Condition; import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.factory.AbstractLinkParameterValidatorFactory; import fr.openwide.core.wicket.more.link.descriptor.parameter.validator.factory.ILinkParameterValidatorFactory; import fr.openwide.core.wicket.more.markup.html.factory.IDetachableFactory; import fr.openwide.core.wicket.more.model.BindingModel; public class ConditionLinkParameterValidator implements ILinkParameterValidator { private static final long serialVersionUID = -6678335084190190566L; private final Condition condition; public static <T extends Tuple> ILinkParameterValidatorFactory<T> fromConditionFactory( final IDetachableFactory<T, ? extends Condition> conditionFactory) { Args.notNull(conditionFactory, "conditionFactory"); return new AbstractLinkParameterValidatorFactory<T>() { private static final long serialVersionUID = 1L; @Override public ILinkParameterValidator create(T parameters) { return new ConditionLinkParameterValidator(conditionFactory.create(parameters)); } @Override public void detach() { super.detach(); conditionFactory.detach(); } }; } public static <R> ILinkParameterValidatorFactory<Unit<IModel<? extends R>>> predicateFactory(final Predicate<? super R> predicate) { Args.notNull(predicate, "predicate"); return new AbstractLinkParameterValidatorFactory<Unit<IModel<? extends R>>>() { private static final long serialVersionUID = 1L; @Override public ILinkParameterValidator create(Unit<IModel<? extends R>> parameters) { return new ConditionLinkParameterValidator(Condition.predicate(parameters.getValue0(), predicate)); } }; } public static <R> ILinkParameterValidatorFactory<Unit<IModel<? extends R>>> anyPermissionFactory(final Collection<String> permissions) { Args.notNull(permissions, "permissions"); return new AbstractLinkParameterValidatorFactory<Unit<IModel<? extends R>>>() { private static final long serialVersionUID = 1L; @Override public ILinkParameterValidator create(Unit<IModel<? extends R>> parameters) { return new ConditionLinkParameterValidator(Condition.anyPermission(parameters.getValue0(), permissions)); } }; } public static <R, T> ILinkParameterValidatorFactory<Unit<IModel<? extends R>>> anyPermissionFactory( final BindingRoot<R, T> bindingRoot, final Collection<String> permissions) { Args.notNull(bindingRoot, "bindingRoot"); Args.notNull(permissions, "permissions"); return new AbstractLinkParameterValidatorFactory<Unit<IModel<? extends R>>>() { private static final long serialVersionUID = 1L; @Override public ILinkParameterValidator create(Unit<IModel<? extends R>> parameters) { return new ConditionLinkParameterValidator(Condition.anyPermission(BindingModel.of(parameters.getValue0(), bindingRoot), permissions)); } }; } public ConditionLinkParameterValidator(Condition condition) { this.condition = condition; } @Override public void validateSerialized(PageParameters parameters, LinkParameterValidationErrorCollector collector) { // Nothing to do } @Override public void validateModel(LinkParameterValidationErrorCollector collector) { if (!condition.applies()) { collector.addError(String.format("Condition '%s' was false.", condition)); } } @Override public void detach() { condition.detach(); } }