Skip to content

Commit cbe0ea6

Browse files
authored
Add support for DynamodbEvent.DynamodbStreamRecord serialization (aws#455)
Add support for DynamodbEvent.DynamodbStreamRecord serialization
1 parent a6f5115 commit cbe0ea6

File tree

5 files changed

+78
-15
lines changed

5 files changed

+78
-15
lines changed

aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/events/LambdaEventSerializers.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public class LambdaEventSerializers {
158158
* If mixins are required for inner classes of an event, then those nested classes must be specified here.
159159
*/
160160
@SuppressWarnings("rawtypes")
161-
private static final Map<String, List<NestedClass>> NESTED_CLASS_MAP = Stream.of(
161+
private static final Map<String, List<? extends NestedClass>> NESTED_CLASS_MAP = Stream.of(
162162
new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent",
163163
Arrays.asList(
164164
new NestedClass("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent$Record"))),
@@ -180,6 +180,14 @@ public class LambdaEventSerializers {
180180
"com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord",
181181
"com.amazonaws.services.dynamodbv2.model.StreamRecord"),
182182
new NestedClass("com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord"))),
183+
new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord",
184+
Arrays.asList(
185+
new AlternateNestedClass(
186+
"com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue",
187+
"com.amazonaws.services.dynamodbv2.model.AttributeValue"),
188+
new AlternateNestedClass(
189+
"com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord",
190+
"com.amazonaws.services.dynamodbv2.model.StreamRecord"))),
183191
new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbTimeWindowEvent",
184192
Arrays.asList(
185193
new AlternateNestedClass(
@@ -236,7 +244,7 @@ public static <T> PojoSerializer<T> serializerFor(Class<T> eventClass, ClassLoad
236244
}
237245
// if event model has nested classes then load those classes and check if mixins apply
238246
if (NESTED_CLASS_MAP.containsKey(eventClass.getName())) {
239-
List<NestedClass> nestedClasses = NESTED_CLASS_MAP.get(eventClass.getName());
247+
List<? extends NestedClass> nestedClasses = NESTED_CLASS_MAP.get(eventClass.getName());
240248
for (NestedClass nestedClass: nestedClasses) {
241249
// if mixin exists for nested class then apply
242250
if (MIXIN_MAP.containsKey(nestedClass.className)) {

aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoader.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ public static DynamodbEvent loadDynamoDbEvent(String filename) {
6565
return loadEvent(filename, DynamodbEvent.class);
6666
}
6767

68+
public static DynamodbEvent.DynamodbStreamRecord loadDynamoDbStreamRecord(String filename) {
69+
return loadEvent(filename, DynamodbEvent.DynamodbStreamRecord.class);
70+
}
71+
6872
public static KafkaEvent loadKafkaEvent(String filename) {
6973
return loadEvent(filename, KafkaEvent.class);
7074
}

aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventLoaderTest.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -160,27 +160,43 @@ public void testLoadSNSEvent() {
160160

161161
@Test
162162
public void testLoadDynamoEvent() {
163-
DynamodbEvent event = EventLoader.loadDynamoDbEvent("dynamo_event.json");
163+
DynamodbEvent event = EventLoader.loadDynamoDbEvent("ddb/dynamo_event.json");
164164
assertThat(event).isNotNull();
165165
assertThat(event.getRecords()).hasSize(3);
166+
assertDynamoDbStreamRecord(event.getRecords().get(1));
167+
}
166168

167-
DynamodbEvent.DynamodbStreamRecord record = event.getRecords().get(0);
169+
@Test
170+
public void testLoadDynamoDbStreamRecord() {
171+
assertDynamoDbStreamRecord(EventLoader.loadDynamoDbStreamRecord("ddb/dynamo_ddb_stream_record.json"));
172+
}
173+
174+
private static void assertDynamoDbStreamRecord(final DynamodbEvent.DynamodbStreamRecord record) {
168175
assertThat(record)
176+
.isNotNull()
169177
.returns("arn:aws:dynamodb:eu-central-1:123456789012:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", from(DynamodbEvent.DynamodbStreamRecord::getEventSourceARN))
170-
.returns("INSERT", from(Record::getEventName));
178+
.returns("MODIFY", from(Record::getEventName));
171179

172180
StreamRecord streamRecord = record.getDynamodb();
173181
assertThat(streamRecord)
174-
.returns("4421584500000000017450439091", StreamRecord::getSequenceNumber)
175-
.returns(26L, StreamRecord::getSizeBytes)
182+
.returns("4421584500000000017450439092", StreamRecord::getSequenceNumber)
183+
.returns(59L, StreamRecord::getSizeBytes)
176184
.returns("NEW_AND_OLD_IMAGES", StreamRecord::getStreamViewType)
177-
.returns(Date.from(ofEpochSecond(1428537600)), StreamRecord::getApproximateCreationDateTime);
178-
179-
assertThat(streamRecord.getKeys()).contains(entry("Id", new AttributeValue().withN("101")));
180-
assertThat(streamRecord.getNewImage()).containsAnyOf(
181-
entry("Message", new AttributeValue("New item!")),
182-
entry("Id", new AttributeValue().withN("101"))
183-
);
185+
.returns(Date.from(ofEpochSecond(1635734407).plusNanos(123456789)), StreamRecord::getApproximateCreationDateTime);
186+
187+
assertThat(streamRecord.getKeys())
188+
.isNotNull()
189+
.contains(entry("Id", new AttributeValue().withN("101")));
190+
assertThat(streamRecord.getNewImage())
191+
.isNotNull()
192+
.containsAnyOf(
193+
entry("Message", new AttributeValue("This item has changed")),
194+
entry("Id", new AttributeValue().withN("101")));
195+
assertThat(streamRecord.getOldImage())
196+
.isNotNull()
197+
.containsAnyOf(
198+
entry("Message", new AttributeValue("New item!")),
199+
entry("Id", new AttributeValue().withN("101")));
184200
}
185201

186202
@Test
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"eventID": "c81e728d9d4c2f636f067f89cc14862c",
3+
"eventName": "MODIFY",
4+
"eventVersion": "1.1",
5+
"eventSource": "aws:dynamodb",
6+
"awsRegion": "eu-central-1",
7+
"dynamodb": {
8+
"Keys": {
9+
"Id": {
10+
"N": "101"
11+
}
12+
},
13+
"NewImage": {
14+
"Message": {
15+
"S": "This item has changed"
16+
},
17+
"Id": {
18+
"N": "101"
19+
}
20+
},
21+
"OldImage": {
22+
"Message": {
23+
"S": "New item!"
24+
},
25+
"Id": {
26+
"N": "101"
27+
}
28+
},
29+
"ApproximateCreationDateTime": 1.635734407123456789E9,
30+
"SequenceNumber": "4421584500000000017450439092",
31+
"SizeBytes": 59,
32+
"StreamViewType": "NEW_AND_OLD_IMAGES"
33+
},
34+
"eventSourceARN": "arn:aws:dynamodb:eu-central-1:123456789012:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899"
35+
}

aws-lambda-java-tests/src/test/resources/dynamo_event.json renamed to aws-lambda-java-tests/src/test/resources/ddb/dynamo_event.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
"N": "101"
6060
}
6161
},
62-
"ApproximateCreationDateTime": 1428537600,
62+
"ApproximateCreationDateTime": 1.635734407123456789E9,
6363
"SequenceNumber": "4421584500000000017450439092",
6464
"SizeBytes": 59,
6565
"StreamViewType": "NEW_AND_OLD_IMAGES"

0 commit comments

Comments
 (0)