You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Ilja Pavkovic <il...@binaere-bauten.de> on 2010/03/18 21:27:34 UTC
LoadableDetachableListModel
Hi,
if someone is interested in a LoadableDetachableListModel where every single
entity in the List is loaded per request by its own detachable model, see
below :).
I found it quite useful. I needed for a multi file upload panel where all
changes entities shall be saved in one step.
public class DocumentModel<Document> extends
LoadableDetachableListModel<Document>{
public DDE(List<Document> entities) {
super(entities);
}
protected IModel<T> createModel(Document entity) {
return new EntityBaseLoadableDetachableModel<Document>(entity);
}
}
package de.binaerebauten.app.presentation.wicket.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
@SuppressWarnings("serial")
public abstract class LoadableDetachableListModel<T> extends
LoadableDetachableModel<List<T>>{
private List<IModel<T>> modelsList = new ArrayList<IModel<T>>();
private List<T> entities;
public LoadableDetachableListModel() {
}
public LoadableDetachableListModel(List<T> entities) {
addAll(entities);
}
protected void addAll(List<T> entities) {
for(T entity: entities) {
add(entity);
}
}
public void onDetach() {
for(IModel<T> model : modelsList) {
model.detach();
}
entities = null;
}
private List<T> loadAll() {
List<T> rv = new ArrayList<T>();
for(IModel<T> model : modelsList) {
rv.add(model.getObject());
}
return rv;
}
protected List<T> load() {
if(entities != null) {
return entities;
}
entities = new List<T>() {
public boolean add(T o) {
return modelsList.add(createModel(o));
}
public void add(int index, T element) {
modelsList.add(index, createModel(element));
}
public boolean addAll(Collection<? extends T> c) {
throw new UnsupportedOperationException();
}
public boolean addAll(int index, Collection<? extends T> c) {
throw new UnsupportedOperationException();
}
public void clear() {
modelsList.clear();
}
public boolean contains(Object o) {
return indexOf(o) > -1;
}
public boolean containsAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
public T get(int index) {
IModel<T> model = modelsList.get(index);
return model.getObject();
}
public int indexOf(Object o) {
int pos = 0;
for(IModel<T> model : modelsList) {
T o1 = model.getObject();
if(o1.equals(o)) {
return pos;
}
pos++;
}
return -1;
}
public boolean isEmpty() {
return modelsList.isEmpty();
}
public Iterator<T> iterator() {
return new Iterator<T>() {
Iterator<IModel<T>> delegate = modelsList.iterator();
public boolean hasNext() {
return delegate.hasNext();
}
public T next() {
IModel<T> model = delegate.next();
return model == null ? null : model.getObject();
}
public void remove() {
delegate.remove();
}
};
}
public int lastIndexOf(Object o) {
throw new UnsupportedOperationException();
}
public ListIterator<T> listIterator() {
throw new UnsupportedOperationException();
}
public ListIterator<T> listIterator(int index) {
throw new UnsupportedOperationException();
}
public boolean remove(Object o) {
int idx = indexOf(o);
if(idx == -1) {
return false;
}
remove(idx);
return true;
}
public T remove(int index) {
IModel<T> model = modelsList.remove(index);
return model == null ? null : model.getObject();
}
public boolean removeAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
public boolean retainAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
public T set(int index, T element) {
IModel<T> model = modelsList.set(index,
createModel(element));
return model == null ? null : model.getObject();
}
public int size() {
return modelsList.size();
}
public List<T> subList(int fromIndex, int toIndex) {
return loadAll().subList(fromIndex, toIndex);
}
public Object[] toArray() {
throw new UnsupportedOperationException();
}
public <U> U[] toArray(U[] a) {
throw new UnsupportedOperationException();
}
};
return entities;
}
public boolean add(T entity) {
return modelsList.add(createModel(entity));
}
protected abstract IModel<T> createModel(T entity);
}
--
binaere bauten gmbh · tempelhofer ufer 1a · 10961 berlin
+49 · 171 · 9342 465
Handelsregister: HRB 115854 - Amtsgericht Charlottenburg
Geschäftsführer: Dipl.-Inform. Ilja Pavkovic, Dipl.-Inform. Jost Becker
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org