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 7d2cd62574e CAUSEWAY-2297: work on simplified tree model (part 15)
7d2cd62574e is described below

commit 7d2cd62574e5d66bbde9109995423d3f4e250424
Author: andi-huber <[email protected]>
AuthorDate: Sun Dec 15 11:21:54 2024 +0100

    CAUSEWAY-2297: work on simplified tree model (part 15)
    
    - MMC for testing: switch to enable registered post-processors
---
 core/metamodel/src/main/java/module-info.java      |  1 +
 .../_testing/MetaModelContext_forTesting.java      |  9 ++++++++
 .../progmodel/ProgrammingModelAbstract.java        | 27 ++++++++--------------
 .../spec/impl/ObjectSpecificationDefault.java      | 21 ++++++++---------
 .../spec/impl/ProgrammingModelDefault.java         |  8 +++----
 .../spec/impl/SpecificationLoaderDefault.java      | 11 +++++----
 .../core/metamodel/spec/impl/_JUnitSupport.java    |  5 +++-
 .../specloader/postprocessor/PostProcessor.java    | 25 ++++++--------------
 .../facets/object/navchild/TreeTraversalTest.java  | 25 ++++++++++++--------
 9 files changed, 66 insertions(+), 66 deletions(-)

diff --git a/core/metamodel/src/main/java/module-info.java 
b/core/metamodel/src/main/java/module-info.java
index 6d1645c66a8..60f690ef4c2 100644
--- a/core/metamodel/src/main/java/module-info.java
+++ b/core/metamodel/src/main/java/module-info.java
@@ -131,6 +131,7 @@ open module org.apache.causeway.core.metamodel {
     exports org.apache.causeway.core.metamodel.facets.object.tabledec to 
org.apache.causeway.viewer.wicket.ui;
     exports org.apache.causeway.core.metamodel.facets.object.layout;
     exports org.apache.causeway.core.metamodel.facets.all.hide;
+    exports org.apache.causeway.core.metamodel.postprocessors;
     exports org.apache.causeway.core.metamodel.services.grid.spi;
     exports org.apache.causeway.core.metamodel.specloader.validator;
     exports org.apache.causeway.core.metamodel.util;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
index faaf5b0d29e..bff7964c0b6 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/_testing/MetaModelContext_forTesting.java
@@ -156,6 +156,14 @@ extends MetaModelContext {
                 new ClassSubstitutorDefault()
                 ));
 
+    /**
+     * Whether to enable all post-processors, that are registered with the 
{@link ProgrammingModel}.
+     * <p>
+     * default: false
+     */
+    @Builder.Default
+    private boolean enablePostprocessors = false;
+
     private ObjectManager objectManager;
 
     private WrapperFactory wrapperFactory;
@@ -389,6 +397,7 @@ extends MetaModelContext {
                     environment,
                     serviceRegistry,
                     programmingModel,
+                    enablePostprocessors,
                     causewayBeanTypeClassifier,
                     causewayBeanTypeRegistry,
                     classSubstitutorRegistry);
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodel/ProgrammingModelAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodel/ProgrammingModelAbstract.java
index 9c08c37bb39..5075af51f69 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodel/ProgrammingModelAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/progmodel/ProgrammingModelAbstract.java
@@ -40,8 +40,8 @@ import lombok.Value;
 
 public abstract class ProgrammingModelAbstract
 implements
-        ProgrammingModel,
-        HasMetaModelContext {
+    ProgrammingModel,
+    HasMetaModelContext {
 
     @Getter(onMethod_ = {@Override})
     private final MetaModelContext metaModelContext;
@@ -59,16 +59,12 @@ implements
      * @param filter - the final programming model will only contain factories 
accepted by this filter
      */
     public void init(final ProgrammingModelInitFilter filter) {
-
-        //assertNotInitialized();
         if(isInitialized()) return;
 
         // for all registered facet-factories that also implement 
MetaModelRefiner
         for (var facetFactory : snapshotFactories(filter, metaModelContext)) {
-
-            if(facetFactory instanceof MetaModelRefiner) {
-                var metaModelValidatorRefiner = (MetaModelRefiner) 
facetFactory;
-                metaModelValidatorRefiner.refineProgrammingModel(this);
+            if(facetFactory instanceof MetaModelRefiner metaModelRefiner) {
+                metaModelRefiner.refineProgrammingModel(this);
             }
         }
 
@@ -78,7 +74,6 @@ implements
                 Collections.unmodifiableList(snapshotValidators(filter, 
metaModelContext));
         this.unmodifiablePostProcessors =
                 Collections.unmodifiableList(snapshotPostProcessors(filter, 
metaModelContext));
-
     }
 
     // -- SETUP
@@ -159,9 +154,7 @@ implements
         var factories = _Lists.<FacetFactory>newArrayList();
         for(var order : FacetProcessingOrder.values()) {
             var factoryEntrySet = factoryEntriesByOrder.get(order);
-            if(factoryEntrySet==null) {
-                continue;
-            }
+            if(factoryEntrySet==null)  continue;
             for(var factoryEntry : factoryEntrySet) {
                 
if(filter.acceptFactoryType(factoryEntry.getInstance().getClass(), 
factoryEntry.getMarkers())) {
                     factories.add(factoryEntry.getInstance());
@@ -181,9 +174,8 @@ implements
         var validators = _Lists.<MetaModelValidator>newArrayList();
         for(var order : ValidationOrder.values()) {
             var validatorEntrySet = validatorEntriesByOrder.get(order);
-            if(validatorEntrySet==null) {
-                continue;
-            }
+            if(validatorEntrySet==null) continue;
+
             for(var validatorEntry : validatorEntrySet) {
                 
if(filter.acceptValidator(validatorEntry.getInstance().getClass(), 
validatorEntry.getMarkers())) {
                     validators.add(validatorEntry.getInstance());
@@ -203,9 +195,8 @@ implements
         var postProcessors = _Lists.<MetaModelPostProcessor>newArrayList();
         for(var order : PostProcessingOrder.values()) {
             var postProcessorEntrySet = postProcessorEntriesByOrder.get(order);
-            if(postProcessorEntrySet==null) {
-                continue;
-            }
+            if(postProcessorEntrySet==null) continue;
+
             for(var postProcessorEntry : postProcessorEntrySet) {
                 if(filter.acceptPostProcessor(
                         postProcessorEntry.getInstance().getClass(),
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectSpecificationDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectSpecificationDefault.java
index 348559cf887..9d8a7d9bd83 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectSpecificationDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ObjectSpecificationDefault.java
@@ -115,6 +115,7 @@ import org.apache.causeway.core.metamodel.util.Facets;
 import static org.apache.causeway.commons.internal.base._NullSafe.stream;
 
 import lombok.Getter;
+import lombok.NonNull;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
@@ -135,11 +136,11 @@ implements ObjectMemberContainer, 
ObjectSpecificationMutable, HasSpecificationLo
     private final IntrospectionPolicy introspectionPolicy;
 
     public ObjectSpecificationDefault(
-            final CausewayBeanMetaData typeMeta,
-            final MetaModelContext mmc,
-            final FacetProcessor facetProcessor,
-            final PostProcessor postProcessor,
-            final ClassSubstitutorRegistry classSubstitutorRegistry) {
+            @NonNull final CausewayBeanMetaData typeMeta,
+            @NonNull final MetaModelContext mmc,
+            @NonNull final FacetProcessor facetProcessor,
+            @NonNull final PostProcessor postProcessor,
+            @NonNull final ClassSubstitutorRegistry classSubstitutorRegistry) {
 
         this.correspondingClass = typeMeta.getCorrespondingClass();
         this.logicalType = typeMeta.logicalType();
@@ -238,7 +239,7 @@ implements ObjectMemberContainer, 
ObjectSpecificationMutable, HasSpecificationLo
         updateInterfaces(interfaceSpecList);
     }
 
-    protected void introspectMembers() {
+    private void introspectMembers() {
 
         // yet this logic does not skip UNKNONW
         if(this.getBeanSort().isCollection()
@@ -254,7 +255,8 @@ implements ObjectMemberContainer, 
ObjectSpecificationMutable, HasSpecificationLo
         replaceAssociations(createAssociations());
         replaceActions(createActions());
 
-        postProcess();
+        postProcessor.postProcess(this);
+        invalidateCachedFacets();
     }
 
     private void addNamedFacetIfRequired() {
@@ -706,11 +708,6 @@ implements ObjectMemberContainer, 
ObjectSpecificationMutable, HasSpecificationLo
         this.aliasedFacet = getFacet(AliasedFacet.class);
     }
 
-    protected void postProcess() {
-        postProcessor.postProcess(this);
-        invalidateCachedFacets();
-    }
-
     @Override
     public final Optional<ValueFacet<?>> valueFacet() {
         if(valueFacet == null
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ProgrammingModelDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ProgrammingModelDefault.java
index 34a25ee8cf7..96a6ca64cd9 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ProgrammingModelDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/ProgrammingModelDefault.java
@@ -105,11 +105,11 @@ extends ProgrammingModelAbstract {
     ProgrammingModelDefault(final MetaModelContext mmc, final 
Iterable<MetaModelRefiner> refiners) {
         super(mmc);
 
-        // act on the peer objects (FacetedMethod etc), rather than 
ObjectMembers etc
+        // acts on the peer objects (FacetedMethod etc), rather than 
ObjectMembers etc
         addFacetFactories();
 
-        // only during the post processors will the mixin members been resolved
-        // and are available on the ObjectSpecification.
+        // only during post processing will the mixed-in members be resolved
+        // and made available to the ObjectSpecification
         addPostProcessors();
 
         addValidators();
@@ -253,7 +253,7 @@ extends ProgrammingModelAbstract {
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, new 
DisabledFromImmutablePostProcessor(mmc));
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, new 
SynthesizeDomainEventsForMixinPostProcessor(mmc));
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, new 
ProjectionFacetsPostProcessor(mmc));
-        
+
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, new 
NavigableSubtreeFacetPostProcessor(mmc));
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, new 
NavigationFacetFromHiddenTypePostProcessor(mmc));
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/SpecificationLoaderDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/SpecificationLoaderDefault.java
index 5e3d9f46012..16fb22c8815 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/SpecificationLoaderDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/SpecificationLoaderDefault.java
@@ -122,7 +122,7 @@ implements
     private final ClassSubstitutorRegistry classSubstitutorRegistry;
     private final Provider<ValueSemanticsResolver> valueSemanticsResolver;
     private final ProgrammingModel programmingModel;
-    private final PostProcessor postProcessor;
+    private PostProcessor postProcessor;
 
     @Inject
     public List<PreloadableTypes> preloadableTypes = Collections.emptyList();
@@ -154,7 +154,6 @@ implements
             final Provider<ValueSemanticsResolver> valueSemanticsRegistry,
             final ClassSubstitutorRegistry classSubstitutorRegistry) {
         this.programmingModel = programmingModel;
-        this.postProcessor = new PostProcessor(programmingModel);
         this.causewayConfiguration = causewayConfiguration;
         this.causewaySystemEnvironment = causewaySystemEnvironment;
         this.serviceRegistry = serviceRegistry;
@@ -171,6 +170,7 @@ implements
             final CausewaySystemEnvironment causewaySystemEnvironment,
             final ServiceRegistry serviceRegistry,
             final ProgrammingModel programmingModel,
+            final boolean enablePostprocessors,
             final CausewayBeanTypeClassifier causewayBeanTypeClassifier,
             final CausewayBeanTypeRegistry causewayBeanTypeRegistry,
             final ClassSubstitutorRegistry classSubstitutorRegistry) {
@@ -184,6 +184,9 @@ implements
         instance.metaModelContext = 
serviceRegistry.lookupServiceElseFail(MetaModelContext.class);
         instance.facetProcessor = new FacetProcessor(programmingModel, 
instance.metaModelContext);
         instance.facetProcessor.init();
+        instance.postProcessor = enablePostprocessors
+                ? new PostProcessor(programmingModel)
+                : new PostProcessor(programmingModel, Can.empty()); // 
explicitly use empty post processor list
 
         return instance;
     }
@@ -242,7 +245,7 @@ implements
 
         // initialize subcomponents, only after @PostConstruct has globally 
completed
         facetProcessor.init();
-        postProcessor.init();
+        this.postProcessor = new PostProcessor(programmingModel);
 
         var specs = new SpecCollector();
 
@@ -336,7 +339,7 @@ implements
         log.debug("shutting down {}", this);
         disposeMetaModel();
         facetProcessor.close();
-        postProcessor.close();
+        postProcessor = null;
         facetProcessor = null;
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/_JUnitSupport.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/_JUnitSupport.java
index e683d82a54c..6ca4c6c4a8b 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/_JUnitSupport.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/_JUnitSupport.java
@@ -41,13 +41,14 @@ public class _JUnitSupport {
             final CausewaySystemEnvironment causewaySystemEnvironment,
             final ServiceRegistry serviceRegistry,
             final ProgrammingModel programmingModel,
+            final boolean enablePostprocessors,
             final CausewayBeanTypeClassifier causewayBeanTypeClassifier,
             final CausewayBeanTypeRegistry causewayBeanTypeRegistry,
             final ClassSubstitutorRegistry classSubstitutorRegistry) {
 
         return SpecificationLoaderDefault
                 .instanceForTesting(causewayConfiguration, 
causewaySystemEnvironment, serviceRegistry,
-                        programmingModel, causewayBeanTypeClassifier, 
causewayBeanTypeRegistry,
+                        programmingModel, enablePostprocessors, 
causewayBeanTypeClassifier, causewayBeanTypeRegistry,
                         classSubstitutorRegistry);
     }
 
@@ -73,9 +74,11 @@ public class _JUnitSupport {
             final FacetedMethod facetedMethod) {
         return new ObjectActionDefault(facetedMethod.getFeatureIdentifier(), 
facetedMethod, false, true);
     }
+
     public ObjectAction actionForMixinMain(final FacetedMethod facetedMethod) {
         return new ObjectActionDefault(facetedMethod.getFeatureIdentifier(), 
facetedMethod, true, true);
     }
+
     public ObjectActionMixedIn mixedInActionforMixinMain(
             final ObjectSpecification mixeeSpec,
             final ObjectSpecification mixinSpec,
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/postprocessor/PostProcessor.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/postprocessor/PostProcessor.java
index 779d25a5459..f866cb9102c 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/postprocessor/PostProcessor.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/postprocessor/PostProcessor.java
@@ -24,32 +24,21 @@ import 
org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
 
-import lombok.RequiredArgsConstructor;
+public record PostProcessor(
+        ProgrammingModel programmingModel,
+        Can<MetaModelPostProcessor> enabledPostProcessors) {
 
-@RequiredArgsConstructor
-public class PostProcessor implements AutoCloseable {
-
-    private final ProgrammingModel programmingModel;
-    private Can<MetaModelPostProcessor> enabledPostProcessors = Can.empty(); 
// populated at #init
-
-    public void init() {
-        enabledPostProcessors = programmingModel.streamPostProcessors()
+    public PostProcessor(final ProgrammingModel programmingModel) {
+        this(programmingModel, programmingModel.streamPostProcessors()
                 .filter(MetaModelPostProcessor::isEnabled)
-                .collect(Can.toCan());
-    }
-
-    @Override
-    public void close() {
-        enabledPostProcessors = Can.empty();
+                .collect(Can.toCan()));
     }
 
     public void postProcess(final ObjectSpecification objectSpecification) {
 
         for (var postProcessor : enabledPostProcessors) {
 
-            if(!postProcessor.getFilter().test(objectSpecification)) {
-                continue;
-            }
+            if(!postProcessor.getFilter().test(objectSpecification)) continue;
 
             postProcessor.postProcessObject(objectSpecification);
 
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 f4a7b1ac092..e7c4e7df2d5 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
@@ -21,15 +21,16 @@ package 
org.apache.causeway.core.metamodel.facets.object.navchild;
 import java.util.stream.Collectors;
 
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.causeway.applib.graph.tree.TreeNode;
-import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract;
 
-//TODO[causeway-core-metamodel-CAUSEWAY-2297] WIP
 class TreeTraversalTest
 extends FacetFactoryTestAbstract {
 
@@ -38,22 +39,27 @@ extends FacetFactoryTestAbstract {
 
     @BeforeEach
     void setUp() {
-        mmc = MetaModelContext_forTesting.buildDefault();
+        mmc = MetaModelContext_forTesting.builder()
+                .enablePostprocessors(true)
+                .build();
         treeAdapter = new ObjectTreeAdapter(mmc.getSpecificationLoader());
     }
 
-    //@Test
+    @Test
     void preconditions() {
         var specLoader = mmc.getSpecificationLoader();
         var specA = specLoader.loadSpecification(_TreeSample.A.class);
+
+        // first: members must have the NavigableSubtreeSequenceFacet
         var assocAB = specA.getAssociationElseFail("childrenB");
-        //TODO[causeway-core-metamodel-CAUSEWAY-2297] we are seeing a 
PropertyAccessorFacetViaAccessor here,
-        // while it should be CollectionAccessorFacetViaAccessor
-        //TODO[causeway-core-metamodel-CAUSEWAY-2297] we are expecting to see 
a NavigableSubtreeFacet here,
-        // but we don't
-        System.err.printf("assocA %s%n", 
assocAB.streamFacets().collect(Can.toCan()).join("\n"));
+        assertTrue(assocAB.isCollection());
+        assertTrue(assocAB.containsFacet(NavigableSubtreeSequenceFacet.class));
+
+        // second: post-processor should generate NavigableSubtreeFacet
+        assertTrue(specA.containsFacet(NavigableSubtreeFacet.class));
     }
 
+    //TODO[causeway-core-metamodel-CAUSEWAY-2297] make test work
     //@Test
     void depthFirstTraversal() {
         // instantiate a tree, that we later traverse
@@ -72,6 +78,7 @@ extends FacetFactoryTestAbstract {
                 nodeNames);
     }
 
+    //TODO[causeway-core-metamodel-CAUSEWAY-2297] make test work
     //@Test
     void leafToRootTraversal() {
         // instantiate a tree and pick an arbitrary leaf value,

Reply via email to