diff --git a/pom.xml b/pom.xml
index ed7bd157..6e2a834e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.grad.secom
secom-parent
pom
- 0.0.50
+ 0.0.51-SNAPSHOT
secom-core
diff --git a/secom-core-jakarta/pom.xml b/secom-core-jakarta/pom.xml
index 02ef5bc8..50bf00ad 100644
--- a/secom-core-jakarta/pom.xml
+++ b/secom-core-jakarta/pom.xml
@@ -21,13 +21,13 @@
secom-parent
org.grad.secom
- 0.0.50
+ 0.0.51-SNAPSHOT
4.0.0
org.grad.secom
secom-core-jakarta
- 0.0.50
+ 0.0.51-SNAPSHOT
9.0.0
@@ -82,7 +82,7 @@
io.swagger.core.v3
swagger-annotations-jakarta
- 2.2.8
+ 2.2.30
provided
@@ -106,6 +106,13 @@
test
+
+ org.mockito
+ mockito-core
+ 5.8.0
+ test
+
+
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/CsvStringGenerator.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/CsvStringGenerator.java
index edad11da..1c1fb6e2 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/CsvStringGenerator.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/CsvStringGenerator.java
@@ -20,7 +20,7 @@
import org.grad.secom.core.models.enums.SECOM_Enum;
import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.Base64;
@@ -82,10 +82,10 @@ else if(attribute instanceof CsvStringGenerator) {
.map(CsvStringGenerator::getCsvString)
.orElse("");
}
- else if(attribute instanceof LocalDateTime) {
+ else if(attribute instanceof Instant) {
return Optional.of(attribute)
- .map(LocalDateTime.class::cast)
- .map(ldt -> ldt.toEpochSecond(ZoneOffset.UTC))
+ .map(Instant.class::cast)
+ .map(Instant::getEpochSecond)
.map(String::valueOf)
.orElse("");
} else if(attribute instanceof Boolean) {
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/EnvelopeSignatureBearer.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/EnvelopeSignatureBearer.java
index 5667e68e..0adc6a2e 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/EnvelopeSignatureBearer.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/EnvelopeSignatureBearer.java
@@ -28,7 +28,7 @@
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateEncodingException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.Optional;
/**
@@ -102,7 +102,7 @@ default EnvelopeSignatureBearer signEnvelope(SecomCertificateProvider certificat
try {
this.getEnvelope().setEnvelopeSignatureCertificate(SecomPemUtils.getMinifiedPemFromCert(signatureCertificate.getCertificate()));
this.getEnvelope().setEnvelopeRootCertificateThumbprint(SecomPemUtils.getCertThumbprint(signatureCertificate.getRootCertificate(), SecomConstants.CERTIFICATE_THUMBPRINT_HASH));
- this.getEnvelope().setEnvelopeSignatureTime(LocalDateTime.now());
+ this.getEnvelope().setEnvelopeSignatureTime(Instant.now());
} catch (CertificateEncodingException | NoSuchAlgorithmException exception) {
throw new SecomInvalidCertificateException(exception.getMessage());
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/base/DateTimeDeSerializer.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/InstantDeserializer.java
similarity index 79%
rename from secom-core/src/main/java/org/grad/secom/core/base/DateTimeDeSerializer.java
rename to secom-core-jakarta/src/main/java/org/grad/secom/core/base/InstantDeserializer.java
index 74493258..372183fb 100644
--- a/secom-core/src/main/java/org/grad/secom/core/base/DateTimeDeSerializer.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/InstantDeserializer.java
@@ -21,14 +21,14 @@
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.Optional;
import static java.util.function.Predicate.not;
import static org.grad.secom.core.base.SecomConstants.SECOM_DATE_TIME_FORMATTER;
/**
- * The DateTimeDeSerializer Class
+ * The DateTimeDeserializer Class
*
* In SECOM the date-time format is not the frequently used ISO. According to
* the standard A DateTime is a combination of a date and a time type.
@@ -37,12 +37,12 @@
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
-public class DateTimeDeSerializer extends StdDeserializer {
+public class InstantDeserializer extends StdDeserializer {
/**
* Instantiates a new Byte array de serializer.
*/
- protected DateTimeDeSerializer() {
+ protected InstantDeserializer() {
this(null);
}
@@ -51,24 +51,25 @@ protected DateTimeDeSerializer() {
*
* @param t the byte array class
*/
- protected DateTimeDeSerializer(Class t) {
+ protected InstantDeserializer(Class t) {
super(t);
}
/**
* Implements the de-serialization procedure of the de-serializer.
*
- * @param jp The JSON Parser
- * @param ctxt The deserialization context
+ * @param jp The JSON Parser
+ * @param context The deserialization context
* @return the deserialized output
* @throws IOException for any IO exceptions
*/
@Override
- public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
+ public Instant deserialize(JsonParser jp, DeserializationContext context) throws IOException {
final String value = jp.getCodec().readValue(jp, String.class);
return Optional.ofNullable(value)
.filter(not(String::isBlank))
- .map(v -> LocalDateTime.parse(v, SECOM_DATE_TIME_FORMATTER))
+ .map(SECOM_DATE_TIME_FORMATTER::parse)
+ .map(Instant::from)
.orElse(null);
}
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/DateTimeSerializer.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/InstantSerializer.java
similarity index 81%
rename from secom-core-jakarta/src/main/java/org/grad/secom/core/base/DateTimeSerializer.java
rename to secom-core-jakarta/src/main/java/org/grad/secom/core/base/InstantSerializer.java
index e52d9030..99cf1545 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/DateTimeSerializer.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/InstantSerializer.java
@@ -21,7 +21,7 @@
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneId;
import java.util.Optional;
@@ -37,12 +37,12 @@
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
-public class DateTimeSerializer extends StdSerializer {
+public class InstantSerializer extends StdSerializer {
/**
* Instantiates a new Byte array serializer.
*/
- protected DateTimeSerializer() {
+ protected InstantSerializer() {
this(null);
}
@@ -51,22 +51,22 @@ protected DateTimeSerializer() {
*
* @param t the byte array class
*/
- protected DateTimeSerializer(Class t) {
+ protected InstantSerializer(Class t) {
super(t);
}
/**
* Implements the serialization procedure of the serializer.
*
- * @param localDateTime The input to be serialized
+ * @param instant The input to be serialized
* @param jg The JSON generator
* @param serializerProvider The serialization provider
* @return the serialized output
* @throws IOException for any IO exceptions
*/
@Override
- public void serialize(LocalDateTime localDateTime, JsonGenerator jg, SerializerProvider serializerProvider) throws IOException {
- jg.writeString(Optional.ofNullable(localDateTime)
+ public void serialize(Instant instant, JsonGenerator jg, SerializerProvider serializerProvider) throws IOException {
+ jg.writeString(Optional.ofNullable(instant)
.map(dt -> dt.atZone(ZoneId.systemDefault()))
.map(SECOM_DATE_TIME_FORMATTER::format)
.orElse(""));
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/SecomConstants.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/SecomConstants.java
index 529fc114..b0e719bb 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/SecomConstants.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/base/SecomConstants.java
@@ -16,6 +16,7 @@
package org.grad.secom.core.base;
+import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
@@ -66,7 +67,9 @@ public class SecomConstants {
.parseLenient()
.appendOffset("+HHMM", "Z")
.parseStrict()
- .toFormatter();
+ .optionalEnd()
+ .toFormatter()
+ .withZone(ZoneId.systemDefault());
}
public static final String SECOM_DATE_TIME_FORMAT = SECOM_DATE_FORMAT + "'T'" + SECOM_TIME_FORMAT;
@@ -79,7 +82,9 @@ public class SecomConstants {
.parseLenient()
.appendOffset("+HHMM", "Z")
.parseStrict()
- .toFormatter();
+ .optionalEnd()
+ .toFormatter()
+ .withZone(ZoneId.systemDefault());
}
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/components/ContainerTypeConverterProvider.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/components/ContainerTypeConverterProvider.java
index ba9fe22b..af000c25 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/components/ContainerTypeConverterProvider.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/components/ContainerTypeConverterProvider.java
@@ -26,7 +26,7 @@
import java.lang.reflect.Type;
/**
- * The LocalDateTime Converter Provider.
+ * The Instant Converter Provider.
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/components/LocalDateTimeConverterProvider.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/components/InstantConverterProvider.java
similarity index 75%
rename from secom-core-jakarta/src/main/java/org/grad/secom/core/components/LocalDateTimeConverterProvider.java
rename to secom-core-jakarta/src/main/java/org/grad/secom/core/components/InstantConverterProvider.java
index 84158ecd..f74e3146 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/components/LocalDateTimeConverterProvider.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/components/InstantConverterProvider.java
@@ -23,22 +23,20 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
+import java.time.*;
import static org.grad.secom.core.base.SecomConstants.SECOM_DATE_TIME_FORMATTER;
/**
- * The LocalDateTime Converter Provider.
+ * The Instant Converter Provider.
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
@Provider
-public class LocalDateTimeConverterProvider implements ParamConverterProvider {
+public class InstantConverterProvider implements ParamConverterProvider {
// Class Variables
- private final LocalDateTimeConverter converter = new LocalDateTimeConverter();
+ private final InstantConverter converter = new InstantConverter();
/**
* Implement the converter provision function.
@@ -51,16 +49,16 @@ public class LocalDateTimeConverterProvider implements ParamConverterProvider {
*/
@Override
public ParamConverter getConverter(Class aClass, Type type, Annotation[] annotations) {
- if (!aClass.equals(LocalDateTime.class)) return null;
+ if (!aClass.equals(Instant.class)) return null;
return (ParamConverter) converter;
}
/**
- * The LocalDateTime Converter Class.
+ * The Instant Converter Class.
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
- public class LocalDateTimeConverter implements ParamConverter {
+ public static class InstantConverter implements ParamConverter {
/**
* Implement the fromString operation.
@@ -68,14 +66,13 @@ public class LocalDateTimeConverter implements ParamConverter {
* @param value the string value to be converted into an object
* @return the converted object
*/
- public LocalDateTime fromString(String value) {
+ public Instant fromString(String value) {
if (value == null || value.isEmpty()) return null;
try {
- return LocalDateTime.parse(value, SECOM_DATE_TIME_FORMATTER);
+ return Instant.from(SECOM_DATE_TIME_FORMATTER.parse(value));
} catch (Exception ex) { // Direct to BAD_REQUEST
throw new SecomValidationException(ex.getMessage());
}
-
}
/**
@@ -84,11 +81,10 @@ public LocalDateTime fromString(String value) {
* @param value the object to be converted into a string
* @return the converted string
*/
- public String toString(LocalDateTime value) {
+ public String toString(Instant value) {
if (value == null) return "";
try {
- final ZonedDateTime zonedValue = value.atZone(ZoneId.systemDefault());
- return SECOM_DATE_TIME_FORMATTER.format(zonedValue);
+ return SECOM_DATE_TIME_FORMATTER.format(value);
} catch (Exception ex) { // Direct to BAD_REQUEST
throw new SecomValidationException(ex.getMessage());
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/interfaces/GetSecomInterface.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/interfaces/GetSecomInterface.java
index d791c3c9..9361fdb2 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/interfaces/GetSecomInterface.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/interfaces/GetSecomInterface.java
@@ -17,7 +17,8 @@
package org.grad.secom.core.interfaces;
import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.exc.InvalidFormatException;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.ws.rs.*;
import org.grad.secom.core.exceptions.SecomNotAuthorisedException;
import org.grad.secom.core.exceptions.SecomNotFoundException;
@@ -33,7 +34,7 @@
import jakarta.validation.constraints.Pattern;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -78,8 +79,8 @@ GetResponseObject get(@QueryParam("dataReference") UUID dataReference,
@QueryParam("productVersion") String productVersion,
@QueryParam("geometry") String geometry,
@QueryParam("unlocode") @Pattern(regexp = "[A-Z]{5}") String unlocode,
- @QueryParam("validFrom") LocalDateTime validFrom,
- @QueryParam("validTo") LocalDateTime validTo,
+ @QueryParam("validFrom") @Parameter(example = "20200101T123000", schema = @Schema(implementation = String.class, pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")) Instant validFrom,
+ @QueryParam("validTo") @Parameter(example = "20200101T123000", schema = @Schema(implementation = String.class, pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")) Instant validTo,
@QueryParam("page") @Min(0) Integer page,
@QueryParam("pageSize") @Min(0) Integer pageSize);
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/interfaces/GetSummarySecomInterface.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/interfaces/GetSummarySecomInterface.java
index 32a3582e..9142d343 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/interfaces/GetSummarySecomInterface.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/interfaces/GetSummarySecomInterface.java
@@ -18,6 +18,8 @@
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.ws.rs.*;
import org.grad.secom.core.exceptions.SecomNotAuthorisedException;
import org.grad.secom.core.exceptions.SecomNotFoundException;
@@ -33,7 +35,7 @@
import jakarta.validation.constraints.Pattern;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
-import java.time.LocalDateTime;
+import java.time.Instant;
/**
* The SECOM Get Summary Interface Definition.
@@ -76,8 +78,8 @@ GetSummaryResponseObject getSummary(@QueryParam("containerType") ContainerTypeEn
@QueryParam("productVersion") String productVersion,
@QueryParam("geometry") String geometry,
@QueryParam("unlocode") @Pattern(regexp = "[A-Z]{5}") String unlocode,
- @QueryParam("validFrom") LocalDateTime validFrom,
- @QueryParam("validTo") LocalDateTime validTo,
+ @QueryParam("validFrom") @Parameter(example = "20200101T123000", schema = @Schema(implementation = String.class, pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")) Instant validFrom,
+ @QueryParam("validTo") @Parameter(example = "20200101T123000", schema = @Schema(implementation = String.class, pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")) Instant validTo,
@QueryParam("page") @Min(0) Integer page,
@QueryParam("pageSize") @Min(0) Integer pageSize);
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/AbstractEnvelope.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/AbstractEnvelope.java
index 0c84245c..8071ab11 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/AbstractEnvelope.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/AbstractEnvelope.java
@@ -22,10 +22,10 @@
import org.grad.secom.core.base.CsvStringGenerator;
import jakarta.validation.constraints.NotNull;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
-import java.time.LocalDateTime;
+import java.time.Instant;
public abstract class AbstractEnvelope implements CsvStringGenerator {
@@ -35,10 +35,10 @@ public abstract class AbstractEnvelope implements CsvStringGenerator {
@NotNull
protected String envelopeRootCertificateThumbprint;
@NotNull
- @Schema(description = "The envelope signature date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- protected LocalDateTime envelopeSignatureTime;
+ @Schema(description = "The envelope signature date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ protected Instant envelopeSignatureTime;
/**
* Gets envelope signature certificate.
@@ -81,7 +81,7 @@ public void setEnvelopeRootCertificateThumbprint(String envelopeRootCertificateT
*
* @return the envelope signature time
*/
- public LocalDateTime getEnvelopeSignatureTime() {
+ public Instant getEnvelopeSignatureTime() {
return envelopeSignatureTime;
}
@@ -90,7 +90,7 @@ public LocalDateTime getEnvelopeSignatureTime() {
*
* @param envelopeSignatureTime the envelope signature time
*/
- public void setEnvelopeSignatureTime(LocalDateTime envelopeSignatureTime) {
+ public void setEnvelopeSignatureTime(Instant envelopeSignatureTime) {
this.envelopeSignatureTime = envelopeSignatureTime;
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeAckObject.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeAckObject.java
index ecb12ad0..526babe4 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeAckObject.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeAckObject.java
@@ -20,13 +20,13 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.models.enums.AckTypeEnum;
import org.grad.secom.core.models.enums.NackTypeEnum;
import jakarta.validation.constraints.NotNull;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -38,10 +38,10 @@ public class EnvelopeAckObject extends AbstractEnvelope {
// Class Variables
@NotNull
- @Schema(description = "The creation date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime createdAt;
+ @Schema(description = "The creation date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant createdAt;
@NotNull
private UUID transactionIdentifier;
@NotNull
@@ -53,7 +53,7 @@ public class EnvelopeAckObject extends AbstractEnvelope {
*
* @return the created at
*/
- public LocalDateTime getCreatedAt() {
+ public Instant getCreatedAt() {
return createdAt;
}
@@ -62,7 +62,7 @@ public LocalDateTime getCreatedAt() {
*
* @param createdAt the created at
*/
- public void setCreatedAt(LocalDateTime createdAt) {
+ public void setCreatedAt(Instant createdAt) {
this.createdAt = createdAt;
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeKeyNotificationObject.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeKeyNotificationObject.java
index 89a107e0..c2000475 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeKeyNotificationObject.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeKeyNotificationObject.java
@@ -20,10 +20,10 @@
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -41,10 +41,10 @@ public class EnvelopeKeyNotificationObject {
@NotNull
private String envelopeSignatureCertificate;
@NotNull
- @Schema(description = "The envelope signature date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime envelopeSignatureTime;
+ @Schema(description = "The envelope signature date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant envelopeSignatureTime;
/**
* Gets data reference.
@@ -105,7 +105,7 @@ public void setEnvelopeSignatureCertificate(String envelopeSignatureCertificate)
*
* @return the envelope signature time
*/
- public LocalDateTime getEnvelopeSignatureTime() {
+ public Instant getEnvelopeSignatureTime() {
return envelopeSignatureTime;
}
@@ -114,7 +114,7 @@ public LocalDateTime getEnvelopeSignatureTime() {
*
* @param envelopeSignatureTime the envelope signature time
*/
- public void setEnvelopeSignatureTime(LocalDateTime envelopeSignatureTime) {
+ public void setEnvelopeSignatureTime(Instant envelopeSignatureTime) {
this.envelopeSignatureTime = envelopeSignatureTime;
}
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeLinkObject.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeLinkObject.java
index cff65402..66257de4 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeLinkObject.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/EnvelopeLinkObject.java
@@ -20,15 +20,15 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.base.GenericExchangeMetadataBearer;
import org.grad.secom.core.models.enums.AckRequestEnum;
import org.grad.secom.core.models.enums.ContainerTypeEnum;
import org.grad.secom.core.models.enums.SECOM_DataProductType;
import jakarta.validation.constraints.NotNull;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -55,10 +55,10 @@ public class EnvelopeLinkObject extends AbstractEnvelope implements GenericExcha
@NotNull
private Integer size;
@NotNull
- @Schema(description = "The time to live date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime timeToLive;
+ @Schema(description = "The time to live date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant timeToLive;
/**
* Instantiates a new Envelope link object.
@@ -198,7 +198,7 @@ public void setSize(Integer size) {
*
* @return the time to live
*/
- public LocalDateTime getTimeToLive() {
+ public Instant getTimeToLive() {
return timeToLive;
}
@@ -207,7 +207,7 @@ public LocalDateTime getTimeToLive() {
*
* @param timeToLive the time to live
*/
- public void setTimeToLive(LocalDateTime timeToLive) {
+ public void setTimeToLive(Instant timeToLive) {
this.timeToLive = timeToLive;
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/PingResponseObject.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/PingResponseObject.java
index d0844149..bbc998c7 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/PingResponseObject.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/PingResponseObject.java
@@ -19,11 +19,10 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
-import java.time.LocalDateTime;
+import java.time.Instant;
/**
* The SECOM Ping Response Object Class
@@ -33,17 +32,17 @@
public class PingResponseObject {
// Class Variables
- @Schema(description = "The last private interaction date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime lastPrivateInteractionTime;
+ @Schema(description = "The last private interaction date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant lastPrivateInteractionTime;
/**
* Gets last private interaction time.
*
* @return the last private interaction time
*/
- public LocalDateTime getLastPrivateInteractionTime() {
+ public Instant getLastPrivateInteractionTime() {
return lastPrivateInteractionTime;
}
@@ -52,7 +51,7 @@ public LocalDateTime getLastPrivateInteractionTime() {
*
* @param lastPrivateInteractionTime the last private interaction time
*/
- public void setLastPrivateInteractionTime(LocalDateTime lastPrivateInteractionTime) {
+ public void setLastPrivateInteractionTime(Instant lastPrivateInteractionTime) {
this.lastPrivateInteractionTime = lastPrivateInteractionTime;
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SearchObjectResult.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SearchObjectResult.java
index f21ca58e..8485707e 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SearchObjectResult.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SearchObjectResult.java
@@ -19,13 +19,13 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.models.enums.SECOM_DataProductType;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.List;
/**
@@ -59,14 +59,14 @@ public class SearchObjectResult {
private String instanceAsXml;
// Non-standard fields (mentioned but not standardised)
- @Schema(description = "The publication date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime publishedAt;
- @Schema(description = "The last updated date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime lastUpdatedAt;
+ @Schema(description = "The publication date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant publishedAt;
+ @Schema(description = "The last updated date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant lastUpdatedAt;
private String comment;
private String mmsi;
private String imo;
@@ -293,7 +293,7 @@ public void setInstanceAsXml(String instanceAsXml) {
*
* @return the published at
*/
- public LocalDateTime getPublishedAt() {
+ public Instant getPublishedAt() {
return publishedAt;
}
@@ -302,7 +302,7 @@ public LocalDateTime getPublishedAt() {
*
* @param publishedAt the published at
*/
- public void setPublishedAt(LocalDateTime publishedAt) {
+ public void setPublishedAt(Instant publishedAt) {
this.publishedAt = publishedAt;
}
@@ -311,7 +311,7 @@ public void setPublishedAt(LocalDateTime publishedAt) {
*
* @return the last updated at
*/
- public LocalDateTime getLastUpdatedAt() {
+ public Instant getLastUpdatedAt() {
return lastUpdatedAt;
}
@@ -320,7 +320,7 @@ public LocalDateTime getLastUpdatedAt() {
*
* @param lastUpdatedAt the last updated at
*/
- public void setLastUpdatedAt(LocalDateTime lastUpdatedAt) {
+ public void setLastUpdatedAt(Instant lastUpdatedAt) {
this.lastUpdatedAt = lastUpdatedAt;
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SubscriptionRequestObject.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SubscriptionRequestObject.java
index 7e7e3022..d7a5717b 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SubscriptionRequestObject.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SubscriptionRequestObject.java
@@ -19,13 +19,13 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.models.enums.ContainerTypeEnum;
import org.grad.secom.core.models.enums.SECOM_DataProductType;
import jakarta.validation.constraints.Pattern;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -46,14 +46,14 @@ public class SubscriptionRequestObject {
@Schema(description = "The subscription area as UNLOCODE", type = "string", example = "GBHRW")
@Pattern(regexp = "[A-Z]{5}")
private String unlocode;
- @Schema(description = "The subscription period start", type = "string", example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime subscriptionPeriodStart;
- @Schema(description = "The subscription period end", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime subscriptionPeriodEnd;
+ @Schema(description = "The subscription period start", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant subscriptionPeriodStart;
+ @Schema(description = "The subscription period end", type = "string",example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant subscriptionPeriodEnd;
/**
* Gets container type.
@@ -168,7 +168,7 @@ public void setUnlocode(String unlocode) {
*
* @return the subscription period start
*/
- public LocalDateTime getSubscriptionPeriodStart() {
+ public Instant getSubscriptionPeriodStart() {
return subscriptionPeriodStart;
}
@@ -177,7 +177,7 @@ public LocalDateTime getSubscriptionPeriodStart() {
*
* @param subscriptionPeriodStart the subscription period start
*/
- public void setSubscriptionPeriodStart(LocalDateTime subscriptionPeriodStart) {
+ public void setSubscriptionPeriodStart(Instant subscriptionPeriodStart) {
this.subscriptionPeriodStart = subscriptionPeriodStart;
}
@@ -186,7 +186,7 @@ public void setSubscriptionPeriodStart(LocalDateTime subscriptionPeriodStart) {
*
* @return the subscription period end
*/
- public LocalDateTime getSubscriptionPeriodEnd() {
+ public Instant getSubscriptionPeriodEnd() {
return subscriptionPeriodEnd;
}
@@ -195,7 +195,7 @@ public LocalDateTime getSubscriptionPeriodEnd() {
*
* @param subscriptionPeriodEnd the subscription period end
*/
- public void setSubscriptionPeriodEnd(LocalDateTime subscriptionPeriodEnd) {
+ public void setSubscriptionPeriodEnd(Instant subscriptionPeriodEnd) {
this.subscriptionPeriodEnd = subscriptionPeriodEnd;
}
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SummaryObject.java b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SummaryObject.java
index e7405c2a..86ad1025 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SummaryObject.java
+++ b/secom-core-jakarta/src/main/java/org/grad/secom/core/models/SummaryObject.java
@@ -20,12 +20,12 @@
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.models.enums.ContainerTypeEnum;
import org.grad.secom.core.models.enums.SECOM_DataProductType;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -50,10 +50,10 @@ public class SummaryObject {
private String info_name;
private String info_status;
private String info_description;
- @Schema(description = "The last modified date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime info_lastModifiedDate;
+ @Schema(description = "The last modified date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant info_lastModifiedDate;
private String info_productVersion;
private Long info_size;
@@ -224,7 +224,7 @@ public void setInfo_description(String info_description) {
*
* @return the info last modified date
*/
- public LocalDateTime getInfo_lastModifiedDate() {
+ public Instant getInfo_lastModifiedDate() {
return info_lastModifiedDate;
}
@@ -233,7 +233,7 @@ public LocalDateTime getInfo_lastModifiedDate() {
*
* @param info_lastModifiedDate the info last modified date
*/
- public void setInfo_lastModifiedDate(LocalDateTime info_lastModifiedDate) {
+ public void setInfo_lastModifiedDate(Instant info_lastModifiedDate) {
this.info_lastModifiedDate = info_lastModifiedDate;
}
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/base/InstantDeserializerTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/base/InstantDeserializerTest.java
new file mode 100644
index 00000000..33290047
--- /dev/null
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/base/InstantDeserializerTest.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2022 GLA Research and Development Directorate
+ *
+ * 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
+ *
+ * http://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 org.grad.secom.core.base;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+class InstantDeserializerTest {
+
+ // Test Parameters
+ InstantDeserializer instantDeserializer;
+
+ /**
+ * Set up some base data.
+ */
+ @BeforeEach
+ void setup() {
+ this.instantDeserializer = new InstantDeserializer();
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted local dates.
+ */
+ @Test
+ void testDeserializeInstant() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20010101T121314").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2001-01-01T12:13:14.00Z"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted local daylight-saving dates.
+ */
+ @Test
+ void testDeserializeInstantDLS() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20080808T121314").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2008-08-08T12:13:14.00+01:00"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted UTC dates.
+ */
+ @Test
+ void testDeserializeUTCDate() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20010101T121314Z").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2001-01-01T12:13:14.00Z"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted UTC daylight-saving dates.
+ */
+ @Test
+ void testDeserializeUTCDateDLS() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20080808T121314Z").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2008-08-08T12:13:14.00Z"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted dates with offsets.
+ */
+ @Test
+ void testDeserializeDateWithOffset() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20010101T121314+0100").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2001-01-01T12:13:14.00+01:00"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted daylight-saving dates with offsets.
+ */
+ @Test
+ void testDeserializeDateWithOffsetDLS() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20080808T121314+0100").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2008-08-08T12:13:14.00+01:00"), result);
+ }
+
+}
\ No newline at end of file
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/base/InstantSerializerTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/base/InstantSerializerTest.java
new file mode 100644
index 00000000..5ac149c4
--- /dev/null
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/base/InstantSerializerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2022 GLA Research and Development Directorate
+ *
+ * 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
+ *
+ * http://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 org.grad.secom.core.base;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.json.WriterBasedJsonGenerator;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.time.Instant;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class InstantSerializerTest {
+
+ // Test Variables
+ ObjectMapper objectMapper;
+ InstantSerializer instantSerializer;
+ StringWriter stringWriter;
+ WriterBasedJsonGenerator jsonGenerator;
+ SerializerProvider serializerProvider;
+
+ /**
+ * Set up some base data.
+ */
+ @BeforeEach
+ void setup() throws IOException {
+ // Initialise the object mapper
+ this.objectMapper = new ObjectMapper();
+
+ // Initialise the serializer
+ this.instantSerializer = new InstantSerializer();
+
+ // Create a json generator
+ this.stringWriter = new StringWriter();
+ this.jsonGenerator = (WriterBasedJsonGenerator) new JsonFactory().createGenerator(this.stringWriter);
+
+ // And add a serialisation provider
+ this.serializerProvider = new ObjectMapper().getSerializerProvider();
+ }
+
+ /**
+ * Test that we can successfully serialise a temporal instant according to
+ * the SECOM standard.
+ */
+ @Test
+ void testSerialize() throws IOException {
+ // Get a test time instance
+ Instant instant = Instant.now();
+
+ // Begin the JSON Generation
+ this.jsonGenerator.writeStartObject();
+
+ // Serialize the input
+ jsonGenerator.writeFieldName("date");
+ instantSerializer.serialize(instant, this.jsonGenerator, this.serializerProvider);
+
+ // Finish the JSON Generation
+ this.jsonGenerator.writeEndObject();
+ this.jsonGenerator.close();
+
+ // And get the final result
+ final Map result = this.objectMapper.readValue(
+ this.stringWriter.toString(),
+ new TypeReference<>() {}
+ );
+
+ // Make sure it seems fine
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertTrue(result.get("date").matches("(\\d{4})(\\d{2})(\\d{2})T(\\d{2})(\\d{2})(\\d{2})(Z|\\+(\\d{4}))"));
+ }
+}
\ No newline at end of file
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/AcknowledgementObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/AcknowledgementObjectTest.java
index e7155e7c..8516696b 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/AcknowledgementObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/AcknowledgementObjectTest.java
@@ -23,7 +23,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -55,13 +55,13 @@ void setup() {
// Create a new envelope upload object
this.envelopeLinkObject = new EnvelopeAckObject();
- this.envelopeLinkObject.setCreatedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeLinkObject.setCreatedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.envelopeLinkObject.setTransactionIdentifier(UUID.randomUUID());
this.envelopeLinkObject.setAckType(AckTypeEnum.DELIVERED_ACK);
this.envelopeLinkObject.setNackType(NackTypeEnum.UNKNOWN_DATA_TYPE_OR_VERSION);
this.envelopeLinkObject.setEnvelopeSignatureCertificate("envelopeCertificate");
this.envelopeLinkObject.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.envelopeLinkObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeLinkObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new object
this.obj = new AcknowledgementObject();
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EncryptionKeyNotificationObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EncryptionKeyNotificationObjectTest.java
index 7b1f7f5d..b203fed8 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EncryptionKeyNotificationObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EncryptionKeyNotificationObjectTest.java
@@ -22,7 +22,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -49,7 +49,7 @@ void setup() {
this.envelopeKeyNotificationObject.setDataReference(UUID.randomUUID());
this.envelopeKeyNotificationObject.setEnvelopeSignatureCertificate("signatureCertificate");
this.envelopeKeyNotificationObject.setPublicCertificate("publicCertificate");
- this.envelopeKeyNotificationObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeKeyNotificationObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new object
this.obj = new EncryptionKeyNotificationObject();
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EncryptionKeyObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EncryptionKeyObjectTest.java
index f3567ee3..4316cb00 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EncryptionKeyObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EncryptionKeyObjectTest.java
@@ -22,7 +22,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -61,7 +61,7 @@ void setup() {
this.envelopeLinkObject.setDigitalSignatureValue(this.digitalSignatureValue);
this.envelopeLinkObject.setEnvelopeSignatureCertificate("envelopeCertificate");
this.envelopeLinkObject.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.envelopeLinkObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeLinkObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new upload object
this.obj = new EncryptionKeyObject();
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeAckObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeAckObjectTest.java
index 23aec6e1..59b0502a 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeAckObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeAckObjectTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -50,13 +50,13 @@ void setup() {
// Generate a new object
this.obj = new EnvelopeAckObject();
- this.obj.setCreatedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setCreatedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.obj.setEnvelopeSignatureCertificate("envelopeCertificate");
this.obj.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
this.obj.setTransactionIdentifier(UUID.randomUUID());
this.obj.setAckType(AckTypeEnum.OPENED_ACK);
this.obj.setNackType(NackTypeEnum.UNKNOWN_DATA_TYPE_OR_VERSION);
- this.obj.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
@@ -89,13 +89,13 @@ void testGetCsvString() {
// Match the individual entries of the string
String[] csv = signatureCSV.split("\\.");
- assertEquals(this.obj.getCreatedAt().toEpochSecond(ZoneOffset.UTC), Long.parseLong(csv[0]));
+ assertEquals(this.obj.getCreatedAt().getEpochSecond(), Long.parseLong(csv[0]));
assertEquals(this.obj.getEnvelopeCertificate(), csv[1]);
assertEquals(this.obj.getEnvelopeRootCertificateThumbprint(), csv[2]);
assertEquals(this.obj.getTransactionIdentifier().toString(), csv[3]);
assertEquals(String.valueOf(this.obj.getAckType().getValue()), csv[4]);
assertEquals(String.valueOf(this.obj.getNackType().getValue()), csv[5]);
- assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().toEpochSecond(ZoneOffset.UTC)), csv[6]);
+ assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().getEpochSecond()), csv[6]);
}
}
\ No newline at end of file
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeKeyObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeKeyObjectTest.java
index f31ca948..633476f6 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeKeyObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeKeyObjectTest.java
@@ -22,7 +22,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -61,7 +61,7 @@ void setup() {
this.obj.setDigitalSignatureValue(this.digitalSignatureValue);
this.obj.setEnvelopeSignatureCertificate("envelopeCertificate");
this.obj.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.obj.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
@@ -105,7 +105,7 @@ void testGetCsvString() {
assertEquals(obj.getDigitalSignatureValue().getDigitalSignature(), csv[5]);
assertEquals(obj.getEnvelopeSignatureCertificate(), csv[6]);
assertEquals(obj.getEnvelopeRootCertificateThumbprint(), csv[7]);
- assertEquals(obj.getEnvelopeSignatureTime().toEpochSecond(ZoneOffset.UTC), Long.parseLong(csv[8]));
+ assertEquals(obj.getEnvelopeSignatureTime().getEpochSecond(), Long.parseLong(csv[8]));
}
}
\ No newline at end of file
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeLinkObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeLinkObjectTest.java
index 90c9ae07..89a64f41 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeLinkObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeLinkObjectTest.java
@@ -26,7 +26,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -76,8 +76,8 @@ void setup() {
this.obj.setEnvelopeSignatureCertificate("envelopeCertificate");
this.obj.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
this.obj.setSize(1);
- this.obj.setTimeToLive(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
- this.obj.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setTimeToLive(Instant.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
@@ -136,8 +136,8 @@ void testGetCsvString() {
assertEquals(this.obj.getEnvelopeSignatureCertificate(), csv[12]);
assertEquals(this.obj.getEnvelopeRootCertificateThumbprint(), csv[13]);
assertEquals(String.valueOf(this.obj.getSize()), csv[14]);
- assertEquals(String.valueOf(this.obj.getTimeToLive().toEpochSecond(ZoneOffset.UTC)), csv[15]);
- assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().toEpochSecond(ZoneOffset.UTC)), csv[16]);
+ assertEquals(String.valueOf(this.obj.getTimeToLive().getEpochSecond()), csv[15]);
+ assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().getEpochSecond()), csv[16]);
}
}
\ No newline at end of file
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeUploadObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeUploadObjectTest.java
index ef191574..9c9c7485 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeUploadObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/EnvelopeUploadObjectTest.java
@@ -27,7 +27,7 @@
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.Base64;
@@ -78,7 +78,7 @@ void setup() {
this.obj.setTransactionIdentifier(UUID.randomUUID());
this.obj.setEnvelopeSignatureCertificate("envelopeCertificate");
this.obj.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.obj.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
@@ -135,7 +135,7 @@ void testGetCsvString() {
assertEquals(this.obj.getTransactionIdentifier().toString(), csv[12]);
assertEquals(this.obj.getEnvelopeSignatureCertificate(), csv[13]);
assertEquals(this.obj.getEnvelopeRootCertificateThumbprint(), csv[14]);
- assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().toEpochSecond(ZoneOffset.UTC)), csv[15]);
+ assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().getEpochSecond()), csv[15]);
}
}
\ No newline at end of file
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/GetSummaryResponseObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/GetSummaryResponseObjectTest.java
index edfc4c66..c0413650 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/GetSummaryResponseObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/GetSummaryResponseObjectTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Collections;
import java.util.UUID;
@@ -60,7 +60,7 @@ void setup() {
this.summaryObject.setInfo_name("infoName");
this.summaryObject.setInfo_status("infoStatus");
this.summaryObject.setInfo_description("infoDescription");
- this.summaryObject.setInfo_lastModifiedDate(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.summaryObject.setInfo_lastModifiedDate(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.summaryObject.setInfo_productVersion("infoProductVersion");
this.summaryObject.setInfo_size(1L);
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/PingResponseObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/PingResponseObjectTest.java
index c4b3f3b8..81356540 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/PingResponseObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/PingResponseObjectTest.java
@@ -22,7 +22,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import static org.junit.jupiter.api.Assertions.*;
@@ -44,7 +44,7 @@ void setup() {
// Generate a new object
this.obj = new PingResponseObject();
- this.obj.setLastPrivateInteractionTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setLastPrivateInteractionTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/ResponseSearchObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/ResponseSearchObjectTest.java
index bd6c005b..6428a95a 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/ResponseSearchObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/ResponseSearchObjectTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.Test;
import java.net.URISyntaxException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Collections;
@@ -62,8 +62,8 @@ void setup() throws URISyntaxException {
this.searchObjectResult.setKeywords("keywords");
this.searchObjectResult.setUnlocode(Collections.singletonList("unlocode"));
this.searchObjectResult.setInstanceAsXml("instanceAsXml");
- this.searchObjectResult.setPublishedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
- this.searchObjectResult.setLastUpdatedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.searchObjectResult.setPublishedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
+ this.searchObjectResult.setLastUpdatedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.searchObjectResult.setMmsi("mmsi");
this.searchObjectResult.setImo("imo");
this.searchObjectResult.setGeometry("geometry");
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SearchObjectResultTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SearchObjectResultTest.java
index bc4749a6..674683fa 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SearchObjectResultTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SearchObjectResultTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.Test;
import java.net.URISyntaxException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Collections;
@@ -61,8 +61,8 @@ void setup() throws URISyntaxException {
this.obj.setKeywords("keywords");
this.obj.setUnlocode(Collections.singletonList("unlocode"));
this.obj.setInstanceAsXml("instanceAsXml");
- this.obj.setPublishedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
- this.obj.setLastUpdatedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setPublishedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setLastUpdatedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.obj.setMmsi("mmsi");
this.obj.setImo("imo");
this.obj.setGeometry("geometry");
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SubscriptionRequestObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SubscriptionRequestObjectTest.java
index ce87bcaa..04135b5b 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SubscriptionRequestObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SubscriptionRequestObjectTest.java
@@ -25,7 +25,7 @@
import org.junit.jupiter.api.Test;
import java.net.URISyntaxException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -56,8 +56,8 @@ void setup() throws URISyntaxException {
this.obj.setProductVersion("version");
this.obj.setGeometry("geometry");
this.obj.setUnlocode("unlocode");
- this.obj.setSubscriptionPeriodStart(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
- this.obj.setSubscriptionPeriodEnd(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setSubscriptionPeriodStart(Instant.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setSubscriptionPeriodEnd(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SummaryObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SummaryObjectTest.java
index aae4821d..b67c77af 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SummaryObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/SummaryObjectTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -56,7 +56,7 @@ void setup() {
this.obj.setInfo_name("infoName");
this.obj.setInfo_status("infoStatus");
this.obj.setInfo_description("infoDescription");
- this.obj.setInfo_lastModifiedDate(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setInfo_lastModifiedDate(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.obj.setInfo_productVersion("infoProductVersion");
this.obj.setInfo_size(1L);
}
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/UploadLinkObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/UploadLinkObjectTest.java
index 8b31a262..0a1a6c05 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/UploadLinkObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/UploadLinkObjectTest.java
@@ -26,7 +26,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -76,7 +76,7 @@ void setup() {
this.envelopeLinkObject.setTransactionIdentifier(UUID.randomUUID());
this.envelopeLinkObject.setEnvelopeSignatureCertificate("envelopeCertificate");
this.envelopeLinkObject.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.envelopeLinkObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeLinkObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new object
this.obj = new UploadLinkObject();
diff --git a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/UploadObjectTest.java b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/UploadObjectTest.java
index 51a075b4..adaba92b 100644
--- a/secom-core-jakarta/src/test/java/org/grad/secom/core/models/UploadObjectTest.java
+++ b/secom-core-jakarta/src/test/java/org/grad/secom/core/models/UploadObjectTest.java
@@ -27,7 +27,7 @@
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -78,7 +78,7 @@ void setup() {
this.envelopeUploadObject.setTransactionIdentifier(UUID.randomUUID());
this.envelopeUploadObject.setEnvelopeSignatureCertificate("envelopeCertificate");
this.envelopeUploadObject.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.envelopeUploadObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeUploadObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new object
this.obj = new UploadObject();
diff --git a/secom-core/pom.xml b/secom-core/pom.xml
index 9b66ef76..46d79a75 100644
--- a/secom-core/pom.xml
+++ b/secom-core/pom.xml
@@ -21,13 +21,13 @@
secom-parent
org.grad.secom
- 0.0.50
+ 0.0.51-SNAPSHOT
4.0.0
org.grad.secom
secom-core
- 0.0.50
+ 0.0.51-SNAPSHOT
2.1.1
@@ -82,7 +82,7 @@
io.swagger.core.v3
swagger-annotations
- 2.1.10
+ 2.2.30
provided
@@ -106,6 +106,13 @@
test
+
+ org.mockito
+ mockito-core
+ 5.8.0
+ test
+
+
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
diff --git a/secom-core/src/main/java/org/grad/secom/core/base/CsvStringGenerator.java b/secom-core/src/main/java/org/grad/secom/core/base/CsvStringGenerator.java
index edad11da..1c1fb6e2 100644
--- a/secom-core/src/main/java/org/grad/secom/core/base/CsvStringGenerator.java
+++ b/secom-core/src/main/java/org/grad/secom/core/base/CsvStringGenerator.java
@@ -20,7 +20,7 @@
import org.grad.secom.core.models.enums.SECOM_Enum;
import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.Base64;
@@ -82,10 +82,10 @@ else if(attribute instanceof CsvStringGenerator) {
.map(CsvStringGenerator::getCsvString)
.orElse("");
}
- else if(attribute instanceof LocalDateTime) {
+ else if(attribute instanceof Instant) {
return Optional.of(attribute)
- .map(LocalDateTime.class::cast)
- .map(ldt -> ldt.toEpochSecond(ZoneOffset.UTC))
+ .map(Instant.class::cast)
+ .map(Instant::getEpochSecond)
.map(String::valueOf)
.orElse("");
} else if(attribute instanceof Boolean) {
diff --git a/secom-core/src/main/java/org/grad/secom/core/base/EnvelopeSignatureBearer.java b/secom-core/src/main/java/org/grad/secom/core/base/EnvelopeSignatureBearer.java
index 3a00aaa2..eb30e684 100644
--- a/secom-core/src/main/java/org/grad/secom/core/base/EnvelopeSignatureBearer.java
+++ b/secom-core/src/main/java/org/grad/secom/core/base/EnvelopeSignatureBearer.java
@@ -28,7 +28,7 @@
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateEncodingException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.Optional;
/**
@@ -102,7 +102,7 @@ default EnvelopeSignatureBearer signEnvelope(SecomCertificateProvider certificat
try {
this.getEnvelope().setEnvelopeSignatureCertificate(SecomPemUtils.getMinifiedPemFromCert(signatureCertificate.getCertificate()));
this.getEnvelope().setEnvelopeRootCertificateThumbprint(SecomPemUtils.getCertThumbprint(signatureCertificate.getRootCertificate(), SecomConstants.CERTIFICATE_THUMBPRINT_HASH));
- this.getEnvelope().setEnvelopeSignatureTime(LocalDateTime.now());
+ this.getEnvelope().setEnvelopeSignatureTime(Instant.now());
} catch (CertificateEncodingException | NoSuchAlgorithmException exception) {
throw new SecomInvalidCertificateException(exception.getMessage());
}
diff --git a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/DateTimeDeSerializer.java b/secom-core/src/main/java/org/grad/secom/core/base/InstantDeserializer.java
similarity index 81%
rename from secom-core-jakarta/src/main/java/org/grad/secom/core/base/DateTimeDeSerializer.java
rename to secom-core/src/main/java/org/grad/secom/core/base/InstantDeserializer.java
index 74493258..454f062d 100644
--- a/secom-core-jakarta/src/main/java/org/grad/secom/core/base/DateTimeDeSerializer.java
+++ b/secom-core/src/main/java/org/grad/secom/core/base/InstantDeserializer.java
@@ -21,7 +21,7 @@
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.Optional;
import static java.util.function.Predicate.not;
@@ -37,12 +37,12 @@
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
-public class DateTimeDeSerializer extends StdDeserializer {
+public class InstantDeserializer extends StdDeserializer {
/**
* Instantiates a new Byte array de serializer.
*/
- protected DateTimeDeSerializer() {
+ protected InstantDeserializer() {
this(null);
}
@@ -51,24 +51,25 @@ protected DateTimeDeSerializer() {
*
* @param t the byte array class
*/
- protected DateTimeDeSerializer(Class t) {
+ protected InstantDeserializer(Class t) {
super(t);
}
/**
* Implements the de-serialization procedure of the de-serializer.
*
- * @param jp The JSON Parser
- * @param ctxt The deserialization context
+ * @param jp The JSON Parser
+ * @param context The deserialization context
* @return the deserialized output
* @throws IOException for any IO exceptions
*/
@Override
- public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
+ public Instant deserialize(JsonParser jp, DeserializationContext context) throws IOException {
final String value = jp.getCodec().readValue(jp, String.class);
return Optional.ofNullable(value)
.filter(not(String::isBlank))
- .map(v -> LocalDateTime.parse(v, SECOM_DATE_TIME_FORMATTER))
+ .map(SECOM_DATE_TIME_FORMATTER::parse)
+ .map(Instant::from)
.orElse(null);
}
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/base/DateTimeSerializer.java b/secom-core/src/main/java/org/grad/secom/core/base/InstantSerializer.java
similarity index 81%
rename from secom-core/src/main/java/org/grad/secom/core/base/DateTimeSerializer.java
rename to secom-core/src/main/java/org/grad/secom/core/base/InstantSerializer.java
index e52d9030..4930d69f 100644
--- a/secom-core/src/main/java/org/grad/secom/core/base/DateTimeSerializer.java
+++ b/secom-core/src/main/java/org/grad/secom/core/base/InstantSerializer.java
@@ -21,7 +21,7 @@
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneId;
import java.util.Optional;
@@ -37,12 +37,12 @@
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
-public class DateTimeSerializer extends StdSerializer {
+public class InstantSerializer extends StdSerializer {
/**
* Instantiates a new Byte array serializer.
*/
- protected DateTimeSerializer() {
+ protected InstantSerializer() {
this(null);
}
@@ -51,22 +51,22 @@ protected DateTimeSerializer() {
*
* @param t the byte array class
*/
- protected DateTimeSerializer(Class t) {
+ protected InstantSerializer(Class t) {
super(t);
}
/**
* Implements the serialization procedure of the serializer.
*
- * @param localDateTime The input to be serialized
+ * @param instant The input to be serialized
* @param jg The JSON generator
* @param serializerProvider The serialization provider
* @return the serialized output
* @throws IOException for any IO exceptions
*/
@Override
- public void serialize(LocalDateTime localDateTime, JsonGenerator jg, SerializerProvider serializerProvider) throws IOException {
- jg.writeString(Optional.ofNullable(localDateTime)
+ public void serialize(Instant instant, JsonGenerator jg, SerializerProvider serializerProvider) throws IOException {
+ jg.writeString(Optional.ofNullable(instant)
.map(dt -> dt.atZone(ZoneId.systemDefault()))
.map(SECOM_DATE_TIME_FORMATTER::format)
.orElse(""));
diff --git a/secom-core/src/main/java/org/grad/secom/core/base/SecomConstants.java b/secom-core/src/main/java/org/grad/secom/core/base/SecomConstants.java
index b2dafc50..6d068795 100644
--- a/secom-core/src/main/java/org/grad/secom/core/base/SecomConstants.java
+++ b/secom-core/src/main/java/org/grad/secom/core/base/SecomConstants.java
@@ -16,6 +16,7 @@
package org.grad.secom.core.base;
+import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
@@ -66,7 +67,9 @@ public class SecomConstants {
.parseLenient()
.appendOffset("+HHMM", "Z")
.parseStrict()
- .toFormatter();
+ .optionalEnd()
+ .toFormatter()
+ .withZone(ZoneId.systemDefault());
}
public static final String SECOM_DATE_TIME_FORMAT = SECOM_DATE_FORMAT + "'T'" + SECOM_TIME_FORMAT;
@@ -79,7 +82,9 @@ public class SecomConstants {
.parseLenient()
.appendOffset("+HHMM", "Z")
.parseStrict()
- .toFormatter();
+ .optionalEnd()
+ .toFormatter()
+ .withZone(ZoneId.systemDefault());
}
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/components/ContainerTypeConverterProvider.java b/secom-core/src/main/java/org/grad/secom/core/components/ContainerTypeConverterProvider.java
index 899304cf..bce0e02a 100644
--- a/secom-core/src/main/java/org/grad/secom/core/components/ContainerTypeConverterProvider.java
+++ b/secom-core/src/main/java/org/grad/secom/core/components/ContainerTypeConverterProvider.java
@@ -26,7 +26,7 @@
import java.lang.reflect.Type;
/**
- * The LocalDateTime Converter Provider.
+ * The ContainerType Converter Provider.
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
diff --git a/secom-core/src/main/java/org/grad/secom/core/components/LocalDateTimeConverterProvider.java b/secom-core/src/main/java/org/grad/secom/core/components/InstantConverterProvider.java
similarity index 75%
rename from secom-core/src/main/java/org/grad/secom/core/components/LocalDateTimeConverterProvider.java
rename to secom-core/src/main/java/org/grad/secom/core/components/InstantConverterProvider.java
index 59501ef1..c10c758b 100644
--- a/secom-core/src/main/java/org/grad/secom/core/components/LocalDateTimeConverterProvider.java
+++ b/secom-core/src/main/java/org/grad/secom/core/components/InstantConverterProvider.java
@@ -23,22 +23,20 @@
import javax.ws.rs.ext.Provider;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
+import java.time.*;
import static org.grad.secom.core.base.SecomConstants.SECOM_DATE_TIME_FORMATTER;
/**
- * The LocalDateTime Converter Provider.
+ * The Instant Converter Provider.
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
@Provider
-public class LocalDateTimeConverterProvider implements ParamConverterProvider {
+public class InstantConverterProvider implements ParamConverterProvider {
// Class Variables
- private final LocalDateTimeConverter converter = new LocalDateTimeConverter();
+ private final InstantConverter converter = new InstantConverter();
/**
* Implement the converter provision function.
@@ -51,16 +49,16 @@ public class LocalDateTimeConverterProvider implements ParamConverterProvider {
*/
@Override
public ParamConverter getConverter(Class aClass, Type type, Annotation[] annotations) {
- if (!aClass.equals(LocalDateTime.class)) return null;
+ if (!aClass.equals(Instant.class)) return null;
return (ParamConverter) converter;
}
/**
- * The LocalDateTime Converter Class.
+ * The Instant Converter Class.
*
* @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org)
*/
- public class LocalDateTimeConverter implements ParamConverter {
+ public static class InstantConverter implements ParamConverter {
/**
* Implement the fromString operation.
@@ -68,14 +66,13 @@ public class LocalDateTimeConverter implements ParamConverter {
* @param value the string value to be converted into an object
* @return the converted object
*/
- public LocalDateTime fromString(String value) {
+ public Instant fromString(String value) {
if (value == null || value.isEmpty()) return null;
try {
- return LocalDateTime.parse(value, SECOM_DATE_TIME_FORMATTER);
+ return Instant.from(SECOM_DATE_TIME_FORMATTER.parse(value));
} catch (Exception ex) { // Direct to BAD_REQUEST
throw new SecomValidationException(ex.getMessage());
}
-
}
/**
@@ -84,11 +81,10 @@ public LocalDateTime fromString(String value) {
* @param value the object to be converted into a string
* @return the converted string
*/
- public String toString(LocalDateTime value) {
+ public String toString(Instant value) {
if (value == null) return "";
try {
- final ZonedDateTime zonedValue = value.atZone(ZoneId.systemDefault());
- return SECOM_DATE_TIME_FORMATTER.format(zonedValue);
+ return SECOM_DATE_TIME_FORMATTER.format(value);
} catch (Exception ex) { // Direct to BAD_REQUEST
throw new SecomValidationException(ex.getMessage());
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/interfaces/GetSecomInterface.java b/secom-core/src/main/java/org/grad/secom/core/interfaces/GetSecomInterface.java
index 7975926e..eb208ef9 100644
--- a/secom-core/src/main/java/org/grad/secom/core/interfaces/GetSecomInterface.java
+++ b/secom-core/src/main/java/org/grad/secom/core/interfaces/GetSecomInterface.java
@@ -18,6 +18,8 @@
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import org.grad.secom.core.exceptions.SecomNotAuthorisedException;
import org.grad.secom.core.exceptions.SecomNotFoundException;
import org.grad.secom.core.exceptions.SecomValidationException;
@@ -33,7 +35,7 @@
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -78,8 +80,8 @@ GetResponseObject get(@QueryParam("dataReference") UUID dataReference,
@QueryParam("productVersion") String productVersion,
@QueryParam("geometry") String geometry,
@QueryParam("unlocode") @Pattern(regexp = "[A-Z]{5}") String unlocode,
- @QueryParam("validFrom") LocalDateTime validFrom,
- @QueryParam("validTo") LocalDateTime validTo,
+ @QueryParam("validFrom") @Parameter(example = "20200101T123000", schema = @Schema(implementation = String.class, pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")) Instant validFrom,
+ @QueryParam("validTo") @Parameter(example = "20200101T123000", schema = @Schema(implementation = String.class, pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")) Instant validTo,
@QueryParam("page") @Min(0) Integer page,
@QueryParam("pageSize") @Min(0) Integer pageSize);
diff --git a/secom-core/src/main/java/org/grad/secom/core/interfaces/GetSummarySecomInterface.java b/secom-core/src/main/java/org/grad/secom/core/interfaces/GetSummarySecomInterface.java
index e283b32a..3de36d8f 100644
--- a/secom-core/src/main/java/org/grad/secom/core/interfaces/GetSummarySecomInterface.java
+++ b/secom-core/src/main/java/org/grad/secom/core/interfaces/GetSummarySecomInterface.java
@@ -18,6 +18,8 @@
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import org.grad.secom.core.exceptions.SecomNotAuthorisedException;
import org.grad.secom.core.exceptions.SecomNotFoundException;
import org.grad.secom.core.exceptions.SecomValidationException;
@@ -33,7 +35,7 @@
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import java.time.LocalDateTime;
+import java.time.Instant;
/**
* The SECOM Get Summary Interface Definition.
@@ -76,8 +78,8 @@ GetSummaryResponseObject getSummary(@QueryParam("containerType") ContainerTypeEn
@QueryParam("productVersion") String productVersion,
@QueryParam("geometry") String geometry,
@QueryParam("unlocode") @Pattern(regexp = "[A-Z]{5}") String unlocode,
- @QueryParam("validFrom") LocalDateTime validFrom,
- @QueryParam("validTo") LocalDateTime validTo,
+ @QueryParam("validFrom") @Parameter(example = "20200101T123000", schema = @Schema(implementation = String.class, pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")) Instant validFrom,
+ @QueryParam("validTo") @Parameter(example = "20200101T123000", schema = @Schema(implementation = String.class, pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")) Instant validTo,
@QueryParam("page") @Min(0) Integer page,
@QueryParam("pageSize") @Min(0) Integer pageSize);
diff --git a/secom-core/src/main/java/org/grad/secom/core/models/AbstractEnvelope.java b/secom-core/src/main/java/org/grad/secom/core/models/AbstractEnvelope.java
index befec048..ca44d1e8 100644
--- a/secom-core/src/main/java/org/grad/secom/core/models/AbstractEnvelope.java
+++ b/secom-core/src/main/java/org/grad/secom/core/models/AbstractEnvelope.java
@@ -20,11 +20,11 @@
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
import org.grad.secom.core.base.CsvStringGenerator;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
+import java.time.Instant;
public abstract class AbstractEnvelope implements CsvStringGenerator {
@@ -34,10 +34,10 @@ public abstract class AbstractEnvelope implements CsvStringGenerator {
@NotNull
protected String envelopeRootCertificateThumbprint;
@NotNull
- @Schema(description = "The last modified date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- protected LocalDateTime envelopeSignatureTime;
+ @Schema(description = "The last modified date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ protected Instant envelopeSignatureTime;
/**
* Gets envelope signature certificate.
@@ -80,7 +80,7 @@ public void setEnvelopeRootCertificateThumbprint(String envelopeRootCertificateT
*
* @return the envelope signature time
*/
- public LocalDateTime getEnvelopeSignatureTime() {
+ public Instant getEnvelopeSignatureTime() {
return envelopeSignatureTime;
}
@@ -89,7 +89,7 @@ public LocalDateTime getEnvelopeSignatureTime() {
*
* @param envelopeSignatureTime the envelope signature time
*/
- public void setEnvelopeSignatureTime(LocalDateTime envelopeSignatureTime) {
+ public void setEnvelopeSignatureTime(Instant envelopeSignatureTime) {
this.envelopeSignatureTime = envelopeSignatureTime;
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeAckObject.java b/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeAckObject.java
index eb483154..5e22d95f 100644
--- a/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeAckObject.java
+++ b/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeAckObject.java
@@ -20,13 +20,13 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.models.enums.AckTypeEnum;
import org.grad.secom.core.models.enums.NackTypeEnum;
import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -38,10 +38,10 @@ public class EnvelopeAckObject extends AbstractEnvelope {
// Class Variables
@NotNull
- @Schema(description = "The creation date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime createdAt;
+ @Schema(description = "The creation date-time", type = "string",example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant createdAt;
@NotNull
private UUID transactionIdentifier;
@NotNull
@@ -53,7 +53,7 @@ public class EnvelopeAckObject extends AbstractEnvelope {
*
* @return the created at
*/
- public LocalDateTime getCreatedAt() {
+ public Instant getCreatedAt() {
return createdAt;
}
@@ -62,7 +62,7 @@ public LocalDateTime getCreatedAt() {
*
* @param createdAt the created at
*/
- public void setCreatedAt(LocalDateTime createdAt) {
+ public void setCreatedAt(Instant createdAt) {
this.createdAt = createdAt;
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeKeyNotificationObject.java b/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeKeyNotificationObject.java
index 32126b95..2db359dc 100644
--- a/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeKeyNotificationObject.java
+++ b/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeKeyNotificationObject.java
@@ -19,11 +19,11 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -41,10 +41,10 @@ public class EnvelopeKeyNotificationObject {
@NotNull
private String envelopeSignatureCertificate;
@NotNull
- @Schema(description = "The envelope signature date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime envelopeSignatureTime;
+ @Schema(description = "The envelope signature date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant envelopeSignatureTime;
/**
* Gets data reference.
@@ -105,7 +105,7 @@ public void setEnvelopeSignatureCertificate(String envelopeSignatureCertificate)
*
* @return the envelope signature time
*/
- public LocalDateTime getEnvelopeSignatureTime() {
+ public Instant getEnvelopeSignatureTime() {
return envelopeSignatureTime;
}
@@ -114,7 +114,7 @@ public LocalDateTime getEnvelopeSignatureTime() {
*
* @param envelopeSignatureTime the envelope signature time
*/
- public void setEnvelopeSignatureTime(LocalDateTime envelopeSignatureTime) {
+ public void setEnvelopeSignatureTime(Instant envelopeSignatureTime) {
this.envelopeSignatureTime = envelopeSignatureTime;
}
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeLinkObject.java b/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeLinkObject.java
index 2efac998..8117f471 100644
--- a/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeLinkObject.java
+++ b/secom-core/src/main/java/org/grad/secom/core/models/EnvelopeLinkObject.java
@@ -20,15 +20,15 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.base.GenericExchangeMetadataBearer;
import org.grad.secom.core.models.enums.AckRequestEnum;
import org.grad.secom.core.models.enums.ContainerTypeEnum;
import org.grad.secom.core.models.enums.SECOM_DataProductType;
import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -55,10 +55,10 @@ public class EnvelopeLinkObject extends AbstractEnvelope implements GenericExcha
@NotNull
private Integer size;
@NotNull
- @Schema(description = "The time to live date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime timeToLive;
+ @Schema(description = "The time to live date-time", type = "string", example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant timeToLive;
/**
* Instantiates a new Envelope link object.
@@ -198,7 +198,7 @@ public void setSize(Integer size) {
*
* @return the time to live
*/
- public LocalDateTime getTimeToLive() {
+ public Instant getTimeToLive() {
return timeToLive;
}
@@ -207,7 +207,7 @@ public LocalDateTime getTimeToLive() {
*
* @param timeToLive the time to live
*/
- public void setTimeToLive(LocalDateTime timeToLive) {
+ public void setTimeToLive(Instant timeToLive) {
this.timeToLive = timeToLive;
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/models/PingResponseObject.java b/secom-core/src/main/java/org/grad/secom/core/models/PingResponseObject.java
index ebfe3587..f894f503 100644
--- a/secom-core/src/main/java/org/grad/secom/core/models/PingResponseObject.java
+++ b/secom-core/src/main/java/org/grad/secom/core/models/PingResponseObject.java
@@ -19,11 +19,10 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
-import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
+import java.time.Instant;
/**
* The SECOM Ping Response Object Class
@@ -33,17 +32,17 @@
public class PingResponseObject {
// Class Variables
- @Schema(description = "The last private interaction date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime lastPrivateInteractionTime;
+ @Schema(description = "The last private interaction date-time", type = "string",example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant lastPrivateInteractionTime;
/**
* Gets last private interaction time.
*
* @return the last private interaction time
*/
- public LocalDateTime getLastPrivateInteractionTime() {
+ public Instant getLastPrivateInteractionTime() {
return lastPrivateInteractionTime;
}
@@ -52,7 +51,7 @@ public LocalDateTime getLastPrivateInteractionTime() {
*
* @param lastPrivateInteractionTime the last private interaction time
*/
- public void setLastPrivateInteractionTime(LocalDateTime lastPrivateInteractionTime) {
+ public void setLastPrivateInteractionTime(Instant lastPrivateInteractionTime) {
this.lastPrivateInteractionTime = lastPrivateInteractionTime;
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/models/SearchObjectResult.java b/secom-core/src/main/java/org/grad/secom/core/models/SearchObjectResult.java
index 8ce535b6..b55c4f9a 100644
--- a/secom-core/src/main/java/org/grad/secom/core/models/SearchObjectResult.java
+++ b/secom-core/src/main/java/org/grad/secom/core/models/SearchObjectResult.java
@@ -19,13 +19,13 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.models.enums.SECOM_DataProductType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.List;
/**
@@ -59,14 +59,14 @@ public class SearchObjectResult {
private String instanceAsXml;
// Non-standard fields (mentioned but not standardised)
- @Schema(description = "The publication date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime publishedAt;
- @Schema(description = "The last updated date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime lastUpdatedAt;
+ @Schema(description = "The publication date-time", type = "string",example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant publishedAt;
+ @Schema(description = "The last updated date-time", type = "string",example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant lastUpdatedAt;
private String comment;
private String mmsi;
private String imo;
@@ -293,7 +293,7 @@ public void setInstanceAsXml(String instanceAsXml) {
*
* @return the published at
*/
- public LocalDateTime getPublishedAt() {
+ public Instant getPublishedAt() {
return publishedAt;
}
@@ -302,7 +302,7 @@ public LocalDateTime getPublishedAt() {
*
* @param publishedAt the published at
*/
- public void setPublishedAt(LocalDateTime publishedAt) {
+ public void setPublishedAt(Instant publishedAt) {
this.publishedAt = publishedAt;
}
@@ -311,7 +311,7 @@ public void setPublishedAt(LocalDateTime publishedAt) {
*
* @return the last updated at
*/
- public LocalDateTime getLastUpdatedAt() {
+ public Instant getLastUpdatedAt() {
return lastUpdatedAt;
}
@@ -320,7 +320,7 @@ public LocalDateTime getLastUpdatedAt() {
*
* @param lastUpdatedAt the last updated at
*/
- public void setLastUpdatedAt(LocalDateTime lastUpdatedAt) {
+ public void setLastUpdatedAt(Instant lastUpdatedAt) {
this.lastUpdatedAt = lastUpdatedAt;
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/models/SubscriptionRequestObject.java b/secom-core/src/main/java/org/grad/secom/core/models/SubscriptionRequestObject.java
index 65f8f4fd..aca60a17 100644
--- a/secom-core/src/main/java/org/grad/secom/core/models/SubscriptionRequestObject.java
+++ b/secom-core/src/main/java/org/grad/secom/core/models/SubscriptionRequestObject.java
@@ -19,13 +19,13 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.models.enums.ContainerTypeEnum;
import org.grad.secom.core.models.enums.SECOM_DataProductType;
import javax.validation.constraints.Pattern;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -46,14 +46,14 @@ public class SubscriptionRequestObject {
@Schema(description = "The subscription area as UNLOCODE", type = "string", example = "GBHRW")
@Pattern(regexp = "[A-Z]{5}")
private String unlocode;
- @Schema(description = "The subscription period start", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime subscriptionPeriodStart;
- @Schema(description = "The subscription period end", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime subscriptionPeriodEnd;
+ @Schema(description = "The subscription period start", type = "string",example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant subscriptionPeriodStart;
+ @Schema(description = "The subscription period end", type = "string",example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant subscriptionPeriodEnd;
/**
* Gets container type.
@@ -168,7 +168,7 @@ public void setUnlocode(String unlocode) {
*
* @return the subscription period start
*/
- public LocalDateTime getSubscriptionPeriodStart() {
+ public Instant getSubscriptionPeriodStart() {
return subscriptionPeriodStart;
}
@@ -177,7 +177,7 @@ public LocalDateTime getSubscriptionPeriodStart() {
*
* @param subscriptionPeriodStart the subscription period start
*/
- public void setSubscriptionPeriodStart(LocalDateTime subscriptionPeriodStart) {
+ public void setSubscriptionPeriodStart(Instant subscriptionPeriodStart) {
this.subscriptionPeriodStart = subscriptionPeriodStart;
}
@@ -186,7 +186,7 @@ public void setSubscriptionPeriodStart(LocalDateTime subscriptionPeriodStart) {
*
* @return the subscription period end
*/
- public LocalDateTime getSubscriptionPeriodEnd() {
+ public Instant getSubscriptionPeriodEnd() {
return subscriptionPeriodEnd;
}
@@ -195,7 +195,7 @@ public LocalDateTime getSubscriptionPeriodEnd() {
*
* @param subscriptionPeriodEnd the subscription period end
*/
- public void setSubscriptionPeriodEnd(LocalDateTime subscriptionPeriodEnd) {
+ public void setSubscriptionPeriodEnd(Instant subscriptionPeriodEnd) {
this.subscriptionPeriodEnd = subscriptionPeriodEnd;
}
}
diff --git a/secom-core/src/main/java/org/grad/secom/core/models/SummaryObject.java b/secom-core/src/main/java/org/grad/secom/core/models/SummaryObject.java
index b50f3916..9c8c20af 100644
--- a/secom-core/src/main/java/org/grad/secom/core/models/SummaryObject.java
+++ b/secom-core/src/main/java/org/grad/secom/core/models/SummaryObject.java
@@ -19,13 +19,13 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
-import org.grad.secom.core.base.DateTimeDeSerializer;
-import org.grad.secom.core.base.DateTimeSerializer;
+import org.grad.secom.core.base.InstantDeserializer;
+import org.grad.secom.core.base.InstantSerializer;
import org.grad.secom.core.models.enums.ContainerTypeEnum;
import org.grad.secom.core.models.enums.SECOM_DataProductType;
import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.util.UUID;
/**
@@ -50,10 +50,10 @@ public class SummaryObject {
private String info_name;
private String info_status;
private String info_description;
- @Schema(description = "The last modified date-time", type = "string",example = "19850412T101530")
- @JsonSerialize(using = DateTimeSerializer.class)
- @JsonDeserialize(using = DateTimeDeSerializer.class)
- private LocalDateTime info_lastModifiedDate;
+ @Schema(description = "The last modified date-time", type = "string",example = "19850412T101530", pattern = "(\\d{8})T(\\d{6})(Z|\\+\\d{4})?")
+ @JsonSerialize(using = InstantSerializer.class)
+ @JsonDeserialize(using = InstantDeserializer.class)
+ private Instant info_lastModifiedDate;
private String info_productVersion;
private Long info_size;
@@ -224,7 +224,7 @@ public void setInfo_description(String info_description) {
*
* @return the info last modified date
*/
- public LocalDateTime getInfo_lastModifiedDate() {
+ public Instant getInfo_lastModifiedDate() {
return info_lastModifiedDate;
}
@@ -233,7 +233,7 @@ public LocalDateTime getInfo_lastModifiedDate() {
*
* @param info_lastModifiedDate the info last modified date
*/
- public void setInfo_lastModifiedDate(LocalDateTime info_lastModifiedDate) {
+ public void setInfo_lastModifiedDate(Instant info_lastModifiedDate) {
this.info_lastModifiedDate = info_lastModifiedDate;
}
diff --git a/secom-core/src/test/java/org/grad/secom/core/base/InstantDeserializerTest.java b/secom-core/src/test/java/org/grad/secom/core/base/InstantDeserializerTest.java
new file mode 100644
index 00000000..33290047
--- /dev/null
+++ b/secom-core/src/test/java/org/grad/secom/core/base/InstantDeserializerTest.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2022 GLA Research and Development Directorate
+ *
+ * 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
+ *
+ * http://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 org.grad.secom.core.base;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+class InstantDeserializerTest {
+
+ // Test Parameters
+ InstantDeserializer instantDeserializer;
+
+ /**
+ * Set up some base data.
+ */
+ @BeforeEach
+ void setup() {
+ this.instantDeserializer = new InstantDeserializer();
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted local dates.
+ */
+ @Test
+ void testDeserializeInstant() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20010101T121314").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2001-01-01T12:13:14.00Z"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted local daylight-saving dates.
+ */
+ @Test
+ void testDeserializeInstantDLS() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20080808T121314").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2008-08-08T12:13:14.00+01:00"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted UTC dates.
+ */
+ @Test
+ void testDeserializeUTCDate() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20010101T121314Z").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2001-01-01T12:13:14.00Z"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted UTC daylight-saving dates.
+ */
+ @Test
+ void testDeserializeUTCDateDLS() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20080808T121314Z").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2008-08-08T12:13:14.00Z"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted dates with offsets.
+ */
+ @Test
+ void testDeserializeDateWithOffset() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20010101T121314+0100").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2001-01-01T12:13:14.00+01:00"), result);
+ }
+
+ /**
+ * make sure we can correctly deserialize the incoming SECOM-compliant
+ * formatted daylight-saving dates with offsets.
+ */
+ @Test
+ void testDeserializeDateWithOffsetDLS() throws IOException {
+ // Make some mocks to test easily
+ ObjectCodec objectCodecMock = mock(ObjectCodec.class);
+ doReturn("20080808T121314+0100").when(objectCodecMock).readValue(any(), eq(String.class));
+ JsonParser jsonParserMock = mock(JsonParser.class);
+ doReturn(objectCodecMock).when(jsonParserMock).getCodec();
+ DeserializationContext deserializationContextMock = mock(DeserializationContext.class);
+
+ // And deserialize
+ Instant result = this.instantDeserializer.deserialize(jsonParserMock, deserializationContextMock);
+
+ // Make sure the result seems correct
+ assertEquals(Instant.parse("2008-08-08T12:13:14.00+01:00"), result);
+ }
+
+}
\ No newline at end of file
diff --git a/secom-core/src/test/java/org/grad/secom/core/base/InstantSerializerTest.java b/secom-core/src/test/java/org/grad/secom/core/base/InstantSerializerTest.java
new file mode 100644
index 00000000..a7193aca
--- /dev/null
+++ b/secom-core/src/test/java/org/grad/secom/core/base/InstantSerializerTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2022 GLA Research and Development Directorate
+ *
+ * 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
+ *
+ * http://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 org.grad.secom.core.base;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.json.WriterBasedJsonGenerator;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.time.Instant;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class InstantSerializerTest {
+
+ // Test Variables
+ ObjectMapper objectMapper;
+ InstantSerializer instantSerializer;
+ StringWriter stringWriter;
+ WriterBasedJsonGenerator jsonGenerator;
+ SerializerProvider serializerProvider;
+
+ /**
+ * Set up some base data.
+ */
+ @BeforeEach
+ void setup() throws IOException {
+ // Initialise the object mapper
+ this.objectMapper = new ObjectMapper();
+
+ // Initialise the serializer
+ this.instantSerializer = new InstantSerializer();
+
+ // Create a json generator
+ this.stringWriter = new StringWriter();
+ this.jsonGenerator = (WriterBasedJsonGenerator) new JsonFactory().createGenerator(this.stringWriter);
+
+ // And add a serialisation provider
+ this.serializerProvider = new ObjectMapper().getSerializerProvider();
+ }
+
+ /**
+ * Test that we can successfully serialise a temporal instant according to
+ * the SECOM standard.
+ */
+ @Test
+ void testSerialize() throws IOException {
+ // Get a test time instance
+ Instant instant = Instant.now();
+
+ // Begin the JSON Generation
+ this.jsonGenerator.writeStartObject();
+
+ // Serialize the input
+ jsonGenerator.writeFieldName("date");
+ instantSerializer.serialize(instant, this.jsonGenerator, this.serializerProvider);
+
+ // Finish the JSON Generation
+ this.jsonGenerator.writeEndObject();
+ this.jsonGenerator.close();
+
+ // And get the final result
+ final Map result = this.objectMapper.readValue(
+ this.stringWriter.toString(),
+ new TypeReference<>() {}
+ );
+
+ // Make sure it seems fine
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertTrue(result.get("date").matches("(\\d{4})(\\d{2})(\\d{2})T(\\d{2})(\\d{2})(\\d{2})(Z|\\+(\\d{4}))"));
+ }
+
+}
\ No newline at end of file
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/AcknowledgementObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/AcknowledgementObjectTest.java
index e7155e7c..8516696b 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/AcknowledgementObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/AcknowledgementObjectTest.java
@@ -23,7 +23,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -55,13 +55,13 @@ void setup() {
// Create a new envelope upload object
this.envelopeLinkObject = new EnvelopeAckObject();
- this.envelopeLinkObject.setCreatedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeLinkObject.setCreatedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.envelopeLinkObject.setTransactionIdentifier(UUID.randomUUID());
this.envelopeLinkObject.setAckType(AckTypeEnum.DELIVERED_ACK);
this.envelopeLinkObject.setNackType(NackTypeEnum.UNKNOWN_DATA_TYPE_OR_VERSION);
this.envelopeLinkObject.setEnvelopeSignatureCertificate("envelopeCertificate");
this.envelopeLinkObject.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.envelopeLinkObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeLinkObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new object
this.obj = new AcknowledgementObject();
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/EncryptionKeyNotificationObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/EncryptionKeyNotificationObjectTest.java
index 7b1f7f5d..b203fed8 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/EncryptionKeyNotificationObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/EncryptionKeyNotificationObjectTest.java
@@ -22,7 +22,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -49,7 +49,7 @@ void setup() {
this.envelopeKeyNotificationObject.setDataReference(UUID.randomUUID());
this.envelopeKeyNotificationObject.setEnvelopeSignatureCertificate("signatureCertificate");
this.envelopeKeyNotificationObject.setPublicCertificate("publicCertificate");
- this.envelopeKeyNotificationObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeKeyNotificationObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new object
this.obj = new EncryptionKeyNotificationObject();
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/EncryptionKeyObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/EncryptionKeyObjectTest.java
index f3567ee3..4316cb00 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/EncryptionKeyObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/EncryptionKeyObjectTest.java
@@ -22,7 +22,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -61,7 +61,7 @@ void setup() {
this.envelopeLinkObject.setDigitalSignatureValue(this.digitalSignatureValue);
this.envelopeLinkObject.setEnvelopeSignatureCertificate("envelopeCertificate");
this.envelopeLinkObject.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.envelopeLinkObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeLinkObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new upload object
this.obj = new EncryptionKeyObject();
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeAckObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeAckObjectTest.java
index 23aec6e1..59b0502a 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeAckObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeAckObjectTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -50,13 +50,13 @@ void setup() {
// Generate a new object
this.obj = new EnvelopeAckObject();
- this.obj.setCreatedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setCreatedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.obj.setEnvelopeSignatureCertificate("envelopeCertificate");
this.obj.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
this.obj.setTransactionIdentifier(UUID.randomUUID());
this.obj.setAckType(AckTypeEnum.OPENED_ACK);
this.obj.setNackType(NackTypeEnum.UNKNOWN_DATA_TYPE_OR_VERSION);
- this.obj.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
@@ -89,13 +89,13 @@ void testGetCsvString() {
// Match the individual entries of the string
String[] csv = signatureCSV.split("\\.");
- assertEquals(this.obj.getCreatedAt().toEpochSecond(ZoneOffset.UTC), Long.parseLong(csv[0]));
+ assertEquals(this.obj.getCreatedAt().getEpochSecond(), Long.parseLong(csv[0]));
assertEquals(this.obj.getEnvelopeCertificate(), csv[1]);
assertEquals(this.obj.getEnvelopeRootCertificateThumbprint(), csv[2]);
assertEquals(this.obj.getTransactionIdentifier().toString(), csv[3]);
assertEquals(String.valueOf(this.obj.getAckType().getValue()), csv[4]);
assertEquals(String.valueOf(this.obj.getNackType().getValue()), csv[5]);
- assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().toEpochSecond(ZoneOffset.UTC)), csv[6]);
+ assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().getEpochSecond()), csv[6]);
}
}
\ No newline at end of file
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeKeyObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeKeyObjectTest.java
index f31ca948..633476f6 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeKeyObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeKeyObjectTest.java
@@ -22,7 +22,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -61,7 +61,7 @@ void setup() {
this.obj.setDigitalSignatureValue(this.digitalSignatureValue);
this.obj.setEnvelopeSignatureCertificate("envelopeCertificate");
this.obj.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.obj.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
@@ -105,7 +105,7 @@ void testGetCsvString() {
assertEquals(obj.getDigitalSignatureValue().getDigitalSignature(), csv[5]);
assertEquals(obj.getEnvelopeSignatureCertificate(), csv[6]);
assertEquals(obj.getEnvelopeRootCertificateThumbprint(), csv[7]);
- assertEquals(obj.getEnvelopeSignatureTime().toEpochSecond(ZoneOffset.UTC), Long.parseLong(csv[8]));
+ assertEquals(obj.getEnvelopeSignatureTime().getEpochSecond(), Long.parseLong(csv[8]));
}
}
\ No newline at end of file
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeLinkObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeLinkObjectTest.java
index 90c9ae07..89a64f41 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeLinkObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeLinkObjectTest.java
@@ -26,7 +26,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -76,8 +76,8 @@ void setup() {
this.obj.setEnvelopeSignatureCertificate("envelopeCertificate");
this.obj.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
this.obj.setSize(1);
- this.obj.setTimeToLive(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
- this.obj.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setTimeToLive(Instant.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
@@ -136,8 +136,8 @@ void testGetCsvString() {
assertEquals(this.obj.getEnvelopeSignatureCertificate(), csv[12]);
assertEquals(this.obj.getEnvelopeRootCertificateThumbprint(), csv[13]);
assertEquals(String.valueOf(this.obj.getSize()), csv[14]);
- assertEquals(String.valueOf(this.obj.getTimeToLive().toEpochSecond(ZoneOffset.UTC)), csv[15]);
- assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().toEpochSecond(ZoneOffset.UTC)), csv[16]);
+ assertEquals(String.valueOf(this.obj.getTimeToLive().getEpochSecond()), csv[15]);
+ assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().getEpochSecond()), csv[16]);
}
}
\ No newline at end of file
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeUploadObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeUploadObjectTest.java
index ef191574..e35678e0 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeUploadObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/EnvelopeUploadObjectTest.java
@@ -27,8 +27,7 @@
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Base64;
import java.util.UUID;
@@ -78,7 +77,7 @@ void setup() {
this.obj.setTransactionIdentifier(UUID.randomUUID());
this.obj.setEnvelopeSignatureCertificate("envelopeCertificate");
this.obj.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.obj.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
@@ -135,7 +134,7 @@ void testGetCsvString() {
assertEquals(this.obj.getTransactionIdentifier().toString(), csv[12]);
assertEquals(this.obj.getEnvelopeSignatureCertificate(), csv[13]);
assertEquals(this.obj.getEnvelopeRootCertificateThumbprint(), csv[14]);
- assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().toEpochSecond(ZoneOffset.UTC)), csv[15]);
+ assertEquals(String.valueOf(this.obj.getEnvelopeSignatureTime().getEpochSecond()), csv[15]);
}
}
\ No newline at end of file
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/GetSummaryResponseObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/GetSummaryResponseObjectTest.java
index edfc4c66..c0413650 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/GetSummaryResponseObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/GetSummaryResponseObjectTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Collections;
import java.util.UUID;
@@ -60,7 +60,7 @@ void setup() {
this.summaryObject.setInfo_name("infoName");
this.summaryObject.setInfo_status("infoStatus");
this.summaryObject.setInfo_description("infoDescription");
- this.summaryObject.setInfo_lastModifiedDate(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.summaryObject.setInfo_lastModifiedDate(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.summaryObject.setInfo_productVersion("infoProductVersion");
this.summaryObject.setInfo_size(1L);
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/PingResponseObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/PingResponseObjectTest.java
index c4b3f3b8..81356540 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/PingResponseObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/PingResponseObjectTest.java
@@ -22,7 +22,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import static org.junit.jupiter.api.Assertions.*;
@@ -44,7 +44,7 @@ void setup() {
// Generate a new object
this.obj = new PingResponseObject();
- this.obj.setLastPrivateInteractionTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setLastPrivateInteractionTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/ResponseSearchObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/ResponseSearchObjectTest.java
index bd6c005b..6428a95a 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/ResponseSearchObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/ResponseSearchObjectTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.Test;
import java.net.URISyntaxException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Collections;
@@ -62,8 +62,8 @@ void setup() throws URISyntaxException {
this.searchObjectResult.setKeywords("keywords");
this.searchObjectResult.setUnlocode(Collections.singletonList("unlocode"));
this.searchObjectResult.setInstanceAsXml("instanceAsXml");
- this.searchObjectResult.setPublishedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
- this.searchObjectResult.setLastUpdatedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.searchObjectResult.setPublishedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
+ this.searchObjectResult.setLastUpdatedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.searchObjectResult.setMmsi("mmsi");
this.searchObjectResult.setImo("imo");
this.searchObjectResult.setGeometry("geometry");
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/SearchObjectResultTest.java b/secom-core/src/test/java/org/grad/secom/core/models/SearchObjectResultTest.java
index bc4749a6..674683fa 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/SearchObjectResultTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/SearchObjectResultTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.Test;
import java.net.URISyntaxException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Collections;
@@ -61,8 +61,8 @@ void setup() throws URISyntaxException {
this.obj.setKeywords("keywords");
this.obj.setUnlocode(Collections.singletonList("unlocode"));
this.obj.setInstanceAsXml("instanceAsXml");
- this.obj.setPublishedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
- this.obj.setLastUpdatedAt(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setPublishedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setLastUpdatedAt(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.obj.setMmsi("mmsi");
this.obj.setImo("imo");
this.obj.setGeometry("geometry");
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/SubscriptionRequestObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/SubscriptionRequestObjectTest.java
index ce87bcaa..04135b5b 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/SubscriptionRequestObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/SubscriptionRequestObjectTest.java
@@ -25,7 +25,7 @@
import org.junit.jupiter.api.Test;
import java.net.URISyntaxException;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -56,8 +56,8 @@ void setup() throws URISyntaxException {
this.obj.setProductVersion("version");
this.obj.setGeometry("geometry");
this.obj.setUnlocode("unlocode");
- this.obj.setSubscriptionPeriodStart(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
- this.obj.setSubscriptionPeriodEnd(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setSubscriptionPeriodStart(Instant.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setSubscriptionPeriodEnd(Instant.now().truncatedTo(ChronoUnit.SECONDS));
}
/**
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/SummaryObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/SummaryObjectTest.java
index aae4821d..b67c77af 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/SummaryObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/SummaryObjectTest.java
@@ -24,7 +24,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -56,7 +56,7 @@ void setup() {
this.obj.setInfo_name("infoName");
this.obj.setInfo_status("infoStatus");
this.obj.setInfo_description("infoDescription");
- this.obj.setInfo_lastModifiedDate(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.obj.setInfo_lastModifiedDate(Instant.now().truncatedTo(ChronoUnit.SECONDS));
this.obj.setInfo_productVersion("infoProductVersion");
this.obj.setInfo_size(1L);
}
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/UploadLinkObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/UploadLinkObjectTest.java
index 8b31a262..0a1a6c05 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/UploadLinkObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/UploadLinkObjectTest.java
@@ -26,7 +26,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -76,7 +76,7 @@ void setup() {
this.envelopeLinkObject.setTransactionIdentifier(UUID.randomUUID());
this.envelopeLinkObject.setEnvelopeSignatureCertificate("envelopeCertificate");
this.envelopeLinkObject.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.envelopeLinkObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeLinkObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new object
this.obj = new UploadLinkObject();
diff --git a/secom-core/src/test/java/org/grad/secom/core/models/UploadObjectTest.java b/secom-core/src/test/java/org/grad/secom/core/models/UploadObjectTest.java
index 51a075b4..adaba92b 100644
--- a/secom-core/src/test/java/org/grad/secom/core/models/UploadObjectTest.java
+++ b/secom-core/src/test/java/org/grad/secom/core/models/UploadObjectTest.java
@@ -27,7 +27,7 @@
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
+import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
@@ -78,7 +78,7 @@ void setup() {
this.envelopeUploadObject.setTransactionIdentifier(UUID.randomUUID());
this.envelopeUploadObject.setEnvelopeSignatureCertificate("envelopeCertificate");
this.envelopeUploadObject.setEnvelopeRootCertificateThumbprint("envelopeThumbprint");
- this.envelopeUploadObject.setEnvelopeSignatureTime(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS));
+ this.envelopeUploadObject.setEnvelopeSignatureTime(Instant.now().truncatedTo(ChronoUnit.SECONDS));
// Generate a new object
this.obj = new UploadObject();
diff --git a/secom-springboot2/pom.xml b/secom-springboot2/pom.xml
index b0bcf11f..1188279c 100644
--- a/secom-springboot2/pom.xml
+++ b/secom-springboot2/pom.xml
@@ -21,18 +21,18 @@
secom-parent
org.grad.secom
- 0.0.50
+ 0.0.51-SNAPSHOT
4.0.0
org.grad.secom
secom-springboot2
- 0.0.50
+ 0.0.51-SNAPSHOT
5.3.29
5.1.0.Final
- 2.2.8
+ 2.2.30
diff --git a/secom-springboot2/src/main/java/org/grad/secom/springboot2/config/JaxrsApplication.java b/secom-springboot2/src/main/java/org/grad/secom/springboot2/config/JaxrsApplication.java
index d9cb4ec6..ce361217 100644
--- a/secom-springboot2/src/main/java/org/grad/secom/springboot2/config/JaxrsApplication.java
+++ b/secom-springboot2/src/main/java/org/grad/secom/springboot2/config/JaxrsApplication.java
@@ -121,13 +121,13 @@ DigitalSignatureAlgorithmConverterProvider digitalSignatureAlgorithmConverterPro
}
/**
- * Initialise the LocalDateTime Converter Provider bean.
+ * Initialise the Instant Converter Provider bean.
*
* @return the LocalDateTime Converter Provider bean
*/
@Bean
- LocalDateTimeConverterProvider localDateTimeConverterProvider() {
- return new LocalDateTimeConverterProvider();
+ InstantConverterProvider instantConverterProvider() {
+ return new InstantConverterProvider();
}
/**
diff --git a/secom-springboot3/pom.xml b/secom-springboot3/pom.xml
index e0fc2f1b..b1350512 100644
--- a/secom-springboot3/pom.xml
+++ b/secom-springboot3/pom.xml
@@ -21,18 +21,18 @@
secom-parent
org.grad.secom
- 0.0.50
+ 0.0.51-SNAPSHOT
4.0.0
org.grad.secom
secom-springboot3
- 0.0.50
+ 0.0.51-SNAPSHOT
- 6.1.6
- 6.1.1.Final
- 2.2.21
+ 6.2.5
+ 6.3.0.Final
+ 2.2.30
@@ -74,6 +74,12 @@
swagger-jaxrs2-jakarta
${swagger.version}
+
+ jakarta.servlet
+ jakarta.servlet-api
+ 6.0.0
+ compile
+
diff --git a/secom-springboot3/src/main/java/org/grad/secom/springboot3/config/JaxrsApplication.java b/secom-springboot3/src/main/java/org/grad/secom/springboot3/config/JaxrsApplication.java
index d0b6b1ca..e6e29530 100644
--- a/secom-springboot3/src/main/java/org/grad/secom/springboot3/config/JaxrsApplication.java
+++ b/secom-springboot3/src/main/java/org/grad/secom/springboot3/config/JaxrsApplication.java
@@ -122,13 +122,13 @@ DigitalSignatureAlgorithmConverterProvider digitalSignatureAlgorithmConverterPro
}
/**
- * Initialise the LocalDateTime Converter Provider bean.
+ * Initialise the Instant Converter Provider bean.
*
- * @return the LocalDateTime Converter Provider bean
+ * @return the Instant Converter Provider bean
*/
@Bean
- LocalDateTimeConverterProvider localDateTimeConverterProvider() {
- return new LocalDateTimeConverterProvider();
+ InstantConverterProvider instantConverterProvider() {
+ return new InstantConverterProvider();
}
/**