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,