Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat (Mailgun/Messages): Support 'QueueStatusDisabledDetails.until'as Instant #202

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -162,13 +162,13 @@ public void getSendingQueuesStatusResult() {
ExceededQueueQuota.builder()
.setIsDisabled(false)
.setDetails(
QueueStatusDisabledDetails.builder().setUntil("").setReason("").build())
QueueStatusDisabledDetails.builder().setUntil(null).setReason("").build())
.build())
.setScheduled(
ExceededQueueQuota.builder()
.setIsDisabled(false)
.setDetails(
QueueStatusDisabledDetails.builder().setUntil("").setReason("").build())
QueueStatusDisabledDetails.builder().setUntil(null).setReason("").build())
.build())
.build();

Expand Down
36 changes: 36 additions & 0 deletions core/src/main/com/sinch/sdk/core/utils/DateUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,19 @@
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.logging.Logger;

/** Utility class for Date */
public class DateUtil {

private static final DateTimeFormatter RFC822_ZONED_FORMAT =
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss z");

private static final Logger LOGGER = Logger.getLogger(DateUtil.class.getName());

private DateUtil() {}

/**
Expand Down Expand Up @@ -57,4 +65,32 @@ public static Instant failSafeTimeStampToInstant(String value) {
}
return timestamp;
}

/**
* Convert String to Instant
*
* <p>Consume a date time in form of RFC-822 format
*
* @param value A RFC-822 compliant string
* @return Extracted Instant value
* @since __TO_BE_DEFINED__
*/
public static Instant RFC822StringToInstant(String value) {

if (null == value) {
return null;
}

try {
return Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(value));
} catch (DateTimeParseException _unused) {
try {
return ZonedDateTime.parse(value, RFC822_ZONED_FORMAT).toInstant();
} catch (DateTimeParseException e) {
// do not break deserialization: fallback to empty value
LOGGER.severe(String.format("Unable to parse '%s' date string: %s", value, e.getMessage()));
return null;
}
}
}
}
26 changes: 16 additions & 10 deletions core/src/main/com/sinch/sdk/core/utils/databind/Mapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

public class Mapper {

public static final PropertyFilter uninitializedFilter =
private static final PropertyFilter uninitializedFilter =
new SimpleBeanPropertyFilter() {
@Override
public void serializeAsField(
Expand Down Expand Up @@ -95,19 +95,19 @@ public static ObjectMapper getInstance() {

private static class LazyHolder {

public static final SimpleModule module =
static final SimpleModule module =
new JavaTimeModule()
.addDeserializer(OffsetDateTime.class, new OffsetDateTimeCustomDeserializer())
.addDeserializer(Instant.class, new InstantCustomDeserializer());

public static final SimpleModule optionalValueModule =
static final SimpleModule optionalValueModule =
new SimpleModule("optionalValueModule")
.addSerializer(OptionalValue.class, new OptionalValueSerializer());
public static final SimpleModule dynamicEnumModule =
static final SimpleModule dynamicEnumModule =
new SimpleModule("dynamicEnumModule")
.addSerializer(EnumDynamic.class, new EnumDynamicSerializer());

public static final SimpleModule validationDeserializationModule =
static final SimpleModule validationDeserializationModule =
new SimpleModule("deserializationModule")
.setDeserializerModifier(new BuilderDeserializerWithValidation());

Expand All @@ -128,7 +128,7 @@ private static class LazyHolder {
.registerModule(validationDeserializationModule);
}

public static final class OffsetDateTimeCustomDeserializer
private static final class OffsetDateTimeCustomDeserializer
extends JsonDeserializer<OffsetDateTime> {

@Override
Expand All @@ -148,18 +148,24 @@ public OffsetDateTime deserialize(JsonParser parser, DeserializationContext cont
}
}

public static final class InstantCustomDeserializer extends JsonDeserializer<Instant> {
private static final class InstantCustomDeserializer extends JsonDeserializer<Instant> {

@Override
public Instant deserialize(JsonParser parser, DeserializationContext context)
throws IOException {

String text = parser.getText();
return DateUtil.failSafeTimeStampToInstant(text);
Instant deserialized;
try {
deserialized = DateUtil.failSafeTimeStampToInstant(text);
} catch (Exception e) {
deserialized = DateUtil.RFC822StringToInstant(text);
asein-sinch marked this conversation as resolved.
Show resolved Hide resolved
}
return deserialized;
}
}

public static class EnumDynamicSerializer extends JsonSerializer<EnumDynamic> {
private static class EnumDynamicSerializer extends JsonSerializer<EnumDynamic> {

@Override
public void serialize(EnumDynamic value, JsonGenerator jgen, SerializerProvider provider)
Expand All @@ -168,7 +174,7 @@ public void serialize(EnumDynamic value, JsonGenerator jgen, SerializerProvider
}
}

public static class OptionalValueSerializer extends JsonSerializer<OptionalValue> {
private static class OptionalValueSerializer extends JsonSerializer<OptionalValue> {

@Override
public void serialize(OptionalValue value, JsonGenerator jgen, SerializerProvider provider)
Expand Down
49 changes: 49 additions & 0 deletions core/src/test/java/com/sinch/sdk/core/utils/DateUtilTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,53 @@ void failSafeTimeStampFromUTC() {
Instant instant = DateUtil.failSafeTimeStampToInstant("2024-05-04T10:00:00.1234Z");
assertEquals("2024-05-04T10:00:00.123400Z", instant.toString());
}

@Test
void RFC822NullGuard() {
Instant instant = DateUtil.RFC822StringToInstant(null);
assertNull(instant);
}

@Test
void RFC822WithUnsupportedMST() {
Instant instant = DateUtil.RFC822StringToInstant("Mon, 2 Jan 2006 15:04:05 MST");
assertEquals("2006-01-02T22:04:05Z", instant.toString());
}

@Test
void RFC822WithGMT() {
Instant instant = DateUtil.RFC822StringToInstant("Mon, 2 Jan 2006 15:04:05 GMT");
assertEquals("2006-01-02T15:04:05Z", instant.toString());
}

@Test
void RFC822WithUnsupportedUT() {
Instant instant = DateUtil.RFC822StringToInstant("Mon, 2 Jan 2006 15:04:05 UT");
assertEquals("2006-01-02T15:04:05Z", instant.toString());
}

@Test
void RFC822WithUnsupportedEST() {
Instant instant = DateUtil.RFC822StringToInstant("Mon, 2 Jan 2006 15:04:05 EST");
assertEquals("2006-01-02T20:04:05Z", instant.toString());
}

@Test
void RFC822WithOffset() {
Instant instant = DateUtil.RFC822StringToInstant("Mon, 2 Jan 2006 15:04:05 +0100");
assertEquals("2006-01-02T14:04:05Z", instant.toString());
}

@Test
void RFC822NoOffset() {
Instant instant = DateUtil.RFC822StringToInstant("Mon, 2 Jan 2006 15:04:05");
asein-sinch marked this conversation as resolved.
Show resolved Hide resolved
assertNull(instant);
}

@Test
void RFC822Invalid() {
// 12th of January 2006 is not a Monday (it was a Thursday)
Instant instant = DateUtil.RFC822StringToInstant("Mon, 12 Jan 2006 15:04:05 +0100");
assertNull(instant);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
package com.sinch.sdk.domains.mailgun.models.v1.emails.response;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.time.Instant;

/** QueueStatusDisabledDetails */
@JsonDeserialize(builder = QueueStatusDisabledDetailsImpl.Builder.class)
Expand All @@ -21,7 +22,7 @@ public interface QueueStatusDisabledDetails {
*
* @return until
*/
String getUntil();
Instant getUntil();

/**
* Get reason
Expand Down Expand Up @@ -49,7 +50,7 @@ interface Builder {
* @return Current builder
* @see #getUntil
*/
Builder setUntil(String until);
Builder setUntil(Instant until);

/**
* see getter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.sinch.sdk.core.models.OptionalValue;
import java.time.Instant;
import java.util.Objects;

@JsonPropertyOrder({
Expand All @@ -20,7 +21,7 @@ public class QueueStatusDisabledDetailsImpl implements QueueStatusDisabledDetail

public static final String JSON_PROPERTY_UNTIL = "until";

private OptionalValue<String> until;
private OptionalValue<Instant> until;

public static final String JSON_PROPERTY_REASON = "reason";

Expand All @@ -29,19 +30,19 @@ public class QueueStatusDisabledDetailsImpl implements QueueStatusDisabledDetail
public QueueStatusDisabledDetailsImpl() {}

protected QueueStatusDisabledDetailsImpl(
OptionalValue<String> until, OptionalValue<String> reason) {
OptionalValue<Instant> until, OptionalValue<String> reason) {
this.until = until;
this.reason = reason;
}

@JsonIgnore
public String getUntil() {
public Instant getUntil() {
return until.orElse(null);
}

@JsonProperty(JSON_PROPERTY_UNTIL)
@JsonInclude(value = JsonInclude.Include.ALWAYS)
public OptionalValue<String> until() {
public OptionalValue<Instant> until() {
return until;
}

Expand Down Expand Up @@ -103,11 +104,11 @@ private String toIndentedString(Object o) {

@JsonPOJOBuilder(withPrefix = "set")
static class Builder implements QueueStatusDisabledDetails.Builder {
OptionalValue<String> until = OptionalValue.empty();
OptionalValue<Instant> until = OptionalValue.empty();
OptionalValue<String> reason = OptionalValue.empty();

@JsonProperty(JSON_PROPERTY_UNTIL)
public Builder setUntil(String until) {
public Builder setUntil(Instant until) {
this.until = OptionalValue.of(until);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.adelean.inject.resources.junit.jupiter.TestWithResources;
import com.sinch.sdk.BaseTest;
import com.sinch.sdk.core.TestHelpers;
import java.time.Instant;
import org.junit.jupiter.api.Test;

@TestWithResources
Expand All @@ -16,7 +17,7 @@ public class SendingQueuesStatusResponseTest extends BaseTest {
.setIsDisabled(true)
.setDetails(
QueueStatusDisabledDetails.builder()
.setUntil("Mon, 24 Jan 2006 16:00:00 MST")
.setUntil(Instant.parse("2025-01-30T04:14:04Z"))
asein-sinch marked this conversation as resolved.
Show resolved Hide resolved
.setReason("You have too many messages in regular queue")
.build())
.build())
Expand All @@ -25,7 +26,7 @@ public class SendingQueuesStatusResponseTest extends BaseTest {
.setIsDisabled(true)
.setDetails(
QueueStatusDisabledDetails.builder()
.setUntil("Mon, 12 Jan 2006 15:04:05 MST")
.setUntil(Instant.parse("2025-01-30T15:14:04Z"))
.setReason("You have too many messages in scheduled queue")
.build())
.build())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
"scheduled": {
"is_disabled": true,
"disabled": {
"until": "Mon, 12 Jan 2006 15:04:05 MST",
"until": "Thu, 30 Jan 2025 16:14:04 +0100",
"reason": "You have too many messages in scheduled queue"
}
},
"regular": {
"is_disabled": true,
"disabled": {
"until": "Mon, 24 Jan 2006 16:00:00 MST",
"until": "Thu, 30 Jan 2025 06:14:04 +0200",
"reason": "You have too many messages in regular queue"
}
}
Expand Down
Loading