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 a41a0e1f932 CAUSEWAY-2297: FacetProcessor and PostProcessor are 
implementation details
a41a0e1f932 is described below

commit a41a0e1f932bcb1151b841819bcf45b102b2ffc9
Author: andi-huber <[email protected]>
AuthorDate: Sun Dec 15 12:32:00 2024 +0100

    CAUSEWAY-2297: FacetProcessor and PostProcessor are implementation
    details
---
 .../causeway/core/metamodel/facetapi/Facet.java    |   1 -
 .../core/metamodel/facets/FacetFactory.java        |   2 +-
 .../MandatoryFacetOnParametersDefaultFactory.java  |   4 +-
 .../MandatoryFacetOnProperyDefaultFactory.java     |   4 +-
 .../dflt/PropertyValidateFacetDefaultFactory.java  |   4 +-
 .../methods/MethodFilteringFacetFactory.java       |   3 -
 .../methods/MethodPrefixBasedFacetFactory.java     |   5 -
 .../impl}/FacetProcessor.java                      | 259 +++++++++------------
 .../metamodel/spec/impl/FacetedMethodsBuilder.java |   1 -
 .../spec/impl/ObjectSpecificationDefault.java      |   2 -
 .../postprocessor => spec/impl}/PostProcessor.java |   4 +-
 .../spec/impl/SpecificationLoaderDefault.java      |  11 +-
 12 files changed, 118 insertions(+), 182 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/Facet.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/Facet.java
index 4a9e7121b75..7fe0aeaa423 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/Facet.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facetapi/Facet.java
@@ -26,7 +26,6 @@ import org.apache.causeway.core.metamodel.facets.FacetFactory;
 import org.apache.causeway.core.metamodel.facets.FacetedMethod;
 import 
org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
 import org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet;
-import 
org.apache.causeway.core.metamodel.specloader.postprocessor.PostProcessor;
 
 public interface Facet
 extends
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/FacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/FacetFactory.java
index 8faf739c798..0eda0034714 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/FacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/FacetFactory.java
@@ -63,7 +63,7 @@ import lombok.RequiredArgsConstructor;
  * <p>
  *     To process a mixin member in the context of it actually being a mixin
  *     member (for example, authorization or translations), instead use the
- *     {@link 
org.apache.causeway.core.metamodel.specloader.postprocessor.PostProcessor} 
interface.
+ *     {@link org.apache.causeway.core.metamodel.spec.impl.PostProcessor} 
interface.
  * </p>
  */
 public interface FacetFactory {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
index 816454c3418..5020ea409c5 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
@@ -27,7 +27,7 @@ import org.apache.causeway.core.metamodel.facets.FacetFactory;
 import org.apache.causeway.core.metamodel.facets.FacetFactoryAbstract;
 import 
org.apache.causeway.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
 import 
org.apache.causeway.core.metamodel.facets.objectvalue.mandatory.MandatoryFacetDefault;
-import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcessor;
+import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
 
 /**
  * Simply installs a {@link MandatoryFacetDefault} onto all properties and
@@ -35,7 +35,7 @@ import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcess
  *
  * <p>
  * The idea is that this {@link FacetFactory} is included early on in the
- * {@link FacetProcessor}, but other {@link MandatoryFacet} implementations
+ * {@link ProgrammingModel}, but other {@link MandatoryFacet} implementations
  * which don't require mandatory semantics will potentially replace these where
  * the property or parameter is annotated or otherwise indicated as being
  * optional.
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/mandatory/dflt/MandatoryFacetOnProperyDefaultFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/mandatory/dflt/MandatoryFacetOnProperyDefaultFactory.java
index 842f0a07c40..8cbe64b7222 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/mandatory/dflt/MandatoryFacetOnProperyDefaultFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/mandatory/dflt/MandatoryFacetOnProperyDefaultFactory.java
@@ -27,7 +27,7 @@ import org.apache.causeway.core.metamodel.facets.FacetFactory;
 import org.apache.causeway.core.metamodel.facets.FacetFactoryAbstract;
 import 
org.apache.causeway.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
 import 
org.apache.causeway.core.metamodel.facets.objectvalue.mandatory.MandatoryFacetDefault;
-import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcessor;
+import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
 
 /**
  * Simply installs a {@link MandatoryFacetDefault} onto all properties and
@@ -35,7 +35,7 @@ import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcess
  *
  * <p>
  * The idea is that this {@link FacetFactory} is included early on in the
- * {@link FacetProcessor}, but other {@link MandatoryFacet} implementations
+ * {@link ProgrammingModel}, but other {@link MandatoryFacet} implementations
  * which don't require mandatory semantics will potentially replace these where
  * the property or parameter is annotated or otherwise indicated as being
  * optional.
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefaultFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefaultFactory.java
index acf09ca5962..12aa76f24db 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefaultFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefaultFactory.java
@@ -25,14 +25,14 @@ import 
org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facets.FacetFactory;
 import org.apache.causeway.core.metamodel.facets.FacetFactoryAbstract;
 import 
org.apache.causeway.core.metamodel.facets.properties.validating.PropertyValidateFacet;
-import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcessor;
+import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
 
 /**
  * Simply installs a {@link PropertyValidateFacet} onto all properties.
  *
  * <p>
  * The idea is that this {@link FacetFactory} is included early on in the
- * {@link FacetProcessor}, but other {@link PropertyValidateFacet}
+ * {@link ProgrammingModel}, but other {@link PropertyValidateFacet}
  * implementations will potentially replace these where the property is
  * annotated or otherwise provides a validation mechanism.
  */
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/methods/MethodFilteringFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/methods/MethodFilteringFacetFactory.java
index e7cd6e5d428..40307d514c9 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/methods/MethodFilteringFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/methods/MethodFilteringFacetFactory.java
@@ -22,12 +22,9 @@ import java.lang.reflect.Method;
 
 import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
 import org.apache.causeway.core.metamodel.facets.FacetFactory;
-import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcessor;
 
 /**
  * A {@link FacetFactory} which filters out arbitrary {@link Method method}s.
- * <p>
- * Used by {@link FacetProcessor#recognizes(ResolvedMethod)}
  */
 public interface MethodFilteringFacetFactory extends FacetFactory {
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/methods/MethodPrefixBasedFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/methods/MethodPrefixBasedFacetFactory.java
index 6d79eb7c390..d9c3a41abe5 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/methods/MethodPrefixBasedFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/methods/MethodPrefixBasedFacetFactory.java
@@ -19,17 +19,12 @@
 package org.apache.causeway.core.metamodel.methods;
 
 import org.apache.causeway.commons.collections.Can;
-import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
 import org.apache.causeway.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.causeway.core.metamodel.facets.FacetFactory;
-import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcessor;
 
 /**
  * Indicates that the {@link FacetFactory} works by recognizing methods with a
  * certain prefix (or prefixes).
- *
- * <p>
- * Used by {@link FacetProcessor#recognizes(ResolvedMethod)}.
  */
 public interface MethodPrefixBasedFacetFactory extends FacetFactory, 
MetaModelRefiner {
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/facetprocessor/FacetProcessor.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/FacetProcessor.java
similarity index 66%
rename from 
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/facetprocessor/FacetProcessor.java
rename to 
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/FacetProcessor.java
index 626cc510b23..09ee9cf1998 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/facetprocessor/FacetProcessor.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/FacetProcessor.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.core.metamodel.specloader.facetprocessor;
+package org.apache.causeway.core.metamodel.spec.impl;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -29,9 +29,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.causeway.applib.annotation.Introspection.IntrospectionPolicy;
-import org.apache.causeway.commons.internal.base._Lazy;
-import org.apache.causeway.commons.internal.collections._Lists;
-import org.apache.causeway.commons.internal.collections._Maps;
+import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.collections._Multimaps;
 import 
org.apache.causeway.commons.internal.collections._Multimaps.ListMultimap;
 import org.apache.causeway.commons.internal.collections._Sets;
@@ -56,111 +54,83 @@ import 
org.apache.causeway.core.metamodel.methods.MethodPrefixBasedFacetFactory;
 import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 
-import lombok.Getter;
 import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
 
-@RequiredArgsConstructor
-public class FacetProcessor
-implements HasMetaModelContext, AutoCloseable{
-
-    private final @NonNull ProgrammingModel programmingModel;
-
-    @Getter(onMethod_ = {@Override})
-    private final @NonNull MetaModelContext metaModelContext;
-
-    /**
-     * Class<FacetFactory> => FacetFactory
-     */
-    private final Map<Class<? extends FacetFactory>, FacetFactory> 
factoryByFactoryType = _Maps.newHashMap();
-
-    /**
-     * {@link FacetFactory Facet factories}, in order they were
-     * {@link #registerFactory(FacetFactory) registered}.
-     */
-    private final List<FacetFactory> factories = _Lists.newArrayList();
-
-    /**
-     * All method prefixes to check in {@link #recognizes(Method)}.
-     *
-     * <p>
-     * Derived from factories that implement
-     * {@link MethodPrefixBasedFacetFactory}.
-     *
-     */
-    private final _Lazy<Set<String>> methodPrefixes =
-            _Lazy.threadSafe(this::init_methodPrefixes);
-
-    /**
-     * All registered {@link FacetFactory factories} that implement
-     * {@link MethodFilteringFacetFactory}.
-     *
-     * <p>
-     * Used within {@link #recognizes(Method)}.
-     *
-     */
-    private final _Lazy<List<MethodFilteringFacetFactory>> 
methodFilteringFactories =
-            _Lazy.threadSafe(this::init_methodFilteringFactories);
-
-    /**
-     * {@link FacetFactory factories} that implement {@link 
AccessorFacetFactory}
-     * and support properties.
-     * <p>
-     * Used within {@link #recognizes(Method)}.
-     */
-    private final _Lazy<List<AccessorFacetFactory>> propertyAccessorFactories =
-        _Lazy.threadSafe(this::init_propertyIdentifyingFactories);
-
-    /**
-     * {@link FacetFactory factories} that implement {@link 
AccessorFacetFactory}
-     * and support collections.
-     * <p>
-     * Used within {@link #recognizes(Method)}.
-     */
-    private final _Lazy<List<AccessorFacetFactory>> 
collectionAccessorFactories =
-        _Lazy.threadSafe(this::init_collectionIdentifyingFactories);
-
-    /**
-     * ObjectFeatureType => List<FacetFactory>
-     *
-     * <p>
-     * Lazily initialized, then cached. The lists remain in the same order that
-     * the factories were {@link #registerFactory(FacetFactory) registered}.
-     */
-    private final _Lazy<ListMultimap<FeatureType, FacetFactory>> 
factoryListByFeatureType =
-            _Lazy.threadSafe(this::init_factoriesByFeatureType);
-
-    // -- LIFECYCLE
-
-    public void init() {
-        cleanUp();
-        programmingModel.streamFactories()
-        .forEach(this::registerFactory);
-    }
-
-    @Override
-    public void close() {
-        cleanUp();
+record FacetProcessor(
+        ProgrammingModel programmingModel,
+        /**
+         * {@link FacetFactory Facet factories}, in order as provided by the 
ProgrammingModel.
+         */
+        Can<FacetFactory> factories,
+        /**
+         * Class<FacetFactory> => FacetFactory
+         */
+        Map<Class<? extends FacetFactory>, FacetFactory> factoryByFactoryType,
+        /**
+         * <pre>ObjectFeatureType => List of FacetFactory</pre>
+         * <p>
+         * The lists remain in the same order as the order in
+         * {@link #factories}.
+         */
+        ListMultimap<FeatureType, FacetFactory> factoriesByFeatureType,
+        /**
+         * All method prefixes to check in {@link #recognizes(Method)}.
+         * <p>
+         * Derived from factories that implement
+         * {@link MethodPrefixBasedFacetFactory}.
+         */
+        Set<String> methodPrefixes,
+        /**
+         * All registered {@link FacetFactory factories} that implement
+         * {@link MethodFilteringFacetFactory}.
+         */
+        List<MethodFilteringFacetFactory> methodFilteringFactories,
+        /**
+         * {@link FacetFactory factories} that implement {@link 
AccessorFacetFactory}
+         * and support properties.
+         */
+        List<AccessorFacetFactory> propertyAccessorFactories,
+        /**
+         * {@link FacetFactory factories} that implement {@link 
AccessorFacetFactory}
+         * and support collections.
+         */
+        List<AccessorFacetFactory> collectionAccessorFactories,
+        List<ObjectTypeFacetFactory> objectSpecIfFacetFactoryList
+        )
+implements HasMetaModelContext {
+
+    public FacetProcessor(
+            @NonNull final ProgrammingModel programmingModel) {
+        this(programmingModel, programmingModel.streamFactories()
+                
.map(programmingModel.getMetaModelContext().getServiceInjector()::injectServicesInto)
+                .collect(Can.toCan()));
     }
 
-    private void cleanUp() {
-        clearCaches();
-        factories.clear();
-        factoryByFactoryType.clear();
+    private FacetProcessor(
+            final ProgrammingModel programmingModel,
+            final Can<FacetFactory> factories) {
+        this(programmingModel, factories, 
factories.toMap(FacetFactory::getClass), factoriesByFeatureType(factories));
     }
 
-    private void registerFactory(final FacetFactory factory) {
-        factoryByFactoryType.put(factory.getClass(), factory);
-        factories.add(factory);
-        injectDependenciesInto(factory);
+    private FacetProcessor(
+            final ProgrammingModel programmingModel,
+            final Can<FacetFactory> factories,
+            final Map<Class<? extends FacetFactory>, FacetFactory> 
factoryByFactoryType,
+            final ListMultimap<FeatureType, FacetFactory> 
factoriesByFeatureType) {
+        this(programmingModel,
+                factories,
+                factoryByFactoryType,
+                factoriesByFeatureType,
+                methodPrefixes(factories),
+                methodFilteringFactories(factories),
+                propertyAccessorFactories(factories),
+                collectionAccessorFactories(factories),
+                objectSpecIfFacetFactoryList(factoriesByFeatureType, 
factories));
     }
 
-    /**
-     * This is <tt>public</tt> so that can be used for <tt>@Facets</tt>
-     * processing.
-     */
-    public void injectDependenciesInto(final FacetFactory factory) {
-        metaModelContext.getServiceInjector().injectServicesInto(factory);
+    @Override
+    public MetaModelContext getMetaModelContext() {
+        return programmingModel.getMetaModelContext();
     }
 
     /**
@@ -175,13 +145,13 @@ implements HasMetaModelContext, AutoCloseable{
             final Consumer<ResolvedMethod> onCandidate) {
 
         methodStream.forEach(method->{
-            for (var facetFactory : propertyAccessorFactories.get()) {
+            for (var facetFactory : propertyAccessorFactories) {
                 if (facetFactory.isAssociationAccessor(method)) {
                     onCandidate.accept(method);
                     return; // first wins
                 }
             }
-            for (var facetFactory : collectionAccessorFactories.get()) {
+            for (var facetFactory : collectionAccessorFactories) {
                 if (facetFactory.isAssociationAccessor(method)) {
                     onCandidate.accept(method);
                     return; // first wins
@@ -198,7 +168,7 @@ implements HasMetaModelContext, AutoCloseable{
     public List<ResolvedMethod> findAndRemovePropertyAccessors(
             final MethodRemover methodRemover) {
         var propertyAccessors = new ArrayList<ResolvedMethod>();
-        for (var facetFactory : propertyAccessorFactories.get()) {
+        for (var facetFactory : propertyAccessorFactories) {
             methodRemover.removeMethods(facetFactory::isAssociationAccessor, 
propertyAccessors::add);
         }
         return propertyAccessors;
@@ -212,7 +182,7 @@ implements HasMetaModelContext, AutoCloseable{
     public List<ResolvedMethod> findAndRemoveCollectionAccessors(
             final MethodRemover methodRemover) {
         var collectionAccessors = new ArrayList<ResolvedMethod>();
-        for (var facetFactory : collectionAccessorFactories.get()) {
+        for (var facetFactory : collectionAccessorFactories) {
             methodRemover.removeMethods(facetFactory::isAssociationAccessor, 
collectionAccessors::add);
         }
         return collectionAccessors;
@@ -236,40 +206,21 @@ implements HasMetaModelContext, AutoCloseable{
      */
     public boolean recognizes(final ResolvedMethod method) {
         var methodName = method.name();
-        for (var prefix : methodPrefixes.get()) {
+        for (var prefix : methodPrefixes) {
             if (methodName.startsWith(prefix)) return true;
         }
-        for (var factory : methodFilteringFactories.get()) {
+        for (var factory : methodFilteringFactories) {
             if (factory.recognizes(method)) return true;
         }
         return false;
     }
 
     public void processObjectType(final Class<?> cls, final FacetHolder 
facetHolder) {
-        var factoryList = getObjectSpecIfFacetFactoryList();
-        for (var facetFactory : factoryList) {
+        for (var facetFactory : objectSpecIfFacetFactoryList()) {
             facetFactory.process(new ProcessObjectTypeContext(cls, 
facetHolder));
         }
     }
 
-    private List<ObjectTypeFacetFactory> objectSpecIfFacetFactoryList = null;
-
-    private List<ObjectTypeFacetFactory> getObjectSpecIfFacetFactoryList() {
-        if(objectSpecIfFacetFactoryList == null) {
-            var facetFactories = _Lists.<ObjectTypeFacetFactory>newArrayList();
-
-            factoryListByFeatureType.get().getOrElseEmpty(FeatureType.OBJECT)
-            .forEach(facetFactory->{
-                if (facetFactory instanceof ObjectTypeFacetFactory) {
-                    facetFactories.add((ObjectTypeFacetFactory) facetFactory);
-                }
-            });
-
-            objectSpecIfFacetFactoryList = 
Collections.unmodifiableList(facetFactories);
-        }
-        return objectSpecIfFacetFactoryList;
-    }
-
     /**
      * Attaches all facets applicable to the provided {@link FeatureType#OBJECT
      * object}) to the supplied {@link FacetHolder}.
@@ -289,15 +240,14 @@ implements HasMetaModelContext, AutoCloseable{
             final IntrospectionPolicy introspectionPolicy,
             final MethodRemover methodRemover,
             final FacetHolder facetHolder) {
-
         var ctx = new ProcessClassContext(
                 cls,
                 introspectionPolicy,
                 removerElseNoopRemover(methodRemover),
                 facetHolder);
 
-        factoryListByFeatureType.get().getOrElseEmpty(FeatureType.OBJECT)
-        .forEach(facetFactory->facetFactory.process(ctx));
+        factoriesByFeatureType.getOrElseEmpty(FeatureType.OBJECT)
+            .forEach(facetFactory->facetFactory.process(ctx));
     }
 
     /**
@@ -339,7 +289,7 @@ implements HasMetaModelContext, AutoCloseable{
                         method,
                         removerElseNoopRemover(methodRemover), facetedMethod, 
isMixinMain);
 
-        for (FacetFactory facetFactory : 
factoryListByFeatureType.get().getOrElseEmpty(featureType)) {
+        for (FacetFactory facetFactory : 
factoriesByFeatureType.getOrElseEmpty(featureType)) {
             facetFactory.process(processMethodContext);
         }
     }
@@ -374,26 +324,16 @@ implements HasMetaModelContext, AutoCloseable{
                 new ProcessParameterContext(introspectedClass, 
introspectionPolicy,
                         method, methodRemover, facetedMethodParameter);
 
-        var factoryCache = factoryListByFeatureType.get();
-
         FeatureType.PARAMETERS_ONLY.stream()
-        .map(factoryCache::getOrElseEmpty)
-        .flatMap(List::stream)
-        .collect(Collectors.toSet())
-        
.forEach(facetFactory->facetFactory.processParams(processParameterContext));
-    }
-
-    private void clearCaches() {
-        factoryListByFeatureType.clear();
-        methodPrefixes.clear();
-        methodFilteringFactories.clear();
-        propertyAccessorFactories.clear();
-        collectionAccessorFactories.clear();
+            .map(factoriesByFeatureType::getOrElseEmpty)
+            .flatMap(List::stream)
+            .collect(Collectors.toSet())
+            
.forEach(facetFactory->facetFactory.processParams(processParameterContext));
     }
 
     // -- INITIALIZERS
 
-    private ListMultimap<FeatureType, FacetFactory> 
init_factoriesByFeatureType() {
+    private static ListMultimap<FeatureType, FacetFactory> 
factoriesByFeatureType(final Iterable<FacetFactory> factories) {
         var factoryListByFeatureType = _Multimaps.<FeatureType, 
FacetFactory>newListMultimap();
         for (var factory : factories) {
             factory.getFeatureTypes().forEach(featureType->
@@ -402,29 +342,27 @@ implements HasMetaModelContext, AutoCloseable{
         return factoryListByFeatureType;
     }
 
-    private Set<String> init_methodPrefixes() {
+    private static Set<String> methodPrefixes(final Iterable<FacetFactory> 
factories) {
         var cachedMethodPrefixes = _Sets.<String>newHashSet();
         for (var facetFactory : factories) {
-            if (facetFactory instanceof MethodPrefixBasedFacetFactory) {
-                var methodPrefixBasedFacetFactory = 
(MethodPrefixBasedFacetFactory) facetFactory;
+            if (facetFactory instanceof MethodPrefixBasedFacetFactory 
methodPrefixBasedFacetFactory) {
                 
methodPrefixBasedFacetFactory.getPrefixes().forEach(cachedMethodPrefixes::add);
             }
         }
         return cachedMethodPrefixes;
     }
 
-    private List<MethodFilteringFacetFactory> init_methodFilteringFactories() {
+    private static List<MethodFilteringFacetFactory> 
methodFilteringFactories(final Iterable<FacetFactory> factories) {
         var methodFilteringFactories = new 
ArrayList<MethodFilteringFacetFactory>();
         for (var factory : factories) {
-            if (factory instanceof MethodFilteringFacetFactory) {
-                var methodFilteringFacetFactory = 
(MethodFilteringFacetFactory) factory;
+            if (factory instanceof MethodFilteringFacetFactory 
methodFilteringFacetFactory) {
                 methodFilteringFactories.add(methodFilteringFacetFactory);
             }
         }
         return methodFilteringFactories;
     }
 
-    private List<AccessorFacetFactory> init_propertyIdentifyingFactories() {
+    private static List<AccessorFacetFactory> propertyAccessorFactories(final 
Iterable<FacetFactory> factories) {
         var propertyOrCollectionIdentifyingFactories = new 
ArrayList<AccessorFacetFactory>();
         for (var factory : factories) {
             if (factory instanceof AccessorFacetFactory accessorFacetFactory) {
@@ -434,7 +372,7 @@ implements HasMetaModelContext, AutoCloseable{
         }
         return propertyOrCollectionIdentifyingFactories;
     }
-    private List<AccessorFacetFactory> init_collectionIdentifyingFactories() {
+    private static List<AccessorFacetFactory> 
collectionAccessorFactories(final Iterable<FacetFactory> factories) {
         var propertyOrCollectionIdentifyingFactories = new 
ArrayList<AccessorFacetFactory>();
         for (var factory : factories) {
             if (factory instanceof AccessorFacetFactory accessorFacetFactory) {
@@ -445,6 +383,19 @@ implements HasMetaModelContext, AutoCloseable{
         return propertyOrCollectionIdentifyingFactories;
     }
 
+    private static List<ObjectTypeFacetFactory> objectSpecIfFacetFactoryList(
+            final ListMultimap<FeatureType, FacetFactory> 
factoryListByFeatureType,
+            final Iterable<FacetFactory> factories) {
+            var facetFactories = new ArrayList<ObjectTypeFacetFactory>();
+            factoryListByFeatureType.getOrElseEmpty(FeatureType.OBJECT)
+            .forEach(facetFactory->{
+                if (facetFactory instanceof ObjectTypeFacetFactory 
objectTypeFacetFactory) {
+                    facetFactories.add(objectTypeFacetFactory);
+                }
+            });
+            return Collections.unmodifiableList(facetFactories);
+    }
+
     // -- HELPER
 
     private static MethodRemover removerElseNoopRemover(final MethodRemover 
methodRemover) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/FacetedMethodsBuilder.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/FacetedMethodsBuilder.java
index 5525715ed4b..912c311215e 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/FacetedMethodsBuilder.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/FacetedMethodsBuilder.java
@@ -55,7 +55,6 @@ import 
org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.causeway.core.metamodel.facets.object.mixin.MixinFacet;
 import 
org.apache.causeway.core.metamodel.services.classsubstitutor.ClassSubstitutorRegistry;
 import 
org.apache.causeway.core.metamodel.spec.impl.ObjectSpecificationMutable.IntrospectionState;
-import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcessor;
 import org.apache.causeway.core.metamodel.specloader.typeextract.TypeExtractor;
 
 import lombok.Getter;
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 9d8a7d9bd83..5598b3ccf53 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
@@ -107,8 +107,6 @@ import 
org.apache.causeway.core.metamodel.spec.feature.MixedIn;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
-import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcessor;
-import 
org.apache.causeway.core.metamodel.specloader.postprocessor.PostProcessor;
 import org.apache.causeway.core.metamodel.spi.EntityTitleSubscriber;
 import org.apache.causeway.core.metamodel.util.Facets;
 
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/spec/impl/PostProcessor.java
similarity index 96%
rename from 
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/postprocessor/PostProcessor.java
rename to 
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/PostProcessor.java
index f866cb9102c..9b7fcdfe4a8 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/spec/impl/PostProcessor.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.causeway.core.metamodel.specloader.postprocessor;
+package org.apache.causeway.core.metamodel.spec.impl;
 
 import org.apache.causeway.commons.collections.Can;
 import 
org.apache.causeway.core.metamodel.postprocessors.MetaModelPostProcessor;
@@ -24,7 +24,7 @@ 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;
 
-public record PostProcessor(
+record PostProcessor(
         ProgrammingModel programmingModel,
         Can<MetaModelPostProcessor> enabledPostProcessors) {
 
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 16fb22c8815..828cfae02d0 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
@@ -78,8 +78,6 @@ import 
org.apache.causeway.core.metamodel.services.classsubstitutor.ClassSubstit
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import 
org.apache.causeway.core.metamodel.spec.impl.ObjectSpecificationMutable.IntrospectionState;
-import 
org.apache.causeway.core.metamodel.specloader.facetprocessor.FacetProcessor;
-import 
org.apache.causeway.core.metamodel.specloader.postprocessor.PostProcessor;
 import 
org.apache.causeway.core.metamodel.specloader.validator.ValidationFailure;
 import 
org.apache.causeway.core.metamodel.specloader.validator.ValidationFailures;
 import 
org.apache.causeway.core.metamodel.valuetypes.ValueSemanticsResolverDefault;
@@ -182,8 +180,7 @@ implements
                 classSubstitutorRegistry);
 
         instance.metaModelContext = 
serviceRegistry.lookupServiceElseFail(MetaModelContext.class);
-        instance.facetProcessor = new FacetProcessor(programmingModel, 
instance.metaModelContext);
-        instance.facetProcessor.init();
+        instance.facetProcessor = new FacetProcessor(programmingModel);
         instance.postProcessor = enablePostprocessors
                 ? new PostProcessor(programmingModel)
                 : new PostProcessor(programmingModel, Can.empty()); // 
explicitly use empty post processor list
@@ -199,7 +196,7 @@ implements
             log.debug("initialising {}", this);
         }
         this.metaModelContext = 
serviceRegistry.lookupServiceElseFail(MetaModelContext.class);
-        this.facetProcessor = new FacetProcessor(programmingModel, 
metaModelContext);
+        this.facetProcessor = new FacetProcessor(programmingModel);
     }
 
     record SpecCollector(
@@ -244,7 +241,7 @@ implements
         var stopWatch = _Timing.now();
 
         // initialize subcomponents, only after @PostConstruct has globally 
completed
-        facetProcessor.init();
+        this.facetProcessor = new FacetProcessor(programmingModel);
         this.postProcessor = new PostProcessor(programmingModel);
 
         var specs = new SpecCollector();
@@ -338,7 +335,7 @@ implements
     public void shutdown() {
         log.debug("shutting down {}", this);
         disposeMetaModel();
-        facetProcessor.close();
+        facetProcessor = null;
         postProcessor = null;
         facetProcessor = null;
     }

Reply via email to