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 c354d90dc11 CAUSEWAY-3836: supports PropertyLayout and 
CollectionLayout annotations
c354d90dc11 is described below

commit c354d90dc11c622a4091e491091979a9982563ec
Author: andi-huber <[email protected]>
AuthorDate: Mon Dec 16 08:51:37 2024 +0100

    CAUSEWAY-3836: supports PropertyLayout and CollectionLayout annotations
    
    - to infer a tree structure
    - for now we are directly using method handles bypassing rule-checking
---
 .../layout/CollectionLayoutFacetFactory.java           |  4 ++--
 .../object/navchild/NavigableSubtreeSequenceFacet.java | 18 +++++++++++-------
 .../navchild/NavigableSubtreeSequenceFacetRecord.java  | 14 +++++++-------
 .../propertylayout/PropertyLayoutFacetFactory.java     |  9 +++++++++
 .../facets/object/navchild/TreeTraversalTest.java      | 13 ++++++-------
 .../metamodel/facets/object/navchild/_TreeSample.java  |  6 ++++--
 6 files changed, 39 insertions(+), 25 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
index d8e2619538b..b5ed17a28ce 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
@@ -85,12 +85,12 @@ extends FacetFactoryAbstract {
         addFacetIfPresent(
             SortedByFacetForCollectionLayoutAnnotation
                 .create(collectionLayoutIfAny, facetHolder));
-        
+
         addFacetIfPresent(
             collectionLayoutIfAny
                 .map(CollectionLayout::navigableSubtree)
                 .filter(StringUtils::hasLength)
-                .flatMap(sequence->NavigableSubtreeSequenceFacet.create(
+                
.flatMap(sequence->NavigableSubtreeSequenceFacet.create("CollectionLayout 
annotation",
                     processMethodContext.getCls(), 
processMethodContext.getMethod().asMethod(), sequence, facetHolder)));
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/navchild/NavigableSubtreeSequenceFacet.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/navchild/NavigableSubtreeSequenceFacet.java
index 3fbe37265d8..6b9ac38502c 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/navchild/NavigableSubtreeSequenceFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/navchild/NavigableSubtreeSequenceFacet.java
@@ -32,21 +32,25 @@ import 
org.apache.causeway.core.metamodel.facetapi.FacetHolder;
  *
  * @since 3.2
  */
-public sealed interface NavigableSubtreeSequenceFacet 
-extends Facet 
+public sealed interface NavigableSubtreeSequenceFacet
+extends Facet
 permits NavigableSubtreeSequenceFacetRecord {
 
     String sequence();
     MethodHandle methodHandle();
-    
+
     // -- FACTORY
-    
+
     static Optional<NavigableSubtreeSequenceFacet> create(
-        final Class<?> cls, 
+        /**
+         * Informal text, describing the origin of this facet.
+         */
+        final String origin,
+        final Class<?> cls,
         final Optional<ResolvedMethod> resolvedMethod,
         final String sequence,
         final FacetHolder facetHolder) {
-        
+
         return resolvedMethod
             .map(ResolvedMethod::method)
             .flatMap(method->Try.call(()->MethodHandles
@@ -54,7 +58,7 @@ permits NavigableSubtreeSequenceFacetRecord {
                     .unreflect(method))
                 .ifFailure(e->e.printStackTrace())
                 .getValue()
-                .map(mh->new NavigableSubtreeSequenceFacetRecord(sequence, mh, 
facetHolder)));
+                .map(mh->new NavigableSubtreeSequenceFacetRecord(sequence, mh, 
origin, facetHolder)));
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/navchild/NavigableSubtreeSequenceFacetRecord.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/navchild/NavigableSubtreeSequenceFacetRecord.java
index 0ffd5a612b7..bd6a1874fe6 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/navchild/NavigableSubtreeSequenceFacetRecord.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/navchild/NavigableSubtreeSequenceFacetRecord.java
@@ -21,17 +21,16 @@ package 
org.apache.causeway.core.metamodel.facets.object.navchild;
 import java.lang.invoke.MethodHandle;
 import java.util.function.BiConsumer;
 
-import org.springframework.util.ClassUtils;
-
 import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 
 record NavigableSubtreeSequenceFacetRecord(
     String sequence,
-    MethodHandle methodHandle, 
-    FacetHolder facetHolder) 
+    MethodHandle methodHandle,
+    String origin,
+    FacetHolder facetHolder)
 implements NavigableSubtreeSequenceFacet {
-    
+
     @Override
     public Class<? extends Facet> facetType() {
         return NavigableSubtreeSequenceFacet.class;
@@ -41,7 +40,7 @@ implements NavigableSubtreeSequenceFacet {
     public Precedence getPrecedence() {
         return Precedence.DEFAULT;
     }
-    
+
     @Override
     public FacetHolder getFacetHolder() {
         return facetHolder;
@@ -49,7 +48,8 @@ implements NavigableSubtreeSequenceFacet {
 
     @Override
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        visitor.accept("facet", ClassUtils.getShortName(getClass()));
+        visitor.accept("facet", "NavigableSubtreeSequenceFacet");
+        visitor.accept("origin", origin);
         visitor.accept("precedence", getPrecedence().name());
         visitor.accept("sequence", sequence);
         visitor.accept("methodHandle", methodHandle);
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
index 306ff3f3cbb..11f9aeb518d 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
@@ -20,12 +20,15 @@ package 
org.apache.causeway.core.metamodel.facets.properties.propertylayout;
 
 import jakarta.inject.Inject;
 
+import org.springframework.util.StringUtils;
+
 import org.apache.causeway.applib.annotation.PropertyLayout;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facets.FacetFactoryAbstract;
 import 
org.apache.causeway.core.metamodel.facets.members.layout.group.LayoutGroupFacetFromPropertyLayoutAnnotation;
 import 
org.apache.causeway.core.metamodel.facets.members.layout.order.LayoutOrderFacetFromPropertyLayoutAnnotation;
+import 
org.apache.causeway.core.metamodel.facets.object.navchild.NavigableSubtreeSequenceFacet;
 import 
org.apache.causeway.core.metamodel.specloader.validator.ValidationFailureUtils;
 
 public class PropertyLayoutFacetFactory
@@ -88,6 +91,12 @@ extends FacetFactoryAbstract {
         addFacetIfPresent(UnchangingFacetForPropertyLayoutAnnotation
                 .create(propertyLayoutIfAny, facetHolder));
 
+        addFacetIfPresent(
+                propertyLayoutIfAny
+                    .map(PropertyLayout::navigableSubtree)
+                    .filter(StringUtils::hasLength)
+                    
.flatMap(sequence->NavigableSubtreeSequenceFacet.create("PropertyLayout 
annotation",
+                        processMethodContext.getCls(), 
processMethodContext.getMethod().asMethod(), sequence, facetHolder)));
     }
 
 }
diff --git 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/TreeTraversalTest.java
 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/TreeTraversalTest.java
index 3b0f58fe442..3ff4210f853 100644
--- 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/TreeTraversalTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/TreeTraversalTest.java
@@ -103,14 +103,13 @@ extends FacetFactoryTestAbstract {
 
         var firstChildOfA = 
treeAdapter.childrenOf(a).findFirst().orElseThrow();
 
-        // first child node of a is expected to have 3 children
-        assertEquals(3, treeAdapter.childCountOf(firstChildOfA));
-        assertEquals(3, treeAdapter.childrenOf(firstChildOfA).toList().size());
+        // first child node of a is expected to have 4 children
+        assertEquals(4, treeAdapter.childCountOf(firstChildOfA));
+        assertEquals(4, treeAdapter.childrenOf(firstChildOfA).toList().size());
 
-        //TODO[causeway-core-metamodel-CAUSEWAY-2297] add property support
         // count all nodes
-        assertEquals(17, Can.ofIterable(tree::iteratorDepthFirst).size());
-        assertEquals(17, Can.ofIterable(tree::iteratorBreadthFirst).size());
+        assertEquals(25, Can.ofIterable(tree::iteratorDepthFirst).size());
+        assertEquals(25, Can.ofIterable(tree::iteratorBreadthFirst).size());
     }
 
     @Test
@@ -121,7 +120,7 @@ extends FacetFactoryTestAbstract {
             .collect(Collectors.joining(", "));
 
         assertEquals(
-                "a, b1, d1, d2, d3, b2, d1, d2, d3, c1, d1, d2, d3, c2, d1, 
d2, d3",
+                "a, b1, c1, d1, d2, d3, d1, d2, d3, b2, c2, d1, d2, d3, d1, 
d2, d3, c1, d1, d2, d3, c2, d1, d2, d3",
                 nodeNames);
     }
 
diff --git 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/_TreeSample.java
 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/_TreeSample.java
index c95d49615b4..e7be343b0cd 100644
--- 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/_TreeSample.java
+++ 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/_TreeSample.java
@@ -24,6 +24,7 @@ import org.apache.causeway.applib.ViewModel;
 import org.apache.causeway.applib.annotation.CollectionLayout;
 import org.apache.causeway.applib.annotation.Programmatic;
 import org.apache.causeway.applib.annotation.Property;
+import org.apache.causeway.applib.annotation.PropertyLayout;
 import org.apache.causeway.commons.collections.Can;
 
 import lombok.Getter;
@@ -41,7 +42,8 @@ class _TreeSample {
         @CollectionLayout(navigableSubtree = "2") Map<String, C> childrenC) 
implements SampleNode {
     }
     record B(String name,
-        @CollectionLayout(navigableSubtree = "1") Can<D> childrenD) implements 
SampleNode {
+        @PropertyLayout(navigableSubtree = "1") C childC,
+        @CollectionLayout(navigableSubtree = "2") Can<D> childrenD) implements 
SampleNode {
     }
     record C(String name,
         @CollectionLayout(navigableSubtree = "1") Can<D> childrenD) implements 
SampleNode {
@@ -52,7 +54,7 @@ class _TreeSample {
     A sampleA() {
         var ds = Can.of(new D("d1"), new D("d2"), new D("d3"));
         var cs = Can.of(new C("c1", ds), new C("c2", ds));
-        var bs = Can.of(new B("b1", ds), new B("b2", ds));
+        var bs = Can.of(new B("b1", cs.getElseFail(0), ds), new B("b2", 
cs.getElseFail(1), ds));
         var a = new A("a", bs, cs.toMap(C::name));
         return a;
     }

Reply via email to