package fr.openwide.core.wicket.markup.html.model;
import java.util.Collection;
import org.apache.wicket.model.IModel;
import com.google.common.base.Supplier;
/**
* A wrapper allowing to handle an IModel<? extends Collection<T>> as if it were an IModel<Collection<T>>, both when reading it and writing to it.
*
* @param <T> The collection's element type
* @param <C> The underlying collection type
*/
public class ConcreteCollectionToCollectionWrapperModel<T, C extends Collection<T>> implements IModel<Collection<T>> {
private static final long serialVersionUID = -6342356257002249205L;
private final IModel<C> concreteCollectionModel;
private final Supplier<? extends C> concreteCollectionSupplier;
public ConcreteCollectionToCollectionWrapperModel(IModel<C> concreteCollectionModel, Supplier<? extends C> concreteCollectionSupplier) {
this.concreteCollectionModel = concreteCollectionModel;
this.concreteCollectionSupplier = concreteCollectionSupplier;
}
@Override
public Collection<T> getObject() {
return concreteCollectionModel.getObject();
}
@Override
public void setObject(Collection<T> object) {
C concreteCollection;
if (object == null) {
concreteCollection = null;
} else {
concreteCollection = concreteCollectionSupplier.get();
concreteCollection.addAll(object);
}
concreteCollectionModel.setObject(concreteCollection);
}
@Override
public void detach() {
concreteCollectionModel.detach();
}
}