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

commit f494e8d6c4c517d9e4544f2fd28ebb51113c043d
Author: Andi Huber <[email protected]>
AuthorDate: Sat Dec 14 09:22:42 2024 +0100

    CAUSEWAY-2297: work on simplified tree model (part 12)
    
    - refactor, optimize accessor facet creation
---
 .../metamodel/facets/AccessorFacetFactory.java     | 60 ++++++++++++++
 ...ract.java => AccessorFacetFactoryAbstract.java} | 26 +++++-
 ...ropertyOrCollectionIdentifyingFacetFactory.java | 84 -------------------
 .../CollectionAccessorFacetViaAccessorFactory.java | 31 ++++---
 .../PropertyAccessorFacetViaAccessorFactory.java   | 33 ++++----
 .../specloader/facetprocessor/FacetProcessor.java  | 95 ++++++++++++----------
 .../facets/object/navchild/TreeTraversalTest.java  | 18 ++++
 7 files changed, 182 insertions(+), 165 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactory.java
new file mode 100644
index 00000000000..3c4e9e8a815
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactory.java
@@ -0,0 +1,60 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.core.metamodel.facets;
+
+import java.util.function.Consumer;
+
+import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
+import org.apache.causeway.core.metamodel.facetapi.MethodRemover;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+
+/**
+ * A {@link FacetFactory} implementation that is able to identify property or
+ * collection accessors.
+ * <p>
+ * For example, a <i>getter</i> method is most commonly used to represent 
either
+ * a property (value or reference) or a collection, with the return type
+ * indicating which.
+ */
+public interface AccessorFacetFactory extends FacetFactory {
+
+    /**
+     * Whether is in support of {@link OneToOneAssociation}(s).
+     */
+    boolean supportsProperties();
+    /**
+     * Whether is in support of {@link OneToManyAssociation}(s).
+     */
+    boolean supportsCollections();
+
+    /**
+     * Whether (this facet is able to determine that) the supplied
+     * {@link ResolvedMethod} represents an accessor to an {@link 
ObjectAssociation}.
+     */
+    boolean isAssociationAccessor(ResolvedMethod method);
+
+    /**
+     * Uses the provided {@link MethodRemover} to remove all matching accessors
+     * and calls back the supplied consumer.
+     */
+    void findAndRemoveAccessors(MethodRemover methodRemover, 
Consumer<ResolvedMethod> onMatchingAccessor);
+
+}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactoryAbstract.java
similarity index 62%
rename from 
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java
rename to 
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactoryAbstract.java
index 4e0f778abdd..5d8183eac95 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactoryAbstract.java
@@ -20,19 +20,21 @@ package org.apache.causeway.core.metamodel.facets;
 
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.collections.ImmutableEnumSet;
+import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
+import 
org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import 
org.apache.causeway.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
-public abstract class PropertyOrCollectionIdentifyingFacetFactoryAbstract
+public abstract class AccessorFacetFactoryAbstract
 extends MethodPrefixBasedFacetFactoryAbstract
-implements PropertyOrCollectionIdentifyingFacetFactory {
+implements AccessorFacetFactory {
 
-    protected PropertyOrCollectionIdentifyingFacetFactoryAbstract(
+    protected AccessorFacetFactoryAbstract(
             final MetaModelContext mmc,
             final ImmutableEnumSet<FeatureType> featureTypes,
             final Can<String> prefixes) {
-
         super(mmc, featureTypes, OrphanValidation.DONT_VALIDATE, prefixes);
     }
 
@@ -46,4 +48,20 @@ implements PropertyOrCollectionIdentifyingFacetFactory {
         return super.getFeatureTypes().contains(FeatureType.COLLECTION);
     }
 
+    @Override
+    public final void process(final ProcessMethodContext processMethodContext) 
{
+        var accessorMethod = 
processMethodContext.getMethod().asMethodElseFail();
+        processMethodContext.removeMethod(accessorMethod);
+
+        var cls = processMethodContext.getCls();
+        var typeSpec = getSpecificationLoader().loadSpecification(cls);
+        var facetHolder = processMethodContext.getFacetHolder();
+
+
+        addFacet(createFacet(typeSpec, accessorMethod, facetHolder));
+    }
+
+    protected abstract PropertyOrCollectionAccessorFacet createFacet(
+        ObjectSpecification typeSpec, ResolvedMethod accessorMethod, 
FacetedMethod facetHolder);
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactory.java
deleted file mode 100644
index 9f4483012e6..00000000000
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactory.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.core.metamodel.facets;
-
-import java.lang.reflect.Method;
-import java.util.List;
-
-import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
-import org.apache.causeway.core.metamodel.facetapi.MethodRemover;
-
-/**
- * A {@link FacetFactory} implementation that is able to identify a property or
- * collection.
- * <p>
- * For example, a <i>getter</i> method is most commonly used to represent 
either
- * a property (value or reference) or a collection, with the return type
- * indicating which.
- * <p>
- * Used by the Java 8 Reflector's <tt>ProgrammingModel</tt> to determine which
- * facet factories to ask whether a {@link Method} represents a property or a
- * collection.
- */
-public interface PropertyOrCollectionIdentifyingFacetFactory extends 
FacetFactory {
-
-//    /**
-//     * Whether (this facet is able to determine that) the supplied
-//     * {@link Method} possibly represents the accessor of either a
-//     * {@link OneToOneAssociation reference property}
-//     * or a {@link OneToManyAssociation collection}.
-//     * <p>
-//     * For example, if a method name has a prefix of <tt>get</tt> or
-//     * alternatively has a prefix of <tt>is</tt> and returns a 
<tt>boolean</tt>,
-//     * then it would be a candidate.
-//     */
-//    boolean isPropertyOrCollectionGetterCandidate(ResolvedMethod method);
-
-    boolean supportsProperties();
-    boolean supportsCollections();
-
-    boolean isAssociationAccessor(ResolvedMethod method);
-    void findAndRemoveAccessors(MethodRemover methodRemover, 
List<ResolvedMethod> methodListToAppendTo);
-
-
-//    /**
-//     * Whether (this facet is able to determine that) the supplied
-//     * {@link Method} represents a
-//     * {@link OneToOneAssociation reference property}.
-//     */
-//    boolean isPropertyAccessor(ResolvedMethod method);
-//
-//    /**
-//     * Whether (this facet is able to determine that) the supplied
-//     * {@link Method} represents a {@link OneToManyAssociation collection}.
-//     */
-//    boolean isCollectionAccessor(ResolvedMethod method);
-//
-//    /**
-//     * Use the provided {@link MethodRemover} to remove all reference 
property
-//     * accessors, and append them to the supplied methodList.
-//     */
-//    void findAndRemovePropertyAccessors(MethodRemover methodRemover, 
List<ResolvedMethod> methodListToAppendTo);
-//
-//    /**
-//     * Use the provided {@link MethodRemover} to remove all collection
-//     * accessors, and append them to the supplied methodList.
-//     */
-//    void findAndRemoveCollectionAccessors(MethodRemover methodRemover, 
List<ResolvedMethod> methodListToAppendTo);
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
index d33c86620c2..841f05804db 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
@@ -18,7 +18,7 @@
  */
 package org.apache.causeway.core.metamodel.facets.collections.accessor;
 
-import java.util.List;
+import java.util.function.Consumer;
 
 import jakarta.inject.Inject;
 
@@ -28,10 +28,13 @@ import 
org.apache.causeway.commons.semantics.AccessorSemantics;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facetapi.MethodRemover;
-import 
org.apache.causeway.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.facets.AccessorFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.facets.FacetedMethod;
+import 
org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
 public class CollectionAccessorFacetViaAccessorFactory
-extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
+extends AccessorFacetFactoryAbstract {
 
     private static final Can<String> PREFIXES = Can.empty();
 
@@ -40,18 +43,6 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
         super(mmc, FeatureType.COLLECTIONS_ONLY, PREFIXES);
     }
 
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        var accessorMethod = 
processMethodContext.getMethod().asMethodElseFail(); // no-arg method, should 
have a regular facade
-        processMethodContext.removeMethod(accessorMethod);
-
-        var cls = processMethodContext.getCls();
-        var typeSpec = getSpecificationLoader().loadSpecification(cls);
-        var facetHolder = processMethodContext.getFacetHolder();
-
-        addFacet(new CollectionAccessorFacetViaAccessor(typeSpec, 
accessorMethod, facetHolder));
-    }
-
     @Override
     public boolean isAssociationAccessor(final ResolvedMethod method) {
         return AccessorSemantics.isCollectionAccessor(method);
@@ -59,8 +50,14 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
 
     @Override
     public void findAndRemoveAccessors(
-            final MethodRemover methodRemover, final List<ResolvedMethod> 
methodListToAppendTo) {
-        
methodRemover.removeMethods(AccessorSemantics::hasSupportedNonScalarMethodReturnType,
 methodListToAppendTo::add);
+            final MethodRemover methodRemover, final Consumer<ResolvedMethod> 
onMatchingAccessor) {
+        
methodRemover.removeMethods(AccessorSemantics::hasSupportedNonScalarMethodReturnType,
 onMatchingAccessor);
+    }
+
+    @Override
+    protected PropertyOrCollectionAccessorFacet createFacet(
+        final ObjectSpecification typeSpec, final ResolvedMethod 
accessorMethod, final FacetedMethod facetHolder) {
+        return new CollectionAccessorFacetViaAccessor(typeSpec, 
accessorMethod, facetHolder);
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
index 7779dcbd69b..8508aeb30f1 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
@@ -18,7 +18,7 @@
  */
 package org.apache.causeway.core.metamodel.facets.properties.accessor;
 
-import java.util.List;
+import java.util.function.Consumer;
 
 import jakarta.inject.Inject;
 
@@ -28,10 +28,13 @@ import 
org.apache.causeway.commons.semantics.AccessorSemantics;
 import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facetapi.MethodRemover;
-import 
org.apache.causeway.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.facets.AccessorFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.facets.FacetedMethod;
+import 
org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
 public class PropertyAccessorFacetViaAccessorFactory
-extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
+extends AccessorFacetFactoryAbstract {
 
     private static final Can<String> PREFIXES = Can.empty();
 
@@ -40,18 +43,6 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
         super(mmc, FeatureType.PROPERTIES_ONLY, PREFIXES);
     }
 
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-        var accessorMethod = 
processMethodContext.getMethod().asMethodElseFail();
-        processMethodContext.removeMethod(accessorMethod);
-
-        var cls = processMethodContext.getCls();
-        var typeSpec = getSpecificationLoader().loadSpecification(cls);
-        var facetHolder = processMethodContext.getFacetHolder();
-
-        addFacet(new PropertyAccessorFacetViaAccessor(typeSpec, 
accessorMethod, facetHolder));
-    }
-
     @Override
     public boolean isAssociationAccessor(final ResolvedMethod method) {
         return AccessorSemantics.isPropertyAccessor(method);
@@ -59,9 +50,15 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
 
     @Override
     public void findAndRemoveAccessors(
-        final MethodRemover methodRemover, final List<ResolvedMethod> 
methodListToAppendTo) {
-        methodRemover.removeMethods(AccessorSemantics::isBooleanGetter, 
methodListToAppendTo::add);
-        methodRemover.removeMethods(AccessorSemantics::isNonBooleanGetter, 
methodListToAppendTo::add);
+        final MethodRemover methodRemover, final Consumer<ResolvedMethod> 
onMatchingAccessor) {
+        methodRemover.removeMethods(AccessorSemantics::isBooleanGetter, 
onMatchingAccessor);
+        methodRemover.removeMethods(AccessorSemantics::isNonBooleanGetter, 
onMatchingAccessor);
+    }
+
+    @Override
+    protected PropertyOrCollectionAccessorFacet createFacet(
+        final ObjectSpecification typeSpec, final ResolvedMethod 
accessorMethod, final FacetedMethod facetHolder) {
+        return new PropertyAccessorFacetViaAccessor(typeSpec, accessorMethod, 
facetHolder);
     }
 
 }
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/specloader/facetprocessor/FacetProcessor.java
index 3ffbd18d70d..10450f212b1 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/specloader/facetprocessor/FacetProcessor.java
@@ -19,6 +19,7 @@
 package org.apache.causeway.core.metamodel.specloader.facetprocessor;
 
 import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -49,7 +50,7 @@ import 
org.apache.causeway.core.metamodel.facets.FacetedMethod;
 import org.apache.causeway.core.metamodel.facets.FacetedMethodParameter;
 import org.apache.causeway.core.metamodel.facets.ObjectTypeFacetFactory;
 import 
org.apache.causeway.core.metamodel.facets.ObjectTypeFacetFactory.ProcessObjectTypeContext;
-import 
org.apache.causeway.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactory;
+import org.apache.causeway.core.metamodel.facets.AccessorFacetFactory;
 import org.apache.causeway.core.metamodel.methods.MethodFilteringFacetFactory;
 import 
org.apache.causeway.core.metamodel.methods.MethodPrefixBasedFacetFactory;
 import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
@@ -102,14 +103,22 @@ implements HasMetaModelContext, AutoCloseable{
             _Lazy.threadSafe(this::init_methodFilteringFactories);
 
     /**
-     * All registered {@link FacetFactory factories} that implement
-     * {@link PropertyOrCollectionIdentifyingFacetFactory}.
-     *
+     * {@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<PropertyOrCollectionIdentifyingFacetFactory>> 
propertyOrCollectionIdentifyingFactories =
-            
_Lazy.threadSafe(this::init_propertyOrCollectionIdentifyingFactories);
+    private final _Lazy<List<AccessorFacetFactory>> 
collectionAccessorFactories =
+        _Lazy.threadSafe(this::init_collectionIdentifyingFactories);
 
     /**
      * ObjectFeatureType => List<FacetFactory>
@@ -157,19 +166,25 @@ implements HasMetaModelContext, AutoCloseable{
     /**
      * Appends to the supplied {@link Set} all of the {@link Method}s that may
      * represent a property or collection.
-     *
      * <p>
      * Delegates to all known
-     * {@link PropertyOrCollectionIdentifyingFacetFactory}s.
+     * {@link AccessorFacetFactory}s.
      */
     public void findAssociationCandidateGetters(
             final Stream<ResolvedMethod> methodStream,
             final Consumer<ResolvedMethod> onCandidate) {
-        var factories = propertyOrCollectionIdentifyingFactories.get();
+
         methodStream.forEach(method->{
-            for (var facetFactory : factories) {
+            for (var facetFactory : propertyAccessorFactories.get()) {
                 if (facetFactory.isAssociationAccessor(method)) {
                     onCandidate.accept(method);
+                    return; // first wins
+                }
+            }
+            for (var facetFactory : collectionAccessorFactories.get()) {
+                if (facetFactory.isAssociationAccessor(method)) {
+                    onCandidate.accept(method);
+                    return; // first wins
                 }
             }
         });
@@ -177,42 +192,37 @@ implements HasMetaModelContext, AutoCloseable{
 
     /**
      * Use the provided {@link MethodRemover} to call all known
-     * {@link PropertyOrCollectionIdentifyingFacetFactory}s to remove all
+     * {@link AccessorFacetFactory}s to remove all
      * property accessors and append them to the supplied methodList.
      * <p>
-     * @see 
PropertyOrCollectionIdentifyingFacetFactory#findAndRemoveAccessors(MethodRemover,
 List)
+     * @see AccessorFacetFactory#findAndRemoveAccessors(MethodRemover, 
Consumer)
      */
     public void findAndRemovePropertyAccessors(
             final MethodRemover methodRemover,
             final List<ResolvedMethod> methodListToAppendTo) {
-
-        for (var facetFactory : 
propertyOrCollectionIdentifyingFactories.get()) {
-            if(!facetFactory.supportsProperties()) continue;
-            facetFactory.findAndRemoveAccessors(methodRemover, 
methodListToAppendTo);
+        for (var facetFactory : propertyAccessorFactories.get()) {
+            facetFactory.findAndRemoveAccessors(methodRemover, 
methodListToAppendTo::add);
         }
     }
 
     /**
      * Use the provided {@link MethodRemover} to call all known
-     * {@link PropertyOrCollectionIdentifyingFacetFactory}s to remove all
+     * {@link AccessorFacetFactory}s to remove all
      * collection accessors and append them to the supplied methodList.
      *
-     * @see 
PropertyOrCollectionIdentifyingFacetFactory#findAndRemoveAccessors(MethodRemover,
 List)
+     * @see AccessorFacetFactory#findAndRemoveAccessors(MethodRemover, 
Consumer)
      */
     public void findAndRemoveCollectionAccessors(
             final MethodRemover methodRemover,
             final List<ResolvedMethod> methodListToAppendTo) {
-
-        for (var facetFactory : 
propertyOrCollectionIdentifyingFactories.get()) {
-            if(!facetFactory.supportsCollections()) continue;
-            facetFactory.findAndRemoveAccessors(methodRemover, 
methodListToAppendTo);
+        for (var facetFactory : collectionAccessorFactories.get()) {
+            facetFactory.findAndRemoveAccessors(methodRemover, 
methodListToAppendTo::add);
         }
     }
 
     /**
      * Whether this {@link Method method} is recognized by any of the
      * {@link FacetFactory}s.
-     *
      * <p>
      * Typically this is when method has a specific prefix, such as
      * <tt>validate</tt> or <tt>hide</tt>. Specifically, it checks:
@@ -221,7 +231,6 @@ implements HasMetaModelContext, AutoCloseable{
      * {@link MethodPrefixBasedFacetFactory}</li>
      * <li>the method against any {@link MethodFilteringFacetFactory}</li>
      * </ul>
-     *
      * <p>
      * The design of {@link MethodPrefixBasedFacetFactory} (whereby this facet
      * factory set does the work) is a slight performance optimization for when
@@ -230,17 +239,11 @@ implements HasMetaModelContext, AutoCloseable{
     public boolean recognizes(final ResolvedMethod method) {
         var methodName = method.name();
         for (var prefix : methodPrefixes.get()) {
-            if (methodName.startsWith(prefix)) {
-                return true;
-            }
+            if (methodName.startsWith(prefix)) return true;
         }
-
         for (var factory : methodFilteringFactories.get()) {
-            if (factory.recognizes(method)) {
-                return true;
-            }
+            if (factory.recognizes(method)) return true;
         }
-
         return false;
     }
 
@@ -272,7 +275,6 @@ implements HasMetaModelContext, AutoCloseable{
     /**
      * Attaches all facets applicable to the provided {@link FeatureType#OBJECT
      * object}) to the supplied {@link FacetHolder}.
-     *
      * <p>
      * Delegates to {@link 
FacetFactory#process(FacetFactory.ProcessClassContext)} for each
      * appropriate factory.
@@ -303,7 +305,6 @@ implements HasMetaModelContext, AutoCloseable{
     /**
      * Attaches all facets applicable to the provided {@link FeatureType type 
of
      * feature} to the supplied {@link FacetHolder}.
-     *
      * <p>
      * Delegates to {@link 
FacetFactory#process(FacetFactory.ProcessMethodContext)} for each
      * appropriate factory.
@@ -352,7 +353,6 @@ implements HasMetaModelContext, AutoCloseable{
     /**
      * Attaches all facets applicable to the provided parameter to the supplied
      * {@link FacetHolder}.
-     *
      * <p>
      * Delegates to {@link FacetFactory#processParams(ProcessParameterContext)}
      * for each appropriate factory.
@@ -389,7 +389,8 @@ implements HasMetaModelContext, AutoCloseable{
         factoryListByFeatureType.clear();
         methodPrefixes.clear();
         methodFilteringFactories.clear();
-        propertyOrCollectionIdentifyingFactories.clear();
+        propertyAccessorFactories.clear();
+        collectionAccessorFactories.clear();
     }
 
     // -- INITIALIZERS
@@ -415,7 +416,7 @@ implements HasMetaModelContext, AutoCloseable{
     }
 
     private List<MethodFilteringFacetFactory> init_methodFilteringFactories() {
-        var methodFilteringFactories = 
_Lists.<MethodFilteringFacetFactory>newArrayList();
+        var methodFilteringFactories = new 
ArrayList<MethodFilteringFacetFactory>();
         for (var factory : factories) {
             if (factory instanceof MethodFilteringFacetFactory) {
                 var methodFilteringFacetFactory = 
(MethodFilteringFacetFactory) factory;
@@ -425,12 +426,22 @@ implements HasMetaModelContext, AutoCloseable{
         return methodFilteringFactories;
     }
 
-    private List<PropertyOrCollectionIdentifyingFacetFactory> 
init_propertyOrCollectionIdentifyingFactories() {
-        var propertyOrCollectionIdentifyingFactories = 
_Lists.<PropertyOrCollectionIdentifyingFacetFactory>newArrayList();
+    private List<AccessorFacetFactory> init_propertyIdentifyingFactories() {
+        var propertyOrCollectionIdentifyingFactories = new 
ArrayList<AccessorFacetFactory>();
+        for (var factory : factories) {
+            if (factory instanceof AccessorFacetFactory accessorFacetFactory) {
+                if(!accessorFacetFactory.supportsProperties()) continue;
+                
propertyOrCollectionIdentifyingFactories.add(accessorFacetFactory);
+            }
+        }
+        return propertyOrCollectionIdentifyingFactories;
+    }
+    private List<AccessorFacetFactory> init_collectionIdentifyingFactories() {
+        var propertyOrCollectionIdentifyingFactories = new 
ArrayList<AccessorFacetFactory>();
         for (var factory : factories) {
-            if (factory instanceof 
PropertyOrCollectionIdentifyingFacetFactory) {
-                var identifyingFacetFactory = 
(PropertyOrCollectionIdentifyingFacetFactory) factory;
-                
propertyOrCollectionIdentifyingFactories.add(identifyingFacetFactory);
+            if (factory instanceof AccessorFacetFactory accessorFacetFactory) {
+                if(!accessorFacetFactory.supportsCollections()) continue;
+                
propertyOrCollectionIdentifyingFactories.add(accessorFacetFactory);
             }
         }
         return propertyOrCollectionIdentifyingFactories;
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 66239aa1693..38bbc3110f8 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
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.causeway.core.metamodel.facets.object.navchild;
 
 import java.util.stream.Collectors;

Reply via email to