This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 840109855f ISIS-3325: simplifies _TreeModel and renames it to 
_TreeNodeMemento
840109855f is described below

commit 840109855fcccf32d1bf4cb7dcbcdd1e6d533f42
Author: andi-huber <[email protected]>
AuthorDate: Mon Jan 23 15:20:11 2023 +0100

    ISIS-3325: simplifies _TreeModel and renames it to _TreeNodeMemento
---
 .../tree/CausewayToWicketTreeAdapter.java          |  37 +++++---
 .../tree/_LoadableDetachableTreeModel.java         | 103 ---------------------
 .../ui/components/tree/_TreeExpansionModel.java    |  18 ++--
 .../wicket/ui/components/tree/_TreeModel.java      |  57 ------------
 .../ui/components/tree/_TreeModelTreeAdapter.java  |  21 ++---
 .../ui/components/tree/_TreeModelTreeProvider.java |  18 ++--
 .../ui/components/tree/_TreeNodeMemento.java       |  87 +++++++++++++++++
 7 files changed, 136 insertions(+), 205 deletions(-)

diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/CausewayToWicketTreeAdapter.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/CausewayToWicketTreeAdapter.java
index 830ca9bd3e..7e3b0d31f6 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/CausewayToWicketTreeAdapter.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/CausewayToWicketTreeAdapter.java
@@ -32,10 +32,12 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.IModel;
 
 import org.apache.causeway.applib.graph.tree.TreeNode;
+import org.apache.causeway.core.metamodel.context.HasMetaModelContext;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.viewer.wicket.model.models.ScalarModel;
 import org.apache.causeway.viewer.wicket.model.models.ValueModel;
+import org.apache.causeway.viewer.wicket.model.util.WktContext;
 import 
org.apache.causeway.viewer.wicket.ui.components.entity.icontitle.EntityIconAndTitlePanel;
 
 import lombok.val;
@@ -73,10 +75,13 @@ class CausewayToWicketTreeAdapter {
     /**
      * Wicket's Tree Component implemented for Causeway
      */
-    private static class EntityTree extends NestedTree<_TreeModel> {
+    private static class EntityTree extends NestedTree<_TreeNodeMemento>
+    implements HasMetaModelContext {
 
         private static final long serialVersionUID = 1L;
 
+        private transient MetaModelContext metaModelContext;
+
         public static EntityTree of(
                 final String id, final ManagedObject treeNodeObject, final 
MetaModelContext mmc) {
 
@@ -89,7 +94,7 @@ class CausewayToWicketTreeAdapter {
                     wrappingTreeAdapter.wrap(treeNode.getValue(), 
treeNode.getPositionAsPath()),
                     wrappingTreeAdapter);
 
-            val treeExpansionModel = _TreeExpansionModel.of(mmc,
+            val treeExpansionModel = _TreeExpansionModel.of(
                     treeNode.getTreeState().getExpandedNodePaths());
 
             return new EntityTree(id,
@@ -99,18 +104,24 @@ class CausewayToWicketTreeAdapter {
 
         private EntityTree(
                 final String id,
-                final ITreeProvider<_TreeModel> provider,
+                final ITreeProvider<_TreeNodeMemento> provider,
                 final _TreeExpansionModel collapseExpandState) {
             super(id, provider, collapseExpandState);
         }
 
+        @Override
+        public MetaModelContext getMetaModelContext() {
+            return this.metaModelContext = 
WktContext.computeIfAbsent(metaModelContext);
+        }
+
         /**
          * To use a custom component for the representation of a node's 
content we override this method.
          */
         @Override
-        protected Component newContentComponent(final String id, final 
IModel<_TreeModel> node) {
-            final _TreeModel treeModel = node.getObject();
-            final Component entityIconAndTitle = new 
EntityIconAndTitlePanel(id, treeModel);
+        protected Component newContentComponent(final String id, final 
IModel<_TreeNodeMemento> node) {
+            final _TreeNodeMemento treeModel = node.getObject();
+            final Component entityIconAndTitle = new EntityIconAndTitlePanel(
+                    id, treeModel.asObjectAdapterModel(getMetaModelContext()));
             return entityIconAndTitle;
         }
 
@@ -118,20 +129,20 @@ class CausewayToWicketTreeAdapter {
          * To hardcode Node's 
<pre>AjaxFallbackLink.isEnabledInHierarchy()->true</pre> we override this 
method.
          */
         @Override
-        public Component newNodeComponent(final String id, final 
IModel<_TreeModel> model) {
+        public Component newNodeComponent(final String id, final 
IModel<_TreeNodeMemento> model) {
 
-            final Node<_TreeModel> node =  new Node<_TreeModel>(id, this, 
model) {
+            final Node<_TreeNodeMemento> node =  new 
Node<_TreeNodeMemento>(id, this, model) {
                 private static final long serialVersionUID = 1L;
 
                 @Override
-                protected Component createContent(final String id, final 
IModel<_TreeModel> model) {
+                protected Component createContent(final String id, final 
IModel<_TreeNodeMemento> model) {
                     return EntityTree.this.newContentComponent(id, model);
                 }
 
                 @Override
                 protected MarkupContainer createJunctionComponent(final String 
id) {
 
-                    final Node<_TreeModel> node = this;
+                    final Node<_TreeNodeMemento> node = this;
                     final Runnable toggleExpandCollapse = (Runnable & 
Serializable) this::toggle;
 
                     return new AjaxFallbackLink<Void>(id) {
@@ -168,7 +179,7 @@ class CausewayToWicketTreeAdapter {
          * we override this method.
          */
         @Override
-        public State getState(final _TreeModel t) {
+        public State getState(final _TreeNodeMemento t) {
             return treeExpansionModel().contains(t.getTreePath()) ? 
State.EXPANDED : State.COLLAPSED;
         }
 
@@ -177,7 +188,7 @@ class CausewayToWicketTreeAdapter {
          * we override this method.
          */
         @Override
-        public void expand(final _TreeModel t) {
+        public void expand(final _TreeNodeMemento t) {
             treeExpansionModel().onExpand(t);
             super.expand(t);
         }
@@ -187,7 +198,7 @@ class CausewayToWicketTreeAdapter {
          * we override this method.
          */
         @Override
-        public void collapse(final _TreeModel t) {
+        public void collapse(final _TreeNodeMemento t) {
             treeExpansionModel().onCollapse(t);
             super.collapse(t);
         }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_LoadableDetachableTreeModel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_LoadableDetachableTreeModel.java
deleted file mode 100644
index d7d50156dd..0000000000
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_LoadableDetachableTreeModel.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.viewer.wicket.ui.components.tree;
-
-import java.util.NoSuchElementException;
-import java.util.Objects;
-
-import org.apache.wicket.model.LoadableDetachableModel;
-
-import org.apache.causeway.applib.graph.tree.TreePath;
-import org.apache.causeway.applib.services.bookmark.Bookmark;
-import org.apache.causeway.core.metamodel.context.HasMetaModelContext;
-import org.apache.causeway.core.metamodel.context.MetaModelContext;
-import org.apache.causeway.core.metamodel.object.ManagedObjects;
-import org.apache.causeway.viewer.wicket.model.util.WktContext;
-
-import lombok.val;
-
-/**
- * Wicket's loadable/detachable model for TreeModel nodes.
- */
-class _LoadableDetachableTreeModel
-extends LoadableDetachableModel<_TreeModel>
-implements HasMetaModelContext {
-    private static final long serialVersionUID = 1L;
-
-    private final Bookmark bookmark;
-    private final TreePath treePath;
-    private final int hashCode;
-
-    private transient MetaModelContext metaModelContext;
-
-    public _LoadableDetachableTreeModel(final _TreeModel tModel) {
-        super(tModel);
-        this.treePath = tModel.getTreePath();
-        this.bookmark = ManagedObjects.bookmarkElseFail(tModel.getObject());
-
-        this.hashCode = Objects.hash(bookmark.hashCode(), treePath.hashCode());
-        this.metaModelContext = tModel.getMetaModelContext();
-    }
-
-    /*
-     * loads EntityModel using Oid (id)
-     */
-    @Override
-    protected _TreeModel load() {
-
-        val objAdapter = getObjectManager()
-                .loadObject(bookmark)
-                .orElseThrow(()->new NoSuchElementException(
-                        String.format("Tree creation: could not recreate 
TreeModel from Bookmark: '%s'", bookmark)));
-
-        final Object pojo = objAdapter.getPojo();
-        if(pojo==null) {
-            throw new NoSuchElementException(
-                    String.format("Tree creation: could not recreate Pojo from 
Oid: '%s'", bookmark));
-        }
-
-        return new _TreeModel(getMetaModelContext(), objAdapter, treePath);
-    }
-
-    @Override
-    public MetaModelContext getMetaModelContext() {
-        return this.metaModelContext = 
WktContext.computeIfAbsent(metaModelContext);
-    }
-
-    /*
-     * Important! Models must be identifiable by their contained object. Also 
IDs must be
-     * unique within a tree structure.
-     */
-    @Override
-    public boolean equals(final Object obj) {
-        if (obj instanceof _LoadableDetachableTreeModel) {
-            final _LoadableDetachableTreeModel other = 
(_LoadableDetachableTreeModel) obj;
-            return treePath.equals(other.treePath) && 
bookmark.equals(other.bookmark);
-        }
-        return false;
-    }
-
-    /*
-     * Important! Models must be identifiable by their contained object.
-     */
-    @Override
-    public int hashCode() {
-        return hashCode;
-    }
-}
\ No newline at end of file
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeExpansionModel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeExpansionModel.java
index 8a32e363a4..1dff504104 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeExpansionModel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeExpansionModel.java
@@ -24,26 +24,23 @@ import java.util.stream.Collectors;
 import org.apache.wicket.model.IModel;
 
 import org.apache.causeway.applib.graph.tree.TreePath;
-import org.apache.causeway.core.metamodel.context.MetaModelContext;
 
 /**
  * Wicket's model for collapse/expand state
  */
-class _TreeExpansionModel implements IModel<Set<_TreeModel>> {
+class _TreeExpansionModel implements IModel<Set<_TreeNodeMemento>> {
     private static final long serialVersionUID = 648152234030889164L;
 
     public static _TreeExpansionModel of(
-            final MetaModelContext commonContext,
             final Set<TreePath> expandedTreePaths) {
-
-        return new _TreeExpansionModel(commonContext, expandedTreePaths);
+        return new _TreeExpansionModel( expandedTreePaths);
     }
 
     /**
      * Happens on user interaction via UI.
      * @param t
      */
-    public void onExpand(final _TreeModel t) {
+    public void onExpand(final _TreeNodeMemento t) {
         expandedTreePaths.add(t.getTreePath());
     }
 
@@ -51,7 +48,7 @@ class _TreeExpansionModel implements IModel<Set<_TreeModel>> {
      * Happens on user interaction via UI.
      * @param t
      */
-    public void onCollapse(final _TreeModel t) {
+    public void onCollapse(final _TreeNodeMemento t) {
         expandedTreePaths.remove(t.getTreePath());
     }
 
@@ -60,20 +57,19 @@ class _TreeExpansionModel implements 
IModel<Set<_TreeModel>> {
     }
 
     private final Set<TreePath> expandedTreePaths;
-    private final Set<_TreeModel> expandedNodes;
+    private final Set<_TreeNodeMemento> expandedNodes;
 
     private _TreeExpansionModel(
-            final MetaModelContext commonContext,
             final Set<TreePath> expandedTreePaths) {
 
         this.expandedTreePaths = expandedTreePaths;
         this.expandedNodes = expandedTreePaths.stream()
-                .map(tPath->new _TreeModel(commonContext, tPath))
+                .map(tPath->new _TreeNodeMemento(tPath))
                 .collect(Collectors.toSet());
     }
 
     @Override
-    public Set<_TreeModel> getObject() {
+    public Set<_TreeNodeMemento> getObject() {
         return expandedNodes;
     }
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModel.java
deleted file mode 100644
index 2234b6c983..0000000000
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModel.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.viewer.wicket.ui.components.tree;
-
-import java.util.Objects;
-
-import org.apache.causeway.applib.graph.tree.TreePath;
-import org.apache.causeway.core.metamodel.context.MetaModelContext;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
-
-/**
- * Extending the UiObjectWkt to also provide a TreePath.
- */
-class _TreeModel extends UiObjectWkt {
-    private static final long serialVersionUID = 8916044984628849300L;
-
-    private final TreePath treePath;
-    private final boolean isTreePathModelOnly;
-
-    public _TreeModel(final MetaModelContext commonContext, final TreePath 
treePath) {
-        super(commonContext, commonContext.getObjectManager().adapt(0)); // 
any bookmarkable will do
-        this.treePath = treePath;
-        this.isTreePathModelOnly = true;
-    }
-
-    public _TreeModel(final MetaModelContext commonContext, final 
ManagedObject adapter, final TreePath treePath) {
-        super(commonContext, Objects.requireNonNull(adapter));
-        this.treePath = treePath;
-        this.isTreePathModelOnly = false;
-    }
-
-    public TreePath getTreePath() {
-        return treePath;
-    }
-
-    public boolean isTreePathModelOnly() {
-        return isTreePathModelOnly;
-    }
-
-}
\ No newline at end of file
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModelTreeAdapter.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModelTreeAdapter.java
index 6b1bb3e348..5fda8458cb 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModelTreeAdapter.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModelTreeAdapter.java
@@ -40,7 +40,7 @@ import lombok.NonNull;
 @SuppressWarnings({"rawtypes", "unchecked"})
 class _TreeModelTreeAdapter
 implements
-    TreeAdapter<_TreeModel>,
+    TreeAdapter<_TreeNodeMemento>,
     HasMetaModelContext,
     Serializable {
 
@@ -64,7 +64,7 @@ implements
     }
 
     @Override
-    public Optional<_TreeModel> parentOf(final _TreeModel treeModel) {
+    public Optional<_TreeNodeMemento> parentOf(final _TreeNodeMemento 
treeModel) {
         if(treeModel==null) {
             return Optional.empty();
         }
@@ -73,7 +73,7 @@ implements
     }
 
     @Override
-    public int childCountOf(final _TreeModel treeModel) {
+    public int childCountOf(final _TreeNodeMemento treeModel) {
         if(treeModel==null) {
             return 0;
         }
@@ -81,7 +81,7 @@ implements
     }
 
     @Override
-    public Stream<_TreeModel> childrenOf(final _TreeModel treeModel) {
+    public Stream<_TreeNodeMemento> childrenOf(final _TreeNodeMemento 
treeModel) {
         if(treeModel==null) {
             return Stream.empty();
         }
@@ -89,19 +89,18 @@ implements
                 .map(newPojoToTreeModelMapper(treeModel));
     }
 
-    _TreeModel wrap(final @NonNull Object pojo, final TreePath treePath) {
-        return new _TreeModel(
-                getMetaModelContext(),
-                ManagedObject.adaptSingular(getSpecificationLoader(), pojo),
+    _TreeNodeMemento wrap(final @NonNull Object pojo, final TreePath treePath) 
{
+        return new _TreeNodeMemento(
+                ManagedObject.adaptSingular(getSpecificationLoader(), 
pojo).getBookmark().orElseThrow(),
                 treePath);
     }
 
-    private Object unwrap(final _TreeModel model) {
+    private Object unwrap(final _TreeNodeMemento model) {
         Objects.requireNonNull(model);
-        return model.getObject().getPojo();
+        return model.getPojo(getMetaModelContext());
     }
 
-    private Function<Object, _TreeModel> newPojoToTreeModelMapper(final 
_TreeModel parent) {
+    private Function<Object, _TreeNodeMemento> newPojoToTreeModelMapper(final 
_TreeNodeMemento parent) {
         return IndexedFunction.zeroBased((indexWithinSiblings, pojo)->
         wrap(pojo, parent.getTreePath().append(indexWithinSiblings)));
     }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModelTreeProvider.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModelTreeProvider.java
index 683231f2c1..bf810243fc 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModelTreeProvider.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeModelTreeProvider.java
@@ -29,17 +29,17 @@ import 
org.apache.causeway.commons.internal.collections._Lists;
 /**
  * Wicket's {@link ITreeProvider} implemented for Causeway
  */
-class _TreeModelTreeProvider implements ITreeProvider<_TreeModel> {
+class _TreeModelTreeProvider implements ITreeProvider<_TreeNodeMemento> {
 
     private static final long serialVersionUID = 1L;
 
     /**
      * tree's root
      */
-    private final _TreeModel primaryValue;
+    private final _TreeNodeMemento primaryValue;
     private final _TreeModelTreeAdapter treeAdapter;
 
-    _TreeModelTreeProvider(final _TreeModel primaryValue, final 
_TreeModelTreeAdapter treeAdapter) {
+    _TreeModelTreeProvider(final _TreeNodeMemento primaryValue, final 
_TreeModelTreeAdapter treeAdapter) {
         this.primaryValue = primaryValue;
         this.treeAdapter = treeAdapter;
     }
@@ -49,25 +49,23 @@ class _TreeModelTreeProvider implements 
ITreeProvider<_TreeModel> {
     }
 
     @Override
-    public Iterator<? extends _TreeModel> getRoots() {
+    public Iterator<? extends _TreeNodeMemento> getRoots() {
         return _Lists.singleton(primaryValue).iterator();
     }
 
     @Override
-    public boolean hasChildren(final _TreeModel node) {
+    public boolean hasChildren(final _TreeNodeMemento node) {
         return treeAdapter.childCountOf(node)>0;
     }
 
     @Override
-    public Iterator<? extends _TreeModel> getChildren(final _TreeModel node) {
+    public Iterator<? extends _TreeNodeMemento> getChildren(final 
_TreeNodeMemento node) {
         return treeAdapter.childrenOf(node).iterator();
     }
 
     @Override
-    public IModel<_TreeModel> model(final _TreeModel treeModel) {
-        return treeModel.isTreePathModelOnly()
-                ? Model.of(treeModel)
-                : new _LoadableDetachableTreeModel(treeModel);
+    public IModel<_TreeNodeMemento> model(final _TreeNodeMemento treeModel) {
+        return Model.of(treeModel);
     }
 
 }
\ No newline at end of file
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeNodeMemento.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeNodeMemento.java
new file mode 100644
index 0000000000..7e0f87dafc
--- /dev/null
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/_TreeNodeMemento.java
@@ -0,0 +1,87 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.viewer.wicket.ui.components.tree;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+import org.apache.causeway.applib.graph.tree.TreePath;
+import org.apache.causeway.applib.services.bookmark.Bookmark;
+import org.apache.causeway.commons.internal.assertions._Assert;
+import org.apache.causeway.core.metamodel.context.MetaModelContext;
+import org.apache.causeway.viewer.wicket.model.models.ObjectAdapterModel;
+import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
+
+import lombok.Getter;
+import lombok.NonNull;
+
+/**
+ * Memento for a pair of {@link Bookmark} and {@link TreePath}.
+ */
+class _TreeNodeMemento implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Getter private final Bookmark bookmark;
+    @Getter private final TreePath treePath;
+    private final int hashCode;
+
+    public _TreeNodeMemento(final TreePath treePath) {
+        this.bookmark = null;
+        this.treePath = treePath;
+        this.hashCode = Objects.hash(0, treePath.hashCode());
+    }
+
+    public _TreeNodeMemento(final @NonNull Bookmark bookmark, final @NonNull 
TreePath treePath) {
+        this.bookmark = bookmark;
+        this.treePath = treePath;
+        this.hashCode = Objects.hash(bookmark.hashCode(), treePath.hashCode());
+    }
+
+    public boolean isTreePathMemento() {
+        return bookmark==null;
+    }
+
+    public Object getPojo(final MetaModelContext mmc) {
+        _Assert.assertFalse(isTreePathMemento());
+        return /*isTreePathMemento()
+                ? null
+                : */asObjectAdapterModel(mmc).getObject().getPojo();
+    }
+
+    public ObjectAdapterModel asObjectAdapterModel(final MetaModelContext mmc) 
{
+        _Assert.assertFalse(isTreePathMemento());
+        return UiObjectWkt.ofBookmark(mmc, getBookmark());
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj instanceof _TreeNodeMemento) {
+            final _TreeNodeMemento other = (_TreeNodeMemento) obj;
+            return treePath.equals(other.treePath)
+                    && bookmark.equals(other.bookmark);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return hashCode;
+    }
+
+}
\ No newline at end of file

Reply via email to