/* * Databinder: a simple bridge from Wicket to Hibernate * Copyright (C) 2006 Nathan Hamblen nathan@technically.us * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package net.databinder.models; import org.apache.wicket.model.IModel; /** * Adaptation of Wicket's LoadableDetachableModel that does not extend a * read-only model and permits changing the underlying object. */ public abstract class LoadableWritableModel<T> implements IModel<T> { private transient boolean attached = false; private transient T tempModelObject; public LoadableWritableModel() { } public final void detach() { if (attached) { attached = false; tempModelObject = null; onDetach(); } } public T getObject() { if (!attached) { attached = true; tempModelObject = load(); onAttach(); } return tempModelObject; } public final boolean isAttached() { return attached; } /** * Called by subclass when the model object is readily available. Saves a later * (possibly expensive) call to load(). * @param object */ protected void setTempModelObject(T object) { attached = true; tempModelObject = object; } public String toString() { StringBuffer sb = new StringBuffer(super.toString()); sb.append(":attached=").append(attached).append(":tempModelObject=[") .append(this.tempModelObject).append("]"); return sb.toString(); } protected abstract T load(); /** * Called when attaching, after load(). */ protected void onAttach() { } /** * Called when detaching. */ protected void onDetach() { } }