package fr.openwide.core.wicket.more.model.threadsafe;
import java.io.Serializable;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.wicket.Session;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
/**
* An alternative implementation of {@link Model} that is thread-safe, and may thus be used in multiple request cycles at the same time.
* <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 model need not maintain a cache (on contrary to loadable/detachable models such as {@link SessionThreadSafeSimpleLoadableDetachableModel} or {@link SessionThreadSafeDerivedSerializableStateLoadableDetachableModel}).
* </ul>
* <p><strong>WARNING:</strong> Access to members of the model object is obviously not secured by this model in any way, so writing to the model
* object is <strong>NOT</strong> thread-safe, unless the object implements thread safety.
*/
public class SessionThreadSafeModel<T extends Serializable> implements IModel<T> {
private static final long serialVersionUID = 4954375223101982404L;
private final AtomicReference<T> objectReference = new AtomicReference<T>();
public SessionThreadSafeModel() { }
public SessionThreadSafeModel(T object) {
setObject(object);
}
@Override
public T getObject() {
return objectReference.get();
}
@Override
public void setObject(T object) {
objectReference.set(object);
}
@Override
public void detach() {
// Nothing to do
}
}