This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/main by this push:
     new 5b27ef53007 CAUSEWAY-3883: simplifies DomainObjInvHandl. and 
ProxyGenerator
5b27ef53007 is described below

commit 5b27ef53007752b13ff2c8e529440153e72515cb
Author: andi-huber <[email protected]>
AuthorDate: Sun Jun 22 19:16:54 2025 +0200

    CAUSEWAY-3883: simplifies DomainObjInvHandl. and ProxyGenerator
    
    - the remaining thing to do before we can cache proxy instances by
    domain object or mixin class, is for the DomainObjectInvocationHandler
    instances to not hold a mixeeAdapter field;
---
 .../wrapper/WrapperFactoryDefault.java             |  8 ++--
 .../handlers/DomainObjectInvocationHandler.java    | 47 ++++++++--------------
 .../wrapper/handlers/ProxyGenerator.java           | 23 +++++------
 3 files changed, 32 insertions(+), 46 deletions(-)

diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefault.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefault.java
index 4b939ff3754..b4cf9ddc186 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefault.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/WrapperFactoryDefault.java
@@ -251,13 +251,13 @@ public <T> T wrapMixin(
 
     protected <T> T createProxy(final T domainObject, final SyncControl 
syncControl) {
         var objAdapter = 
adaptAndGuardAgainstWrappingNotSupported(domainObject);
-        return proxyGenerator.objectProxy(domainObject, objAdapter, 
syncControl);
+        return proxyGenerator.objectProxy(domainObject, objAdapter.objSpec(), 
syncControl);
     }
 
     protected <T> T createMixinProxy(final Object mixee, final T mixin, final 
SyncControl syncControl) {
         var mixeeAdapter = adaptAndGuardAgainstWrappingNotSupported(mixee);
         var mixinAdapter = adaptAndGuardAgainstWrappingNotSupported(mixin);
-        return proxyGenerator.mixinProxy(mixin, mixeeAdapter, mixinAdapter, 
syncControl);
+        return proxyGenerator.mixinProxy(mixin, mixeeAdapter, 
mixinAdapter.objSpec(), syncControl);
     }
 
     @Override
@@ -300,7 +300,7 @@ public <T,R> T asyncWrap(
             }
 
             if (asyncControl.isCheckRules()) {
-                var doih = proxyGenerator.handlerForRegular(domainObject, 
targetAdapter);
+                var doih = 
proxyGenerator.handlerForRegular(targetAdapter.objSpec());
                 doih.invoke(domainObject, method, args);
             }
 
@@ -341,7 +341,7 @@ public <T, R> T asyncWrapMixin(
             }
 
             if (asyncControl.isCheckRules()) {
-                var doih = proxyGenerator.handlerForMixin(mixin, mixeeAdapter, 
mixinAdapter);
+                var doih = proxyGenerator.handlerForMixin(mixeeAdapter, 
mixinAdapter.objSpec());
                 doih.invoke(mixin, method, args);
             }
 
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
index f6f6e9a4390..3580a6ea3a4 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -46,10 +46,8 @@
 import org.apache.causeway.commons.internal.reflection._GenericResolver;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.consent.InteractionResult;
-import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facets.ImperativeFacet;
 import org.apache.causeway.core.metamodel.facets.ImperativeFacet.Intent;
-import org.apache.causeway.core.metamodel.facets.object.entity.EntityFacet;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ActionInteractionHead;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.object.MmAssertionUtils;
@@ -62,7 +60,6 @@
 import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.causeway.core.metamodel.util.Facets;
 import org.apache.causeway.core.runtime.wrap.WrapperInvocationHandler;
 
 import lombok.Getter;
@@ -70,35 +67,25 @@
 import lombok.experimental.Accessors;
 import lombok.extern.log4j.Log4j2;
 
-/**
- *
- * @param <T> type of delegate
- */
 @Log4j2
-final class DomainObjectInvocationHandler<T>
+final class DomainObjectInvocationHandler
 implements WrapperInvocationHandler {
 
     @Getter(onMethod_ = {@Override}) @Accessors(fluent=true) 
     private final WrapperInvocationHandler.ClassMetaData classMetaData;
     
     private final ProxyGenerator proxyGenerator;
-    private final MetaModelContext mmc;
-
-    private final EntityFacet entityFacet;
     private final ManagedObject mixeeAdapter;
+    private final ObjectSpecification targetSpec;
 
     DomainObjectInvocationHandler(
-            final Class<T> domainObjectClass,
             final ManagedObject mixeeAdapter, // ignored if not handling a 
mixin
-            final ManagedObject targetAdapter,
+            final ObjectSpecification targetSpec,
             final ProxyGenerator proxyGenerator) {
-        
-        this.mmc = targetAdapter.objSpec().getMetaModelContext();
-        this.classMetaData = 
WrapperInvocationHandler.ClassMetaData.of(domainObjectClass);
-        this.proxyGenerator = proxyGenerator;
-
 
-        this.entityFacet = targetAdapter.objSpec().entityFacet().orElse(null);
+        this.targetSpec = targetSpec;
+        this.classMetaData = 
WrapperInvocationHandler.ClassMetaData.of(targetSpec.getCorrespondingClass());
+        this.proxyGenerator = proxyGenerator;
         this.mixeeAdapter = mixeeAdapter;
     }
 
@@ -113,7 +100,7 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
             return method.invoke(target, wrapperInvocation.args());
         }
 
-        final ManagedObject targetAdapter = 
mmc.getObjectManager().adapt(target);
+        final ManagedObject targetAdapter = 
targetSpec.getObjectManager().adapt(target);
 
         if(!targetAdapter.specialization().isMixin()) {
             MmAssertionUtils.assertIsBookmarkSupported(targetAdapter);
@@ -184,8 +171,8 @@ public Object invoke(WrapperInvocation wrapperInvocation) 
throws Throwable {
             }
 
             var objectAction = (ObjectAction) objectMember;
-
-            if(Facets.mixinIsPresent(targetSpec)) {
+            
+            if(targetSpec.isMixin()) {
                 if (mixeeAdapter == null) {
                     throw _Exceptions.illegalState(
                             "Missing the required mixeeAdapter for action 
'%s'",
@@ -249,9 +236,9 @@ private InteractionInitiatedBy 
getInteractionInitiatedBy(final WrapperInvocation
     }
 
     private boolean isEnhancedEntityMethod(final Method method) {
-        return entityFacet!=null
-                ? entityFacet.isProxyEnhancement(method)
-                : false;
+        return targetSpec.entityFacet()
+            .map(entityFacet->entityFacet.isProxyEnhancement(method))
+            .orElse(false);
     }
 
     private Object handleTitleMethod(
@@ -262,7 +249,7 @@ private Object handleTitleMethod(
         var titleContext = targetNoSpec
                 .createTitleInteractionContext(targetAdapter, 
InteractionInitiatedBy.FRAMEWORK);
         var titleEvent = titleContext.createInteractionEvent();
-        mmc.getWrapperFactory().notifyListeners(titleEvent);
+        targetSpec.getWrapperFactory().notifyListeners(titleEvent);
         return titleEvent.getTitle();
     }
 
@@ -306,7 +293,7 @@ private Object handleGetterMethodOnProperty(
 
             var currentReferencedObj = 
MmUnwrapUtils.single(currentReferencedAdapter);
 
-            mmc.getWrapperFactory().notifyListeners(new PropertyAccessEvent(
+            targetSpec.getWrapperFactory().notifyListeners(new 
PropertyAccessEvent(
                     targetAdapter.getPojo(), 
                     property.getFeatureIdentifier(), 
                     currentReferencedObj));
@@ -369,13 +356,13 @@ private Object handleGetterMethodOnCollection(
                 var collectionViewObject = wrapCollection(
                         (Collection<?>) currentReferencedObj, 
                         collection);
-                mmc.getWrapperFactory().notifyListeners(collectionAccessEvent);
+                
targetSpec.getWrapperFactory().notifyListeners(collectionAccessEvent);
                 return collectionViewObject;
             } else if (currentReferencedObj instanceof Map) {
                 var mapViewObject = wrapMap( 
                         (Map<?, ?>) currentReferencedObj,
                         collection);
-                mmc.getWrapperFactory().notifyListeners(collectionAccessEvent);
+                
targetSpec.getWrapperFactory().notifyListeners(collectionAccessEvent);
                 return mapViewObject;
             }
 
@@ -494,7 +481,7 @@ private void checkUsability(
     private void notifyListenersAndVetoIfRequired(final InteractionResult 
interactionResult) {
         var interactionEvent = interactionResult.getInteractionEvent();
         
-        mmc.getWrapperFactory().notifyListeners(interactionEvent);
+        targetSpec.getWrapperFactory().notifyListeners(interactionEvent);
         if (interactionEvent.isVeto()) {
             throw toException(interactionEvent);
         }
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyGenerator.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyGenerator.java
index 4103ee4fe58..cd4f768f446 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyGenerator.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyGenerator.java
@@ -31,6 +31,7 @@
 import org.apache.causeway.commons.internal.proxy._ProxyFactoryService;
 import org.apache.causeway.commons.semantics.CollectionSemantics;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.runtime.wrap.WrapperInvocationHandler;
 
@@ -38,20 +39,20 @@ public record ProxyGenerator(@NonNull _ProxyFactoryService 
proxyFactoryService)
 
     public <T> T objectProxy(
         final T domainObject,
-        final ManagedObject adapter,
+        final ObjectSpecification domainObjectSpec,
         final SyncControl syncControl) {
 
-        var invocationHandler = handlerForRegular(domainObject, adapter);
+        var invocationHandler = handlerForRegular(domainObjectSpec);
         return instantiateProxy(invocationHandler, new 
WrappingObject.Origin(domainObject, syncControl));
     }
 
     public <T> T mixinProxy(
             final T mixin,
             final ManagedObject mixeeAdapter,
-            final ManagedObject mixinAdapter,
+            final ObjectSpecification mixinSpec,
             final SyncControl syncControl) {
     
-        var invocationHandler = handlerForMixin(mixin, mixeeAdapter, 
mixinAdapter);
+        var invocationHandler = handlerForMixin(mixeeAdapter, mixinSpec);
         return instantiateProxy(invocationHandler, new 
WrappingObject.Origin(mixin, syncControl));
     }
     
@@ -115,19 +116,17 @@ private <T, P> P instantiatePluralProxy(final Class<T> 
base, final PluralInvocat
         return _Casts.uncheckedCast(proxyWithoutFields);
     }
 
-    public <T> WrapperInvocationHandler handlerForRegular(@NonNull T 
domainObject, ManagedObject targetAdapter) {
-        return new DomainObjectInvocationHandler<>(
-                domainObject.getClass(),
+    public WrapperInvocationHandler handlerForRegular(ObjectSpecification 
targetSpec) {
+        return new DomainObjectInvocationHandler(
                 null, // mixeeAdapter ignored
-                targetAdapter,
+                targetSpec,
                 this);
     }
 
-    public <T> WrapperInvocationHandler handlerForMixin(T mixin, ManagedObject 
mixeeAdapter, ManagedObject mixinAdapter) {
-        return new DomainObjectInvocationHandler<>(
-                mixin.getClass(),
+    public WrapperInvocationHandler handlerForMixin(ManagedObject 
mixeeAdapter, ObjectSpecification mixinSpec) {
+        return new DomainObjectInvocationHandler(
                 mixeeAdapter,
-                mixinAdapter,
+                mixinSpec,
                 this);
     }
     

Reply via email to