Skip to content

Commit 207c7a8

Browse files
committed
CAUSEWAY-3883: flattens WrapperInvocationHandler hierarchy (refactor)
1 parent 206f24c commit 207c7a8

File tree

5 files changed

+48
-111
lines changed

5 files changed

+48
-111
lines changed

core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/CollectionInvocationHandler.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import org.apache.causeway.core.metamodel.object.MmAssertionUtils;
5858
import org.apache.causeway.core.metamodel.object.MmEntityUtils;
5959
import org.apache.causeway.core.metamodel.object.MmUnwrapUtils;
60-
import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
6160
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
6261
import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
6362
import org.apache.causeway.core.metamodel.spec.feature.MixedInMember;
@@ -78,7 +77,7 @@
7877
* @param <T> type of delegate
7978
*/
8079
@Log4j2
81-
public class DomainObjectInvocationHandler<T>
80+
public final class DomainObjectInvocationHandler<T>
8281
implements WrapperInvocationHandler {
8382

8483
@Getter(onMethod_ = {@Override}) @Accessors(fluent=true)
@@ -140,8 +139,7 @@ public DomainObjectInvocationHandler(
140139
nsme);
141140
}
142141

143-
entityFacet = targetAdapter.objSpec().entityFacet().orElse(null);
144-
142+
this.entityFacet = targetAdapter.objSpec().entityFacet().orElse(null);
145143
this.mixeeAdapter = mixeeAdapter;
146144
}
147145

@@ -160,7 +158,7 @@ public Object invoke(final Object proxyObjectUnused, final Method method, final
160158
return context().invoke(method, args);
161159
}
162160

163-
final ManagedObject targetAdapter = getObjectManager().adapt(context().delegate());
161+
final ManagedObject targetAdapter = mmc.getObjectManager().adapt(context().delegate());
164162

165163
if(!targetAdapter.specialization().isMixin()) {
166164
MmAssertionUtils.assertIsBookmarkSupported(targetAdapter);
@@ -371,7 +369,7 @@ private Object handleSetterMethodOnProperty(
371369
checkUsability(targetAdapter, property);
372370
});
373371

374-
var argumentAdapter = getObjectManager().adapt(singleArg);
372+
var argumentAdapter = property.getObjectManager().adapt(singleArg);
375373

376374
runValidationTask(()->{
377375
var interactionResult = property.isAssociationValid(
@@ -459,7 +457,7 @@ private Object handleActionMethod(
459457
final ObjectAction objectAction) {
460458

461459
var head = objectAction.interactionHead(targetAdapter);
462-
var objectManager = getObjectManager();
460+
var objectManager = objectAction.getObjectManager();
463461

464462
// adapt argument pojos to managed objects
465463
var argAdapters = objectAction.getParameterTypes().map(IndexedFunction.zeroBased((paramIndex, paramSpec)->{
@@ -631,10 +629,4 @@ private void zeroArgsElseThrow(final Object[] args, final String name) {
631629
}
632630
}
633631

634-
// -- DEPENDENCIES
635-
636-
private ObjectManager getObjectManager() {
637-
return mmc.getObjectManager();
638-
}
639-
640632
}

core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/MapInvocationHandler.java

Lines changed: 0 additions & 44 deletions
This file was deleted.
Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Map;
2424

2525
import org.apache.causeway.applib.services.wrapper.events.CollectionMethodEvent;
26+
import org.apache.causeway.commons.internal.assertions._Assert;
2627
import org.apache.causeway.commons.semantics.CollectionSemantics;
2728
import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
2829
import org.apache.causeway.core.runtime.wrap.WrapperInvocationHandler;
@@ -36,16 +37,49 @@
3637
* @param <T> Domain Object type
3738
* @param <P> non-scalar type (eg. {@link Collection} or {@link Map}) to be proxied
3839
*/
39-
abstract class PluralInvocationHandlerAbstract<T, P>
40+
final class PluralInvocationHandler<T, P>
4041
implements WrapperInvocationHandler {
4142

43+
// -- FACTORIES
44+
45+
static <T, C extends Collection<?>> PluralInvocationHandler<T, C> forCollection(
46+
final C collectionToBeProxied,
47+
final DomainObjectInvocationHandler<T> handler,
48+
final OneToManyAssociation otma) {
49+
50+
_Assert.assertTrue(Collection.class.isAssignableFrom(collectionToBeProxied.getClass()),
51+
()->String.format("Cannot use %s for type %s, these are not compatible.",
52+
PluralInvocationHandler.class.getName() + ".forCollection(..)",
53+
collectionToBeProxied.getClass()));
54+
55+
return new PluralInvocationHandler<>(collectionToBeProxied, handler, otma,
56+
CollectionSemantics
57+
.valueOfElseFail(collectionToBeProxied.getClass()));
58+
}
59+
60+
static <T, M extends Map<?,?>> PluralInvocationHandler<T, M> forMap(
61+
final M mapToBeProxied,
62+
final DomainObjectInvocationHandler<T> handler,
63+
final OneToManyAssociation otma) {
64+
65+
_Assert.assertTrue(Map.class.isAssignableFrom(mapToBeProxied.getClass()),
66+
()->String.format("Cannot use %s for type %s, these are not compatible.",
67+
PluralInvocationHandler.class.getName() + ".forMap(..)",
68+
mapToBeProxied.getClass()));
69+
70+
return new PluralInvocationHandler<>(mapToBeProxied, handler, otma,
71+
CollectionSemantics.MAP);
72+
}
73+
74+
// -- CONSTRUCTION
75+
4276
@Getter(onMethod_ = {@Override}) @Accessors(fluent=true)
4377
private final WrapperInvocationHandler.Context context;
4478

4579
private final OneToManyAssociation oneToManyAssociation;
4680
private final CollectionSemantics collectionSemantics;
47-
48-
protected PluralInvocationHandlerAbstract(
81+
82+
protected PluralInvocationHandler(
4983
final P collectionOrMapToBeProxied,
5084
final DomainObjectInvocationHandler<T> handler,
5185
final OneToManyAssociation otma,

core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/wrapper/handlers/ProxyGenerator.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,12 @@ public <T, E> Collection<E> collectionProxy(
7878
final DomainObjectInvocationHandler<T> handler,
7979
final OneToManyAssociation otma) {
8080

81-
var collectionInvocationHandler = new CollectionInvocationHandler<T, Collection<E>>(
82-
collectionToBeProxied, handler, otma);
81+
var collectionInvocationHandler = PluralInvocationHandler
82+
.forCollection(collectionToBeProxied, handler, otma);
8383

8484
var proxyBase = CollectionSemantics
85-
.valueOfElseFail(collectionToBeProxied.getClass())
86-
.getContainerType();
85+
.valueOfElseFail(collectionToBeProxied.getClass())
86+
.getContainerType();
8787

8888
return instantiateProxy(_Casts.uncheckedCast(proxyBase), collectionInvocationHandler);
8989
}
@@ -97,8 +97,8 @@ public <T, P, Q> Map<P, Q> mapProxy(
9797
final DomainObjectInvocationHandler<T> handler,
9898
final OneToManyAssociation otma) {
9999

100-
var mapInvocationHandler = new MapInvocationHandler<T, Map<P, Q>>(
101-
collectionToBeProxied, handler, otma);
100+
var mapInvocationHandler = PluralInvocationHandler
101+
.forMap(collectionToBeProxied, handler, otma);
102102

103103
var proxyBase = Map.class;
104104

0 commit comments

Comments
 (0)