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;