package fr.openwide.core.wicket.more.markup.html.factory; import org.apache.wicket.model.IModel; import org.springframework.security.acls.model.Permission; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import fr.openwide.core.wicket.more.condition.BooleanOperator; import fr.openwide.core.wicket.more.condition.Condition; import fr.openwide.core.wicket.more.util.model.Detachables; public final class ConditionFactories { private ConditionFactories() { } public static final <T> IDetachableFactory<T, Condition> constant(final Condition condition) { return new AbstractDetachableFactory<T, Condition>() { private static final long serialVersionUID = 1L; @Override public Condition create(T parameter) { return condition; } @Override public void detach() { super.detach(); Detachables.detach(condition); } }; } public static final <T> IDetachableFactory<T, Condition> negate(final IDetachableFactory<T, Condition> factory) { return new AbstractDetachableFactory<T, Condition>() { private static final long serialVersionUID = 1L; @Override public Condition create(T parameter) { return factory.create(parameter).negate(); } @Override public void detach() { super.detach(); Detachables.detach(factory); } }; } @SafeVarargs public static final <T> IDetachableFactory<T, Condition> compose( final BooleanOperator operator, final IDetachableFactory<T, Condition> firstFactory, final IDetachableFactory<T, Condition> ... otherFactories ) { return new AbstractDetachableFactory<T, Condition>() { private static final long serialVersionUID = 1L; @Override public Condition create(final T parameter) { return Condition.composite( operator, Iterables.transform( Lists.asList(firstFactory, otherFactories), DetachableFactories.<T, Condition>toApplyFunction(parameter) ) ); } @Override public void detach() { super.detach(); Detachables.detach(firstFactory, otherFactories); } }; } @SafeVarargs public static final <T> IDetachableFactory<T, Condition> or( final IDetachableFactory<T, Condition> firstFactory, final IDetachableFactory<T, Condition> ... otherFactories ) { return compose(BooleanOperator.OR, firstFactory, otherFactories); } @SafeVarargs public static final <T> IDetachableFactory<T, Condition> and( final IDetachableFactory<T, Condition> firstFactory, final IDetachableFactory<T, Condition> ... otherFactories ) { return compose(BooleanOperator.AND, firstFactory, otherFactories); } public static final <T> IDetachableFactory<IModel<? extends T>, Condition> predicate(final Predicate<? super T> predicate) { return new AbstractDetachableFactory<IModel<? extends T>, Condition>() { private static final long serialVersionUID = 1L; @Override public Condition create(IModel<? extends T> parameter) { return Condition.predicate(parameter, predicate); } }; } public static final <T> IDetachableFactory<IModel<? extends T>, Condition> permission(final String permission) { return new AbstractDetachableFactory<IModel<? extends T>, Condition>() { private static final long serialVersionUID = 1L; @Override public Condition create(IModel<? extends T> parameter) { return Condition.permission(parameter, permission); } }; } public static final <T> IDetachableFactory<IModel<? extends T>, Condition> permission(final Permission permission) { return new AbstractDetachableFactory<IModel<? extends T>, Condition>() { private static final long serialVersionUID = 1L; @Override public Condition create(IModel<? extends T> parameter) { return Condition.permission(parameter, permission); } }; } }