Cleaned up LoadableDetachableModel state tracking Previous implementation crafted by me was a tad overengineered, and had some lousy naming. Fixed the naming and removed the unnecessary booleans.
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/2c2eaf51 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/2c2eaf51 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/2c2eaf51 Branch: refs/heads/WICKET-5906-7.x Commit: 2c2eaf51cd45fb563acbd0eadedb11f5250e5efc Parents: b8b7111 Author: Martijn Dashorst <[email protected]> Authored: Sat May 30 21:47:59 2015 +0200 Committer: Andrea Del Bene <â[email protected]â> Committed: Wed Jun 3 10:04:20 2015 +0200 ---------------------------------------------------------------------- .../wicket/model/LoadableDetachableModel.java | 57 +++++++------------- 1 file changed, 18 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/2c2eaf51/wicket-core/src/main/java/org/apache/wicket/model/LoadableDetachableModel.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/model/LoadableDetachableModel.java b/wicket-core/src/main/java/org/apache/wicket/model/LoadableDetachableModel.java index e3a7fc0..16c6271 100644 --- a/wicket-core/src/main/java/org/apache/wicket/model/LoadableDetachableModel.java +++ b/wicket-core/src/main/java/org/apache/wicket/model/LoadableDetachableModel.java @@ -52,39 +52,16 @@ import org.slf4j.LoggerFactory; */ public abstract class LoadableDetachableModel<T> implements IModel<T> { - /** - * - */ + /** */ private static final long serialVersionUID = 1L; /** Logger. */ private static final Logger log = LoggerFactory.getLogger(LoadableDetachableModel.class); - private enum AttachingState - { - DETACHED(false, false), - ATTACHING(true, false), - ATTACHED(true, true); - - private boolean attaching; - private boolean attached; - - private AttachingState(boolean attaching, boolean attached) - { - this.attached = attached; - this.attaching = attaching; - } - - public boolean isAttached() - { - return attached; - } + /** Internal state of the LoadableDetachableModel. */ + private enum InternalState { + DETACHED, ATTACHING, ATTACHED; - public boolean isAttaching() - { - return attaching; - } - @Override public String toString() { @@ -92,14 +69,15 @@ public abstract class LoadableDetachableModel<T> implements IModel<T> } } - /** keeps track of whether this model is attached or detached */ - private transient AttachingState attached = AttachingState.DETACHED; + /** Keeps track of whether this model is attached or detached */ + private transient InternalState state = InternalState.DETACHED; /** temporary, transient object. */ private transient T transientModelObject; /** - * Construct. + * Default constructor, constructs the model in detached state with no data associated with the + * model. */ public LoadableDetachableModel() { @@ -107,7 +85,8 @@ public abstract class LoadableDetachableModel<T> implements IModel<T> /** * This constructor is used if you already have the object retrieved and want to wrap it with a - * detachable model. + * detachable model. Constructs the model in attached state. Calls to {@link #getObject()} will + * return {@code object} until {@link #detach()} is called. * * @param object * retrieved instance of the detachable object @@ -115,7 +94,7 @@ public abstract class LoadableDetachableModel<T> implements IModel<T> public LoadableDetachableModel(T object) { this.transientModelObject = object; - attached = AttachingState.ATTACHED; + state = InternalState.ATTACHED; } /** @@ -124,7 +103,7 @@ public abstract class LoadableDetachableModel<T> implements IModel<T> @Override public void detach() { - if (attached == AttachingState.ATTACHED) + if (state == InternalState.ATTACHED) { try { @@ -132,7 +111,7 @@ public abstract class LoadableDetachableModel<T> implements IModel<T> } finally { - attached = AttachingState.DETACHED; + state = InternalState.DETACHED; transientModelObject = null; log.debug("removed transient object for {}, requestCycle {}", this, @@ -147,10 +126,10 @@ public abstract class LoadableDetachableModel<T> implements IModel<T> @Override public final T getObject() { - if (attached == AttachingState.DETACHED) + if (state == InternalState.DETACHED) { // prevent infinite attachment loops - attached = AttachingState.ATTACHING; + state = InternalState.ATTACHING; transientModelObject = load(); @@ -160,7 +139,7 @@ public abstract class LoadableDetachableModel<T> implements IModel<T> ", requestCycle " + RequestCycle.get()); } - attached = AttachingState.ATTACHED; + state = InternalState.ATTACHED; onAttach(); } return transientModelObject; @@ -173,7 +152,7 @@ public abstract class LoadableDetachableModel<T> implements IModel<T> */ public final boolean isAttached() { - return attached.isAttached(); + return state == InternalState.ATTACHED; } /** @@ -225,7 +204,7 @@ public abstract class LoadableDetachableModel<T> implements IModel<T> @Override public void setObject(final T object) { - attached = AttachingState.ATTACHED; + state = InternalState.ATTACHED; transientModelObject = object; } }
