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

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


The following commit(s) were added to refs/heads/v3 by this push:
     new 86d747e3ac5 CAUSEWAY-2297: work on simplified tree model (part 6)
86d747e3ac5 is described below

commit 86d747e3ac5e487c22e203fb1b1896556eb5b825
Author: Andi Huber <[email protected]>
AuthorDate: Wed Dec 11 13:02:23 2024 +0100

    CAUSEWAY-2297: work on simplified tree model (part 6)
    
    - additional javadoc
---
 .../causeway/applib/graph/tree/TreeAdapter.java    |  1 +
 .../graph/tree/TreeAdapterWithConverter.java       |  6 ++
 .../causeway/applib/graph/tree/TreeConverter.java  | 20 ++++--
 .../apache/causeway/applib/graph/tree/Trees.adoc   | 77 ++++++++++++++++++++--
 .../wicket/ui/components/tree/TreeProvider.java    |  3 +-
 5 files changed, 94 insertions(+), 13 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeAdapter.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeAdapter.java
index 68cb08c971f..db06ace2243 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeAdapter.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeAdapter.java
@@ -85,6 +85,7 @@ public interface TreeAdapter<T> {
                 : childNode;
     }
 
+    /** converts this {@code TreeAdapter<T>} to an equivalent {@code 
TreeAdapter<R>} */
     default <R> TreeAdapter<R> convert(final TreeConverter<T, R> converter) {
         return new TreeAdapterWithConverter<T, R>(this, converter);
     }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeAdapterWithConverter.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeAdapterWithConverter.java
index e5fa6534521..fac1be2759c 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeAdapterWithConverter.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeAdapterWithConverter.java
@@ -26,6 +26,12 @@ import org.springframework.lang.Nullable;
 
 import org.apache.causeway.commons.functional.IndexedFunction;
 
+/**
+ * Acts as a TreeAdapter facade by wrapping an underlying {@link TreeAdapter}
+ * and translating the node type back and forth using a {@link TreeConverter}.
+ * @param <U> underlying tree node generic type
+ * @param <T> tree node generic type of this facade
+ */
 record TreeAdapterWithConverter<U, T>(
         TreeAdapter<U> underlyingAdapter,
         TreeConverter<U, T> converter)
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeConverter.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeConverter.java
index f73b092c6e6..9a46952de2c 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeConverter.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/TreeConverter.java
@@ -18,9 +18,21 @@
  */
 package org.apache.causeway.applib.graph.tree;
 
+/**
+ * @param <U> underlying tree generic type
+ * @param <T> converted tree generic type
+ */
 public interface TreeConverter<U, T> {
-    
-    public T fromUnderlyingNode(U value, T parentNode, int siblingIndex);
-    public U toUnderlyingNode(T value);
-    
+
+    /**
+     * Creates a converted node value from the (underlying) node value, also 
providing context,
+     * that is, passing in the resulting node's parent-node and the resulting 
node's sibling index.
+     */
+    T fromUnderlyingNode(U value, T parentNode, int siblingIndex);
+
+    /**
+     * Recovers the original (underlying) node value from given converted node 
value.
+     */
+    U toUnderlyingNode(T value);
+
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/Trees.adoc 
b/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/Trees.adoc
index 52a07bbde69..7d5e96a4c22 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/Trees.adoc
+++ b/api/applib/src/main/java/org/apache/causeway/applib/graph/tree/Trees.adoc
@@ -11,6 +11,20 @@ Their purpose is rather to document diagrams and design 
decisions close to the r
 And also for code authors to quickly get an overview or refresher on the 
topic.  
 ****
 
+== TreeAdapter 
+
+A `TreeAdapter` provides the parent/child relationship information between 
pojos to derive a tree-structure. 
+
+[NOTE]
+====
+The model deliberately does *not* reflect a doubly linked tree, that is, 
+we don't directly provide a link from a node to its parent node. 
+(To define a tree, parent references are not strictly required.) 
+
+For tree data structures in general, referencing parents would introduce 
circular references, 
+which don't play well with immutable data structures or serialization.
+==== 
+
 [plantuml,fig-TreeModel-1,svg]
 .Tree Model
 ----
@@ -20,6 +34,7 @@ interface TreeAdapter<T> {
     childCountOf(T): int
     childrenOf(T): Stream<T>
     resolveRelative(T, TreePath): Optional<T>
+    convert(TreeConverter<T, R>): TreeAdapter<R>
 }
 
 interface TreeConverter<U, T> {
@@ -27,19 +42,67 @@ interface TreeConverter<U, T> {
     toUnderlyingNode(T value): U
 }
 
-class TreeAdapterWithConverter<U, T> << (R,#FF7700) record >>{
+class TreeAdapterWithConverter<U, T> << (R,#FF7700) internal >>{
     underlyingAdapter(): TreeAdapter<U>
     converter(): TreeConverter<U, T>
 }
 
-TreeAdapterWithConverter -|> TreeAdapter
+TreeAdapter <|- TreeAdapterWithConverter: facade
+TreeAdapter ..> TreeConverter: uses for conversion
 
 @enduml
 ----
 
-== TreeAdapter 
+The internal `TreeAdapterWithConverter` acts as a `TreeAdapter` facade by 
wrapping an underlying `TreeAdapter` 
+and translating the node type back and forth using a `TreeConverter`.
+
+== TreeProvider (Wicket Viewer)
+
+`TreeAdapterRecord` is Wicket's `ITreeProvider` implemented for a tree of 
`TreeNodeMemento`(s).
+
+[plantuml,fig-TreeModel-2,svg]
+.Tree Provider (Wicket Viewer)
+----
+@startuml
+
+class TreeNodeMemento << (R,#FF7700) serializable >>{
+    bookmark: Bookmark
+    treePath: TreePath
+}
 
-provides the parent/child relationship information between pojos to derive a 
tree-structure. 
-It is deliberately *not* modeled as a doubly linked tree, that is, 
-we don't directly provide a link from a node to its parent node, as this would 
introduce circular references, 
-which don't play well with immutable data structures or serialization. 
\ No newline at end of file
+class TreeAdapterRecord<T> << (R,#FF7700) serializable>>{
+    treeAdapter: TreeAdapter
+}
+
+class TreeProvider << (R,#FF7700) serializable>>{
+}
+
+TreeProvider --> TreeNodeMemento: primaryValue
+TreeProvider --> TreeAdapterRecord: treeAdapterRecord
+
+@enduml
+----
+
+Only constraint for the tree node values is that those need to be 
_bookmarkable_. 
+The `TreeProvider` is then simply made of 2 parts:
+
+ . the root node (in its serializable form)
+ . the TreeAdapter (wrapped in a serializable container)
+ 
+The fact that `TreeProvider` also implements `TreeConverter` is just an 
implementation detail.
+
+[source,java]
+----
+record TreeProvider(
+    /** tree's single root */
+    TreeNodeMemento primaryValue,
+    TreeAdapterRecord<Object> treeAdapterRecord)
+implements
+    ITreeProvider<TreeNodeMemento>,
+    TreeConverter<Object, TreeNodeMemento> {
+    //..
+}
+----
+ 
+ 
+ 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/TreeProvider.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/TreeProvider.java
index 8c13ad05348..84cd3e46709 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/TreeProvider.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/tree/TreeProvider.java
@@ -35,7 +35,7 @@ import 
org.apache.causeway.core.metamodel.tree.TreeAdapterRecord;
 import org.apache.causeway.core.metamodel.tree.TreeNodeMemento;
 
 /**
- * Wicket's {@link ITreeProvider} implemented for Causeway.
+ * Wicket's {@link ITreeProvider} implemented for a tree of {@link 
TreeNodeMemento}.
  */
 record TreeProvider(
     /** tree's single root */
@@ -101,5 +101,4 @@ implements
     private TreeAdapter<TreeNodeMemento> treeAdapter() {
         return treeAdapterRecord.treeAdapter().convert(this);
     }
-
 }
\ No newline at end of file

Reply via email to