From 3f53c2f5bd2e721ce5db3402ca4305554efecae6 Mon Sep 17 00:00:00 2001 From: musketyr Date: Fri, 14 Jun 2024 08:43:21 +0200 Subject: [PATCH 1/2] Fixed instant handling in the nested object --- .../dynamodb/DefaultDynamoDBService.groovy | 21 ++++++++++ .../dynamodb/convert/InstantConverter.java | 17 ++++++++ .../aws/dynamodb/DynamoDBEntity.java | 12 ++++++ .../aws/dynamodb/DynamoDBServiceTest.java | 2 + .../micronaut/aws/dynamodb/LogEntry.java | 39 +++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/convert/InstantConverter.java create mode 100644 subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/LogEntry.java diff --git a/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/DefaultDynamoDBService.groovy b/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/DefaultDynamoDBService.groovy index 9347a08a3..8613876be 100644 --- a/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/DefaultDynamoDBService.groovy +++ b/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/DefaultDynamoDBService.groovy @@ -119,6 +119,27 @@ class DefaultDynamoDBService implements DynamoDBService } ) + .addFirstType(Instant, + new ArgumentMarshaller() { + + @Override + AttributeValue marshall(Object obj) { + return obj == null ? null : new AttributeValue().withS(serializeDate((Instant) obj)) + } + + }, + new ArgumentUnmarshaller() { + + @Override + void typeCheck(AttributeValue value, Method setter) { } + + @Override + Object unmarshall(AttributeValue value) throws ParseException { + return value.s == null ? null : Instant.from(Instant.parse(value.s)) + } + + } + ) .build() // Specific ranges ending with 'Index' are String concatenated indexes, diff --git a/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/convert/InstantConverter.java b/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/convert/InstantConverter.java new file mode 100644 index 000000000..2be372195 --- /dev/null +++ b/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/convert/InstantConverter.java @@ -0,0 +1,17 @@ +package com.agorapulse.micronaut.aws.dynamodb.convert; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter; + +import java.time.Instant; + +public class InstantConverter implements DynamoDBTypeConverter { + + public String convert(Instant instant) { + return instant.toString(); + } + + public Instant unconvert(String date) { + return Instant.parse(date); + } + +} diff --git a/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/DynamoDBEntity.java b/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/DynamoDBEntity.java index 0e2da0431..36fcb5bad 100644 --- a/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/DynamoDBEntity.java +++ b/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/DynamoDBEntity.java @@ -19,7 +19,9 @@ import com.amazonaws.services.dynamodbv2.datamodeling.*; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Objects; @DynamoDBTable(tableName = "entity") @@ -46,6 +48,8 @@ public class DynamoDBEntity { @DynamoDBTypeConvertedEnum State state = State.UNKNOWN; + private List logs = new ArrayList<>(); + public String getParentId() { return parentId; } @@ -103,6 +107,14 @@ public void setState(State state) { this.state = state; } + public List getLogs() { + return logs; + } + + public void setLogs(List logs) { + this.logs = logs; + } + //CHECKSTYLE:OFF @Override public boolean equals(Object o) { diff --git a/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/DynamoDBServiceTest.java b/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/DynamoDBServiceTest.java index 47f71697f..9da5d18d1 100644 --- a/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/DynamoDBServiceTest.java +++ b/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/DynamoDBServiceTest.java @@ -27,6 +27,7 @@ import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Date; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -161,6 +162,7 @@ private DynamoDBEntity createEntity(String parentId, String id, String rangeInde entity.setId(id); entity.setRangeIndex(rangeIndex); entity.setDate(date); + entity.setLogs(List.of(LogEntry.create("test"))); return entity; } } diff --git a/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/LogEntry.java b/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/LogEntry.java new file mode 100644 index 000000000..9832b085d --- /dev/null +++ b/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/LogEntry.java @@ -0,0 +1,39 @@ +package com.agorapulse.micronaut.aws.dynamodb; + +import com.agorapulse.micronaut.aws.dynamodb.convert.InstantConverter; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverted; + +import java.time.Instant; + +@DynamoDBDocument +public class LogEntry { + + public static LogEntry create(String message) { + LogEntry entry = new LogEntry(); + entry.timestamp = Instant.now(); + entry.message = message; + return entry; + } + + @DynamoDBTypeConverted(converter = InstantConverter.class) + private Instant timestamp; + private String message; + + public Instant getTimestamp() { + return timestamp; + } + + public void setTimestamp(Instant timestamp) { + this.timestamp = timestamp; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + +} From 5cbb780dadd810c5b98ed29310b21d28b40d49a2 Mon Sep 17 00:00:00 2001 From: musketyr Date: Fri, 14 Jun 2024 08:54:19 +0200 Subject: [PATCH 2/2] license headers --- .../aws/dynamodb/convert/InstantConverter.java | 17 +++++++++++++++++ .../micronaut/aws/dynamodb/LogEntry.java | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/convert/InstantConverter.java b/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/convert/InstantConverter.java index 2be372195..851891c41 100644 --- a/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/convert/InstantConverter.java +++ b/subprojects/micronaut-aws-sdk-dynamodb/src/main/groovy/com/agorapulse/micronaut/aws/dynamodb/convert/InstantConverter.java @@ -1,3 +1,20 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2018-2024 Agorapulse. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.agorapulse.micronaut.aws.dynamodb.convert; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter; diff --git a/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/LogEntry.java b/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/LogEntry.java index 9832b085d..e25898155 100644 --- a/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/LogEntry.java +++ b/subprojects/micronaut-aws-sdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/aws/dynamodb/LogEntry.java @@ -1,3 +1,20 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2018-2024 Agorapulse. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.agorapulse.micronaut.aws.dynamodb; import com.agorapulse.micronaut.aws.dynamodb.convert.InstantConverter;