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