Skip to content

Commit 3ab0787

Browse files
committed
add a method to construct TypeToken from Class
1 parent 43ae4fe commit 3ab0787

9 files changed

Lines changed: 24 additions & 51 deletions

File tree

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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ public T get() {
341341
if (resultTypeToken != null) {
342342
return serDes.deserialize(result, resultTypeToken);
343343
} else {
344-
return serDes.deserialize(result, resultType);
344+
return serDes.deserialize(result, TypeToken.get(resultType));
345345
}
346346
} else {
347347
// It failed so there's some kind of throwable. If we're using a serDes with

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;

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,6 @@ public interface SerDes {
1818
*/
1919
String serialize(Object value);
2020

21-
/**
22-
* Deserializes a JSON string to an object of the specified type.
23-
*
24-
* @param data the JSON string to deserialize
25-
* @param type the class of the target type
26-
* @param <T> the target type
27-
* @return the deserialized object, or null if data is null
28-
*/
29-
<T> T deserialize(String data, Class<T> type);
30-
3121
/**
3222
* Deserializes a JSON string to an object of the specified generic type.
3323
*

sdk/src/test/java/com/amazonaws/lambda/durable/DurableExecutionWrapperTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
import static java.util.List.of;
66
import static org.junit.jupiter.api.Assertions.*;
7-
import static org.mockito.ArgumentMatchers.*;
8-
import static org.mockito.Mockito.*;
97

108
import com.amazonaws.lambda.durable.client.DurableExecutionClient;
119
import com.amazonaws.lambda.durable.model.DurableExecutionInput;
@@ -78,7 +76,7 @@ void testWrapperPattern() {
7876
assertEquals(ExecutionStatus.SUCCEEDED, output.status());
7977
assertNotNull(output.result());
8078

81-
var result = serDes.deserialize(output.result(), TestOutput.class);
79+
var result = serDes.deserialize(output.result(), TypeToken.get(TestOutput.class));
8280
assertEquals("Wrapped: test", result.result);
8381
}
8482

@@ -108,7 +106,7 @@ void testWrapperWithMethodReference() {
108106
var output = handler.handleRequest(input, null);
109107

110108
assertEquals(ExecutionStatus.SUCCEEDED, output.status());
111-
var result = serDes.deserialize(output.result(), TestOutput.class);
109+
var result = serDes.deserialize(output.result(), TypeToken.get(TestOutput.class));
112110
assertEquals("Method: method-ref", result.result);
113111
}
114112

sdk/src/test/java/com/amazonaws/lambda/durable/serde/JacksonSerDesTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static org.junit.jupiter.api.Assertions.assertThrows;
99
import static org.junit.jupiter.api.Assertions.assertTrue;
1010

11+
import com.amazonaws.lambda.durable.TypeToken;
1112
import com.amazonaws.lambda.durable.exception.SerDesException;
1213
import org.junit.jupiter.api.Test;
1314

@@ -21,7 +22,7 @@ void testRoundTrip() {
2122
var original = new TestData("test", 42);
2223

2324
var json = serDes.serialize(original);
24-
var deserialized = serDes.deserialize(json, TestData.class);
25+
var deserialized = serDes.deserialize(json, TypeToken.get(TestData.class));
2526

2627
assertEquals(original, deserialized);
2728
}
@@ -31,7 +32,7 @@ void testNullHandling() {
3132
var serDes = new JacksonSerDes();
3233

3334
assertNull(serDes.serialize(null));
34-
assertNull(serDes.deserialize(null, String.class));
35+
assertNull(serDes.deserialize(null, TypeToken.get(String.class)));
3536
}
3637

3738
@Test
@@ -40,7 +41,7 @@ void testDeserializationThrowsSerDesException() {
4041
var invalidJson = "{invalid json}";
4142

4243
var exception = assertThrows(SerDesException.class, () -> {
43-
serDes.deserialize(invalidJson, TestData.class);
44+
serDes.deserialize(invalidJson, TypeToken.get(TestData.class));
4445
});
4546

4647
assertTrue(exception.getMessage().contains("Deserialization failed"));
@@ -79,7 +80,7 @@ void testSerDesExceptionExtendsRuntimeException() {
7980

8081
// Verify SerDesException is a RuntimeException (unchecked)
8182
assertThrows(RuntimeException.class, () -> {
82-
serDes.deserialize(invalidJson, TestData.class);
83+
serDes.deserialize(invalidJson, TypeToken.get(TestData.class));
8384
});
8485
}
8586
}

sdk/src/test/java/com/amazonaws/lambda/durable/serde/JacksonSerDesTypeTokenTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ void setUp() {
2121
}
2222

2323
@Test
24-
void testDeserializeListOfStrings() {
24+
void testDeserializeListGetStrings() {
2525
var json = "[\"apple\",\"banana\",\"cherry\"]";
2626
var token = new TypeToken<List<String>>() {};
2727

@@ -35,7 +35,7 @@ void testDeserializeListOfStrings() {
3535
}
3636

3737
@Test
38-
void testDeserializeMapOfStringToInteger() {
38+
void testDeserializeMapGetStringToInteger() {
3939
var json = "{\"one\":1,\"two\":2,\"three\":3}";
4040
var token = new TypeToken<Map<String, Integer>>() {};
4141

@@ -62,7 +62,7 @@ void testDeserializeNestedGeneric() {
6262
}
6363

6464
@Test
65-
void testDeserializeListOfMaps() {
65+
void testDeserializeListGetMaps() {
6666
var json = "[{\"name\":\"Alice\",\"age\":30},{\"name\":\"Bob\",\"age\":25}]";
6767
var token = new TypeToken<List<Map<String, Object>>>() {};
6868

@@ -175,7 +175,7 @@ public TestObject(String name, int value) {
175175
}
176176

177177
@Test
178-
void testDeserializeListOfCustomObjects() {
178+
void testDeserializeListGetCustomObjects() {
179179
var json = "[{\"name\":\"test1\",\"value\":10},{\"name\":\"test2\",\"value\":20}]";
180180
var token = new TypeToken<List<TestObject>>() {};
181181

0 commit comments

Comments
 (0)