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

commit 1d8bcf3f158f54da5a0134f104ed4ff2cad54d46
Author: andi-huber <[email protected]>
AuthorDate: Sun Dec 15 07:13:26 2024 +0100

    CAUSEWAY-2297: work on simplified tree model (part 14)
    
    - simplifies accessor facets
---
 .../commons/semantics/AccessorSemantics.java       | 72 +++++++++------------
 .../core/metamodel/execution/PropertyModifier.java |  4 +-
 .../metamodel/facets/AccessorFacetFactory.java     |  9 ---
 .../facets/collections/CollectionFacet.java        | 21 +++---
 .../CollectionAccessorFacetViaAccessor.java        | 18 ++----
 .../CollectionAccessorFacetViaAccessorFactory.java |  9 ---
 .../PropertyOrCollectionAccessorFacet.java         | 31 ++++-----
 .../PropertyOrCollectionAccessorFacetAbstract.java |  5 ++
 .../accessor/PropertyAccessorFacetViaAccessor.java |  6 +-
 .../PropertyAccessorFacetViaAccessorFactory.java   | 10 ---
 .../property/modify/PropertyDomainEventFacet.java  | 17 ++---
 .../metamodel/spec/impl/FacetedMethodsBuilder.java | 75 ++++++----------------
 .../spec/impl/OneToManyAssociationDefault.java     | 19 ++----
 .../spec/impl/OneToOneAssociationDefault.java      |  2 +-
 .../specloader/facetprocessor/FacetProcessor.java  | 24 ++++---
 .../CollectionAnnotationFacetFactoryTest.java      | 11 +---
 .../PropertyAnnotationFacetFactoryTest.java        |  2 +-
 17 files changed, 114 insertions(+), 221 deletions(-)

diff --git 
a/commons/src/main/java/org/apache/causeway/commons/semantics/AccessorSemantics.java
 
b/commons/src/main/java/org/apache/causeway/commons/semantics/AccessorSemantics.java
index 56083149030..43f05235c9d 100644
--- 
a/commons/src/main/java/org/apache/causeway/commons/semantics/AccessorSemantics.java
+++ 
b/commons/src/main/java/org/apache/causeway/commons/semantics/AccessorSemantics.java
@@ -19,10 +19,10 @@
 package org.apache.causeway.commons.semantics;
 
 import java.beans.Introspector;
+import java.util.Map;
 import java.util.function.Predicate;
 
 import org.springframework.lang.Nullable;
-import org.springframework.util.ClassUtils;
 
 import org.apache.causeway.commons.internal.base._Strings;
 import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
@@ -38,6 +38,12 @@ public enum AccessorSemantics {
     SET("set");
     private final String prefix;
 
+    public static String associationIdentifierFor(final ResolvedMethod method) 
{
+        return AccessorSemantics.isRecordComponentAccessor(method)
+                ? method.name()
+                : Introspector.decapitalize(_Strings.baseName(method.name()));
+    }
+
     public String prefix(final @Nullable String input) {
         return input!=null
                 ? prefix + input
@@ -53,35 +59,30 @@ public enum AccessorSemantics {
     // -- HIGH LEVEL PREDICATES
 
     public static boolean isPropertyAccessor(final ResolvedMethod method) {
-        return isPropertyAccessorCandidate(method)
+        return isRecordComponentAccessor(method)
+                || isGetter(method)
             ? !hasCollectionSemantics(method.returnType())
             : false;
     }
 
     public static boolean isCollectionAccessor(final ResolvedMethod method) {
-        return isCollectionAccessorCandidate(method)
+        return isRecordComponentAccessor(method)
+                || isNonBooleanGetter(method)
             ? hasCollectionSemantics(method.returnType())
             : false;
     }
 
-    public static boolean hasSupportedNonScalarMethodReturnType(final 
ResolvedMethod method) {
-        return isNonBooleanGetter(method, Iterable.class)
-            && CollectionSemantics.valueOf(method.returnType()).isPresent();
-    }
-
     // -- LOW LEVEL PREDICATES
 
-    public static boolean isPropertyAccessorCandidate(final ResolvedMethod 
method) {
-        return isRecordComponentAccessor(method)
-            || isGetter(method);
-    }
-
-    public static boolean isCollectionAccessorCandidate(final ResolvedMethod 
method) {
-        return isRecordComponentAccessor(method)
-            || isNonBooleanGetter(method);
+    public static boolean isRecordComponentAccessor(final ResolvedMethod 
method) {
+        var recordClass = method.implementationClass();
+        if(!recordClass.isRecord()) return false;
+        for(var recordComponent : recordClass.getRecordComponents()) {
+            if(method.name().equals(recordComponent.getName())) return true;
+        }
+        return false;
     }
 
-
     public static boolean isCandidateGetterName(final @Nullable String name) {
         return GET.isPrefixOf(name)
                 || IS.isPrefixOf(name);
@@ -100,15 +101,20 @@ public enum AccessorSemantics {
                 || isNonBooleanGetter(method);
     }
 
-    public static boolean isNonBooleanGetter(final ResolvedMethod method, 
final Class<?> expectedType) {
-        return isNonBooleanGetter(method, type->
-            
expectedType.isAssignableFrom(ClassUtils.resolvePrimitiveIfNecessary(type)));
-    }
-
     public static boolean isNonBooleanGetter(final ResolvedMethod method) {
         return isNonBooleanGetter(method, type->type != void.class);
     }
 
+//  public static boolean hasIterableMethodReturnType(final ResolvedMethod 
method) {
+//      return isNonBooleanGetter(method, Iterable.class)
+//          && hasCollectionSemantics(method.returnType());
+//  }
+//
+//  private static boolean isNonBooleanGetter(final ResolvedMethod method, 
final Class<?> expectedType) {
+//      return isNonBooleanGetter(method, type->
+//          
expectedType.isAssignableFrom(ClassUtils.resolvePrimitiveIfNecessary(type)));
+//  }
+
     private static boolean isNonBooleanGetter(final ResolvedMethod method, 
final Predicate<Class<?>> typeFilter) {
         return GET.isPrefixOf(method.name())
                 && method.isNoArg()
@@ -116,28 +122,10 @@ public enum AccessorSemantics {
                 && typeFilter.test(method.returnType());
     }
 
-    /**
-     * @since 3.0.0
-     */
-    public static boolean isRecordComponentAccessor(final ResolvedMethod 
method) {
-        var recordClass = method.implementationClass();
-        if(!recordClass.isRecord()) return false;
-        for(var recordComponent : recordClass.getRecordComponents()) {
-            if(method.name().equals(recordComponent.getName())) return true;
-        }
-        return false;
-    }
-
-    public static String associationIdentifierFor(final ResolvedMethod method) 
{
-        return AccessorSemantics.isRecordComponentAccessor(method)
-                ? method.name()
-                : Introspector.decapitalize(_Strings.baseName(method.name()));
-    }
-
     // -- HELPER
 
+    /** includes {@link Map} which are not directly iterable */
     private static boolean hasCollectionSemantics(final Class<?> cls) {
-        return CollectionSemantics.valueOf(cls)
-                .isPresent();
+        return CollectionSemantics.valueOf(cls).isPresent();
     }
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/PropertyModifier.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/PropertyModifier.java
index 592d1b3148b..41d4faf938e 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/PropertyModifier.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/PropertyModifier.java
@@ -164,7 +164,7 @@ implements
         }
 
         // ... post the executing event
-        var oldValuePojo = getterFacet.getProperty(head.getTarget(), 
interactionInitiatedBy);
+        var oldValuePojo = 
getterFacet.getAssociationValueAsPojo(head.getTarget(), interactionInitiatedBy);
         var newValuePojo = MmUnwrapUtils.single(newValue);
 
         var propertyDomainEvent =
@@ -190,7 +190,7 @@ implements
         executeClearOrSetWithoutEvents(newValueAfterEventPolling);
 
         // reading the actual value from the target object, playing it safe...
-        var actualNewValue = getterFacet.getProperty(head.getTarget(), 
interactionInitiatedBy);
+        var actualNewValue = 
getterFacet.getAssociationValueAsPojo(head.getTarget(), interactionInitiatedBy);
         if (!Objects.equals(oldValuePojo, actualNewValue)) {
 
             // ... post the executed event
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
index 3c4e9e8a815..0f0e36ee874 100644
--- 
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
@@ -18,10 +18,7 @@
  */
 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;
@@ -51,10 +48,4 @@ public interface AccessorFacetFactory extends FacetFactory {
      */
     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/collections/CollectionFacet.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/CollectionFacet.java
index ab588d5219e..0925379f295 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/CollectionFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/CollectionFacet.java
@@ -103,26 +103,23 @@ public interface CollectionFacet extends Facet {
     // -- UTILS
 
     public static Optional<CollectionFacet> lookup(@Nullable final 
ManagedObject container) {
-        if(container==null) {
-            return Optional.empty();
-        }
-        return container.getSpecification().lookupFacet(CollectionFacet.class);
+        return container!=null
+            ? container.getSpecification().lookupFacet(CollectionFacet.class)
+            : Optional.empty();
     }
 
     public static int elementCount(@Nullable final ManagedObject container) {
-        if(container instanceof PackedManagedObject) {
-            return ((PackedManagedObject)container).unpack().size();
-        }
-        return lookup(container)
+        return container instanceof PackedManagedObject packedManagedObject
+            ? packedManagedObject.unpack().size()
+            : lookup(container)
                 .map(collectionFacet->collectionFacet.size(container))
                 .orElse(0);
     }
 
     public static Stream<ManagedObject> streamAdapters(@Nullable final 
ManagedObject container) {
-        if(container instanceof PackedManagedObject) {
-            return ((PackedManagedObject)container).unpack().stream();
-        }
-        return lookup(container)
+        return container instanceof PackedManagedObject packedManagedObject
+            ? packedManagedObject.unpack().stream()
+            : lookup(container)
                 .map(collectionFacet->collectionFacet.stream(container))
                 .orElse(Stream.empty());
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
index e3c220e9e4c..050cae091a5 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
@@ -55,27 +55,21 @@ implements ImperativeFacet {
     }
 
     @Override
-    public Object getProperty(
+    public Object getAssociationValueAsPojo(
             final ManagedObject owningAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         var method = methods.getFirstElseFail().asMethodElseFail(); // 
expected regular
         final Object collectionOrArray = 
MmInvokeUtils.invokeNoArg(method.method(), owningAdapter);
-        if(collectionOrArray == null) {
-            return null;
-        }
-
-        var collectionAdapter = getObjectManager().adapt(collectionOrArray);
-
-        final boolean filterForVisibility = 
getConfiguration().getCore().getMetaModel().isFilterVisibility();
-        if(filterForVisibility) {
+        if(collectionOrArray == null) return null;
 
+        if(isConfiguredToFilterForVisibility()) {
+            var collectionAdapter = 
getObjectManager().adapt(collectionOrArray);
             var autofittedObjectContainer = MmVisibilityUtils
                     .visiblePojosAutofit(collectionAdapter, 
interactionInitiatedBy, method.returnType());
 
-            if (autofittedObjectContainer != null) {
-                return autofittedObjectContainer;
-            }
+            if (autofittedObjectContainer != null) return 
autofittedObjectContainer;
+
             // would be null if unable to take a copy (unrecognized return 
type)
             // fallback to returning the original adapter, without filtering 
for visibility
         }
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 841f05804db..4de0addf7f4 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,8 +18,6 @@
  */
 package org.apache.causeway.core.metamodel.facets.collections.accessor;
 
-import java.util.function.Consumer;
-
 import jakarta.inject.Inject;
 
 import org.apache.causeway.commons.collections.Can;
@@ -27,7 +25,6 @@ import 
org.apache.causeway.commons.internal.reflection._GenericResolver.Resolved
 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.AccessorFacetFactoryAbstract;
 import org.apache.causeway.core.metamodel.facets.FacetedMethod;
 import 
org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
@@ -48,12 +45,6 @@ extends AccessorFacetFactoryAbstract {
         return AccessorSemantics.isCollectionAccessor(method);
     }
 
-    @Override
-    public void findAndRemoveAccessors(
-            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) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacet.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacet.java
index 9a026957bea..8ec38da9ce1 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacet.java
@@ -18,35 +18,32 @@
  */
 package org.apache.causeway.core.metamodel.facets.propcoll.accessor;
 
+import org.springframework.lang.Nullable;
+
+import org.apache.causeway.core.config.CausewayConfiguration;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.facetapi.Facet;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
 /**
- * The mechanism by which the value of the property can be accessed.
- *
- * <p>
- * In the standard Apache Causeway Programming Model, corresponds to invoking 
the
- * accessor method for a property OR a collection.
+ * Provides access to an association, typically via a getter.
  */
 public interface PropertyOrCollectionAccessorFacet extends Facet {
 
     /**
-     * Gets the value of this property or collection from this object (as a 
pojo, not as
-     * an {@link ManagedObject adapter}).
-     *
+     * Returns the (nullable) pojo value of this property or collection from 
given {@link ManagedObject}.
+     * <p>
+     * If enabled via {@link CausewayConfiguration 
causeway.core.meta-model.filter-visibility},
+     * object(s) not visible to the current user will be excluded from the 
result.
      * <p>
-     *     The object(s) will be excluded if not visible to the current user.  
That is, for a collection they will be
-     *     omitted from that collection, while for a property if the 
referenced object is invisible then null will be
-     *     returned.
-     * </p>
-     * @param inObject
-     * @param interactionInitiatedBy
+     * That is, for a property {@code null} will be returned,
+     * while for a collection, objects not visible, will be omitted from that 
collection.
      */
-    Object getProperty(
-            final ManagedObject inObject,
-            final InteractionInitiatedBy interactionInitiatedBy);
+    @Nullable
+    Object getAssociationValueAsPojo(
+            ManagedObject inObject,
+            InteractionInitiatedBy interactionInitiatedBy);
 
     ObjectSpecification getDeclaringType();
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacetAbstract.java
index 82861bf9e58..7cadccfdd19 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/propcoll/accessor/PropertyOrCollectionAccessorFacetAbstract.java
@@ -52,4 +52,9 @@ implements PropertyOrCollectionAccessorFacet {
         super.visitAttributes(visitor);
         visitor.accept("declaringType", declaringType);
     }
+
+    protected final boolean isConfiguredToFilterForVisibility() {
+        return 
getConfiguration().getCore().getMetaModel().isFilterVisibility();
+    }
+
 }
\ No newline at end of file
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
index 4bd89f7c0bd..05d33fbd080 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
@@ -56,16 +56,14 @@ implements ImperativeFacet {
     }
 
     @Override
-    public Object getProperty(
+    public Object getAssociationValueAsPojo(
             final ManagedObject owningAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
         var method = methods.getFirstElseFail().asMethodElseFail(); // 
expected regular
         final Object referencedObject = 
MmInvokeUtils.invokeNoArg(method.method(), owningAdapter);
-
         if(referencedObject == null) return null;
 
-        boolean filterForVisibility = 
getConfiguration().getCore().getMetaModel().isFilterVisibility();
-        if(filterForVisibility) {
+        if(isConfiguredToFilterForVisibility()) {
             final ManagedObject referencedAdapter = 
getObjectManager().adapt(referencedObject);
             final boolean visible = MmVisibilityUtils
                     .isVisible(referencedAdapter, interactionInitiatedBy);
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 8508aeb30f1..8a46ae613ef 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,8 +18,6 @@
  */
 package org.apache.causeway.core.metamodel.facets.properties.accessor;
 
-import java.util.function.Consumer;
-
 import jakarta.inject.Inject;
 
 import org.apache.causeway.commons.collections.Can;
@@ -27,7 +25,6 @@ import 
org.apache.causeway.commons.internal.reflection._GenericResolver.Resolved
 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.AccessorFacetFactoryAbstract;
 import org.apache.causeway.core.metamodel.facets.FacetedMethod;
 import 
org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
@@ -48,13 +45,6 @@ extends AccessorFacetFactoryAbstract {
         return AccessorSemantics.isPropertyAccessor(method);
     }
 
-    @Override
-    public void findAndRemoveAccessors(
-        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) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacet.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacet.java
index 699d7ea4e5f..60bf70adb54 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacet.java
@@ -141,9 +141,8 @@ implements
                         _Casts.uncheckedCast(getEventType()), null,
                         getFacetHolder(), ic.getHead(),
                         null, null);
-        if (event != null && event.isHidden()) {
-            return "Hidden by subscriber";
-        }
+        if (event != null && event.isHidden()) return "Hidden by subscriber";
+
         return null;
     }
 
@@ -173,19 +172,15 @@ implements
 
     @Override
     public String invalidates(final ValidityContext ic) {
+        if(getterFacetIfAny == null) return null;
         if(!isPostable()) return null; // bale out
 
-        if(getterFacetIfAny == null) {
-            return null;
-        }
-
         // if this is a mixin, then this ain't true.
-        if(!(ic instanceof ProposedHolder)) {
-            return null;
-        }
+        if(!(ic instanceof ProposedHolder)) return null;
+
         final ProposedHolder ph = (ProposedHolder) ic;
 
-        final Object oldValue = getterFacetIfAny.getProperty(ic.getTarget(), 
ic.getInitiatedBy());
+        final Object oldValue = 
getterFacetIfAny.getAssociationValueAsPojo(ic.getTarget(), ic.getInitiatedBy());
         final ManagedObject proposedAdapter = ph.getProposed();
         final Object proposedValue = proposedAdapter != null ? 
proposedAdapter.getPojo() : null;
 
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 61f45acfa66..5525715ed4b 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
@@ -45,10 +45,8 @@ import 
org.apache.causeway.commons.internal.reflection._GenericResolver.Resolved
 import org.apache.causeway.commons.internal.reflection._MethodFacades;
 import 
org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade;
 import org.apache.causeway.commons.internal.reflection._Reflect;
-import org.apache.causeway.commons.semantics.AccessorSemantics;
 import org.apache.causeway.core.metamodel.commons.ToString;
 import org.apache.causeway.core.metamodel.context.HasMetaModelContext;
-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.FacetedMethod;
@@ -92,9 +90,7 @@ implements
 
         @Override
         public void removeMethod(final ResolvedMethod method) {
-            if(method==null) {
-                return;
-            }
+            if(method==null) return;
             methodsRemaining.remove(method);
         }
 
@@ -193,53 +189,33 @@ implements
         var associationCandidateMethods = new HashSet<ResolvedMethod>();
 
         getFacetProcessor()
-        .findAssociationCandidateGetters(
-                    methodRemover.streamRemaining(),
-                    associationCandidateMethods::add);
+            .findAssociationCandidateGetters(
+                methodRemover.streamRemaining(),
+                associationCandidateMethods::add);
 
         // Ensure all return types are known
-
         TypeExtractor.streamMethodReturn(associationCandidateMethods)
-        .filter(typeToLoad->typeToLoad!=introspectedClass)
-        .forEach(typeToLoad->specLoader.loadSpecification(typeToLoad, 
IntrospectionState.TYPE_INTROSPECTED));
+            .filter(typeToLoad->typeToLoad!=introspectedClass)
+            .forEach(typeToLoad->specLoader.loadSpecification(typeToLoad, 
IntrospectionState.TYPE_INTROSPECTED));
 
         // now create FacetedMethods for collections and for properties
-        var associationFacetedMethods = _Lists.<FacetedMethod>newArrayList();
-
-        
findAndRemoveCollectionAccessorsAndCreateCorrespondingFacetedMethods(associationFacetedMethods::add);
-        
findAndRemovePropertyAccessorsAndCreateCorrespondingFacetedMethods(associationFacetedMethods::add);
+        var associationFacetedMethods = new ArrayList<FacetedMethod>();
 
-        return Collections.unmodifiableList(associationFacetedMethods);
-    }
+        var collectionAccessors = 
getFacetProcessor().findAndRemoveCollectionAccessors(methodRemover);
+        createCollectionFacetedMethodsFromAccessors(collectionAccessors, 
associationFacetedMethods::add);
 
-    private void 
findAndRemoveCollectionAccessorsAndCreateCorrespondingFacetedMethods(
-            final Consumer<FacetedMethod> onNewAssociationPeer) {
-        var collectionAccessors = new ArrayList<ResolvedMethod>();
-        getFacetProcessor().findAndRemoveCollectionAccessors(methodRemover, 
collectionAccessors);
-        createCollectionFacetedMethodsFromAccessors(
-                getMetaModelContext(), collectionAccessors, 
onNewAssociationPeer);
-    }
-
-    /**
-     * Since the value properties and collections have already been processed,
-     * this will pick up the remaining reference properties.
-     */
-    private void 
findAndRemovePropertyAccessorsAndCreateCorrespondingFacetedMethods(final 
Consumer<FacetedMethod> onNewField) {
-        var propertyAccessors = new ArrayList<ResolvedMethod>();
-        getFacetProcessor().findAndRemovePropertyAccessors(methodRemover, 
propertyAccessors);
+        var propertyAccessors = 
getFacetProcessor().findAndRemovePropertyAccessors(methodRemover);
+        createPropertyFacetedMethodsFromAccessors(propertyAccessors, 
associationFacetedMethods::add);
 
-        methodRemover.removeMethods(AccessorSemantics::isNonBooleanGetter, 
propertyAccessors::add);
-        methodRemover.removeMethods(AccessorSemantics::isBooleanGetter, 
propertyAccessors::add);
-        
methodRemover.removeMethods(AccessorSemantics::isRecordComponentAccessor, 
propertyAccessors::add);
-
-        createPropertyFacetedMethodsFromAccessors(propertyAccessors, 
onNewField);
+        return Collections.unmodifiableList(associationFacetedMethods);
     }
 
     private void createCollectionFacetedMethodsFromAccessors(
-            final MetaModelContext mmc,
             final List<ResolvedMethod> accessorMethods,
             final Consumer<FacetedMethod> onNewFacetMethod) {
 
+        var mmc = getMetaModelContext();
+
         for (final ResolvedMethod accessorMethod : accessorMethods) {
             if (log.isDebugEnabled()) {
                 log.debug("  identified accessor method representing 
collection: {}", accessorMethod);
@@ -265,9 +241,7 @@ implements
                     .orElse(Object.class);
 
             // skip if class substitutor says so.
-            if 
(classSubstitutorRegistry.getSubstitution(elementType).isNeverIntrospect()) {
-                continue;
-            }
+            if 
(classSubstitutorRegistry.getSubstitution(elementType).isNeverIntrospect()) 
continue;
 
             onNewFacetMethod.accept(facetedMethod.withType(elementType));
         }
@@ -283,9 +257,7 @@ implements
             final Class<?> returnType = accessorMethod.returnType();
 
             // skip if class strategy says so.
-            if 
(classSubstitutorRegistry.getSubstitution(returnType).isNeverIntrospect()) {
-                continue;
-            }
+            if 
(classSubstitutorRegistry.getSubstitution(returnType).isNeverIntrospect()) 
continue;
 
             // create a 1:1 association peer
             var facetedMethod = FacetedMethod
@@ -332,8 +304,7 @@ implements
         return actionFacetedMethods;
     }
 
-    private void collectActionFacetedMethods(
-            final Consumer<FacetedMethod> onActionFacetedMethod) {
+    private void collectActionFacetedMethods(final Consumer<FacetedMethod> 
onActionFacetedMethod) {
 
         if (log.isDebugEnabled()) {
             log.debug("  looking for action methods");
@@ -352,15 +323,10 @@ implements
 
     }
 
-    private FacetedMethod findActionFacetedMethod(
-            final ResolvedMethod actionMethod) {
-
-        if (!representsAction(actionMethod)) {
-            return null;
-        }
+    private FacetedMethod findActionFacetedMethod(final ResolvedMethod 
actionMethod) {
+        if (!representsAction(actionMethod)) return null;
 
         // build action
-
         return Optional.of(actionMethod)
             .map(this::createActionFacetedMethod)
             .filter(_NullSafe::isPresent)
@@ -368,8 +334,7 @@ implements
     }
 
     @Nullable
-    private FacetedMethod createActionFacetedMethod(
-            final ResolvedMethod actionMethod) {
+    private FacetedMethod createActionFacetedMethod(final ResolvedMethod 
actionMethod) {
 
         var actionMethodFacade = 
_MethodFacadeAutodetect.autodetect(actionMethod, inspectedTypeSpec);
         if (!isAllParamTypesValid(actionMethodFacade)) return null;
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationDefault.java
index e0b3f169a73..1d6dae39117 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToManyAssociationDefault.java
@@ -103,26 +103,20 @@ implements OneToManyAssociation {
             final ManagedObject ownerAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        final PropertyOrCollectionAccessorFacet accessor = 
getFacet(PropertyOrCollectionAccessorFacet.class);
-        final Object collection = accessor.getProperty(ownerAdapter, 
interactionInitiatedBy);
-        if (collection == null) {
-            return null;
-        }
+        var accessor = getFacet(PropertyOrCollectionAccessorFacet.class);
+        var collection = accessor.getAssociationValueAsPojo(ownerAdapter, 
interactionInitiatedBy);
+        if (collection == null) return null;
 
-        var objectManager = super.getObjectManager();
-
-        super.getServiceInjector().injectServicesInto(collection);
-
-        return objectManager.adapt(collection, this::getElementType);
+        return getObjectManager().adapt(collection, this::getElementType);
     }
 
     @Override
     public boolean isEmpty(
-            final ManagedObject parentAdapter,
+            final ManagedObject ownerAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
         // REVIEW should we be able to determine if a collection is empty
         // without loading it?
-        final ManagedObject collection = get(parentAdapter, 
interactionInitiatedBy);
+        final ManagedObject collection = get(ownerAdapter, 
interactionInitiatedBy);
         return CollectionFacet.elementCount(collection) == 0;
     }
 
@@ -142,7 +136,6 @@ implements OneToManyAssociation {
     public Can<ManagedObject> getChoices(
             final ManagedObject ownerAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
-
         return Can.empty();
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationDefault.java
index ab1223bad26..70a05332dcb 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/impl/OneToOneAssociationDefault.java
@@ -155,7 +155,7 @@ implements OneToOneAssociation, Serializable {
 
         var propertyOrCollectionAccessorFacet = 
getFacet(PropertyOrCollectionAccessorFacet.class);
         var referencedPojo =
-                propertyOrCollectionAccessorFacet.getProperty(ownerAdapter, 
interactionInitiatedBy);
+                
propertyOrCollectionAccessorFacet.getAssociationValueAsPojo(ownerAdapter, 
interactionInitiatedBy);
 
         if (referencedPojo == null) {
             // TODO: perhaps this should instead return 
ManagedObject.empty(getSpecification()) ?
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 10450f212b1..626cc510b23 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
@@ -42,6 +42,7 @@ import 
org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facetapi.MethodRemover;
+import org.apache.causeway.core.metamodel.facets.AccessorFacetFactory;
 import org.apache.causeway.core.metamodel.facets.FacetFactory;
 import 
org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import 
org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext;
@@ -50,7 +51,6 @@ 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.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;
@@ -194,30 +194,28 @@ implements HasMetaModelContext, AutoCloseable{
      * Use the provided {@link MethodRemover} to call all known
      * {@link AccessorFacetFactory}s to remove all
      * property accessors and append them to the supplied methodList.
-     * <p>
-     * @see AccessorFacetFactory#findAndRemoveAccessors(MethodRemover, 
Consumer)
      */
-    public void findAndRemovePropertyAccessors(
-            final MethodRemover methodRemover,
-            final List<ResolvedMethod> methodListToAppendTo) {
+    public List<ResolvedMethod> findAndRemovePropertyAccessors(
+            final MethodRemover methodRemover) {
+        var propertyAccessors = new ArrayList<ResolvedMethod>();
         for (var facetFactory : propertyAccessorFactories.get()) {
-            facetFactory.findAndRemoveAccessors(methodRemover, 
methodListToAppendTo::add);
+            methodRemover.removeMethods(facetFactory::isAssociationAccessor, 
propertyAccessors::add);
         }
+        return propertyAccessors;
     }
 
     /**
      * Use the provided {@link MethodRemover} to call all known
      * {@link AccessorFacetFactory}s to remove all
      * collection accessors and append them to the supplied methodList.
-     *
-     * @see AccessorFacetFactory#findAndRemoveAccessors(MethodRemover, 
Consumer)
      */
-    public void findAndRemoveCollectionAccessors(
-            final MethodRemover methodRemover,
-            final List<ResolvedMethod> methodListToAppendTo) {
+    public List<ResolvedMethod> findAndRemoveCollectionAccessors(
+            final MethodRemover methodRemover) {
+        var collectionAccessors = new ArrayList<ResolvedMethod>();
         for (var facetFactory : collectionAccessorFactories.get()) {
-            facetFactory.findAndRemoveAccessors(methodRemover, 
methodListToAppendTo::add);
+            methodRemover.removeMethods(facetFactory::isAssociationAccessor, 
collectionAccessors::add);
         }
+        return collectionAccessors;
     }
 
     /**
diff --git 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
index be03f6f5673..2d3b2887c39 100644
--- 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
@@ -94,7 +94,7 @@ extends FacetFactoryTestAbstract {
             var mockOnType = Mockito.mock(ObjectSpecification.class);
             FacetUtil.addFacet(new 
PropertyOrCollectionAccessorFacetAbstract(mockOnType, holder) {
                 @Override
-                public Object getProperty(
+                public Object getAssociationValueAsPojo(
                         final ManagedObject inObject,
                         final InteractionInitiatedBy interactionInitiatedBy) {
                     return null;
@@ -116,7 +116,6 @@ extends FacetFactoryTestAbstract {
 
             class Order {
             }
-            @SuppressWarnings("unused")
             class Customer {
                 @Getter @Setter private List<Order> orders;
             }
@@ -139,7 +138,6 @@ extends FacetFactoryTestAbstract {
 
             class Order {
             }
-            @SuppressWarnings("unused")
             class Customer {
                 class OrdersShowingDomainEvent extends 
CollectionDomainEvent<Customer, String> {}
                 @Collection(domainEvent = OrdersShowingDomainEvent.class)
@@ -165,7 +163,6 @@ extends FacetFactoryTestAbstract {
             class Order {
             }
             @DomainObject(collectionDomainEvent = 
Customer.OrdersShowingDomainEvent.class)
-            @SuppressWarnings("unused")
             class Customer {
                 class OrdersShowingDomainEvent extends 
CollectionDomainEvent<Customer, String> {}
                 @Collection
@@ -191,7 +188,6 @@ extends FacetFactoryTestAbstract {
             class Order {
             }
             @DomainObject(collectionDomainEvent = 
Customer.OrdersShowingDomainEvent1.class)
-            @SuppressWarnings("unused")
             class Customer {
                 class OrdersShowingDomainEvent1 extends 
CollectionDomainEvent<Customer, String> {}
                 class OrdersShowingDomainEvent2 extends 
CollectionDomainEvent<Customer, String> {}
@@ -218,7 +214,6 @@ extends FacetFactoryTestAbstract {
 
             class Order {
             }
-            @SuppressWarnings("unused")
             class Customer {
                 class OrdersShowingDomainEvent extends 
CollectionDomainEvent<Customer, String> {}
                 @Getter @Setter private List<Order> orders;
@@ -251,7 +246,6 @@ extends FacetFactoryTestAbstract {
 
             class Order {
             }
-            @SuppressWarnings("unused")
             class Customer {
                 class OrdersShowingDomainEvent extends 
CollectionDomainEvent<Customer, String> {}
                 @Getter @Setter private List<Order> orders;
@@ -285,7 +279,6 @@ extends FacetFactoryTestAbstract {
             class Order {
             }
             @DomainObject(collectionDomainEvent = 
Customer.OrdersShowingDomainEvent.class)
-            @SuppressWarnings("unused")
             class Customer {
                 class OrdersShowingDomainEvent extends 
CollectionDomainEvent<Customer, String> {}
                 @Getter @Setter private List<Order> orders;
@@ -319,7 +312,6 @@ extends FacetFactoryTestAbstract {
             class Order {
             }
             @DomainObject(collectionDomainEvent = 
Customer.OrdersShowingDomainEvent1.class)
-            @SuppressWarnings("unused")
             class Customer {
                 class OrdersShowingDomainEvent1 extends 
CollectionDomainEvent<Customer, String> {}
                 class OrdersShowingDomainEvent2 extends 
CollectionDomainEvent<Customer, String> {}
@@ -354,7 +346,6 @@ extends FacetFactoryTestAbstract {
             class Order {
             }
             @DomainObject(collectionDomainEvent = 
Customer.OrdersShowingDomainEvent1.class)
-            @SuppressWarnings("unused")
             class Customer {
                 class OrdersShowingDomainEvent1 extends 
CollectionDomainEvent<Customer, String> {}
                 class OrdersShowingDomainEvent2 extends 
CollectionDomainEvent<Customer, String> {}
diff --git 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
index 1b8beda78b6..4c07f5bad81 100644
--- 
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
@@ -152,7 +152,7 @@ class PropertyAnnotationFacetFactoryTest extends 
FacetFactoryTestAbstract {
             var mockOnType = Mockito.mock(ObjectSpecification.class);
             FacetUtil.addFacet(new 
PropertyOrCollectionAccessorFacetAbstract(mockOnType, holder) {
                 @Override
-                public Object getProperty(
+                public Object getAssociationValueAsPojo(
                         final ManagedObject inObject,
                         final InteractionInitiatedBy interactionInitiatedBy) {
                     return null;


Reply via email to