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);
}