On Sat, May 30, 2015 at 10:48 PM, <[email protected]> wrote:

> Repository: wicket
> Updated Branches:
>   refs/heads/master 6512a6d45 -> f11391530
>
>
> 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/f1139153
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f1139153
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f1139153
>
> Branch: refs/heads/master
> Commit: f113915302394460c9048cc1ccd685adec1460b7
> Parents: 6512a6d
> Author: Martijn Dashorst <[email protected]>
> Authored: Sat May 30 21:47:59 2015 +0200
> Committer: Martijn Dashorst <[email protected]>
> Committed: Sat May 30 21:48:05 2015 +0200
>
> ----------------------------------------------------------------------
>  .../wicket/model/LoadableDetachableModel.java   | 57 +++++++-------------
>  1 file changed, 18 insertions(+), 39 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/f1139153/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;
>

After deserialization state will be null => fourth state.


>
>         /** 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)
>

and this will break


>                 {
>                         // 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;
>         }
>  }
>
>

Reply via email to