package fr.openwide.core.wicket.more.link.descriptor.mapper;
import org.apache.wicket.model.IModel;
import org.javatuples.Pair;
import com.google.common.base.Function;
import fr.openwide.core.wicket.more.model.ReadOnlyModel;
import fr.openwide.core.wicket.more.util.model.Models;
public abstract class AbstractTwoParameterLinkDescriptorMapper<L, T1, T2>
implements ITwoParameterLinkDescriptorMapper<L, T1, T2> {
private static final long serialVersionUID = 1993813798185549585L;
@Override
public void detach() { }
@Override
public abstract L map(Pair<? extends IModel<T1>, ? extends IModel<T2>> param);
@Override
public final L map(IModel<T1> model1, IModel<T2> model2) {
return map(Pair.with(model1, model2));
}
@Override
public IOneParameterLinkDescriptorMapper<L, T2> setParameter1(final IModel<T1> model1) {
return new AbstractOneParameterLinkDescriptorMapper<L, T2>() {
private static final long serialVersionUID = 1L;
@Override
public L map(IModel<T2> model2) {
return AbstractTwoParameterLinkDescriptorMapper.this.map(model1, model2);
}
@Override
public void detach() {
super.detach();
model1.detach();
AbstractTwoParameterLinkDescriptorMapper.this.detach();
}
};
}
@Override
public IOneParameterLinkDescriptorMapper<L, T2> setParameter1(final Function<T2, T1> function) {
return new AbstractOneParameterLinkDescriptorMapper<L, T2>() {
private static final long serialVersionUID = 1L;
@Override
public L map(IModel<T2> model2) {
return AbstractTwoParameterLinkDescriptorMapper.this.map(ReadOnlyModel.of(model2, function), model2);
}
@Override
public void detach() {
super.detach();
AbstractTwoParameterLinkDescriptorMapper.this.detach();
}
};
}
@Override
public <U1 extends T1> ITwoParameterLinkDescriptorMapper<L, U1, T2> castParameter1() {
return new AbstractTwoParameterLinkDescriptorMapper<L, U1, T2>() {
private static final long serialVersionUID = 1L;
@Override
public L map(Pair<? extends IModel<U1>, ? extends IModel<T2>> param) {
return AbstractTwoParameterLinkDescriptorMapper.this.map(param.setAt0(ReadOnlyModel.<T1>of(param.getValue0())));
}
@Override
public void detach() {
super.detach();
AbstractTwoParameterLinkDescriptorMapper.this.detach();
}
};
}
@Override
public IOneParameterLinkDescriptorMapper<L, T2> ignoreParameter1() {
return setParameter1(Models.<T1>placeholder());
}
@Override
public IOneParameterLinkDescriptorMapper<L, T1> setParameter2(final IModel<T2> model2) {
return new AbstractOneParameterLinkDescriptorMapper<L, T1>() {
private static final long serialVersionUID = 1L;
@Override
public L map(IModel<T1> model1) {
return AbstractTwoParameterLinkDescriptorMapper.this.map(model1, model2);
}
@Override
public void detach() {
super.detach();
model2.detach();
AbstractTwoParameterLinkDescriptorMapper.this.detach();
}
};
}
@Override
public IOneParameterLinkDescriptorMapper<L, T1> setParameter2(final Function<T1, T2> function) {
return new AbstractOneParameterLinkDescriptorMapper<L, T1>() {
private static final long serialVersionUID = 1L;
@Override
public L map(IModel<T1> model1) {
return AbstractTwoParameterLinkDescriptorMapper.this.map(model1, ReadOnlyModel.of(model1, function));
}
@Override
public void detach() {
super.detach();
AbstractTwoParameterLinkDescriptorMapper.this.detach();
}
};
}
@Override
public <U2 extends T2> ITwoParameterLinkDescriptorMapper<L, T1, U2> castParameter2() {
return new AbstractTwoParameterLinkDescriptorMapper<L, T1, U2>() {
private static final long serialVersionUID = 1L;
@Override
public L map(Pair<? extends IModel<T1>, ? extends IModel<U2>> param) {
return AbstractTwoParameterLinkDescriptorMapper.this.map(param.setAt1(ReadOnlyModel.<T2>of(param.getValue1())));
}
@Override
public void detach() {
super.detach();
AbstractTwoParameterLinkDescriptorMapper.this.detach();
}
};
}
@Override
public IOneParameterLinkDescriptorMapper<L, T1> ignoreParameter2() {
return setParameter2(Models.<T2>placeholder());
}
}