package fr.openwide.core.wicket.more.model.threadsafe;
import org.apache.wicket.Session;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import fr.openwide.core.wicket.more.model.threadsafe.impl.AbstractThreadSafeLoadableDetachableModel;
import fr.openwide.core.wicket.more.model.threadsafe.impl.LoadableDetachableModelThreadContext;
/**
* An implementation of {@link LoadableDetachableModel} that is thread-safe, and may thus be used in multiple request cycles at the same time.
* <p>When in doubt, use this class as a basis for your thread-safe loadable/detachable model.
* <p>This class should be used when :
* <ul>
* <li>the model is stored in a global object, such as the {@link Session wicket session}
* <li>the serializable state of this loadable/detachable model is empty (no non-transient member) or not directly related to the model object (for instance, it is contained in a member whose type is {@link IModel}).
* </ul>
*
* @param <T> The type of the model object.
*/
public abstract class SessionThreadSafeSimpleLoadableDetachableModel<T>
extends AbstractThreadSafeLoadableDetachableModel<T, SessionThreadSafeSimpleLoadableDetachableModel<T>.ThreadContextImpl> {
private static final long serialVersionUID = 6859907414385876596L;
protected class ThreadContextImpl extends LoadableDetachableModelThreadContext<T> { }
public SessionThreadSafeSimpleLoadableDetachableModel() { }
public SessionThreadSafeSimpleLoadableDetachableModel(T object) {
setObject(object);
}
@Override
protected final ThreadContextImpl newThreadContext() {
return new ThreadContextImpl();
}
@Override
protected final T load(ThreadContextImpl threadContext) {
return load();
}
/**
* Loads the model object value from the implementation-defined data source.
*/
protected abstract T load();
@Override
protected final void onSetObject(ThreadContextImpl threadContext) {
save(threadContext.getTransientModelObject());
}
protected void save(T object) {
// Does nothing by default
}
@Override
protected final void onDetach(ThreadContextImpl threadContext) {
onDetach();
}
protected void onDetach() {
// Does nothing by default
}
@Override
protected void onDetachDetached() {
// Does nothing by default
}
}