Skip to content

Commit 73e0f95

Browse files
authored
add a method to construct TypeToken from Class (#19)
* add a method to construct TypeToken from Class * remove resultType from StepOperation * fix tests and examples * revert the accidental changes made by IntelliJ
1 parent 43ae4fe commit 73e0f95

14 files changed

Lines changed: 28 additions & 108 deletions

File tree

examples/src/main/java/com/amazonaws/lambda/durable/examples/CustomConfigExample.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,6 @@ public String serialize(Object obj) {
123123
}
124124
}
125125

126-
@Override
127-
public <T> T deserialize(String json, Class<T> clazz) {
128-
try {
129-
return objectMapper.readValue(json, clazz);
130-
} catch (IOException e) {
131-
throw new RuntimeException("Deserialization failed", e);
132-
}
133-
}
134-
135126
@Override
136127
public <T> T deserialize(String json, TypeToken<T> typeToken) {
137128
try {

sdk-integration-tests/src/test/java/com/amazonaws/lambda/durable/CustomConfigIntegrationTest.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,6 @@ public String serialize(Object value) {
3434
return delegate.serialize(value);
3535
}
3636

37-
@Override
38-
public <T> T deserialize(String data, Class<T> type) {
39-
deserializeCount.incrementAndGet();
40-
return delegate.deserialize(data, type);
41-
}
42-
4337
@Override
4438
public <T> T deserialize(String data, TypeToken<T> typeToken) {
4539
deserializeCount.incrementAndGet();

sdk-integration-tests/src/test/java/com/amazonaws/lambda/durable/CustomSerDesIntegrationTest.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,6 @@ public String serialize(Object value) {
2626
return delegate.serialize(value);
2727
}
2828

29-
@Override
30-
public <T> T deserialize(String data, Class<T> type) {
31-
deserializeCount.incrementAndGet();
32-
return delegate.deserialize(data, type);
33-
}
34-
3529
@Override
3630
public <T> T deserialize(String data, TypeToken<T> typeToken) {
3731
deserializeCount.incrementAndGet();

sdk-testing/src/main/java/com/amazonaws/lambda/durable/testing/TestOperation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package com.amazonaws.lambda.durable.testing;
44

5+
import com.amazonaws.lambda.durable.TypeToken;
56
import com.amazonaws.lambda.durable.serde.SerDes;
67
import java.util.List;
78
import software.amazon.awssdk.services.lambda.model.ErrorObject;
@@ -58,7 +59,7 @@ public <T> T getStepResult(Class<T> type) {
5859
if (details == null || details.result() == null) {
5960
return null;
6061
}
61-
return serDes.deserialize(details.result(), type);
62+
return serDes.deserialize(details.result(), TypeToken.get(type));
6263
}
6364

6465
public ErrorObject getError() {

sdk-testing/src/main/java/com/amazonaws/lambda/durable/testing/TestResult.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package com.amazonaws.lambda.durable.testing;
44

5+
import com.amazonaws.lambda.durable.TypeToken;
56
import com.amazonaws.lambda.durable.model.ExecutionStatus;
67
import com.amazonaws.lambda.durable.serde.SerDes;
78
import java.util.List;
@@ -49,7 +50,7 @@ public <T> T getResult(Class<T> resultType) {
4950
if (resultPayload == null) {
5051
return null;
5152
}
52-
return serDes.deserialize(resultPayload, resultType);
53+
return serDes.deserialize(resultPayload, TypeToken.get(resultType));
5354
}
5455

5556
public Optional<ErrorObject> getError() {

sdk/src/main/java/com/amazonaws/lambda/durable/DurableContext.java

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public class DurableContext {
5656
public <T> T step(String name, Class<T> resultType, Supplier<T> func) {
5757
return step(
5858
name,
59-
resultType,
59+
TypeToken.get(resultType),
6060
func,
6161
StepConfig.builder()
6262
.retryStrategy(RetryStrategies.Presets.NO_RETRY)
@@ -86,29 +86,15 @@ public <T> T step(String name, TypeToken<T> typeToken, Supplier<T> func, StepCon
8686
public <T> DurableFuture<T> stepAsync(String name, Class<T> resultType, Supplier<T> func) {
8787
return stepAsync(
8888
name,
89-
resultType,
89+
TypeToken.get(resultType),
9090
func,
9191
StepConfig.builder()
9292
.retryStrategy(RetryStrategies.Presets.NO_RETRY)
9393
.build());
9494
}
9595

9696
public <T> DurableFuture<T> stepAsync(String name, Class<T> resultType, Supplier<T> func, StepConfig config) {
97-
var operationId = nextOperationId();
98-
99-
// Validate replay consistency
100-
var existing = executionManager.getOperation(operationId);
101-
if (existing != null) {
102-
validateReplay(operationId, OperationType.STEP, name, existing);
103-
}
104-
105-
// Create and start step operation
106-
StepOperation<T> operation =
107-
new StepOperation<>(operationId, name, func, resultType, config, executionManager, logger, serDes);
108-
109-
operation.execute(); // Start the step (returns immediately)
110-
111-
return new DurableFuture<>(operation);
97+
return stepAsync(name, TypeToken.get(resultType), func, config);
11298
}
11399

114100
public <T> DurableFuture<T> stepAsync(String name, TypeToken<T> typeToken, Supplier<T> func) {

sdk/src/main/java/com/amazonaws/lambda/durable/DurableExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ private static <I> I extractUserInput(Operation executionOp, SerDes serDes, Clas
156156
}
157157

158158
var inputPayload = executionOp.executionDetails().inputPayload();
159-
return serDes.deserialize(inputPayload, inputType);
159+
return serDes.deserialize(inputPayload, TypeToken.get(inputType));
160160
}
161161

162162
public static <I, O> RequestHandler<DurableExecutionInput, DurableExecutionOutput> wrap(

sdk/src/main/java/com/amazonaws/lambda/durable/TypeToken.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ protected TypeToken() {
4444
}
4545
}
4646

47+
private TypeToken(Type type) {
48+
this.type = type;
49+
}
50+
51+
public static <U> TypeToken<U> get(Class<U> clazz) {
52+
return new TypeToken<>(clazz) {};
53+
}
54+
4755
/**
4856
* Returns the captured type.
4957
*

sdk/src/main/java/com/amazonaws/lambda/durable/operation/StepOperation.java

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,13 @@ public class StepOperation<T> implements DurableOperation<T> {
3333
private final String operationId;
3434
private final String name;
3535
private final Supplier<T> function;
36-
private final Class<T> resultType;
3736
private final TypeToken<T> resultTypeToken;
3837
private final StepConfig config;
3938
private final ExecutionManager executionManager;
4039
private final DurableLogger durableLogger;
4140
private final SerDes serDes;
4241
private final Phaser phaser;
4342

44-
public StepOperation(
45-
String operationId,
46-
String name,
47-
Supplier<T> function,
48-
Class<T> resultType,
49-
StepConfig config,
50-
ExecutionManager executionManager,
51-
DurableLogger durableLogger,
52-
SerDes serDes) {
53-
this(operationId, name, function, resultType, null, config, executionManager, durableLogger, serDes);
54-
}
55-
5643
public StepOperation(
5744
String operationId,
5845
String name,
@@ -62,30 +49,13 @@ public StepOperation(
6249
ExecutionManager executionManager,
6350
DurableLogger durableLogger,
6451
SerDes serDes) {
65-
this(operationId, name, function, null, resultTypeToken, config, executionManager, durableLogger, serDes);
66-
}
67-
68-
private StepOperation(
69-
String operationId,
70-
String name,
71-
Supplier<T> function,
72-
Class<T> resultType,
73-
TypeToken<T> resultTypeToken,
74-
StepConfig config,
75-
ExecutionManager executionManager,
76-
DurableLogger durableLogger,
77-
SerDes serDes) {
78-
if (resultType == null && resultTypeToken == null) {
52+
if (resultTypeToken == null) {
7953
throw new IllegalArgumentException("Either resultType or resultTypeToken must be provided");
8054
}
81-
if (resultType != null && resultTypeToken != null) {
82-
throw new IllegalArgumentException("Cannot provide both resultType and resultTypeToken");
83-
}
8455

8556
this.operationId = operationId;
8657
this.name = name;
8758
this.function = function;
88-
this.resultType = resultType;
8959
this.resultTypeToken = resultTypeToken;
9060
this.config = config;
9161
this.executionManager = executionManager;
@@ -337,12 +307,7 @@ public T get() {
337307
var stepDetails = op.stepDetails();
338308
var result = (stepDetails != null) ? stepDetails.result() : null;
339309

340-
// Use TypeToken if provided, otherwise use Class
341-
if (resultTypeToken != null) {
342-
return serDes.deserialize(result, resultTypeToken);
343-
} else {
344-
return serDes.deserialize(result, resultType);
345-
}
310+
return serDes.deserialize(result, resultTypeToken);
346311
} else {
347312
// It failed so there's some kind of throwable. If we're using a serDes with
348313
// type info, deserialize and rethrow the original

sdk/src/main/java/com/amazonaws/lambda/durable/serde/JacksonSerDes.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,6 @@ public String serialize(Object value) {
5454
}
5555
}
5656

57-
@Override
58-
public <T> T deserialize(String data, Class<T> type) {
59-
if (data == null) return null;
60-
try {
61-
return mapper.readValue(data, type);
62-
} catch (Exception e) {
63-
throw new SerDesException("Deserialization failed for type: " + type.getName(), e);
64-
}
65-
}
66-
6757
@Override
6858
public <T> T deserialize(String data, TypeToken<T> typeToken) {
6959
if (data == null) return null;

0 commit comments

Comments
 (0)