Skip to content

Commit c77433c

Browse files
committed
CAUSEWAY-3975: encapsulate InteractionCarrierDefault
1 parent 8b7713b commit c77433c

File tree

28 files changed

+110
-107
lines changed

28 files changed

+110
-107
lines changed

core/metamodel/src/main/java/module-info.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@
7474
exports org.apache.causeway.core.metamodel.facets.value.semantics;
7575

7676
exports org.apache.causeway.core.metamodel.interactions;
77-
exports org.apache.causeway.core.metamodel.interactions.layer;
7877
exports org.apache.causeway.core.metamodel.interactions.acc;
7978
exports org.apache.causeway.core.metamodel.interactions.managed;
8079
exports org.apache.causeway.core.metamodel.interactions.use;

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/layer/InteractionCarrier.java renamed to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/InteractionCarrier.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,30 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.causeway.core.metamodel.interactions.layer;
19+
package org.apache.causeway.core.metamodel.execution;
2020

21-
import java.util.function.Function;
21+
import java.util.concurrent.Callable;
2222

23+
import org.apache.causeway.applib.services.command.Command;
24+
import org.apache.causeway.applib.services.iactn.Execution;
2325
import org.apache.causeway.applib.services.iactn.Interaction;
2426

27+
/**
28+
* Carries an {@link Interaction} through its life-cycle.
29+
*
30+
* @since 4.0
31+
*/
2532
public interface InteractionCarrier {
2633

2734
Interaction interaction();
35+
36+
int nextExecutionSequence();
37+
int nextTransactionSequence();
38+
39+
<E extends Execution<?, ?>, R> R execute(E execution, Callable<R> callable);
2840

29-
default <T> T putAttribute(Class<? super T> type, T value) {
30-
return interaction().putAttribute(type, value);
31-
}
32-
default <T> T computeAttributeIfAbsent(Class<? super T> type, Function<Class<?>, ? extends T> mappingFunction) {
33-
return interaction().computeAttributeIfAbsent(type, mappingFunction);
34-
}
35-
default <T> T getAttribute(Class<T> type) {
36-
return interaction().getAttribute(type);
37-
}
38-
default void removeAttribute(Class<?> type) {
39-
interaction().removeAttribute(type);
40-
}
41+
// -- SHORTCUT
4142

43+
default Command command() { return interaction().getCommand(); }
44+
4245
}

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/InteractionCarrierDefault.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,12 @@
2626
import org.apache.causeway.applib.services.iactn.Execution;
2727
import org.apache.causeway.applib.services.iactn.Interaction;
2828
import org.apache.causeway.commons.internal.exceptions._Exceptions;
29-
import org.apache.causeway.core.metamodel.interactions.layer.InteractionCarrier;
3029

3130
import lombok.SneakyThrows;
3231
import lombok.extern.slf4j.Slf4j;
3332

34-
/**
35-
* Carries an {@link Interaction} through its lifecycle.
36-
*/
3733
@Slf4j
38-
public record InteractionCarrierDefault(
34+
record InteractionCarrierDefault(
3935
SimpleInteraction interaction,
4036
LongAdder executionSequence,
4137
LongAdder transactionSequence)
@@ -47,10 +43,12 @@ public InteractionCarrierDefault(ExecutionContext executionContext) {
4743

4844
public UUID interactionId() { return interaction.getInteractionId(); }
4945
public ExecutionContext executionContext() { return interaction.executionContext(); }
46+
@Override
5047
public Command command() { return interaction.command(); }
5148
public Interaction getInteraction() { return interaction; }
5249

5350
@SneakyThrows
51+
@Override
5452
public <E extends Execution<?,?>, R> R execute(final E execution, Callable<R> callable) {
5553
push(execution);
5654
start(execution);
@@ -95,7 +93,8 @@ public <E extends Execution<?,?>, R> R execute(final E execution, Callable<R> ca
9593
*
9694
* @see #nextTransactionSequence()
9795
*/
98-
public int nextExecutionSequence() {
96+
@Override
97+
public int nextExecutionSequence() {
9998
executionSequence().increment();
10099
return executionSequence().intValue() - 1;
101100
}
@@ -114,7 +113,8 @@ public int nextExecutionSequence() {
114113
* @see org.apache.causeway.applib.services.xactn.TransactionService
115114
* @see #nextExecutionSequence()
116115
*/
117-
public int nextTransactionSequence() {
116+
@Override
117+
public int nextTransactionSequence() {
118118
transactionSequence().increment();
119119
return transactionSequence().intValue() - 1;
120120
}

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/layer/InteractionLayer.java renamed to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/InteractionLayer.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.causeway.core.metamodel.interactions.layer;
19+
package org.apache.causeway.core.metamodel.execution;
2020

2121
import java.util.ArrayList;
2222
import java.util.List;
@@ -45,10 +45,9 @@
4545
public record InteractionLayer(
4646
@Nullable InteractionLayer parent,
4747
/**
48-
* Current thread's {@link InteractionCarrier} : WHAT is being executed
48+
* Carries an {@link Interaction} through its life-cycle.
4949
*/
5050
InteractionCarrier interactionCarrier,
51-
5251
/**
5352
* WHO is performing this {@link #getInteraction()}, also
5453
* WHEN and WHERE.
@@ -59,7 +58,6 @@ public record InteractionLayer(
5958
*/
6059
List<Runnable> onCloseListeners) {
6160

62-
6361
public InteractionLayer(
6462
@Nullable InteractionLayer parent,
6563
InteractionCarrier interactionCarrier,

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/layer/InteractionLayerStack.java renamed to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/InteractionLayerStack.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.causeway.core.metamodel.interactions.layer;
19+
package org.apache.causeway.core.metamodel.execution;
2020

2121
import java.util.Optional;
2222
import java.util.function.Predicate;
@@ -39,18 +39,29 @@ public final class InteractionLayerStack {
3939
public Optional<InteractionLayer> currentLayer() {
4040
return Optional.ofNullable(threadLocalLayer.get());
4141
}
42-
42+
4343
public InteractionLayer push(
44-
final InteractionCarrier interactionCarrier,
44+
final ExecutionContext executionContext,
4545
final InteractionContext interactionContext,
4646
final Observation observation) {
4747
var parent = currentLayer().orElse(null);
48+
var interactionCarrier = currentLayer()
49+
.map(InteractionLayer::interactionCarrier)
50+
.orElseGet(()->new InteractionCarrierDefault(executionContext));
51+
4852
@SuppressWarnings("resource")
4953
var newLayer = new InteractionLayer(parent, interactionCarrier, interactionContext)
5054
.addOnCloseListener(new ObservationClosure().startAndOpenScope(observation)::close);
5155
threadLocalLayer.set(newLayer);
5256
return newLayer;
5357
}
58+
59+
public InteractionLayer pushForTesting(InteractionCarrier interactionCarrier, InteractionContext interactionContext) {
60+
var parent = currentLayer().orElse(null);
61+
var newLayer = new InteractionLayer(parent, interactionCarrier, interactionContext);
62+
threadLocalLayer.set(newLayer);
63+
return newLayer;
64+
}
5465

5566
public void clear() {
5667
try {

core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/layer/InteractionLayerTracker.java renamed to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/execution/InteractionLayerTracker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.causeway.core.metamodel.interactions.layer;
19+
package org.apache.causeway.core.metamodel.execution;
2020

2121
import java.util.Optional;
2222

core/interaction/src/test/java/org/apache/causeway/core/interaction/InteractionDefaultTest_next.java renamed to core/mmtest/src/test/java/org/apache/causeway/core/metamodel/execution/InteractionDefaultTest_next.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
package org.apache.causeway.core.interaction;
19+
package org.apache.causeway.core.metamodel.execution;
2020

2121
import java.util.UUID;
2222

@@ -25,13 +25,10 @@
2525
import static org.hamcrest.CoreMatchers.is;
2626
import static org.hamcrest.MatcherAssert.assertThat;
2727

28-
import org.apache.causeway.core.metamodel.execution.ExecutionContext;
29-
import org.apache.causeway.core.metamodel.execution.InteractionCarrierDefault;
30-
3128
class InteractionDefaultTest_next {
3229

3330
@Test
34-
public void test() {
31+
void test() {
3532
var context = new ExecutionContext(null, null, null, null, UUID::randomUUID, null,
3633
null, null, null);
3734

core/mmtestsupport/src/main/java/org/apache/causeway/core/mmtestsupport/InteractionService_forTesting.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,14 @@
3232
import org.apache.causeway.applib.services.iactnlayer.InteractionService;
3333
import org.apache.causeway.applib.services.user.UserMemento;
3434
import org.apache.causeway.commons.functional.ThrowingRunnable;
35-
import org.apache.causeway.core.metamodel.interactions.layer.InteractionCarrier;
36-
import org.apache.causeway.core.metamodel.interactions.layer.InteractionLayer;
37-
import org.apache.causeway.core.metamodel.interactions.layer.InteractionLayerStack;
38-
import org.apache.causeway.core.metamodel.interactions.layer.InteractionLayerTracker;
35+
import org.apache.causeway.core.metamodel.execution.InteractionCarrier;
36+
import org.apache.causeway.core.metamodel.execution.InteractionLayer;
37+
import org.apache.causeway.core.metamodel.execution.InteractionLayerStack;
38+
import org.apache.causeway.core.metamodel.execution.InteractionLayerTracker;
3939

4040
import lombok.RequiredArgsConstructor;
4141
import lombok.SneakyThrows;
4242

43-
import io.micrometer.observation.Observation;
44-
4543
/**
4644
* A pass-through implementation, free of side-effects,
4745
* in support of simple JUnit tests.
@@ -69,12 +67,15 @@ private InteractionLayer openInteractionLayer() {
6967
private InteractionLayer openInteractionLayer(final @NonNull InteractionContext interactionContext) {
7068
final Interaction interaction = new Interaction_forTesting();
7169
var interactionCarrier = new InteractionCarrier() {
72-
@Override public Interaction interaction() {
73-
return interaction;
70+
@Override public Interaction interaction() { return interaction; }
71+
@Override public int nextExecutionSequence() { return 0; }
72+
@Override public int nextTransactionSequence() { return 0; }
73+
@SneakyThrows @Override
74+
public <E extends Execution<?, ?>, R> R execute(E execution, Callable<R> callable) {
75+
return callable.call();
7476
}
7577
};
76-
77-
return layerStack.push(interactionCarrier, interactionContext, Observation.NOOP);
78+
return layerStack.pushForTesting(interactionCarrier, interactionContext);
7879
}
7980

8081
@Override

core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/command/CommandExecutorServiceDefault.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
import org.apache.causeway.commons.internal.exceptions._Exceptions;
5050
import org.apache.causeway.core.metamodel.commons.UtilStr;
5151
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
52-
import org.apache.causeway.core.metamodel.interactions.layer.InteractionLayerTracker;
52+
import org.apache.causeway.core.metamodel.execution.InteractionLayerTracker;
5353
import org.apache.causeway.core.metamodel.object.ManagedObject;
5454
import org.apache.causeway.core.metamodel.object.ManagedObjects;
5555
import org.apache.causeway.core.metamodel.services.publishing.CommandPublisher;

core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/executor/MemberExecutorServiceDefault.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@
5050
import org.apache.causeway.core.metamodel.commons.CanonicalInvoker;
5151
import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
5252
import org.apache.causeway.core.metamodel.execution.ActionExecutor;
53-
import org.apache.causeway.core.metamodel.execution.InteractionCarrierDefault;
53+
import org.apache.causeway.core.metamodel.execution.InteractionCarrier;
54+
import org.apache.causeway.core.metamodel.execution.InteractionLayerTracker;
5455
import org.apache.causeway.core.metamodel.execution.MemberExecutorService;
5556
import org.apache.causeway.core.metamodel.execution.PropertyModifier;
5657
import org.apache.causeway.core.metamodel.facetapi.FacetHolder;
5758
import org.apache.causeway.core.metamodel.facets.members.publish.execution.ExecutionPublishingFacet;
5859
import org.apache.causeway.core.metamodel.interactions.InteractionHead;
59-
import org.apache.causeway.core.metamodel.interactions.layer.InteractionLayerTracker;
6060
import org.apache.causeway.core.metamodel.object.ManagedObject;
6161
import org.apache.causeway.core.metamodel.object.ManagedObjects;
6262
import org.apache.causeway.core.metamodel.object.MmEntityUtils;
@@ -176,7 +176,7 @@ private ManagedObject invokeActionInternally(
176176
// sets up startedAt and completedAt on the execution, also manages the execution call graph
177177
execute(interactionCarrier, actionExecutor, actionInvocation);
178178

179-
final var priorExecution = interactionCarrier.getInteraction().getPriorExecution();
179+
final var priorExecution = interactionCarrier.interaction().getPriorExecution();
180180

181181
// throws if there was any exception in prior execution
182182
var executionExceptionIfAny = priorExecution.getThrew();
@@ -285,7 +285,7 @@ private ManagedObject setOrClearPropertyInternally(
285285
var targetPojo = execute(interactionCarrier, propertyModifier, propertyEdit);
286286

287287
// handle any exceptions
288-
var priorExecution = interactionCarrier.getInteraction().getPriorExecution();
288+
var priorExecution = interactionCarrier.interaction().getPriorExecution();
289289
var executionExceptionIfAny = priorExecution.getThrew();
290290
if(executionExceptionIfAny != null) {
291291
throw executionExceptionIfAny instanceof RuntimeException rex
@@ -314,7 +314,7 @@ private ManagedObject setOrClearPropertyInternally(
314314
* execution is accessible at {@link Interaction#getPriorExecution()}.
315315
*/
316316
private void execute(
317-
InteractionCarrierDefault carrier,
317+
InteractionCarrier carrier,
318318
ActionExecutor actionExecutor,
319319
ActionInvocation actionInvocation) {
320320
observationProvider.get("Execute Action Invocation")
@@ -334,7 +334,7 @@ private void execute(
334334
* execution is accessible at {@link Interaction#getPriorExecution()}.
335335
*/
336336
private Object execute(
337-
InteractionCarrierDefault carrier,
337+
InteractionCarrier carrier,
338338
PropertyModifier propertyModifier,
339339
PropertyEdit propertyEdit) {
340340

@@ -431,12 +431,11 @@ private ExecutionPublisher executionPublisher() {
431431
return executionPublisherProvider.get();
432432
}
433433

434-
private Optional<InteractionCarrierDefault> interactionCarrier() {
435-
return interactionLayerTracker.currentInteractionCarrier()
436-
.map(InteractionCarrierDefault.class::cast);
434+
private Optional<InteractionCarrier> interactionCarrier() {
435+
return interactionLayerTracker.currentInteractionCarrier();
437436
}
438437

439-
private InteractionCarrierDefault interactionCarrierElseFail() {
438+
private InteractionCarrier interactionCarrierElseFail() {
440439
return interactionCarrier().orElseThrow(()->_Exceptions
441440
.unrecoverable("needs an InteractionSession on current thread"));
442441
}

0 commit comments

Comments
 (0)