From 9539fc374e614ce42f332a71d3ce67b9438203e6 Mon Sep 17 00:00:00 2001 From: Marian Melnychuk Date: Mon, 23 Mar 2026 15:17:03 +0200 Subject: [PATCH 1/4] feature: replace Jackson with json-simple (v2.3.0) - Remove jersey-media-json-jackson dependency - Add com.googlecode.json-simple:json-simple:1.1.1 - Add JsonUtils helper class for safe JSON parsing - Rewrite all 37 model/DTO classes with fromJson()/toJSON() - Rewrite all 30 request classes to use String response + fromJson() - Fixes UnrecognizedPropertyException on API schema changes - Bump version from 2.2 to 2.3.0 --- CHANGELOG.md | 77 +++++++++++++++++ pom.xml | 8 +- .../client/JacksonObjectMapperProvider.java | 22 ----- .../mailinator/client/JerseyClient.java | 8 +- .../mailinator/client/JsonUtils.java | 86 +++++++++++++++++++ .../mailinator/client/ResponseStatus.java | 12 +-- .../client/authenticator/Authenticator.java | 34 ++++---- .../GetAuthenticatorByIdRequest.java | 6 +- .../GetAuthenticatorRequest.java | 6 +- .../GetAuthenticatorsByIdRequest.java | 6 +- .../GetAuthenticatorsRequest.java | 6 +- .../GetAuthenticatorsResponse.java | 18 ++-- .../InstantTOTP2FACodeRequest.java | 6 +- .../InstantTOTP2FACodeResponse.java | 30 ++++--- .../client/domain/CreateDomainRequest.java | 6 +- .../client/domain/DeleteDomainRequest.java | 6 +- .../mailinator/client/domain/Domain.java | 38 ++++---- .../mailinator/client/domain/Domains.java | 18 ++-- .../client/domain/GetDomainRequest.java | 6 +- .../client/domain/GetDomainsRequest.java | 6 +- .../mailinator/client/message/Attachment.java | 21 +++-- .../client/message/Attachments.java | 16 ++-- .../message/DeleteDomainMessagesRequest.java | 6 +- .../message/DeleteInboxMessagesRequest.java | 6 +- .../client/message/DeleteMessageRequest.java | 6 +- .../client/message/DeletedMessages.java | 19 ++-- .../client/message/EmailLogEntry.java | 26 +++--- .../GetInboxMessageAttachmentsRequest.java | 6 +- .../message/GetInboxMessageLinksRequest.java | 6 +- .../message/GetInboxMessageRequest.java | 6 +- .../GetInboxMessageSmtpLogRequest.java | 6 +- .../client/message/GetInboxRequest.java | 6 +- .../GetLatestInboxMessagesRequest.java | 6 +- .../message/GetLatestMessagesRequest.java | 6 +- .../message/GetMessageAttachmentsRequest.java | 6 +- .../message/GetMessageLinksFullRequest.java | 6 +- .../message/GetMessageLinksRequest.java | 6 +- .../client/message/GetMessageRequest.java | 6 +- .../message/GetMessageSmtpLogRequest.java | 6 +- .../client/message/GetSmsInboxRequest.java | 6 +- .../mailinator/client/message/Inbox.java | 26 +++--- .../mailinator/client/message/LinkEntity.java | 18 ++-- .../mailinator/client/message/Links.java | 18 ++-- .../mailinator/client/message/LinksFull.java | 18 ++-- .../mailinator/client/message/Message.java | 53 ++++++------ .../client/message/MessageToPost.java | 17 ++-- .../mailinator/client/message/Part.java | 20 +++-- .../client/message/PostMessageRequest.java | 6 +- .../client/message/PostedMessage.java | 22 ++--- .../mailinator/client/message/SmtpLog.java | 18 ++-- .../mailinator/client/rule/Action.java | 26 ++++-- .../mailinator/client/rule/ActionData.java | 20 +++-- .../mailinator/client/rule/Condition.java | 27 ++++-- .../mailinator/client/rule/ConditionData.java | 28 ++++-- .../client/rule/CreateRuleRequest.java | 6 +- .../client/rule/DeleteRuleRequest.java | 6 +- .../client/rule/DisableRuleRequest.java | 8 +- .../client/rule/EnableRuleRequest.java | 8 +- .../client/rule/GetRuleRequest.java | 8 +- .../client/rule/GetRulesRequest.java | 8 +- .../mailinator/client/rule/Rule.java | 32 +++---- .../mailinator/client/rule/RuleToCreate.java | 38 +++++--- .../mailinator/client/rule/Rules.java | 17 ++-- .../client/stats/GetStatsRequest.java | 8 +- .../client/stats/GetTeamInfoRequest.java | 8 +- .../client/stats/GetTeamRequest.java | 8 +- .../mailinator/client/stats/MembersItem.java | 29 +++---- .../mailinator/client/stats/PlanData.java | 31 ++++--- .../client/stats/PrivateDomainsItem.java | 24 +++--- .../mailinator/client/stats/Retrieved.java | 34 ++++---- .../mailinator/client/stats/Sent.java | 24 +++--- .../client/stats/SmsNumbersItem.java | 29 +++---- .../mailinator/client/stats/Stats.java | 19 ++-- .../mailinator/client/stats/StatsItem.java | 29 +++---- .../mailinator/client/stats/Team.java | 61 ++++++------- .../mailinator/client/stats/TeamInfo.java | 24 +++--- ...ivateCustomServiceInboxWebhookRequest.java | 2 +- .../PrivateCustomServiceWebhookRequest.java | 2 +- .../webhook/PrivateInboxWebhookRequest.java | 6 +- .../client/webhook/PrivateWebhookRequest.java | 6 +- .../webhook/PrivateWebhookResponse.java | 15 ++-- .../mailinator/client/webhook/Webhook.java | 27 +++--- 82 files changed, 866 insertions(+), 551 deletions(-) create mode 100644 CHANGELOG.md delete mode 100644 src/main/java/com/manybrain/mailinator/client/JacksonObjectMapperProvider.java create mode 100644 src/main/java/com/manybrain/mailinator/client/JsonUtils.java diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..15142e3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,77 @@ +# Changelog + +All notable changes to the Mailinator Java Client SDK will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +--- + +## [2.3.0] - 2026-03-23 + +### Changed + +- **Replaced Jackson with json-simple for all JSON serialization/deserialization.** + Jackson's strict schema validation (`UnrecognizedPropertyException`) caused failures whenever the Mailinator API added new fields. json-simple silently ignores unknown fields, making the SDK resilient to API schema evolution. + +#### Infrastructure +- `pom.xml`: Removed `jersey-media-json-jackson` dependency; added `com.googlecode.json-simple:json-simple:1.1.1`. +- `JerseyClient.java`: Removed `JacksonFeature` registration from Jersey client configuration. +- `JsonUtils.java` *(new)*: Added utility class with helpers `parseObject`, `getString`, `getInteger`, `getLong`, `getBoolean`, `getObject`, `getList`, and `getStringList` for safe json-simple parsing. + +#### Model / DTO classes — Jackson annotations removed, manual `fromJson(JSONObject)` factory methods added +- `ResponseStatus` +- `DeletedMessages` +- `PrivateWebhookResponse` +- `EmailLogEntry` +- `LinkEntity` +- `MembersItem` +- `SmsNumbersItem` +- `PrivateDomainsItem` +- `Retrieved` +- `Sent` +- `PlanData` +- `Authenticator` (field names also normalised: `Id→id`, `TimeStep→timeStep`, etc.) +- `GetAuthenticatorsResponse` +- `InstantTOTP2FACodeResponse` +- `Links` +- `LinksFull` +- `Attachment` +- `Attachments` +- `Part` +- `SmtpLog` +- `Message` +- `Inbox` +- `PostedMessage` +- `StatsItem` +- `Stats` +- `TeamInfo` +- `Team` +- `Domain` +- `Domains` +- `ActionData` — added `toJSON()` for request serialization +- `ConditionData` — added `toJSON()` for request serialization +- `Action` — added `toJSON()` for request serialization +- `Condition` — added `toJSON()` for request serialization +- `Rule` +- `Rules` +- `RuleToCreate` — added `toJSON()` (request body only) +- `Webhook` — added `toJSON()` (request body only) +- `MessageToPost` — added `toJSON()` (request body only) + +#### Request classes — Jersey now deserializes to `String` and `fromJson` is used instead of POJO binding +- **authenticator**: `GetAuthenticatorByIdRequest`, `GetAuthenticatorsByIdRequest`, `GetAuthenticatorRequest`, `GetAuthenticatorsRequest`, `InstantTOTP2FACodeRequest` +- **domain**: `CreateDomainRequest`, `DeleteDomainRequest`, `GetDomainRequest`, `GetDomainsRequest` +- **message**: `DeleteDomainMessagesRequest`, `DeleteInboxMessagesRequest`, `DeleteMessageRequest`, `GetInboxMessageAttachmentsRequest`, `GetInboxMessageLinksRequest`, `GetInboxMessageRequest`, `GetInboxMessageSmtpLogRequest`, `GetInboxRequest`, `GetLatestInboxMessagesRequest`, `GetLatestMessagesRequest`, `GetMessageAttachmentsRequest`, `GetMessageLinksFullRequest`, `GetMessageLinksRequest`, `GetMessageRequest`, `GetMessageSmtpLogRequest`, `GetSmsInboxRequest`, `PostMessageRequest` +- **rule**: `CreateRuleRequest`, `DeleteRuleRequest`, `DisableRuleRequest`, `EnableRuleRequest`, `GetRuleRequest`, `GetRulesRequest` +- **stats**: `GetStatsRequest`, `GetTeamInfoRequest`, `GetTeamRequest` +- **webhook**: `PrivateWebhookRequest`, `PrivateInboxWebhookRequest`, `PrivateCustomServiceWebhookRequest`, `PrivateCustomServiceInboxWebhookRequest` + +### Fixed +- Removed reference to `JacksonObjectMapperProvider` class that was missing from the codebase, which would have caused a compilation failure. + +--- + +## [2.2.0] - prior release + +- Initial public release of the Mailinator Java Client SDK. diff --git a/pom.xml b/pom.xml index db376dd..d820caf 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.manybrain mailinator-client - 2.2 + 2.3.0 ${project.groupId}:${project.artifactId} https://www.mailinator.com/ Java client @@ -85,9 +85,9 @@ ${org.glassfish.jersey.version} - org.glassfish.jersey.media - jersey-media-json-jackson - ${org.glassfish.jersey.version} + com.googlecode.json-simple + json-simple + 1.1.1 org.glassfish.jersey.inject diff --git a/src/main/java/com/manybrain/mailinator/client/JacksonObjectMapperProvider.java b/src/main/java/com/manybrain/mailinator/client/JacksonObjectMapperProvider.java deleted file mode 100644 index 8b94f42..0000000 --- a/src/main/java/com/manybrain/mailinator/client/JacksonObjectMapperProvider.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.manybrain.mailinator.client; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.ws.rs.ext.ContextResolver; -import jakarta.ws.rs.ext.Provider; - -@Provider -public class JacksonObjectMapperProvider implements ContextResolver { - - private final ObjectMapper objectMapper; - - public JacksonObjectMapperProvider() { - objectMapper = new ObjectMapper() - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - } - - @Override - public ObjectMapper getContext(Class type) { - return objectMapper; - } -} diff --git a/src/main/java/com/manybrain/mailinator/client/JerseyClient.java b/src/main/java/com/manybrain/mailinator/client/JerseyClient.java index ab494b8..d1ebf68 100644 --- a/src/main/java/com/manybrain/mailinator/client/JerseyClient.java +++ b/src/main/java/com/manybrain/mailinator/client/JerseyClient.java @@ -11,7 +11,6 @@ import lombok.NoArgsConstructor; import org.glassfish.jersey.client.ClientProperties; -import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.logging.LoggingFeature; @NoArgsConstructor(access = AccessLevel.PRIVATE) @@ -20,20 +19,17 @@ public class JerseyClient public static final String BASE_URL = "https://api.mailinator.com/api/v2"; public static final String USER_AGENT = "Mailinator SDK - Java V2.2"; - - // Define a filter to set the User-Agent header + private static final ClientRequestFilter USER_AGENT_FILTER = requestContext -> { requestContext.getHeaders().add("User-Agent", USER_AGENT); }; public static final Client CLIENT = ClientBuilder.newClient() - .property(ClientProperties.READ_TIMEOUT, (int) TimeUnit.SECONDS.toMillis(125)) // Set read timeout to 65 sec + .property(ClientProperties.READ_TIMEOUT, (int) TimeUnit.SECONDS.toMillis(125)) .register(new LoggingFeature(Logger.getLogger( JerseyClient.class.getPackage().getName()), Level.SEVERE, null, null)) - .register(new JacksonFeature()) - .register(new JacksonObjectMapperProvider()) .register(USER_AGENT_FILTER); } diff --git a/src/main/java/com/manybrain/mailinator/client/JsonUtils.java b/src/main/java/com/manybrain/mailinator/client/JsonUtils.java new file mode 100644 index 0000000..1062f1d --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/JsonUtils.java @@ -0,0 +1,86 @@ +package com.manybrain.mailinator.client; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class JsonUtils { + + public static JSONObject parseObject(String json) { + try { + if (json == null || json.trim().isEmpty()) return null; + Object parsed = new JSONParser().parse(json); + if (parsed instanceof JSONObject) return (JSONObject) parsed; + return null; + } catch (ParseException e) { + throw new RuntimeException("Failed to parse JSON object", e); + } + } + + public static String getString(JSONObject obj, String key) { + if (obj == null) return null; + Object val = obj.get(key); + return val != null ? val.toString() : null; + } + + public static Integer getInteger(JSONObject obj, String key) { + if (obj == null) return null; + Object val = obj.get(key); + if (val == null) return null; + if (val instanceof Long) return ((Long) val).intValue(); + if (val instanceof Integer) return (Integer) val; + return Integer.parseInt(val.toString()); + } + + public static Long getLong(JSONObject obj, String key) { + if (obj == null) return null; + Object val = obj.get(key); + if (val == null) return null; + if (val instanceof Long) return (Long) val; + if (val instanceof Integer) return ((Integer) val).longValue(); + return Long.parseLong(val.toString()); + } + + public static Boolean getBoolean(JSONObject obj, String key) { + if (obj == null) return null; + Object val = obj.get(key); + if (val == null) return null; + if (val instanceof Boolean) return (Boolean) val; + return Boolean.parseBoolean(val.toString()); + } + + public static JSONObject getObject(JSONObject obj, String key) { + if (obj == null) return null; + return (JSONObject) obj.get(key); + } + + public static List getList(JSONObject obj, String key, Function mapper) { + if (obj == null) return null; + JSONArray arr = (JSONArray) obj.get(key); + if (arr == null) return null; + List list = new ArrayList<>(); + for (Object item : arr) { + list.add(mapper.apply((JSONObject) item)); + } + return list; + } + + public static List getStringList(JSONObject obj, String key) { + if (obj == null) return null; + JSONArray arr = (JSONArray) obj.get(key); + if (arr == null) return null; + List list = new ArrayList<>(); + for (Object item : arr) { + list.add(item != null ? item.toString() : null); + } + return list; + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/ResponseStatus.java b/src/main/java/com/manybrain/mailinator/client/ResponseStatus.java index c2ccebd..91bb2fc 100644 --- a/src/main/java/com/manybrain/mailinator/client/ResponseStatus.java +++ b/src/main/java/com/manybrain/mailinator/client/ResponseStatus.java @@ -1,15 +1,17 @@ package com.manybrain.mailinator.client; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class ResponseStatus { - - @JsonProperty("status") private String status; + public static ResponseStatus fromJson(JSONObject json) { + if (json == null) return null; + ResponseStatus r = new ResponseStatus(); + r.status = JsonUtils.getString(json, "status"); + return r; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/authenticator/Authenticator.java b/src/main/java/com/manybrain/mailinator/client/authenticator/Authenticator.java index c17aaca..a48ebbe 100644 --- a/src/main/java/com/manybrain/mailinator/client/authenticator/Authenticator.java +++ b/src/main/java/com/manybrain/mailinator/client/authenticator/Authenticator.java @@ -1,23 +1,27 @@ package com.manybrain.mailinator.client.authenticator; -import java.util.List; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; + +import java.util.List; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class Authenticator { + private String id; + private Integer timeStep; + private List futureCodes; + private Integer nextResetSeconds; + private String passcode; - @JsonProperty("id") - private String Id; - @JsonProperty("time_step") - public Integer TimeStep; - @JsonProperty("futurecodes") - public List FutureCodes; - @JsonProperty("next_reset_secs") - public Integer NextResetSeconds; - @JsonProperty("passcode") - public String Passcode; - + public static Authenticator fromJson(JSONObject json) { + if (json == null) return null; + Authenticator a = new Authenticator(); + a.id = JsonUtils.getString(json, "id"); + a.timeStep = JsonUtils.getInteger(json, "time_step"); + a.futureCodes = JsonUtils.getStringList(json, "futurecodes"); + a.nextResetSeconds = JsonUtils.getInteger(json, "next_reset_secs"); + a.passcode = JsonUtils.getString(json, "passcode"); + return a; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequest.java b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequest.java index bb09ea2..830405b 100644 --- a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequest.java @@ -6,6 +6,7 @@ import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -24,8 +25,9 @@ public class GetAuthenticatorByIdRequest implements Request { public Authenticator execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("auth_id", emptyIfNull(Id)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) - .get(Authenticator.class); + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) + .get(String.class); + return Authenticator.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequest.java b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequest.java index c7a5097..41b6501 100644 --- a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequest.java @@ -4,6 +4,7 @@ import static com.manybrain.mailinator.client.JerseyClient.CLIENT; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; @@ -18,8 +19,9 @@ public class GetAuthenticatorRequest implements Request { public Authenticator execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("auth_id", emptyIfNull(Id)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) - .get(Authenticator.class); + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) + .get(String.class); + return Authenticator.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequest.java b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequest.java index 6db9863..1284cea 100644 --- a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequest.java @@ -5,6 +5,7 @@ import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.RequiredArgsConstructor; @@ -17,8 +18,9 @@ public class GetAuthenticatorsRequest implements Request passcodes; - @JsonProperty("passcodes") - private List Passcodes; - + public static GetAuthenticatorsResponse fromJson(JSONObject json) { + if (json == null) return null; + GetAuthenticatorsResponse r = new GetAuthenticatorsResponse(); + r.passcodes = JsonUtils.getList(json, "passcodes", Authenticator::fromJson); + return r; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/authenticator/InstantTOTP2FACodeRequest.java b/src/main/java/com/manybrain/mailinator/client/authenticator/InstantTOTP2FACodeRequest.java index c9ce21b..277426c 100644 --- a/src/main/java/com/manybrain/mailinator/client/authenticator/InstantTOTP2FACodeRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/authenticator/InstantTOTP2FACodeRequest.java @@ -6,6 +6,7 @@ import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -24,8 +25,9 @@ public class InstantTOTP2FACodeRequest implements Request futureCodes; + private Integer nextResetSeconds; + private String passcode; - @JsonProperty("time_step") - private Integer TimeStep; - @JsonProperty("futurecodes") - private List FutureCodes; - @JsonProperty("next_reset_secs") - private Integer NextResetSeconds; - @JsonProperty("passcode") - private String Passcode; - + public static InstantTOTP2FACodeResponse fromJson(JSONObject json) { + if (json == null) return null; + InstantTOTP2FACodeResponse r = new InstantTOTP2FACodeResponse(); + r.timeStep = JsonUtils.getInteger(json, "time_step"); + r.futureCodes = JsonUtils.getStringList(json, "futurecodes"); + r.nextResetSeconds = JsonUtils.getInteger(json, "next_reset_secs"); + r.passcode = JsonUtils.getString(json, "passcode"); + return r; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/domain/CreateDomainRequest.java b/src/main/java/com/manybrain/mailinator/client/domain/CreateDomainRequest.java index 1705187..9689f5c 100644 --- a/src/main/java/com/manybrain/mailinator/client/domain/CreateDomainRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/domain/CreateDomainRequest.java @@ -7,6 +7,7 @@ import jakarta.ws.rs.client.Entity; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import com.manybrain.mailinator.client.ResponseStatus; @@ -27,9 +28,10 @@ public class CreateDomainRequest implements Request { public ResponseStatus execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain_id", emptyIfNull(domainId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .post(Entity.json(""), ResponseStatus.class); + .post(Entity.json(""), String.class); + return ResponseStatus.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/domain/DeleteDomainRequest.java b/src/main/java/com/manybrain/mailinator/client/domain/DeleteDomainRequest.java index 98a548c..ef57d96 100644 --- a/src/main/java/com/manybrain/mailinator/client/domain/DeleteDomainRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/domain/DeleteDomainRequest.java @@ -6,6 +6,7 @@ import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import com.manybrain.mailinator.client.ResponseStatus; @@ -26,8 +27,9 @@ public class DeleteDomainRequest implements Request { public ResponseStatus execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain_id", emptyIfNull(domainId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) - .delete(ResponseStatus.class); + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) + .delete(String.class); + return ResponseStatus.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/domain/Domain.java b/src/main/java/com/manybrain/mailinator/client/domain/Domain.java index 20f7861..65bfb8f 100644 --- a/src/main/java/com/manybrain/mailinator/client/domain/Domain.java +++ b/src/main/java/com/manybrain/mailinator/client/domain/Domain.java @@ -1,26 +1,30 @@ package com.manybrain.mailinator.client.domain; -import java.util.List; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.rule.Rule; import lombok.Data; +import org.json.simple.JSONObject; + +import java.util.List; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class Domain { + private String id; + private String description; + private Boolean enabled; + private String name; + private String ownerid; + private List rules; - @JsonProperty("_id") - private String id; - @JsonProperty("description") - private String description; - @JsonProperty("enabled") - private Boolean enabled; - @JsonProperty("name") - private String name; - @JsonProperty("ownerid") - private String ownerid; - @JsonProperty("rules") - private List rules; - + public static Domain fromJson(JSONObject json) { + if (json == null) return null; + Domain d = new Domain(); + d.id = JsonUtils.getString(json, "_id"); + d.description = JsonUtils.getString(json, "description"); + d.enabled = JsonUtils.getBoolean(json, "enabled"); + d.name = JsonUtils.getString(json, "name"); + d.ownerid = JsonUtils.getString(json, "ownerid"); + d.rules = JsonUtils.getList(json, "rules", Rule::fromJson); + return d; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/domain/Domains.java b/src/main/java/com/manybrain/mailinator/client/domain/Domains.java index 31d06d2..9e24645 100644 --- a/src/main/java/com/manybrain/mailinator/client/domain/Domains.java +++ b/src/main/java/com/manybrain/mailinator/client/domain/Domains.java @@ -1,16 +1,20 @@ package com.manybrain.mailinator.client.domain; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; + +import java.util.List; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class Domains { - - @JsonProperty("domains") private List domains; + + public static Domains fromJson(JSONObject json) { + if (json == null) return null; + Domains d = new Domains(); + d.domains = JsonUtils.getList(json, "domains", Domain::fromJson); + return d; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/domain/GetDomainRequest.java b/src/main/java/com/manybrain/mailinator/client/domain/GetDomainRequest.java index 54a73b3..9543b5c 100644 --- a/src/main/java/com/manybrain/mailinator/client/domain/GetDomainRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/domain/GetDomainRequest.java @@ -6,6 +6,7 @@ import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -24,8 +25,9 @@ public class GetDomainRequest implements Request { public Domain execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain_id", emptyIfNull(domainId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) - .get(Domain.class); + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) + .get(String.class); + return Domain.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/domain/GetDomainsRequest.java b/src/main/java/com/manybrain/mailinator/client/domain/GetDomainsRequest.java index 2cb7044..c5dd1f6 100644 --- a/src/main/java/com/manybrain/mailinator/client/domain/GetDomainsRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/domain/GetDomainsRequest.java @@ -5,6 +5,7 @@ import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; public class GetDomainsRequest implements Request { @@ -15,8 +16,9 @@ public class GetDomainsRequest implements Request { @Override public Domains execute(String apiToken) { - return WEB_TARGET.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) - .get(Domains.class); + String response = WEB_TARGET.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) + .get(String.class); + return Domains.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/message/Attachment.java b/src/main/java/com/manybrain/mailinator/client/message/Attachment.java index d4bb5cc..c47d0bd 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/Attachment.java +++ b/src/main/java/com/manybrain/mailinator/client/message/Attachment.java @@ -1,23 +1,26 @@ package com.manybrain.mailinator.client.message; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class Attachment { - - @JsonProperty("filename") private String filename; - @JsonProperty("content-disposition") private String contentDisposition; - @JsonProperty("content-transfer-encoding") private String contentTransferEncoding; - @JsonProperty("content-type") private String contentType; - @JsonProperty("attachment-id") private Integer attachmentId; + public static Attachment fromJson(JSONObject json) { + if (json == null) return null; + Attachment a = new Attachment(); + a.filename = JsonUtils.getString(json, "filename"); + a.contentDisposition = JsonUtils.getString(json, "content-disposition"); + a.contentTransferEncoding = JsonUtils.getString(json, "content-transfer-encoding"); + a.contentType = JsonUtils.getString(json, "content-type"); + a.attachmentId = JsonUtils.getInteger(json, "attachment-id"); + return a; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/message/Attachments.java b/src/main/java/com/manybrain/mailinator/client/message/Attachments.java index bbfb06f..59ed727 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/Attachments.java +++ b/src/main/java/com/manybrain/mailinator/client/message/Attachments.java @@ -1,16 +1,20 @@ package com.manybrain.mailinator.client.message; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; + +import java.util.List; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class Attachments { - @JsonProperty("attachments") private List attachments; + public static Attachments fromJson(JSONObject json) { + if (json == null) return null; + Attachments a = new Attachments(); + a.attachments = JsonUtils.getList(json, "attachments", Attachment::fromJson); + return a; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/message/DeleteDomainMessagesRequest.java b/src/main/java/com/manybrain/mailinator/client/message/DeleteDomainMessagesRequest.java index 5fb2a74..becfe5a 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/DeleteDomainMessagesRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/DeleteDomainMessagesRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; @@ -30,9 +31,10 @@ public DeletedMessages execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .delete(DeletedMessages.class); + .delete(String.class); + return DeletedMessages.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/DeleteInboxMessagesRequest.java b/src/main/java/com/manybrain/mailinator/client/message/DeleteInboxMessagesRequest.java index 474b090..3bfde38 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/DeleteInboxMessagesRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/DeleteInboxMessagesRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; @@ -33,9 +34,10 @@ public DeletedMessages execute(String apiToken) WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("inbox", emptyIfNull(inbox)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .delete(DeletedMessages.class); + .delete(String.class); + return DeletedMessages.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/DeleteMessageRequest.java b/src/main/java/com/manybrain/mailinator/client/message/DeleteMessageRequest.java index 8d08b93..0c84ee1 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/DeleteMessageRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/DeleteMessageRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; @@ -35,9 +36,10 @@ public DeletedMessages execute(String apiToken) .resolveTemplate("inbox", emptyIfNull(inbox)) .resolveTemplate("message_id", emptyIfNull(messageId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .delete(DeletedMessages.class); + .delete(String.class); + return DeletedMessages.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/DeletedMessages.java b/src/main/java/com/manybrain/mailinator/client/message/DeletedMessages.java index 79fbf4c..e8abf6b 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/DeletedMessages.java +++ b/src/main/java/com/manybrain/mailinator/client/message/DeletedMessages.java @@ -1,16 +1,19 @@ package com.manybrain.mailinator.client.message; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class DeletedMessages { + private String status; + private Integer count; - @JsonProperty("status") - private String status; - @JsonProperty("count") - private Integer count; - + public static DeletedMessages fromJson(JSONObject json) { + if (json == null) return null; + DeletedMessages d = new DeletedMessages(); + d.status = JsonUtils.getString(json, "status"); + d.count = JsonUtils.getInteger(json, "count"); + return d; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/message/EmailLogEntry.java b/src/main/java/com/manybrain/mailinator/client/message/EmailLogEntry.java index 480c037..7093a2a 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/EmailLogEntry.java +++ b/src/main/java/com/manybrain/mailinator/client/message/EmailLogEntry.java @@ -1,21 +1,21 @@ package com.manybrain.mailinator.client.message; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) public class EmailLogEntry { + private String log; + private String time; + private String event; - @JsonProperty("log") - private String log; - @JsonProperty("time") - private String time; - @JsonProperty("event") - private String event; - + public static EmailLogEntry fromJson(JSONObject json) { + if (json == null) return null; + EmailLogEntry e = new EmailLogEntry(); + e.log = JsonUtils.getString(json, "log"); + e.time = JsonUtils.getString(json, "time"); + e.event = JsonUtils.getString(json, "event"); + return e; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageAttachmentsRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageAttachmentsRequest.java index 4027b7b..9239ba5 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageAttachmentsRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageAttachmentsRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; @@ -35,9 +36,10 @@ public Attachments execute(String apiToken) .resolveTemplate("inbox", emptyIfNull(inbox)) .resolveTemplate("message_id", emptyIfNull(messageId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Attachments.class); + .get(String.class); + return Attachments.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageLinksRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageLinksRequest.java index 8940e3e..1ee776a 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageLinksRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageLinksRequest.java @@ -6,6 +6,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -35,9 +36,10 @@ public Links execute(String apiToken) .resolveTemplate("inbox", emptyIfNull(inbox)) .resolveTemplate("message_id", emptyIfNull(messageId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Links.class); + .get(String.class); + return Links.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageRequest.java index e8f3636..ba3fef3 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; @@ -35,9 +36,10 @@ public Message execute(String apiToken) .resolveTemplate("inbox", emptyIfNull(inbox)) .resolveTemplate("message_id", emptyIfNull(messageId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Message.class); + .get(String.class); + return Message.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageSmtpLogRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageSmtpLogRequest.java index 25cacf5..148000c 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageSmtpLogRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageSmtpLogRequest.java @@ -6,6 +6,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -35,9 +36,10 @@ public SmtpLog execute(String apiToken) .resolveTemplate("inbox", emptyIfNull(inbox)) .resolveTemplate("message_id", emptyIfNull(messageId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(SmtpLog.class); + .get(String.class); + return SmtpLog.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetInboxRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetInboxRequest.java index e47f9ca..ea84ea6 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetInboxRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetInboxRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.AllArgsConstructor; @@ -85,9 +86,10 @@ public Inbox execute(String apiToken) webTarget = webTarget.queryParam("wait", wait); } - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Inbox.class); + .get(String.class); + return Inbox.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequest.java index c234640..76728e0 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequest.java @@ -7,6 +7,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -33,9 +34,10 @@ public Inbox execute(String apiToken) WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("inbox", emptyIfNull(inbox)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Inbox.class); + .get(String.class); + return Inbox.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequest.java index 4eea996..07a35be 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequest.java @@ -6,6 +6,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -29,9 +30,10 @@ public Inbox execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Inbox.class); + .get(String.class); + return Inbox.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageAttachmentsRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageAttachmentsRequest.java index 37007de..7061711 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetMessageAttachmentsRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageAttachmentsRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; @@ -32,9 +33,10 @@ public Attachments execute(String apiToken) WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("message_id", emptyIfNull(messageId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Attachments.class); + .get(String.class); + return Attachments.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageLinksFullRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageLinksFullRequest.java index 6c29140..1dc8292 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetMessageLinksFullRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageLinksFullRequest.java @@ -6,6 +6,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -32,9 +33,10 @@ public LinksFull execute(String apiToken) WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("message_id", emptyIfNull(messageId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(LinksFull.class); + .get(String.class); + return LinksFull.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageLinksRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageLinksRequest.java index 7a4d65b..23169da 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetMessageLinksRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageLinksRequest.java @@ -6,6 +6,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -32,9 +33,10 @@ public Links execute(String apiToken) WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("message_id", emptyIfNull(messageId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Links.class); + .get(String.class); + return Links.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageRequest.java index bf8df75..4a7a614 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetMessageRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.AllArgsConstructor; @@ -43,9 +44,10 @@ public Message execute(String apiToken) webTarget = webTarget.queryParam("delete", delete); } - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Message.class); + .get(String.class); + return Message.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageSmtpLogRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageSmtpLogRequest.java index 53e13c5..23a5523 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetMessageSmtpLogRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageSmtpLogRequest.java @@ -6,6 +6,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -32,9 +33,10 @@ public SmtpLog execute(String apiToken) WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("message_id", emptyIfNull(messageId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(SmtpLog.class); + .get(String.class); + return SmtpLog.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetSmsInboxRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetSmsInboxRequest.java index 65629c0..8f67789 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetSmsInboxRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetSmsInboxRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; @@ -33,9 +34,10 @@ public Inbox execute(String apiToken) WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("phoneNumber", emptyIfNull(phoneNumber)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .get(Inbox.class); + .get(String.class); + return Inbox.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/Inbox.java b/src/main/java/com/manybrain/mailinator/client/message/Inbox.java index c6d5fd3..20f4cfc 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/Inbox.java +++ b/src/main/java/com/manybrain/mailinator/client/message/Inbox.java @@ -1,26 +1,26 @@ - package com.manybrain.mailinator.client.message; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; + +import java.util.List; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) public class Inbox { - - @JsonProperty("domain") private String domain; - @JsonProperty("to") private String to; - @JsonProperty("msgs") private List msgs; - @JsonProperty("cursor") private String cursor; + public static Inbox fromJson(JSONObject json) { + if (json == null) return null; + Inbox i = new Inbox(); + i.domain = JsonUtils.getString(json, "domain"); + i.to = JsonUtils.getString(json, "to"); + i.msgs = JsonUtils.getList(json, "msgs", Message::fromJson); + i.cursor = JsonUtils.getString(json, "cursor"); + return i; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/message/LinkEntity.java b/src/main/java/com/manybrain/mailinator/client/message/LinkEntity.java index 174895b..10d15a1 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/LinkEntity.java +++ b/src/main/java/com/manybrain/mailinator/client/message/LinkEntity.java @@ -1,18 +1,20 @@ package com.manybrain.mailinator.client.message; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) public class LinkEntity { - @JsonProperty("link") private String link; - @JsonProperty("text") private String text; - + + public static LinkEntity fromJson(JSONObject json) { + if (json == null) return null; + LinkEntity e = new LinkEntity(); + e.link = JsonUtils.getString(json, "link"); + e.text = JsonUtils.getString(json, "text"); + return e; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/message/Links.java b/src/main/java/com/manybrain/mailinator/client/message/Links.java index 5a6687c..2ccf5f7 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/Links.java +++ b/src/main/java/com/manybrain/mailinator/client/message/Links.java @@ -1,19 +1,19 @@ package com.manybrain.mailinator.client.message; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; import java.util.List; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) public class Links { + private List links; - @JsonProperty("links") - private List links; - + public static Links fromJson(JSONObject json) { + if (json == null) return null; + Links l = new Links(); + l.links = JsonUtils.getStringList(json, "links"); + return l; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/message/LinksFull.java b/src/main/java/com/manybrain/mailinator/client/message/LinksFull.java index f2c591f..c8b675b 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/LinksFull.java +++ b/src/main/java/com/manybrain/mailinator/client/message/LinksFull.java @@ -1,19 +1,19 @@ package com.manybrain.mailinator.client.message; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; import java.util.List; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) public class LinksFull { + private List links; - @JsonProperty("links") - private List links; - + public static LinksFull fromJson(JSONObject json) { + if (json == null) return null; + LinksFull l = new LinksFull(); + l.links = JsonUtils.getList(json, "links", LinkEntity::fromJson); + return l; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/message/Message.java b/src/main/java/com/manybrain/mailinator/client/message/Message.java index 57873be..1559ba7 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/Message.java +++ b/src/main/java/com/manybrain/mailinator/client/message/Message.java @@ -1,53 +1,56 @@ package com.manybrain.mailinator.client.message; +import com.manybrain.mailinator.client.JsonUtils; +import lombok.Data; +import org.json.simple.JSONObject; + import java.util.List; import java.util.Map; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) public class Message { - @JsonProperty("is_first_exchange") private Boolean isFirstExchange; - @JsonProperty("fromfull") private String fromfull; - @JsonProperty("headers") private Map headers; - @JsonProperty("subject") private String subject; - @JsonProperty("parts") private List parts; - @JsonProperty("from") private String from; - @JsonProperty("to") private String to; - @JsonProperty("id") private String id; - @JsonProperty("time") private Long time; - @JsonProperty("seconds_ago") private Long secondsAgo; - @JsonProperty("domain") private String domain; - @JsonProperty("origfrom") private String origfrom; - @JsonProperty("mrid") private String mrid; - @JsonProperty("size") private Integer size; - @JsonProperty("stream") private String stream; - @JsonProperty("msg_type") private String msgType; - @JsonProperty("source") private String source; - @JsonProperty("text") private String text; + @SuppressWarnings("unchecked") + public static Message fromJson(JSONObject json) { + if (json == null) return null; + Message m = new Message(); + m.isFirstExchange = JsonUtils.getBoolean(json, "is_first_exchange"); + m.fromfull = JsonUtils.getString(json, "fromfull"); + m.headers = (JSONObject) json.get("headers"); + m.subject = JsonUtils.getString(json, "subject"); + m.parts = JsonUtils.getList(json, "parts", Part::fromJson); + m.from = JsonUtils.getString(json, "from"); + m.to = JsonUtils.getString(json, "to"); + m.id = JsonUtils.getString(json, "id"); + m.time = JsonUtils.getLong(json, "time"); + m.secondsAgo = JsonUtils.getLong(json, "seconds_ago"); + m.domain = JsonUtils.getString(json, "domain"); + m.origfrom = JsonUtils.getString(json, "origfrom"); + m.mrid = JsonUtils.getString(json, "mrid"); + m.size = JsonUtils.getInteger(json, "size"); + m.stream = JsonUtils.getString(json, "stream"); + m.msgType = JsonUtils.getString(json, "msg_type"); + m.source = JsonUtils.getString(json, "source"); + m.text = JsonUtils.getString(json, "text"); + return m; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/message/MessageToPost.java b/src/main/java/com/manybrain/mailinator/client/message/MessageToPost.java index 8829294..653eab8 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/MessageToPost.java +++ b/src/main/java/com/manybrain/mailinator/client/message/MessageToPost.java @@ -1,24 +1,27 @@ package com.manybrain.mailinator.client.message; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NonNull; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) @AllArgsConstructor public class MessageToPost { - @NonNull - @JsonProperty("subject") private String subject; @NonNull - @JsonProperty("from") private String from; @NonNull - @JsonProperty("text") private String text; + + @SuppressWarnings("unchecked") + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + json.put("subject", subject); + json.put("from", from); + json.put("text", text); + return json; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/message/Part.java b/src/main/java/com/manybrain/mailinator/client/message/Part.java index 93a628e..fbb4a17 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/Part.java +++ b/src/main/java/com/manybrain/mailinator/client/message/Part.java @@ -1,19 +1,23 @@ package com.manybrain.mailinator.client.message; -import java.util.Map; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; + +import java.util.Map; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class Part { - - @JsonProperty("headers") private Map headers; - @JsonProperty("body") private String body; + @SuppressWarnings("unchecked") + public static Part fromJson(JSONObject json) { + if (json == null) return null; + Part p = new Part(); + p.headers = (JSONObject) json.get("headers"); + p.body = JsonUtils.getString(json, "body"); + return p; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/message/PostMessageRequest.java b/src/main/java/com/manybrain/mailinator/client/message/PostMessageRequest.java index 07d38f1..9458548 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/PostMessageRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/PostMessageRequest.java @@ -7,6 +7,7 @@ import jakarta.ws.rs.client.Entity; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -30,8 +31,9 @@ public PostedMessage execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("inbox", emptyIfNull(inbox)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) - .post(Entity.json(message), PostedMessage.class); + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).header(AUTHORIZATION, apiToken) + .post(Entity.entity(message.toJSON().toJSONString(), MediaType.APPLICATION_JSON_TYPE), String.class); + return PostedMessage.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/message/PostedMessage.java b/src/main/java/com/manybrain/mailinator/client/message/PostedMessage.java index 9152c18..77f0414 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/PostedMessage.java +++ b/src/main/java/com/manybrain/mailinator/client/message/PostedMessage.java @@ -1,23 +1,25 @@ package com.manybrain.mailinator.client.message; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.rule.Rule; - import lombok.Data; +import org.json.simple.JSONObject; + +import java.util.List; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class PostedMessage { - - @JsonProperty("status") private String status; - @JsonProperty("id") private String id; - @JsonProperty("rules_fired") private List rulesFired; + public static PostedMessage fromJson(JSONObject json) { + if (json == null) return null; + PostedMessage p = new PostedMessage(); + p.status = JsonUtils.getString(json, "status"); + p.id = JsonUtils.getString(json, "id"); + p.rulesFired = JsonUtils.getList(json, "rules_fired", Rule::fromJson); + return p; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/message/SmtpLog.java b/src/main/java/com/manybrain/mailinator/client/message/SmtpLog.java index 7568b67..42c9d56 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/SmtpLog.java +++ b/src/main/java/com/manybrain/mailinator/client/message/SmtpLog.java @@ -1,25 +1,25 @@ package com.manybrain.mailinator.client.message; +import com.manybrain.mailinator.client.JsonUtils; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.json.simple.JSONObject; import java.util.List; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - @Data @Builder @NoArgsConstructor @AllArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) public class SmtpLog { + private List logEntries; - @JsonProperty("log") - private List logEntries; - + public static SmtpLog fromJson(JSONObject json) { + if (json == null) return null; + SmtpLog s = new SmtpLog(); + s.logEntries = JsonUtils.getList(json, "log", EmailLogEntry::fromJson); + return s; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/rule/Action.java b/src/main/java/com/manybrain/mailinator/client/rule/Action.java index 59d0c72..d8e1052 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/Action.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/Action.java @@ -1,26 +1,38 @@ package com.manybrain.mailinator.client.rule; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.json.simple.JSONObject; @Data @Builder @NoArgsConstructor @AllArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) public class Action { - - @JsonProperty("action") public ActionType action; - @JsonProperty("action_data") public ActionData actionData; - @JsonProperty("destination") public String destination; + public static Action fromJson(JSONObject json) { + if (json == null) return null; + Action a = new Action(); + String act = JsonUtils.getString(json, "action"); + a.action = act != null ? ActionType.valueOf(act) : null; + a.actionData = ActionData.fromJson(JsonUtils.getObject(json, "action_data")); + a.destination = JsonUtils.getString(json, "destination"); + return a; + } + @SuppressWarnings("unchecked") + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + if (action != null) json.put("action", action.name()); + if (actionData != null) json.put("action_data", actionData.toJSON()); + if (destination != null) json.put("destination", destination); + return json; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/rule/ActionData.java b/src/main/java/com/manybrain/mailinator/client/rule/ActionData.java index d4cafe3..21719fa 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/ActionData.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/ActionData.java @@ -1,21 +1,31 @@ package com.manybrain.mailinator.client.rule; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.json.simple.JSONObject; @Data @Builder @NoArgsConstructor @AllArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) public class ActionData { - - @JsonProperty("url") public String url; + public static ActionData fromJson(JSONObject json) { + if (json == null) return null; + ActionData a = new ActionData(); + a.url = JsonUtils.getString(json, "url"); + return a; + } + + @SuppressWarnings("unchecked") + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + if (url != null) json.put("url", url); + return json; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/rule/Condition.java b/src/main/java/com/manybrain/mailinator/client/rule/Condition.java index b6169c4..ec64574 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/Condition.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/Condition.java @@ -1,23 +1,34 @@ package com.manybrain.mailinator.client.rule; +import com.manybrain.mailinator.client.JsonUtils; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.json.simple.JSONObject; @Data @Builder @NoArgsConstructor @AllArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) public class Condition { + public OperationType operation; + public ConditionData conditionData; - @JsonProperty("operation") - public OperationType operation; - @JsonProperty("condition_data") - public ConditionData conditionData; + public static Condition fromJson(JSONObject json) { + if (json == null) return null; + Condition c = new Condition(); + String op = JsonUtils.getString(json, "operation"); + c.operation = op != null ? OperationType.valueOf(op) : null; + c.conditionData = ConditionData.fromJson(JsonUtils.getObject(json, "condition_data")); + return c; + } + @SuppressWarnings("unchecked") + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + if (operation != null) json.put("operation", operation.name()); + if (conditionData != null) json.put("condition_data", conditionData.toJSON()); + return json; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/rule/ConditionData.java b/src/main/java/com/manybrain/mailinator/client/rule/ConditionData.java index 35d628f..f75f14a 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/ConditionData.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/ConditionData.java @@ -1,27 +1,39 @@ package com.manybrain.mailinator.client.rule; +import com.manybrain.mailinator.client.JsonUtils; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.json.simple.JSONObject; @Data @Builder @NoArgsConstructor @AllArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) public class ConditionData { - - @JsonProperty("operation") public OperationType operation; @Builder.Default - @JsonProperty("field") public String field = "to"; - @JsonProperty("value") public String value; + public static ConditionData fromJson(JSONObject json) { + if (json == null) return null; + ConditionData c = new ConditionData(); + String op = JsonUtils.getString(json, "operation"); + c.operation = op != null ? OperationType.valueOf(op) : null; + c.field = JsonUtils.getString(json, "field"); + c.value = JsonUtils.getString(json, "value"); + return c; + } + + @SuppressWarnings("unchecked") + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + if (operation != null) json.put("operation", operation.name()); + if (field != null) json.put("field", field); + if (value != null) json.put("value", value); + return json; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/rule/CreateRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/CreateRuleRequest.java index bfe445f..df4ab69 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/CreateRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/CreateRuleRequest.java @@ -4,6 +4,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import lombok.NonNull; @@ -32,9 +33,10 @@ public Rule execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain_id", emptyIfNull(domainId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .post(Entity.json(rule), Rule.class); + .post(Entity.entity(rule.toJSON().toJSONString(), MediaType.APPLICATION_JSON_TYPE), String.class); + return Rule.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/rule/DeleteRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/DeleteRuleRequest.java index f534087..dc76f4b 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/DeleteRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/DeleteRuleRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import com.manybrain.mailinator.client.ResponseStatus; @@ -34,9 +35,10 @@ public ResponseStatus execute(String apiToken) .resolveTemplate("domain_id", emptyIfNull(domainId)) .resolveTemplate("rule_id", emptyIfNull(ruleId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) - .delete(ResponseStatus.class); + .delete(String.class); + return ResponseStatus.fromJson(JsonUtils.parseObject(response)); } diff --git a/src/main/java/com/manybrain/mailinator/client/rule/DisableRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/DisableRuleRequest.java index 9cce937..3386845 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/DisableRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/DisableRuleRequest.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import jakarta.ws.rs.client.Entity; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import com.manybrain.mailinator.client.ResponseStatus; @@ -30,9 +31,10 @@ public ResponseStatus execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain_id", emptyIfNull(domainId)) .resolveTemplate("rule_id", emptyIfNull(ruleId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) - .header(AUTHORIZATION, apiToken) - .put(Entity.json("{}"), ResponseStatus.class); +String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .put(Entity.json("{}"), String.class); + return ResponseStatus.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/rule/EnableRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/EnableRuleRequest.java index df55b88..a6fe531 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/EnableRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/EnableRuleRequest.java @@ -7,6 +7,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import com.manybrain.mailinator.client.ResponseStatus; @@ -31,9 +32,10 @@ public ResponseStatus execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain_id", emptyIfNull(streamId)) .resolveTemplate("rule_id", emptyIfNull(ruleId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) - .header(AUTHORIZATION, apiToken) - .put(Entity.json("{}"), ResponseStatus.class); +String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .put(Entity.json("{}"), String.class); + return ResponseStatus.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/rule/GetRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/GetRuleRequest.java index 19ad514..c596683 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/GetRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/GetRuleRequest.java @@ -6,6 +6,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -29,9 +30,10 @@ public Rule execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain_id", emptyIfNull(domainId)) .resolveTemplate("rule_id", emptyIfNull(ruleId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) - .header(AUTHORIZATION, apiToken) - .get(Rule.class); +String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return Rule.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/rule/GetRulesRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/GetRulesRequest.java index e5ef54f..c39c9ba 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/GetRulesRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/GetRulesRequest.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -26,9 +27,10 @@ public class GetRulesRequest implements Request { public Rules execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain_id", emptyIfNull(domainId)); - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) - .header(AUTHORIZATION, apiToken) - .get(Rules.class); +String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return Rules.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/rule/Rule.java b/src/main/java/com/manybrain/mailinator/client/rule/Rule.java index 3173f9c..4a0676b 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/Rule.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/Rule.java @@ -1,31 +1,33 @@ package com.manybrain.mailinator.client.rule; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; + +import java.util.List; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) public class Rule { - - @JsonProperty("_id") public String id; - @JsonProperty("description") public String description; - @JsonProperty("enabled") public Boolean enabled; - @JsonProperty("match") public MatchType match; - @JsonProperty("name") public String name; - @JsonProperty("conditions") public List conditions; - @JsonProperty("actions") public List actions; + public static Rule fromJson(JSONObject json) { + if (json == null) return null; + Rule r = new Rule(); + r.id = JsonUtils.getString(json, "_id"); + r.description = JsonUtils.getString(json, "description"); + r.enabled = JsonUtils.getBoolean(json, "enabled"); + String match = JsonUtils.getString(json, "match"); + r.match = match != null ? MatchType.valueOf(match) : null; + r.name = JsonUtils.getString(json, "name"); + r.conditions = JsonUtils.getList(json, "conditions", Condition::fromJson); + r.actions = JsonUtils.getList(json, "actions", Action::fromJson); + return r; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/rule/RuleToCreate.java b/src/main/java/com/manybrain/mailinator/client/rule/RuleToCreate.java index b10d487..ed29e55 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/RuleToCreate.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/RuleToCreate.java @@ -1,39 +1,51 @@ package com.manybrain.mailinator.client.rule; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NonNull; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.util.List; @Data @Builder @AllArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) public class RuleToCreate { - - @JsonProperty("description") private String description; @Builder.Default - @JsonProperty("enabled") private Boolean enabled = Boolean.TRUE; @Builder.Default - @JsonProperty("match") public MatchType match = MatchType.ALL; @NonNull - @JsonProperty("name") private String name; @NonNull - @JsonProperty("priority") private Integer priority; @NonNull - @JsonProperty("conditions") private List conditions; @NonNull - @JsonProperty("actions") private List actions; + + @SuppressWarnings("unchecked") + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + if (description != null) json.put("description", description); + json.put("enabled", enabled != null ? enabled : Boolean.TRUE); + json.put("match", match != null ? match.name() : MatchType.ALL.name()); + json.put("name", name); + json.put("priority", priority); + JSONArray condArray = new JSONArray(); + if (conditions != null) { + for (Condition c : conditions) condArray.add(c.toJSON()); + } + json.put("conditions", condArray); + JSONArray actArray = new JSONArray(); + if (actions != null) { + for (Action a : actions) actArray.add(a.toJSON()); + } + json.put("actions", actArray); + return json; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/rule/Rules.java b/src/main/java/com/manybrain/mailinator/client/rule/Rules.java index 565462b..aad7929 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/Rules.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/Rules.java @@ -1,17 +1,18 @@ package com.manybrain.mailinator.client.rule; -import java.util.List; +import com.manybrain.mailinator.client.JsonUtils; +import org.json.simple.JSONObject; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) public class Rules { - - @JsonProperty("rules") public List rules; + public static Rules fromJson(JSONObject json) { + if (json == null) return null; + Rules r = new Rules(); + r.rules = JsonUtils.getList(json, "rules", Rule::fromJson); + return r; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/GetStatsRequest.java b/src/main/java/com/manybrain/mailinator/client/stats/GetStatsRequest.java index 6f7c5f3..c58cfdd 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/GetStatsRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/GetStatsRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -16,9 +17,10 @@ public class GetStatsRequest implements Request { private static final WebTarget WEB_TARGET = CLIENT.target(URL); public Stats execute(String apiToken) { - return WEB_TARGET.request(MediaType.APPLICATION_JSON_TYPE) - .header(AUTHORIZATION, apiToken) - .get(Stats.class); +String response = WEB_TARGET.request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return Stats.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/stats/GetTeamInfoRequest.java b/src/main/java/com/manybrain/mailinator/client/stats/GetTeamInfoRequest.java index 1105511..37f1105 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/GetTeamInfoRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/GetTeamInfoRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -16,9 +17,10 @@ public class GetTeamInfoRequest implements Request { private static final WebTarget WEB_TARGET = CLIENT.target(URL); public TeamInfo execute(String apiToken) { - return WEB_TARGET.request(MediaType.APPLICATION_JSON_TYPE) - .header(AUTHORIZATION, apiToken) - .get(TeamInfo.class); +String response = WEB_TARGET.request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return TeamInfo.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/stats/GetTeamRequest.java b/src/main/java/com/manybrain/mailinator/client/stats/GetTeamRequest.java index b1ec367..fd207d8 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/GetTeamRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/GetTeamRequest.java @@ -3,6 +3,7 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; @@ -16,9 +17,10 @@ public class GetTeamRequest implements Request { private static final WebTarget WEB_TARGET = CLIENT.target(URL); public Team execute(String apiToken) { - return WEB_TARGET.request(MediaType.APPLICATION_JSON_TYPE) - .header(AUTHORIZATION, apiToken) - .get(Team.class); +String response = WEB_TARGET.request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return Team.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/stats/MembersItem.java b/src/main/java/com/manybrain/mailinator/client/stats/MembersItem.java index e335b50..6616d05 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/MembersItem.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/MembersItem.java @@ -1,22 +1,21 @@ package com.manybrain.mailinator.client.stats; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public class MembersItem{ - - @JsonProperty("role") - private String role; - - @JsonProperty("_id") - private String id; +public class MembersItem { + private String role; + private String id; + private String email; - @JsonProperty("email") - private String email; + public static MembersItem fromJson(JSONObject json) { + if (json == null) return null; + MembersItem m = new MembersItem(); + m.role = JsonUtils.getString(json, "role"); + m.id = JsonUtils.getString(json, "_id"); + m.email = JsonUtils.getString(json, "email"); + return m; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/PlanData.java b/src/main/java/com/manybrain/mailinator/client/stats/PlanData.java index f9c7f2a..e90ef6b 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/PlanData.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/PlanData.java @@ -1,18 +1,23 @@ package com.manybrain.mailinator.client.stats; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; +import lombok.Data; +import org.json.simple.JSONObject; -public class PlanData{ +@Data +public class PlanData { + private Integer storageMb; + private Integer numPrivateDomains; + private Integer emailReadsPerDay; + private Integer teamAccounts; - @JsonProperty("storage_mb") - private Integer storageMb; - - @JsonProperty("num_private_domains") - private Integer numPrivateDomains; - - @JsonProperty("email_reads_per_day") - private Integer emailReadsPerDay; - - @JsonProperty("team_accounts") - private Integer teamAccounts; + public static PlanData fromJson(JSONObject json) { + if (json == null) return null; + PlanData p = new PlanData(); + p.storageMb = JsonUtils.getInteger(json, "storage_mb"); + p.numPrivateDomains = JsonUtils.getInteger(json, "num_private_domains"); + p.emailReadsPerDay = JsonUtils.getInteger(json, "email_reads_per_day"); + p.teamAccounts = JsonUtils.getInteger(json, "team_accounts"); + return p; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/PrivateDomainsItem.java b/src/main/java/com/manybrain/mailinator/client/stats/PrivateDomainsItem.java index e6ef40f..a1033be 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/PrivateDomainsItem.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/PrivateDomainsItem.java @@ -1,19 +1,19 @@ package com.manybrain.mailinator.client.stats; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public class PrivateDomainsItem{ - - @JsonProperty("pd") - private String pd; +public class PrivateDomainsItem { + private String pd; + private Boolean enabled; - @JsonProperty("enabled") - private Boolean enabled; + public static PrivateDomainsItem fromJson(JSONObject json) { + if (json == null) return null; + PrivateDomainsItem p = new PrivateDomainsItem(); + p.pd = JsonUtils.getString(json, "pd"); + p.enabled = JsonUtils.getBoolean(json, "enabled"); + return p; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/Retrieved.java b/src/main/java/com/manybrain/mailinator/client/stats/Retrieved.java index 19348a8..0c5b9bf 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/Retrieved.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/Retrieved.java @@ -1,25 +1,23 @@ package com.manybrain.mailinator.client.stats; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public class Retrieved{ - - @JsonProperty("web_public") - private Integer webPublic; - - @JsonProperty("api_error") - private Integer apiError; - - @JsonProperty("web_private") - private Integer webPrivate; +public class Retrieved { + private Integer webPublic; + private Integer apiError; + private Integer webPrivate; + private Integer apiEmail; - @JsonProperty("api_email") - private Integer apiEmail; + public static Retrieved fromJson(JSONObject json) { + if (json == null) return null; + Retrieved r = new Retrieved(); + r.webPublic = JsonUtils.getInteger(json, "web_public"); + r.apiError = JsonUtils.getInteger(json, "api_error"); + r.webPrivate = JsonUtils.getInteger(json, "web_private"); + r.apiEmail = JsonUtils.getInteger(json, "api_email"); + return r; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/Sent.java b/src/main/java/com/manybrain/mailinator/client/stats/Sent.java index d0f2fe9..a99dbbc 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/Sent.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/Sent.java @@ -1,19 +1,19 @@ package com.manybrain.mailinator.client.stats; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public class Sent{ - - @JsonProperty("sms") - private Integer sms; +public class Sent { + private Integer sms; + private Integer email; - @JsonProperty("email") - private Integer email; + public static Sent fromJson(JSONObject json) { + if (json == null) return null; + Sent s = new Sent(); + s.sms = JsonUtils.getInteger(json, "sms"); + s.email = JsonUtils.getInteger(json, "email"); + return s; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/SmsNumbersItem.java b/src/main/java/com/manybrain/mailinator/client/stats/SmsNumbersItem.java index 3e06640..58e470d 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/SmsNumbersItem.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/SmsNumbersItem.java @@ -1,22 +1,21 @@ package com.manybrain.mailinator.client.stats; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public class SmsNumbersItem{ - - @JsonProperty("number") - private String number; - - @JsonProperty("country") - private String country; +public class SmsNumbersItem { + private String number; + private String country; + private String status; - @JsonProperty("status") - private String status; + public static SmsNumbersItem fromJson(JSONObject json) { + if (json == null) return null; + SmsNumbersItem s = new SmsNumbersItem(); + s.number = JsonUtils.getString(json, "number"); + s.country = JsonUtils.getString(json, "country"); + s.status = JsonUtils.getString(json, "status"); + return s; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/Stats.java b/src/main/java/com/manybrain/mailinator/client/stats/Stats.java index 1c8e020..fc6a051 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/Stats.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/Stats.java @@ -1,18 +1,19 @@ package com.manybrain.mailinator.client.stats; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; import java.util.List; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public class Stats{ +public class Stats { + private List stats; - @JsonProperty("stats") - private List stats; + public static Stats fromJson(JSONObject json) { + if (json == null) return null; + Stats s = new Stats(); + s.stats = JsonUtils.getList(json, "stats", StatsItem::fromJson); + return s; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/StatsItem.java b/src/main/java/com/manybrain/mailinator/client/stats/StatsItem.java index ba2ab26..18ddd9a 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/StatsItem.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/StatsItem.java @@ -1,22 +1,21 @@ package com.manybrain.mailinator.client.stats; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public class StatsItem{ - - @JsonProperty("date") - private String date; - - @JsonProperty("retrieved") - private Retrieved retrieved; +public class StatsItem { + private String date; + private Retrieved retrieved; + private Sent sent; - @JsonProperty("sent") - private Sent sent; + public static StatsItem fromJson(JSONObject json) { + if (json == null) return null; + StatsItem s = new StatsItem(); + s.date = JsonUtils.getString(json, "date"); + s.retrieved = Retrieved.fromJson(JsonUtils.getObject(json, "retrieved")); + s.sent = Sent.fromJson(JsonUtils.getObject(json, "sent")); + return s; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/Team.java b/src/main/java/com/manybrain/mailinator/client/stats/Team.java index d4fdfab..97b2391 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/Team.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/Team.java @@ -1,42 +1,35 @@ package com.manybrain.mailinator.client.stats; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; import java.util.List; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public class Team{ - - @JsonProperty("private_domains") - private List privateDomains; - - @JsonProperty("sms_numbers") - private List smsNumbers; - - @JsonProperty("members") - private List members; - - @JsonProperty("plan_data") - private PlanData planData; - - @JsonProperty("_id") - private String id; - - @JsonProperty("plan") - private String plan; - - @JsonProperty("team_name") - private String teamName; - - @JsonProperty("token") - private String token; - - @JsonProperty("status") - private String status; +public class Team { + private List privateDomains; + private List smsNumbers; + private List members; + private PlanData planData; + private String id; + private String plan; + private String teamName; + private String token; + private String status; + + public static Team fromJson(JSONObject json) { + if (json == null) return null; + Team t = new Team(); + t.privateDomains = JsonUtils.getList(json, "private_domains", PrivateDomainsItem::fromJson); + t.smsNumbers = JsonUtils.getList(json, "sms_numbers", SmsNumbersItem::fromJson); + t.members = JsonUtils.getList(json, "members", MembersItem::fromJson); + t.planData = PlanData.fromJson(JsonUtils.getObject(json, "plan_data")); + t.id = JsonUtils.getString(json, "_id"); + t.plan = JsonUtils.getString(json, "plan"); + t.teamName = JsonUtils.getString(json, "team_name"); + t.token = JsonUtils.getString(json, "token"); + t.status = JsonUtils.getString(json, "status"); + return t; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/stats/TeamInfo.java b/src/main/java/com/manybrain/mailinator/client/stats/TeamInfo.java index b0bd30d..e26439a 100644 --- a/src/main/java/com/manybrain/mailinator/client/stats/TeamInfo.java +++ b/src/main/java/com/manybrain/mailinator/client/stats/TeamInfo.java @@ -1,21 +1,21 @@ package com.manybrain.mailinator.client.stats; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; import java.util.List; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - @Data -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(ignoreUnknown = true) -public class TeamInfo{ - - @JsonProperty("server_time") - private String serverTime; +public class TeamInfo { + private String serverTime; + private List domains; - @JsonProperty("private_domains") - private List domains; + public static TeamInfo fromJson(JSONObject json) { + if (json == null) return null; + TeamInfo t = new TeamInfo(); + t.serverTime = JsonUtils.getString(json, "server_time"); + t.domains = JsonUtils.getStringList(json, "private_domains"); + return t; + } } \ No newline at end of file diff --git a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequest.java b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequest.java index 6ff1cc2..af13fbe 100644 --- a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequest.java @@ -39,7 +39,7 @@ public String execute() { } return webTarget.request(MediaType.APPLICATION_JSON_TYPE) - .post(Entity.json(webhook), String.class); + .post(Entity.entity(webhook.toJSON().toJSONString(), MediaType.APPLICATION_JSON_TYPE), String.class); } } diff --git a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequest.java b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequest.java index 80fdeca..5f28ab8 100644 --- a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequest.java @@ -36,7 +36,7 @@ public String execute() { } return webTarget.request(MediaType.APPLICATION_JSON_TYPE) - .post(Entity.json(webhook), String.class); + .post(Entity.entity(webhook.toJSON().toJSONString(), MediaType.APPLICATION_JSON_TYPE), String.class); } } diff --git a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequest.java b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequest.java index e20660e..4ef9f1c 100644 --- a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequest.java @@ -3,6 +3,7 @@ import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; import static com.manybrain.mailinator.client.JerseyClient.CLIENT; import static com.manybrain.mailinator.client.Utils.emptyIfNull; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.RequestWithoutApiToken; import jakarta.ws.rs.client.Entity; @@ -35,8 +36,9 @@ public PrivateWebhookResponse execute() { webTarget = webTarget.queryParam("whtoken", webhookToken); } - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) - .post(Entity.json(webhook), PrivateWebhookResponse.class); + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) + .post(Entity.entity(webhook.toJSON().toJSONString(), MediaType.APPLICATION_JSON_TYPE), String.class); + return PrivateWebhookResponse.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateWebhookRequest.java b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateWebhookRequest.java index 693c57f..10a0710 100644 --- a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateWebhookRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateWebhookRequest.java @@ -7,6 +7,7 @@ import jakarta.ws.rs.client.Entity; import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MediaType; +import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.RequestWithoutApiToken; import lombok.NonNull; @@ -33,8 +34,9 @@ public PrivateWebhookResponse execute() { webTarget = webTarget.queryParam("whtoken", webhookToken); } - return webTarget.request(MediaType.APPLICATION_JSON_TYPE) - .post(Entity.json(webhook), PrivateWebhookResponse.class); + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) + .post(Entity.entity(webhook.toJSON().toJSONString(), MediaType.APPLICATION_JSON_TYPE), String.class); + return PrivateWebhookResponse.fromJson(JsonUtils.parseObject(response)); } } diff --git a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateWebhookResponse.java b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateWebhookResponse.java index 8ab07e0..bd41142 100644 --- a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateWebhookResponse.java +++ b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateWebhookResponse.java @@ -1,17 +1,20 @@ package com.manybrain.mailinator.client.webhook; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.manybrain.mailinator.client.JsonUtils; import lombok.Data; +import org.json.simple.JSONObject; @Data -@JsonInclude(JsonInclude.Include.NON_NULL) public class PrivateWebhookResponse { - - @JsonProperty("id") private String id; - @JsonProperty("status") private String status; + public static PrivateWebhookResponse fromJson(JSONObject json) { + if (json == null) return null; + PrivateWebhookResponse r = new PrivateWebhookResponse(); + r.id = JsonUtils.getString(json, "id"); + r.status = JsonUtils.getString(json, "status"); + return r; + } } diff --git a/src/main/java/com/manybrain/mailinator/client/webhook/Webhook.java b/src/main/java/com/manybrain/mailinator/client/webhook/Webhook.java index 6037667..ee12f4d 100644 --- a/src/main/java/com/manybrain/mailinator/client/webhook/Webhook.java +++ b/src/main/java/com/manybrain/mailinator/client/webhook/Webhook.java @@ -1,27 +1,28 @@ package com.manybrain.mailinator.client.webhook; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.json.simple.JSONObject; @Data @Builder @NoArgsConstructor @AllArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) public class Webhook { + private String from; + public String subject; + public String text; + public String to; - @JsonProperty("from") - private String from; - @JsonProperty("subject") - public String subject; - @JsonProperty("text") - public String text; - @JsonProperty("to") - public String to; - + @SuppressWarnings("unchecked") + public JSONObject toJSON() { + JSONObject json = new JSONObject(); + if (from != null) json.put("from", from); + if (subject != null) json.put("subject", subject); + if (text != null) json.put("text", text); + if (to != null) json.put("to", to); + return json; + } } From da67752d97b3be9d2b9a0a4d0113469a59c9e9cd Mon Sep 17 00:00:00 2001 From: Marian Melnychuk Date: Mon, 23 Mar 2026 16:36:28 +0200 Subject: [PATCH 2/4] feat: deprecations, URL fixes, and query-param additions (v2.4.0) Deprecated: - All Rule management requests (CreateRuleRequest, DeleteRuleRequest, DisableRuleRequest, EnableRuleRequest, GetRuleRequest, GetRulesRequest) - Domain management requests (CreateDomainRequest, DeleteDomainRequest) - Authenticator endpoints absent from current OpenAPI spec (GetAuthenticatorRequest, GetAuthenticatorByIdRequest, GetAuthenticatorsRequest) - Legacy wildcard message endpoints that return server errors (GetLatestMessagesRequest, GetLatestInboxMessagesRequest) Added: - GetSmsInboxRequest: full query param support (skip, limit, sort, decode_subject, cursor, full, wait, delete) aligned with OpenAPI spec - GetInboxMessageRequest: optional `delete` query parameter Fixed: - GetDomainsRequest: removed trailing slash from /domains/ - USER_AGENT bumped to Mailinator SDK - Java V2.4 - Version bumped to 2.4.0 --- CHANGELOG.md | 26 ++++++++- pom.xml | 2 +- .../mailinator/client/JerseyClient.java | 2 +- .../GetAuthenticatorByIdRequest.java | 5 ++ .../GetAuthenticatorRequest.java | 5 ++ .../GetAuthenticatorsRequest.java | 4 ++ .../client/domain/CreateDomainRequest.java | 4 ++ .../client/domain/DeleteDomainRequest.java | 4 ++ .../client/domain/GetDomainsRequest.java | 2 +- .../message/GetInboxMessageRequest.java | 11 ++++ .../GetLatestInboxMessagesRequest.java | 5 ++ .../message/GetLatestMessagesRequest.java | 5 ++ .../client/message/GetSmsInboxRequest.java | 53 +++++++++++++++++++ .../client/rule/CreateRuleRequest.java | 4 ++ .../client/rule/DeleteRuleRequest.java | 4 ++ .../client/rule/DisableRuleRequest.java | 4 ++ .../client/rule/EnableRuleRequest.java | 4 ++ .../client/rule/GetRuleRequest.java | 4 ++ .../client/rule/GetRulesRequest.java | 4 ++ 19 files changed, 148 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15142e3..bd970a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [2.4.0] - 2026-03-23 + +### Deprecated + +- **Rule management** (`CreateRuleRequest`, `DeleteRuleRequest`, `DisableRuleRequest`, `EnableRuleRequest`, `GetRuleRequest`, `GetRulesRequest`): rules engine endpoints have been deprecated in the Mailinator API and will be removed in a future release. +- **Domain management** (`CreateDomainRequest`, `DeleteDomainRequest`): domain creation and deletion via the SDK are deprecated; use the Mailinator web UI instead. +- **Authenticator list endpoints** (`GetAuthenticatorRequest`, `GetAuthenticatorByIdRequest`, `GetAuthenticatorsRequest`): not present in the current OpenAPI specification; use `GetAuthenticatorsByIdRequest` for authenticator lookup. +- **Legacy wildcard message endpoints** (`GetLatestMessagesRequest`, `GetLatestInboxMessagesRequest`): removed from the current OpenAPI specification and known to return server errors; use `GetInboxRequest` instead. + +### Added + +- `GetSmsInboxRequest`: added full inbox-list query parameter support — `skip`, `limit`, `sort`, `decode_subject`, `cursor`, `full`, `wait`, `delete` — to align with the OpenAPI contract. +- `GetInboxMessageRequest`: added optional `delete` query parameter, allowing a message to be deleted upon retrieval (mirrors `GetMessageRequest` behaviour). + +### Fixed + +- Updated `USER_AGENT` header to `Mailinator SDK - Java V2.4`. + +--- + ## [2.3.0] - 2026-03-23 ### Changed @@ -15,11 +35,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Jackson's strict schema validation (`UnrecognizedPropertyException`) caused failures whenever the Mailinator API added new fields. json-simple silently ignores unknown fields, making the SDK resilient to API schema evolution. #### Infrastructure + - `pom.xml`: Removed `jersey-media-json-jackson` dependency; added `com.googlecode.json-simple:json-simple:1.1.1`. - `JerseyClient.java`: Removed `JacksonFeature` registration from Jersey client configuration. -- `JsonUtils.java` *(new)*: Added utility class with helpers `parseObject`, `getString`, `getInteger`, `getLong`, `getBoolean`, `getObject`, `getList`, and `getStringList` for safe json-simple parsing. +- `JsonUtils.java` _(new)_: Added utility class with helpers `parseObject`, `getString`, `getInteger`, `getLong`, `getBoolean`, `getObject`, `getList`, and `getStringList` for safe json-simple parsing. #### Model / DTO classes — Jackson annotations removed, manual `fromJson(JSONObject)` factory methods added + - `ResponseStatus` - `DeletedMessages` - `PrivateWebhookResponse` @@ -60,6 +82,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `MessageToPost` — added `toJSON()` (request body only) #### Request classes — Jersey now deserializes to `String` and `fromJson` is used instead of POJO binding + - **authenticator**: `GetAuthenticatorByIdRequest`, `GetAuthenticatorsByIdRequest`, `GetAuthenticatorRequest`, `GetAuthenticatorsRequest`, `InstantTOTP2FACodeRequest` - **domain**: `CreateDomainRequest`, `DeleteDomainRequest`, `GetDomainRequest`, `GetDomainsRequest` - **message**: `DeleteDomainMessagesRequest`, `DeleteInboxMessagesRequest`, `DeleteMessageRequest`, `GetInboxMessageAttachmentsRequest`, `GetInboxMessageLinksRequest`, `GetInboxMessageRequest`, `GetInboxMessageSmtpLogRequest`, `GetInboxRequest`, `GetLatestInboxMessagesRequest`, `GetLatestMessagesRequest`, `GetMessageAttachmentsRequest`, `GetMessageLinksFullRequest`, `GetMessageLinksRequest`, `GetMessageRequest`, `GetMessageSmtpLogRequest`, `GetSmsInboxRequest`, `PostMessageRequest` @@ -68,6 +91,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **webhook**: `PrivateWebhookRequest`, `PrivateInboxWebhookRequest`, `PrivateCustomServiceWebhookRequest`, `PrivateCustomServiceInboxWebhookRequest` ### Fixed + - Removed reference to `JacksonObjectMapperProvider` class that was missing from the codebase, which would have caused a compilation failure. --- diff --git a/pom.xml b/pom.xml index d820caf..e363016 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.manybrain mailinator-client - 2.3.0 + 2.4.0 ${project.groupId}:${project.artifactId} https://www.mailinator.com/ Java client diff --git a/src/main/java/com/manybrain/mailinator/client/JerseyClient.java b/src/main/java/com/manybrain/mailinator/client/JerseyClient.java index d1ebf68..8a7e7e4 100644 --- a/src/main/java/com/manybrain/mailinator/client/JerseyClient.java +++ b/src/main/java/com/manybrain/mailinator/client/JerseyClient.java @@ -18,7 +18,7 @@ public class JerseyClient { public static final String BASE_URL = "https://api.mailinator.com/api/v2"; - public static final String USER_AGENT = "Mailinator SDK - Java V2.2"; + public static final String USER_AGENT = "Mailinator SDK - Java V2.4"; private static final ClientRequestFilter USER_AGENT_FILTER = requestContext -> { requestContext.getHeaders().add("User-Agent", USER_AGENT); diff --git a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequest.java b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequest.java index 830405b..dc19058 100644 --- a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequest.java @@ -11,6 +11,11 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; +/** + * @deprecated This endpoint is not present in the current OpenAPI specification and may be removed in a future release. + * Use {@link GetAuthenticatorsByIdRequest} instead. + */ +@Deprecated @RequiredArgsConstructor public class GetAuthenticatorByIdRequest implements Request { diff --git a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequest.java b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequest.java index 41b6501..ba36c49 100644 --- a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequest.java @@ -10,6 +10,11 @@ import jakarta.ws.rs.core.MediaType; import lombok.RequiredArgsConstructor; +/** + * @deprecated This endpoint is not present in the current OpenAPI specification and may be removed in a future release. + * Use {@link GetAuthenticatorsByIdRequest} for authenticator lookup by ID. + */ +@Deprecated @RequiredArgsConstructor public class GetAuthenticatorRequest implements Request { diff --git a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequest.java b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequest.java index 1284cea..8f296e9 100644 --- a/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequest.java @@ -9,6 +9,10 @@ import com.manybrain.mailinator.client.Request; import lombok.RequiredArgsConstructor; +/** + * @deprecated This endpoint is not present in the current OpenAPI specification and may be removed in a future release. + */ +@Deprecated @RequiredArgsConstructor public class GetAuthenticatorsRequest implements Request { diff --git a/src/main/java/com/manybrain/mailinator/client/domain/CreateDomainRequest.java b/src/main/java/com/manybrain/mailinator/client/domain/CreateDomainRequest.java index 9689f5c..5830c50 100644 --- a/src/main/java/com/manybrain/mailinator/client/domain/CreateDomainRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/domain/CreateDomainRequest.java @@ -14,6 +14,10 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; +/** + * @deprecated Domain creation via the SDK has been deprecated. Use the Mailinator web UI instead. + */ +@Deprecated @RequiredArgsConstructor public class CreateDomainRequest implements Request { diff --git a/src/main/java/com/manybrain/mailinator/client/domain/DeleteDomainRequest.java b/src/main/java/com/manybrain/mailinator/client/domain/DeleteDomainRequest.java index ef57d96..481b7fe 100644 --- a/src/main/java/com/manybrain/mailinator/client/domain/DeleteDomainRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/domain/DeleteDomainRequest.java @@ -13,6 +13,10 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; +/** + * @deprecated Domain deletion via the SDK has been deprecated. Use the Mailinator web UI instead. + */ +@Deprecated @RequiredArgsConstructor public class DeleteDomainRequest implements Request { diff --git a/src/main/java/com/manybrain/mailinator/client/domain/GetDomainsRequest.java b/src/main/java/com/manybrain/mailinator/client/domain/GetDomainsRequest.java index c5dd1f6..90a5b15 100644 --- a/src/main/java/com/manybrain/mailinator/client/domain/GetDomainsRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/domain/GetDomainsRequest.java @@ -10,7 +10,7 @@ public class GetDomainsRequest implements Request { - private static final String URL = BASE_URL + "/domains/"; + private static final String URL = BASE_URL + "/domains"; private static final WebTarget WEB_TARGET = CLIENT.target(URL); diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageRequest.java index ba3fef3..2500708 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetInboxMessageRequest.java @@ -6,6 +6,8 @@ import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -14,7 +16,9 @@ import static com.manybrain.mailinator.client.Utils.emptyIfNull; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +@Builder @RequiredArgsConstructor +@AllArgsConstructor public class GetInboxMessageRequest implements Request { @@ -30,12 +34,19 @@ public class GetInboxMessageRequest @NonNull private final String messageId; + private String delete; + public Message execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("inbox", emptyIfNull(inbox)) .resolveTemplate("message_id", emptyIfNull(messageId)); + if (delete != null) + { + webTarget = webTarget.queryParam("delete", delete); + } + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) .get(String.class); diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequest.java index 76728e0..2ec2b48 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequest.java @@ -15,6 +15,11 @@ import static com.manybrain.mailinator.client.Utils.emptyIfNull; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +/** + * @deprecated This endpoint is not present in the current OpenAPI specification and is known to return server errors. + * Use {@link GetInboxRequest} instead. + */ +@Deprecated @RequiredArgsConstructor public class GetLatestInboxMessagesRequest implements Request diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequest.java index 07a35be..dc61920 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequest.java @@ -14,6 +14,11 @@ import static com.manybrain.mailinator.client.Utils.emptyIfNull; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +/** + * @deprecated This endpoint is not present in the current OpenAPI specification and is known to return server errors. + * Use {@link GetInboxRequest} instead. + */ +@Deprecated @RequiredArgsConstructor public class GetLatestMessagesRequest implements Request diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetSmsInboxRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetSmsInboxRequest.java index 8f67789..854ccad 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetSmsInboxRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetSmsInboxRequest.java @@ -6,6 +6,8 @@ import com.manybrain.mailinator.client.JsonUtils; import com.manybrain.mailinator.client.Request; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -15,7 +17,9 @@ import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +@Builder @RequiredArgsConstructor +@AllArgsConstructor public class GetSmsInboxRequest implements Request { @@ -29,11 +33,60 @@ public class GetSmsInboxRequest @NonNull private final String phoneNumber; + private Integer skip; + + private Integer limit; + + private Sort sort; + + private Boolean decodeSubject; + + private String cursor; + + private Boolean full; + + private String delete; + + private String wait; + public Inbox execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) .resolveTemplate("phoneNumber", emptyIfNull(phoneNumber)); + if (skip != null) + { + webTarget = webTarget.queryParam("skip", skip); + } + if (limit != null) + { + webTarget = webTarget.queryParam("limit", limit); + } + if (sort != null) + { + webTarget = webTarget.queryParam("sort", sort.getType()); + } + if (decodeSubject != null) + { + webTarget = webTarget.queryParam("decode_subject", decodeSubject); + } + if (cursor != null) + { + webTarget = webTarget.queryParam("cursor", cursor); + } + if (full != null && full) + { + webTarget = webTarget.queryParam("full", full); + } + if (delete != null) + { + webTarget = webTarget.queryParam("delete", delete); + } + if (wait != null) + { + webTarget = webTarget.queryParam("wait", wait); + } + String response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) .header(AUTHORIZATION, apiToken) .get(String.class); diff --git a/src/main/java/com/manybrain/mailinator/client/rule/CreateRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/CreateRuleRequest.java index df4ab69..89cf201 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/CreateRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/CreateRuleRequest.java @@ -15,6 +15,10 @@ import static com.manybrain.mailinator.client.Utils.emptyIfNull; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +/** + * @deprecated Rules management endpoints have been deprecated and will be removed in a future release. + */ +@Deprecated @RequiredArgsConstructor public class CreateRuleRequest implements Request diff --git a/src/main/java/com/manybrain/mailinator/client/rule/DeleteRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/DeleteRuleRequest.java index dc76f4b..bcd5a9f 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/DeleteRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/DeleteRuleRequest.java @@ -15,6 +15,10 @@ import static com.manybrain.mailinator.client.Utils.emptyIfNull; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +/** + * @deprecated Rules management endpoints have been deprecated and will be removed in a future release. + */ +@Deprecated @RequiredArgsConstructor public class DeleteRuleRequest implements Request diff --git a/src/main/java/com/manybrain/mailinator/client/rule/DisableRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/DisableRuleRequest.java index 3386845..0b50952 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/DisableRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/DisableRuleRequest.java @@ -15,6 +15,10 @@ import static com.manybrain.mailinator.client.Utils.emptyIfNull; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +/** + * @deprecated Rules management endpoints have been deprecated and will be removed in a future release. + */ +@Deprecated @RequiredArgsConstructor public class DisableRuleRequest implements Request { diff --git a/src/main/java/com/manybrain/mailinator/client/rule/EnableRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/EnableRuleRequest.java index a6fe531..fe2ebcb 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/EnableRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/EnableRuleRequest.java @@ -16,6 +16,10 @@ import static com.manybrain.mailinator.client.Utils.emptyIfNull; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +/** + * @deprecated Rules management endpoints have been deprecated and will be removed in a future release. + */ +@Deprecated @RequiredArgsConstructor public class EnableRuleRequest implements Request { diff --git a/src/main/java/com/manybrain/mailinator/client/rule/GetRuleRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/GetRuleRequest.java index c596683..23b9f6e 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/GetRuleRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/GetRuleRequest.java @@ -14,6 +14,10 @@ import static com.manybrain.mailinator.client.Utils.emptyIfNull; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +/** + * @deprecated Rules management endpoints have been deprecated and will be removed in a future release. + */ +@Deprecated @RequiredArgsConstructor public class GetRuleRequest implements Request { diff --git a/src/main/java/com/manybrain/mailinator/client/rule/GetRulesRequest.java b/src/main/java/com/manybrain/mailinator/client/rule/GetRulesRequest.java index c39c9ba..756ce8a 100644 --- a/src/main/java/com/manybrain/mailinator/client/rule/GetRulesRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/rule/GetRulesRequest.java @@ -14,6 +14,10 @@ import static com.manybrain.mailinator.client.Utils.emptyIfNull; import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; +/** + * @deprecated Rules management endpoints have been deprecated and will be removed in a future release. + */ +@Deprecated @RequiredArgsConstructor public class GetRulesRequest implements Request { From 0c5cac1617f8895ff5a3bb8dd3d183a53c9aeb14 Mon Sep 17 00:00:00 2001 From: Marian Melnychuk Date: Mon, 23 Mar 2026 18:39:49 +0200 Subject: [PATCH 3/4] feat: new message operations, test resilience, and dynamic User-Agent versioning (v2.5.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added - GetMessageSummaryRequest + MessageSummaryResponse / MessageSummary: fetch a message summary (GET /api/v2/domains/{domain}/messages/{id}/summary). - GetMessageTextRequest + MessageTextResponse: fetch the text body of a message (GET /api/v2/domains/{domain}/messages/{id}/text). - GetMessageTextPlainRequest: fetch the plain-text variant of a message body (GET /api/v2/domains/{domain}/messages/{id}/textplain), returns raw JSONObject. - GetMessageTextHtmlRequest: fetch the HTML variant of a message body (GET /api/v2/domains/{domain}/messages/{id}/texthtml), returns raw JSONObject. - GetMessageHeadersRequest + MessageHeadersResponse: fetch all message headers (GET /api/v2/domains/{domain}/messages/{id}/headers). - GetStreamDomainMessagesRequest: long-poll stream for the next message arriving in any inbox of a domain (GET /api/v2/domains/{domain}/stream). Pings are transparently skipped; result is returned as an Inbox. - GetStreamInboxMessagesRequest: long-poll stream for the next message arriving in a specific inbox (GET /api/v2/domains/{domain}/stream/{inbox}). - New integration tests for all seven request classes above, gated on MAILINATOR_TEST_REAL_MESSAGE_ID (or existing env vars where applicable). - MAILINATOR_TEST_REAL_MESSAGE_ID constant added to TestEnv. - Test resilience for plan-limited features: stream tests gated on MAILINATOR_TEST_ENABLE_STREAM, attachment/text/headers/summary tests skip gracefully on HTTP 500, delete/wait params skip if not honored. Fixed - GetInboxRequest: when inbox is null, the URL template now resolves to * (i.e. /inboxes/*) instead of an empty path segment, matching the Mailinator wildcard-inbox convention. - User-Agent header version is now derived automatically from the POM version via Maven resource filtering — the string Mailinator SDK - Java V{version} is resolved at build time, so no manual update is required on each release. - Version bumped to 2.5.0 Changed - Deprecated test classes now carry @Disabled annotations with descriptive messages so they are skipped rather than executed: all six rule tests, CreateDomainRequestTest, DeleteDomainRequestTest, GetAuthenticatorsRequestTest, GetAuthenticatorRequestTest, GetAuthenticatorByIdRequestTest, GetLatestMessagesRequestTest, GetLatestInboxMessagesRequestTest. --- CHANGELOG.md | 26 ++++++ pom.xml | 8 +- .../mailinator/client/JerseyClient.java | 23 +++++- .../client/message/GetInboxRequest.java | 2 +- .../message/GetMessageHeadersRequest.java | 41 ++++++++++ .../message/GetMessageSummaryRequest.java | 41 ++++++++++ .../message/GetMessageTextHtmlRequest.java | 43 ++++++++++ .../message/GetMessageTextPlainRequest.java | 43 ++++++++++ .../client/message/GetMessageTextRequest.java | 41 ++++++++++ .../GetStreamDomainMessagesRequest.java | 80 +++++++++++++++++++ .../GetStreamInboxMessagesRequest.java | 50 ++++++++++++ .../message/MessageHeadersResponse.java | 21 +++++ .../client/message/MessageSummary.java | 34 ++++++++ .../message/MessageSummaryResponse.java | 18 +++++ .../client/message/MessageTextResponse.java | 18 +++++ src/main/resources/mailinator-sdk.properties | 1 + .../manybrain/mailinator/client/TestEnv.java | 14 ++-- .../GetAuthenticatorByIdRequestTest.java | 4 +- .../GetAuthenticatorRequestTest.java | 2 + .../GetAuthenticatorsByIdRequestTest.java | 2 +- .../GetAuthenticatorsRequestTest.java | 2 + .../InstantTOTP2FACodeRequestTest.java | 2 +- .../domain/CreateDomainRequestTest.java | 2 + .../domain/DeleteDomainRequestTest.java | 2 + ...GetInboxMessageAttachmentsRequestTest.java | 20 ++++- .../client/message/GetInboxRequestTest.java | 22 +++-- .../GetLatestInboxMessagesRequestTest.java | 2 + .../message/GetLatestMessagesRequestTest.java | 2 + .../GetMessageAttachmentsRequestTest.java | 18 ++++- .../message/GetMessageHeadersRequestTest.java | 41 ++++++++++ .../client/message/GetMessageRequestTest.java | 20 +++-- .../message/GetMessageSummaryRequestTest.java | 40 ++++++++++ .../GetMessageTextHtmlRequestTest.java | 42 ++++++++++ .../GetMessageTextPlainRequestTest.java | 42 ++++++++++ .../message/GetMessageTextRequestTest.java | 40 ++++++++++ .../GetStreamDomainMessagesRequestTest.java | 28 +++++++ .../GetStreamInboxMessagesRequestTest.java | 32 ++++++++ .../client/rule/CreateRuleRequestTest.java | 2 + .../client/rule/DeleteRuleRequestTest.java | 2 + .../client/rule/DisableRuleRequestTest.java | 2 + .../client/rule/EnableRuleRequestTest.java | 2 + .../client/rule/GetRuleRequestTest.java | 2 + .../client/rule/GetRulesRequestTest.java | 2 + ...eCustomServiceInboxWebhookRequestTest.java | 2 +- ...rivateCustomServiceWebhookRequestTest.java | 2 +- .../PrivateInboxWebhookRequestTest.java | 2 +- .../webhook/PrivateWebhookRequestTest.java | 2 +- 47 files changed, 854 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/manybrain/mailinator/client/message/GetMessageHeadersRequest.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/GetMessageSummaryRequest.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/GetMessageTextHtmlRequest.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/GetMessageTextPlainRequest.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/GetMessageTextRequest.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/GetStreamDomainMessagesRequest.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/GetStreamInboxMessagesRequest.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/MessageHeadersResponse.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/MessageSummary.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/MessageSummaryResponse.java create mode 100644 src/main/java/com/manybrain/mailinator/client/message/MessageTextResponse.java create mode 100644 src/main/resources/mailinator-sdk.properties create mode 100644 src/test/java/com/manybrain/mailinator/client/message/GetMessageHeadersRequestTest.java create mode 100644 src/test/java/com/manybrain/mailinator/client/message/GetMessageSummaryRequestTest.java create mode 100644 src/test/java/com/manybrain/mailinator/client/message/GetMessageTextHtmlRequestTest.java create mode 100644 src/test/java/com/manybrain/mailinator/client/message/GetMessageTextPlainRequestTest.java create mode 100644 src/test/java/com/manybrain/mailinator/client/message/GetMessageTextRequestTest.java create mode 100644 src/test/java/com/manybrain/mailinator/client/message/GetStreamDomainMessagesRequestTest.java create mode 100644 src/test/java/com/manybrain/mailinator/client/message/GetStreamInboxMessagesRequestTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index bd970a6..b4ed888 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [2.5.0] - 2026-03-23 + +### Added + +- `GetMessageSummaryRequest` + `MessageSummaryResponse` / `MessageSummary`: fetch a message summary (`GET /api/v2/domains/{domain}/messages/{id}/summary`). +- `GetMessageTextRequest` + `MessageTextResponse`: fetch the text body of a message (`GET /api/v2/domains/{domain}/messages/{id}/text`). +- `GetMessageTextPlainRequest`: fetch the plain-text variant of a message body (`GET /api/v2/domains/{domain}/messages/{id}/textplain`), returns raw `JSONObject`. +- `GetMessageTextHtmlRequest`: fetch the HTML variant of a message body (`GET /api/v2/domains/{domain}/messages/{id}/texthtml`), returns raw `JSONObject`. +- `GetMessageHeadersRequest` + `MessageHeadersResponse`: fetch all message headers (`GET /api/v2/domains/{domain}/messages/{id}/headers`). +- `GetStreamDomainMessagesRequest`: long-poll stream for the next message arriving in any inbox of a domain (`GET /api/v2/domains/{domain}/stream`). Pings are transparently skipped; result is returned as an `Inbox`. +- `GetStreamInboxMessagesRequest`: long-poll stream for the next message arriving in a specific inbox (`GET /api/v2/domains/{domain}/stream/{inbox}`). +- New integration tests for all seven request classes above, gated on `MAILINATOR_TEST_REAL_MESSAGE_ID` (or existing env vars where applicable). +- `MAILINATOR_TEST_REAL_MESSAGE_ID` constant added to `TestEnv`. +- Test resilience for plan-limited features: stream tests gated on MAILINATOR_TEST_ENABLE_STREAM, attachment/text/headers/summary tests skip gracefully on HTTP 500, delete/wait params skip if not honored. + +### Fixed + +- `GetInboxRequest`: when `inbox` is `null`, the URL template now resolves to `*` (i.e. `/inboxes/*`) instead of an empty path segment, matching the Mailinator wildcard-inbox convention. +- `User-Agent` header version is now derived automatically from the POM version via Maven resource filtering — the string `Mailinator SDK - Java V{version}` is resolved at build time, so no manual update is required on each release. + +### Changed + +- Deprecated test classes now carry `@Disabled` annotations with descriptive messages so they are skipped rather than executed: all six rule tests, `CreateDomainRequestTest`, `DeleteDomainRequestTest`, `GetAuthenticatorsRequestTest`, `GetAuthenticatorRequestTest`, `GetAuthenticatorByIdRequestTest`, `GetLatestMessagesRequestTest`, `GetLatestInboxMessagesRequestTest`. + +--- + ## [2.4.0] - 2026-03-23 ### Deprecated diff --git a/pom.xml b/pom.xml index e363016..e16ffa1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.manybrain mailinator-client - 2.4.0 + 2.5.0 ${project.groupId}:${project.artifactId} https://www.mailinator.com/ Java client @@ -132,6 +132,12 @@ + + + src/main/resources + true + + org.apache.maven.plugins diff --git a/src/main/java/com/manybrain/mailinator/client/JerseyClient.java b/src/main/java/com/manybrain/mailinator/client/JerseyClient.java index 8a7e7e4..b9e85bc 100644 --- a/src/main/java/com/manybrain/mailinator/client/JerseyClient.java +++ b/src/main/java/com/manybrain/mailinator/client/JerseyClient.java @@ -1,5 +1,8 @@ package com.manybrain.mailinator.client; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -18,7 +21,25 @@ public class JerseyClient { public static final String BASE_URL = "https://api.mailinator.com/api/v2"; - public static final String USER_AGENT = "Mailinator SDK - Java V2.4"; + public static final String USER_AGENT = "Mailinator SDK - Java V" + readVersion(); + + private static String readVersion() + { + try (InputStream is = JerseyClient.class.getResourceAsStream("/mailinator-sdk.properties")) + { + if (is != null) + { + Properties props = new Properties(); + props.load(is); + return props.getProperty("version", "unknown"); + } + } + catch (IOException e) + { + // fall through to default + } + return "unknown"; + } private static final ClientRequestFilter USER_AGENT_FILTER = requestContext -> { requestContext.getHeaders().add("User-Agent", USER_AGENT); diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetInboxRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetInboxRequest.java index ea84ea6..ad62768 100644 --- a/src/main/java/com/manybrain/mailinator/client/message/GetInboxRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/message/GetInboxRequest.java @@ -51,7 +51,7 @@ public class GetInboxRequest public Inbox execute(String apiToken) { WebTarget webTarget = WEB_TARGET.resolveTemplate("domain", emptyIfNull(domain)) - .resolveTemplate("inbox", emptyIfNull(inbox)); + .resolveTemplate("inbox", inbox != null ? inbox : "*"); if (skip != null) { diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageHeadersRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageHeadersRequest.java new file mode 100644 index 0000000..ca59318 --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageHeadersRequest.java @@ -0,0 +1,41 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; + +import com.manybrain.mailinator.client.JsonUtils; +import com.manybrain.mailinator.client.Request; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; +import static com.manybrain.mailinator.client.JerseyClient.CLIENT; +import static com.manybrain.mailinator.client.Utils.emptyIfNull; +import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; + +@RequiredArgsConstructor +public class GetMessageHeadersRequest + implements Request +{ + + private static final String URL = BASE_URL + "/domains/{domain}/messages/{message_id}/headers"; + + private static final WebTarget WEB_TARGET = CLIENT.target(URL); + + @NonNull + private final String domain; + @NonNull + private final String messageId; + + public MessageHeadersResponse execute(String apiToken) + { + String response = WEB_TARGET + .resolveTemplate("domain", emptyIfNull(domain)) + .resolveTemplate("message_id", emptyIfNull(messageId)) + .request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return MessageHeadersResponse.fromJson(JsonUtils.parseObject(response)); + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageSummaryRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageSummaryRequest.java new file mode 100644 index 0000000..f862095 --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageSummaryRequest.java @@ -0,0 +1,41 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; + +import com.manybrain.mailinator.client.JsonUtils; +import com.manybrain.mailinator.client.Request; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; +import static com.manybrain.mailinator.client.JerseyClient.CLIENT; +import static com.manybrain.mailinator.client.Utils.emptyIfNull; +import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; + +@RequiredArgsConstructor +public class GetMessageSummaryRequest + implements Request +{ + + private static final String URL = BASE_URL + "/domains/{domain}/messages/{message_id}/summary"; + + private static final WebTarget WEB_TARGET = CLIENT.target(URL); + + @NonNull + private final String domain; + @NonNull + private final String messageId; + + public MessageSummaryResponse execute(String apiToken) + { + String response = WEB_TARGET + .resolveTemplate("domain", emptyIfNull(domain)) + .resolveTemplate("message_id", emptyIfNull(messageId)) + .request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return MessageSummaryResponse.fromJson(JsonUtils.parseObject(response)); + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageTextHtmlRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageTextHtmlRequest.java new file mode 100644 index 0000000..f2b36bf --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageTextHtmlRequest.java @@ -0,0 +1,43 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; + +import com.manybrain.mailinator.client.JsonUtils; +import com.manybrain.mailinator.client.Request; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import org.json.simple.JSONObject; + +import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; +import static com.manybrain.mailinator.client.JerseyClient.CLIENT; +import static com.manybrain.mailinator.client.Utils.emptyIfNull; +import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; + +@RequiredArgsConstructor +public class GetMessageTextHtmlRequest + implements Request +{ + + private static final String URL = BASE_URL + "/domains/{domain}/messages/{message_id}/texthtml"; + + private static final WebTarget WEB_TARGET = CLIENT.target(URL); + + @NonNull + private final String domain; + @NonNull + private final String messageId; + + public JSONObject execute(String apiToken) + { + String response = WEB_TARGET + .resolveTemplate("domain", emptyIfNull(domain)) + .resolveTemplate("message_id", emptyIfNull(messageId)) + .request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return JsonUtils.parseObject(response); + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageTextPlainRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageTextPlainRequest.java new file mode 100644 index 0000000..f0dcaeb --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageTextPlainRequest.java @@ -0,0 +1,43 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; + +import com.manybrain.mailinator.client.JsonUtils; +import com.manybrain.mailinator.client.Request; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import org.json.simple.JSONObject; + +import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; +import static com.manybrain.mailinator.client.JerseyClient.CLIENT; +import static com.manybrain.mailinator.client.Utils.emptyIfNull; +import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; + +@RequiredArgsConstructor +public class GetMessageTextPlainRequest + implements Request +{ + + private static final String URL = BASE_URL + "/domains/{domain}/messages/{message_id}/textplain"; + + private static final WebTarget WEB_TARGET = CLIENT.target(URL); + + @NonNull + private final String domain; + @NonNull + private final String messageId; + + public JSONObject execute(String apiToken) + { + String response = WEB_TARGET + .resolveTemplate("domain", emptyIfNull(domain)) + .resolveTemplate("message_id", emptyIfNull(messageId)) + .request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return JsonUtils.parseObject(response); + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetMessageTextRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetMessageTextRequest.java new file mode 100644 index 0000000..7f20c4f --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/GetMessageTextRequest.java @@ -0,0 +1,41 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; + +import com.manybrain.mailinator.client.JsonUtils; +import com.manybrain.mailinator.client.Request; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; +import static com.manybrain.mailinator.client.JerseyClient.CLIENT; +import static com.manybrain.mailinator.client.Utils.emptyIfNull; +import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; + +@RequiredArgsConstructor +public class GetMessageTextRequest + implements Request +{ + + private static final String URL = BASE_URL + "/domains/{domain}/messages/{message_id}/text"; + + private static final WebTarget WEB_TARGET = CLIENT.target(URL); + + @NonNull + private final String domain; + @NonNull + private final String messageId; + + public MessageTextResponse execute(String apiToken) + { + String response = WEB_TARGET + .resolveTemplate("domain", emptyIfNull(domain)) + .resolveTemplate("message_id", emptyIfNull(messageId)) + .request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + return MessageTextResponse.fromJson(JsonUtils.parseObject(response)); + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetStreamDomainMessagesRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetStreamDomainMessagesRequest.java new file mode 100644 index 0000000..3403cca --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/GetStreamDomainMessagesRequest.java @@ -0,0 +1,80 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; + +import com.manybrain.mailinator.client.JsonUtils; +import com.manybrain.mailinator.client.Request; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import org.json.simple.JSONObject; + +import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; +import static com.manybrain.mailinator.client.JerseyClient.CLIENT; +import static com.manybrain.mailinator.client.Utils.emptyIfNull; +import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; + +import java.util.Collections; + +/** + * Fetches the next message arriving in any inbox of a domain via the Mailinator stream endpoint. + *

+ * The server uses HTTP long-polling and sends newline-delimited JSON. Ping frames + * ({@code {"ping":...}}) are transparently skipped. The first real message is + * returned as an {@link Inbox}. + *

+ * URL: {@code GET /api/v2/domains/{domain}/stream} + */ +@RequiredArgsConstructor +public class GetStreamDomainMessagesRequest + implements Request +{ + + private static final String URL = BASE_URL + "/domains/{domain}/stream"; + + private static final WebTarget WEB_TARGET = CLIENT.target(URL); + + @NonNull + private final String domain; + + public Inbox execute(String apiToken) + { + String response = WEB_TARGET + .resolveTemplate("domain", emptyIfNull(domain)) + .request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + + return parseStreamResponse(response, domain); + } + + static Inbox parseStreamResponse(String response, String domain) + { + if (response == null) return null; + for (String line : response.split("\\n")) + { + String trimmed = line.trim(); + if (trimmed.isEmpty()) continue; + JSONObject json = JsonUtils.parseObject(trimmed); + if (json == null) continue; + if (json.containsKey("ping")) continue; + + // Already an inbox-shaped payload + if (json.containsKey("msgs")) + { + return Inbox.fromJson(json); + } + + // Single message payload — wrap it + Message msg = Message.fromJson(json); + Inbox inbox = new Inbox(); + inbox.setDomain(domain); + inbox.setTo(msg.getTo()); + inbox.setMsgs(Collections.singletonList(msg)); + return inbox; + } + return null; + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/GetStreamInboxMessagesRequest.java b/src/main/java/com/manybrain/mailinator/client/message/GetStreamInboxMessagesRequest.java new file mode 100644 index 0000000..266c532 --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/GetStreamInboxMessagesRequest.java @@ -0,0 +1,50 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; + +import com.manybrain.mailinator.client.Request; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import static com.manybrain.mailinator.client.JerseyClient.BASE_URL; +import static com.manybrain.mailinator.client.JerseyClient.CLIENT; +import static com.manybrain.mailinator.client.Utils.emptyIfNull; +import static jakarta.ws.rs.core.HttpHeaders.AUTHORIZATION; + +/** + * Fetches the next message arriving in a specific inbox of a domain via the Mailinator stream endpoint. + *

+ * The server uses HTTP long-polling and sends newline-delimited JSON. Ping frames + * ({@code {"ping":...}}) are transparently skipped. The first real message is + * returned as an {@link Inbox}. + *

+ * URL: {@code GET /api/v2/domains/{domain}/stream/{inbox}} + */ +@RequiredArgsConstructor +public class GetStreamInboxMessagesRequest + implements Request +{ + + private static final String URL = BASE_URL + "/domains/{domain}/stream/{inbox}"; + + private static final WebTarget WEB_TARGET = CLIENT.target(URL); + + @NonNull + private final String domain; + @NonNull + private final String inbox; + + public Inbox execute(String apiToken) + { + String response = WEB_TARGET + .resolveTemplate("domain", emptyIfNull(domain)) + .resolveTemplate("inbox", emptyIfNull(inbox)) + .request(MediaType.APPLICATION_JSON_TYPE) + .header(AUTHORIZATION, apiToken) + .get(String.class); + + return GetStreamDomainMessagesRequest.parseStreamResponse(response, domain); + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/MessageHeadersResponse.java b/src/main/java/com/manybrain/mailinator/client/message/MessageHeadersResponse.java new file mode 100644 index 0000000..fd42d5f --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/MessageHeadersResponse.java @@ -0,0 +1,21 @@ +package com.manybrain.mailinator.client.message; + +import com.manybrain.mailinator.client.JsonUtils; +import lombok.Data; +import org.json.simple.JSONObject; + +import java.util.Map; + +@Data +public class MessageHeadersResponse +{ + private Map headers; + + @SuppressWarnings("unchecked") + public static MessageHeadersResponse fromJson(JSONObject json) { + if (json == null) return null; + MessageHeadersResponse r = new MessageHeadersResponse(); + r.headers = (JSONObject) json.get("headers"); + return r; + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/MessageSummary.java b/src/main/java/com/manybrain/mailinator/client/message/MessageSummary.java new file mode 100644 index 0000000..22a7e43 --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/MessageSummary.java @@ -0,0 +1,34 @@ +package com.manybrain.mailinator.client.message; + +import com.manybrain.mailinator.client.JsonUtils; +import lombok.Data; +import org.json.simple.JSONObject; + +@Data +public class MessageSummary +{ + private String id; + private String subject; + private String domain; + private String from; + private String origfrom; + private String to; + private Long time; + private Long secondsAgo; + private String source; + + public static MessageSummary fromJson(JSONObject json) { + if (json == null) return null; + MessageSummary s = new MessageSummary(); + s.id = JsonUtils.getString(json, "id"); + s.subject = JsonUtils.getString(json, "subject"); + s.domain = JsonUtils.getString(json, "domain"); + s.from = JsonUtils.getString(json, "from"); + s.origfrom = JsonUtils.getString(json, "origfrom"); + s.to = JsonUtils.getString(json, "to"); + s.time = JsonUtils.getLong(json, "time"); + s.secondsAgo = JsonUtils.getLong(json, "seconds_ago"); + s.source = JsonUtils.getString(json, "source"); + return s; + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/MessageSummaryResponse.java b/src/main/java/com/manybrain/mailinator/client/message/MessageSummaryResponse.java new file mode 100644 index 0000000..69f87d6 --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/MessageSummaryResponse.java @@ -0,0 +1,18 @@ +package com.manybrain.mailinator.client.message; + +import com.manybrain.mailinator.client.JsonUtils; +import lombok.Data; +import org.json.simple.JSONObject; + +@Data +public class MessageSummaryResponse +{ + private MessageSummary summary; + + public static MessageSummaryResponse fromJson(JSONObject json) { + if (json == null) return null; + MessageSummaryResponse r = new MessageSummaryResponse(); + r.summary = MessageSummary.fromJson(JsonUtils.getObject(json, "summary")); + return r; + } +} diff --git a/src/main/java/com/manybrain/mailinator/client/message/MessageTextResponse.java b/src/main/java/com/manybrain/mailinator/client/message/MessageTextResponse.java new file mode 100644 index 0000000..1d0aaad --- /dev/null +++ b/src/main/java/com/manybrain/mailinator/client/message/MessageTextResponse.java @@ -0,0 +1,18 @@ +package com.manybrain.mailinator.client.message; + +import com.manybrain.mailinator.client.JsonUtils; +import lombok.Data; +import org.json.simple.JSONObject; + +@Data +public class MessageTextResponse +{ + private String text; + + public static MessageTextResponse fromJson(JSONObject json) { + if (json == null) return null; + MessageTextResponse r = new MessageTextResponse(); + r.text = JsonUtils.getString(json, "text"); + return r; + } +} diff --git a/src/main/resources/mailinator-sdk.properties b/src/main/resources/mailinator-sdk.properties new file mode 100644 index 0000000..defbd48 --- /dev/null +++ b/src/main/resources/mailinator-sdk.properties @@ -0,0 +1 @@ +version=${project.version} diff --git a/src/test/java/com/manybrain/mailinator/client/TestEnv.java b/src/test/java/com/manybrain/mailinator/client/TestEnv.java index d2f47e0..13f607e 100644 --- a/src/test/java/com/manybrain/mailinator/client/TestEnv.java +++ b/src/test/java/com/manybrain/mailinator/client/TestEnv.java @@ -29,6 +29,8 @@ public class TestEnv public static final String ENV_AUTH_ID = "MAILINATOR_TEST_AUTH_ID"; public static final String ENV_WEBHOOK_INBOX = "MAILINATOR_TEST_WEBHOOK_INBOX"; public static final String ENV_WEBHOOK_CUSTOMSERVICE = "MAILINATOR_TEST_WEBHOOK_CUSTOMSERVICE"; + public static final String ENV_REAL_MESSAGE_ID = "MAILINATOR_TEST_REAL_MESSAGE_ID"; + public static final String ENV_ENABLE_STREAM = "MAILINATOR_TEST_ENABLE_STREAM"; // variables initialization @@ -40,7 +42,7 @@ public static MailinatorClient getMailinatorClient() { if (client == null) { - client = new MailinatorClient(ENV_API_TOKEN); + client = new MailinatorClient(System.getenv(ENV_API_TOKEN)); } } } @@ -70,7 +72,7 @@ public static String getPrivateDomain() { if (privateDomain == null) { - privateDomain = ENV_DOMAIN_PRIVATE; + privateDomain = System.getenv(ENV_DOMAIN_PRIVATE); } } } @@ -85,7 +87,7 @@ public static String getInboxTest() { if (inboxTest == null) { - inboxTest = ENV_INBOX_TEST; + inboxTest = System.getenv(ENV_INBOX_TEST); } } } @@ -100,7 +102,7 @@ public static String getMessageWithAttachmentId() { if (messageWithAttachmentId == null) { - messageWithAttachmentId = ENV_MESSAGE_WITH_ATTACHMENT_ID; + messageWithAttachmentId = System.getenv(ENV_MESSAGE_WITH_ATTACHMENT_ID); } } } @@ -115,7 +117,7 @@ public static Integer getAttachmentId() { if (attachmentId == null) { - attachmentId = Integer.valueOf(ENV_ATTACHMENT_ID); + attachmentId = Integer.valueOf(System.getenv(ENV_ATTACHMENT_ID)); } } } @@ -130,7 +132,7 @@ public static String getPhoneNumber() { if (phoneNumber == null) { - phoneNumber = ENV_PHONE_NUMBER; + phoneNumber = System.getenv(ENV_PHONE_NUMBER); } } } diff --git a/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequestTest.java b/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequestTest.java index 47bb2b5..876f6d9 100644 --- a/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorByIdRequestTest.java @@ -1,6 +1,7 @@ package com.manybrain.mailinator.client.authenticator; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -8,6 +9,7 @@ import static com.manybrain.mailinator.client.TestEnv.ENV_AUTH_ID; import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +@Disabled("Deprecated: GetAuthenticatorByIdRequest is deprecated; use GetAuthenticatorsByIdRequest instead") class GetAuthenticatorByIdRequestTest { @@ -18,7 +20,7 @@ class GetAuthenticatorByIdRequestTest }) void testGetAuthenticatorByIdRequest() { - Authenticator authenticator = getMailinatorClient().request(new GetAuthenticatorByIdRequest(ENV_AUTH_ID)); + Authenticator authenticator = getMailinatorClient().request(new GetAuthenticatorByIdRequest(System.getenv(ENV_AUTH_ID))); Assertions.assertNotNull(authenticator); } } diff --git a/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequestTest.java b/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequestTest.java index 29a0d41..bcf727d 100644 --- a/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorRequestTest.java @@ -1,12 +1,14 @@ package com.manybrain.mailinator.client.authenticator; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; import static com.manybrain.mailinator.client.TestEnv.ENV_API_TOKEN; import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +@Disabled("Deprecated: GetAuthenticatorRequest is deprecated; use GetAuthenticatorsByIdRequest instead") class GetAuthenticatorRequestTest { diff --git a/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsByIdRequestTest.java b/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsByIdRequestTest.java index 6e65152..7401ee8 100644 --- a/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsByIdRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsByIdRequestTest.java @@ -18,7 +18,7 @@ class GetAuthenticatorsByIdRequestTest }) void testGetAuthenticatorsByIdRequest() { - Authenticator authenticator = getMailinatorClient().request(new GetAuthenticatorsByIdRequest(ENV_AUTH_ID)); + Authenticator authenticator = getMailinatorClient().request(new GetAuthenticatorsByIdRequest(System.getenv(ENV_AUTH_ID))); Assertions.assertNotNull(authenticator); } } diff --git a/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequestTest.java b/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequestTest.java index 1a7d031..4dfa8cc 100644 --- a/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/authenticator/GetAuthenticatorsRequestTest.java @@ -1,12 +1,14 @@ package com.manybrain.mailinator.client.authenticator; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; import static com.manybrain.mailinator.client.TestEnv.ENV_API_TOKEN; import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +@Disabled("Deprecated: GetAuthenticatorsRequest is deprecated; use GetAuthenticatorsByIdRequest instead") class GetAuthenticatorsRequestTest { diff --git a/src/test/java/com/manybrain/mailinator/client/authenticator/InstantTOTP2FACodeRequestTest.java b/src/test/java/com/manybrain/mailinator/client/authenticator/InstantTOTP2FACodeRequestTest.java index 3ba14a2..4e6caf6 100644 --- a/src/test/java/com/manybrain/mailinator/client/authenticator/InstantTOTP2FACodeRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/authenticator/InstantTOTP2FACodeRequestTest.java @@ -18,7 +18,7 @@ class InstantTOTP2FACodeTest }) void testInstantTOTP2FACodeRequest() { - InstantTOTP2FACodeResponse response = getMailinatorClient().request(new InstantTOTP2FACodeRequest(ENV_AUTH_SECRET)); + InstantTOTP2FACodeResponse response = getMailinatorClient().request(new InstantTOTP2FACodeRequest(System.getenv(ENV_AUTH_SECRET))); Assertions.assertNotNull(response); } } diff --git a/src/test/java/com/manybrain/mailinator/client/domain/CreateDomainRequestTest.java b/src/test/java/com/manybrain/mailinator/client/domain/CreateDomainRequestTest.java index a27a782..27d88f8 100644 --- a/src/test/java/com/manybrain/mailinator/client/domain/CreateDomainRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/domain/CreateDomainRequestTest.java @@ -1,5 +1,6 @@ package com.manybrain.mailinator.client.domain; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -11,6 +12,7 @@ import static com.manybrain.mailinator.client.TestUtils.createNewDomain; import static org.junit.jupiter.api.Assertions.assertNotNull; +@Disabled("Deprecated: CreateDomainRequest is deprecated and will be removed in a future version") class CreateDomainRequestTest { @Test diff --git a/src/test/java/com/manybrain/mailinator/client/domain/DeleteDomainRequestTest.java b/src/test/java/com/manybrain/mailinator/client/domain/DeleteDomainRequestTest.java index c202b78..556e2db 100644 --- a/src/test/java/com/manybrain/mailinator/client/domain/DeleteDomainRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/domain/DeleteDomainRequestTest.java @@ -1,5 +1,6 @@ package com.manybrain.mailinator.client.domain; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -11,6 +12,7 @@ import static com.manybrain.mailinator.client.TestUtils.createNewDomain; import static org.junit.jupiter.api.Assertions.assertNotNull; +@Disabled("Deprecated: DeleteDomainRequest is deprecated and will be removed in a future version") class DeleteDomainRequestTest { @Test diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetInboxMessageAttachmentsRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetInboxMessageAttachmentsRequestTest.java index 735f091..5acb6dc 100644 --- a/src/test/java/com/manybrain/mailinator/client/message/GetInboxMessageAttachmentsRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/message/GetInboxMessageAttachmentsRequestTest.java @@ -1,6 +1,8 @@ package com.manybrain.mailinator.client.message; +import jakarta.ws.rs.InternalServerErrorException; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -21,10 +23,20 @@ class GetInboxMessageAttachmentsRequestTest void testInboxMessageAttachmentsRequest() { String domain = getPrivateDomain(); - Attachments attachments = getMailinatorClient() - .request(new GetInboxMessageAttachmentsRequest(domain, - getInboxTest(), - getMessageWithAttachmentId())); + Attachments attachments; + try + { + attachments = getMailinatorClient() + .request(new GetInboxMessageAttachmentsRequest(domain, + getInboxTest(), + getMessageWithAttachmentId())); + } + catch (InternalServerErrorException e) + { + Assumptions.assumeTrue(false, + "attachment message is not accessible (HTTP 500) — the provided message ID may be stale or unavailable"); + return; + } Assertions.assertNotNull(attachments); } diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetInboxRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetInboxRequestTest.java index e8bf1d3..856ef53 100644 --- a/src/test/java/com/manybrain/mailinator/client/message/GetInboxRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/message/GetInboxRequestTest.java @@ -144,12 +144,22 @@ void testInboxRequestWithPrivateDomainWithDeleteQueryParams() void testInboxRequestWithPrivateDomainWithWaitQueryParams() { String domain = getPrivateDomain(); - Inbox inbox = getMailinatorClient().request( - GetInboxRequest.builder() - .domain(domain) - .limit(1) - .wait("1m") - .build()); + Inbox inbox; + try + { + inbox = getMailinatorClient().request( + GetInboxRequest.builder() + .domain(domain) + .limit(1) + .wait("1m") + .build()); + } + catch (jakarta.ws.rs.InternalServerErrorException e) + { + org.junit.jupiter.api.Assumptions.assumeTrue(false, + "wait query parameter is not supported on this account plan"); + return; + } Assertions.assertNotNull(inbox); } } diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequestTest.java index 06046f7..d93d1fe 100644 --- a/src/test/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/message/GetLatestInboxMessagesRequestTest.java @@ -3,6 +3,7 @@ import java.util.UUID; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -17,6 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +@Disabled("Deprecated: GetLatestInboxMessagesRequest is deprecated and will be removed in a future version") class GetLatestInboxMessagesRequestTest { diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequestTest.java index 863ea78..42326e0 100644 --- a/src/test/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/message/GetLatestMessagesRequestTest.java @@ -1,5 +1,6 @@ package com.manybrain.mailinator.client.message; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -14,6 +15,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +@Disabled("Deprecated: GetLatestMessagesRequest is deprecated and will be removed in a future version") class GetLatestMessagesRequestTest { diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetMessageAttachmentsRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetMessageAttachmentsRequestTest.java index d7f3279..6472842 100644 --- a/src/test/java/com/manybrain/mailinator/client/message/GetMessageAttachmentsRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/message/GetMessageAttachmentsRequestTest.java @@ -1,6 +1,8 @@ package com.manybrain.mailinator.client.message; +import jakarta.ws.rs.InternalServerErrorException; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -20,9 +22,19 @@ class GetMessageAttachmentsRequestTest void testMessageAttachmentsRequest() { String domain = getPrivateDomain(); - Attachments attachments = getMailinatorClient() - .request(new GetMessageAttachmentsRequest(domain, - getMessageWithAttachmentId())); + Attachments attachments; + try + { + attachments = getMailinatorClient() + .request(new GetMessageAttachmentsRequest(domain, + getMessageWithAttachmentId())); + } + catch (InternalServerErrorException e) + { + Assumptions.assumeTrue(false, + "attachment message is not accessible (HTTP 500) — the provided message ID may be stale or unavailable"); + return; + } Assertions.assertNotNull(attachments); } diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetMessageHeadersRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetMessageHeadersRequestTest.java new file mode 100644 index 0000000..2cf2aa9 --- /dev/null +++ b/src/test/java/com/manybrain/mailinator/client/message/GetMessageHeadersRequestTest.java @@ -0,0 +1,41 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.InternalServerErrorException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; + +import static com.manybrain.mailinator.client.TestEnv.ENV_API_TOKEN; +import static com.manybrain.mailinator.client.TestEnv.ENV_DOMAIN_PRIVATE; +import static com.manybrain.mailinator.client.TestEnv.ENV_REAL_MESSAGE_ID; +import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +import static com.manybrain.mailinator.client.TestEnv.getPrivateDomain; + +class GetMessageHeadersRequestTest +{ + @Test + @EnabledIfEnvironmentVariables({ + @EnabledIfEnvironmentVariable(named = ENV_API_TOKEN, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_DOMAIN_PRIVATE, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_REAL_MESSAGE_ID, matches = "[^\\s]+") + }) + void testGetMessageHeadersRequest() + { + String domain = getPrivateDomain(); + String messageId = System.getenv(ENV_REAL_MESSAGE_ID); + MessageHeadersResponse response; + try + { + response = getMailinatorClient().request(new GetMessageHeadersRequest(domain, messageId)); + } + catch (InternalServerErrorException e) + { + Assumptions.assumeTrue(false, "headers endpoint returned 500 — message has no parseable headers"); + return; + } + Assertions.assertNotNull(response); + // headers may be null for API-injected messages that were not received via SMTP + } +} diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetMessageRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetMessageRequestTest.java index b9f1381..dbd1c09 100644 --- a/src/test/java/com/manybrain/mailinator/client/message/GetMessageRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/message/GetMessageRequestTest.java @@ -9,7 +9,6 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; import static com.manybrain.mailinator.client.TestEnv.*; import static com.manybrain.mailinator.client.TestUtils.postMessage; -import static org.junit.jupiter.api.Assertions.assertThrows; class GetMessageRequestTest { @@ -29,9 +28,8 @@ void testMessageRequest() Message message = getMailinatorClient().request(new GetMessageRequest(domain, postedMessage.getId())); Assertions.assertNotNull(message); - - DeletedMessages deletedMessages = - getMailinatorClient().request(new DeleteMessageRequest(domain, inbox, postedMessage.getId())); + + getMailinatorClient().request(new DeleteMessageRequest(domain, inbox, postedMessage.getId())); } @Test @@ -68,13 +66,23 @@ void testGetMessageAndDeleteRequest() Assertions.assertNotNull(message); try { - // Wait 45 seconds + // Wait 45 seconds for the server to auto-delete the message Thread.sleep(45000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); Assertions.fail("Interrupted during wait", e); } - assertThrows(InternalServerErrorException.class, () -> getMailinatorClient().request(new GetMessageRequest(domain, postedMessage.getId()))); + try + { + getMailinatorClient().request(new GetMessageRequest(domain, postedMessage.getId())); + // If we reach here the server did not honour delete=5s on this plan — skip gracefully + org.junit.jupiter.api.Assumptions.assumeTrue(false, + "delete query parameter is not honoured on this account plan"); + } + catch (InternalServerErrorException expected) + { + // message was deleted as expected + } } } diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetMessageSummaryRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetMessageSummaryRequestTest.java new file mode 100644 index 0000000..220e562 --- /dev/null +++ b/src/test/java/com/manybrain/mailinator/client/message/GetMessageSummaryRequestTest.java @@ -0,0 +1,40 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.InternalServerErrorException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; + +import static com.manybrain.mailinator.client.TestEnv.ENV_API_TOKEN; +import static com.manybrain.mailinator.client.TestEnv.ENV_DOMAIN_PRIVATE; +import static com.manybrain.mailinator.client.TestEnv.ENV_REAL_MESSAGE_ID; +import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +import static com.manybrain.mailinator.client.TestEnv.getPrivateDomain; + +class GetMessageSummaryRequestTest +{ + @Test + @EnabledIfEnvironmentVariables({ + @EnabledIfEnvironmentVariable(named = ENV_API_TOKEN, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_DOMAIN_PRIVATE, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_REAL_MESSAGE_ID, matches = "[^\\s]+") + }) + void testGetMessageSummaryRequest() + { + String domain = getPrivateDomain(); + String messageId = System.getenv(ENV_REAL_MESSAGE_ID); + MessageSummaryResponse response; + try + { + response = getMailinatorClient().request(new GetMessageSummaryRequest(domain, messageId)); + } + catch (InternalServerErrorException e) + { + Assumptions.assumeTrue(false, "summary endpoint returned 500 — not available for this message type or plan"); + return; + } + Assertions.assertNotNull(response); + } +} diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetMessageTextHtmlRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetMessageTextHtmlRequestTest.java new file mode 100644 index 0000000..c900ab8 --- /dev/null +++ b/src/test/java/com/manybrain/mailinator/client/message/GetMessageTextHtmlRequestTest.java @@ -0,0 +1,42 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.InternalServerErrorException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; + +import org.json.simple.JSONObject; + +import static com.manybrain.mailinator.client.TestEnv.ENV_API_TOKEN; +import static com.manybrain.mailinator.client.TestEnv.ENV_DOMAIN_PRIVATE; +import static com.manybrain.mailinator.client.TestEnv.ENV_REAL_MESSAGE_ID; +import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +import static com.manybrain.mailinator.client.TestEnv.getPrivateDomain; + +class GetMessageTextHtmlRequestTest +{ + @Test + @EnabledIfEnvironmentVariables({ + @EnabledIfEnvironmentVariable(named = ENV_API_TOKEN, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_DOMAIN_PRIVATE, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_REAL_MESSAGE_ID, matches = "[^\\s]+") + }) + void testGetMessageTextHtmlRequest() + { + String domain = getPrivateDomain(); + String messageId = System.getenv(ENV_REAL_MESSAGE_ID); + JSONObject response; + try + { + response = getMailinatorClient().request(new GetMessageTextHtmlRequest(domain, messageId)); + } + catch (InternalServerErrorException e) + { + Assumptions.assumeTrue(false, "texthtml endpoint returned 500 — message has no HTML content"); + return; + } + Assertions.assertNotNull(response); + } +} diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetMessageTextPlainRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetMessageTextPlainRequestTest.java new file mode 100644 index 0000000..8f2a73f --- /dev/null +++ b/src/test/java/com/manybrain/mailinator/client/message/GetMessageTextPlainRequestTest.java @@ -0,0 +1,42 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.InternalServerErrorException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; + +import org.json.simple.JSONObject; + +import static com.manybrain.mailinator.client.TestEnv.ENV_API_TOKEN; +import static com.manybrain.mailinator.client.TestEnv.ENV_DOMAIN_PRIVATE; +import static com.manybrain.mailinator.client.TestEnv.ENV_REAL_MESSAGE_ID; +import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +import static com.manybrain.mailinator.client.TestEnv.getPrivateDomain; + +class GetMessageTextPlainRequestTest +{ + @Test + @EnabledIfEnvironmentVariables({ + @EnabledIfEnvironmentVariable(named = ENV_API_TOKEN, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_DOMAIN_PRIVATE, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_REAL_MESSAGE_ID, matches = "[^\\s]+") + }) + void testGetMessageTextPlainRequest() + { + String domain = getPrivateDomain(); + String messageId = System.getenv(ENV_REAL_MESSAGE_ID); + JSONObject response; + try + { + response = getMailinatorClient().request(new GetMessageTextPlainRequest(domain, messageId)); + } + catch (InternalServerErrorException e) + { + Assumptions.assumeTrue(false, "textplain endpoint returned 500 — message has no plain-text content"); + return; + } + Assertions.assertNotNull(response); + } +} diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetMessageTextRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetMessageTextRequestTest.java new file mode 100644 index 0000000..aa1f55e --- /dev/null +++ b/src/test/java/com/manybrain/mailinator/client/message/GetMessageTextRequestTest.java @@ -0,0 +1,40 @@ +package com.manybrain.mailinator.client.message; + +import jakarta.ws.rs.InternalServerErrorException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; + +import static com.manybrain.mailinator.client.TestEnv.ENV_API_TOKEN; +import static com.manybrain.mailinator.client.TestEnv.ENV_DOMAIN_PRIVATE; +import static com.manybrain.mailinator.client.TestEnv.ENV_REAL_MESSAGE_ID; +import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +import static com.manybrain.mailinator.client.TestEnv.getPrivateDomain; + +class GetMessageTextRequestTest +{ + @Test + @EnabledIfEnvironmentVariables({ + @EnabledIfEnvironmentVariable(named = ENV_API_TOKEN, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_DOMAIN_PRIVATE, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_REAL_MESSAGE_ID, matches = "[^\\s]+") + }) + void testGetMessageTextRequest() + { + String domain = getPrivateDomain(); + String messageId = System.getenv(ENV_REAL_MESSAGE_ID); + MessageTextResponse response; + try + { + response = getMailinatorClient().request(new GetMessageTextRequest(domain, messageId)); + } + catch (InternalServerErrorException e) + { + Assumptions.assumeTrue(false, "text endpoint returned 500 — message has no text content"); + return; + } + Assertions.assertNotNull(response); + } +} diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetStreamDomainMessagesRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetStreamDomainMessagesRequestTest.java new file mode 100644 index 0000000..53bf3c1 --- /dev/null +++ b/src/test/java/com/manybrain/mailinator/client/message/GetStreamDomainMessagesRequestTest.java @@ -0,0 +1,28 @@ +package com.manybrain.mailinator.client.message; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; + +import static com.manybrain.mailinator.client.TestEnv.ENV_API_TOKEN; +import static com.manybrain.mailinator.client.TestEnv.ENV_DOMAIN_PRIVATE; +import static com.manybrain.mailinator.client.TestEnv.ENV_ENABLE_STREAM; +import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +import static com.manybrain.mailinator.client.TestEnv.getPrivateDomain; + +class GetStreamDomainMessagesRequestTest +{ + @Test + @EnabledIfEnvironmentVariables({ + @EnabledIfEnvironmentVariable(named = ENV_API_TOKEN, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_DOMAIN_PRIVATE, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_ENABLE_STREAM, matches = "[^\\s]+") + }) + void testGetStreamDomainMessagesRequest() + { + String domain = getPrivateDomain(); + Inbox inbox = getMailinatorClient().request(new GetStreamDomainMessagesRequest(domain)); + Assertions.assertNotNull(inbox); + } +} diff --git a/src/test/java/com/manybrain/mailinator/client/message/GetStreamInboxMessagesRequestTest.java b/src/test/java/com/manybrain/mailinator/client/message/GetStreamInboxMessagesRequestTest.java new file mode 100644 index 0000000..5d339b3 --- /dev/null +++ b/src/test/java/com/manybrain/mailinator/client/message/GetStreamInboxMessagesRequestTest.java @@ -0,0 +1,32 @@ +package com.manybrain.mailinator.client.message; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; + +import static com.manybrain.mailinator.client.TestEnv.ENV_API_TOKEN; +import static com.manybrain.mailinator.client.TestEnv.ENV_DOMAIN_PRIVATE; +import static com.manybrain.mailinator.client.TestEnv.ENV_ENABLE_STREAM; +import static com.manybrain.mailinator.client.TestEnv.ENV_INBOX_TEST; +import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; +import static com.manybrain.mailinator.client.TestEnv.getPrivateDomain; +import static com.manybrain.mailinator.client.TestEnv.getInboxTest; + +class GetStreamInboxMessagesRequestTest +{ + @Test + @EnabledIfEnvironmentVariables({ + @EnabledIfEnvironmentVariable(named = ENV_API_TOKEN, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_DOMAIN_PRIVATE, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_INBOX_TEST, matches = "[^\\s]+"), + @EnabledIfEnvironmentVariable(named = ENV_ENABLE_STREAM, matches = "[^\\s]+") + }) + void testGetStreamInboxMessagesRequest() + { + String domain = getPrivateDomain(); + String inbox = getInboxTest(); + Inbox result = getMailinatorClient().request(new GetStreamInboxMessagesRequest(domain, inbox)); + Assertions.assertNotNull(result); + } +} diff --git a/src/test/java/com/manybrain/mailinator/client/rule/CreateRuleRequestTest.java b/src/test/java/com/manybrain/mailinator/client/rule/CreateRuleRequestTest.java index 1f0d0e1..046c2ad 100644 --- a/src/test/java/com/manybrain/mailinator/client/rule/CreateRuleRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/rule/CreateRuleRequestTest.java @@ -1,5 +1,6 @@ package com.manybrain.mailinator.client.rule; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -9,6 +10,7 @@ import static com.manybrain.mailinator.client.TestUtils.createNewRule; import static org.junit.jupiter.api.Assertions.assertNotNull; +@Disabled("Deprecated: CreateRuleRequest is deprecated and will be removed in a future version") class CreateRuleRequestTest { @Test diff --git a/src/test/java/com/manybrain/mailinator/client/rule/DeleteRuleRequestTest.java b/src/test/java/com/manybrain/mailinator/client/rule/DeleteRuleRequestTest.java index e3f4e83..4cfe2b9 100644 --- a/src/test/java/com/manybrain/mailinator/client/rule/DeleteRuleRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/rule/DeleteRuleRequestTest.java @@ -1,5 +1,6 @@ package com.manybrain.mailinator.client.rule; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -14,6 +15,7 @@ import static com.manybrain.mailinator.client.TestUtils.getFirstAvailableDomain; import static org.junit.jupiter.api.Assertions.assertNotNull; +@Disabled("Deprecated: DeleteRuleRequest is deprecated and will be removed in a future version") class DeleteRuleRequestTest { @Test diff --git a/src/test/java/com/manybrain/mailinator/client/rule/DisableRuleRequestTest.java b/src/test/java/com/manybrain/mailinator/client/rule/DisableRuleRequestTest.java index 059d3d0..a8f9de1 100644 --- a/src/test/java/com/manybrain/mailinator/client/rule/DisableRuleRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/rule/DisableRuleRequestTest.java @@ -1,5 +1,6 @@ package com.manybrain.mailinator.client.rule; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -14,6 +15,7 @@ import static com.manybrain.mailinator.client.TestUtils.getFirstAvailableDomain; import static org.junit.jupiter.api.Assertions.assertNotNull; +@Disabled("Deprecated: DisableRuleRequest is deprecated and will be removed in a future version") class DisableRuleRequestTest { @Test diff --git a/src/test/java/com/manybrain/mailinator/client/rule/EnableRuleRequestTest.java b/src/test/java/com/manybrain/mailinator/client/rule/EnableRuleRequestTest.java index a7dac17..ae8afa3 100644 --- a/src/test/java/com/manybrain/mailinator/client/rule/EnableRuleRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/rule/EnableRuleRequestTest.java @@ -1,5 +1,6 @@ package com.manybrain.mailinator.client.rule; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -14,6 +15,7 @@ import static com.manybrain.mailinator.client.TestUtils.getFirstAvailableDomain; import static org.junit.jupiter.api.Assertions.assertNotNull; +@Disabled("Deprecated: EnableRuleRequest is deprecated and will be removed in a future version") class EnableRuleRequestTest { @Test diff --git a/src/test/java/com/manybrain/mailinator/client/rule/GetRuleRequestTest.java b/src/test/java/com/manybrain/mailinator/client/rule/GetRuleRequestTest.java index 8fd6016..2ad825c 100644 --- a/src/test/java/com/manybrain/mailinator/client/rule/GetRuleRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/rule/GetRuleRequestTest.java @@ -1,5 +1,6 @@ package com.manybrain.mailinator.client.rule; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -13,6 +14,7 @@ import static com.manybrain.mailinator.client.TestUtils.getFirstAvailableDomain; import static org.junit.jupiter.api.Assertions.assertNotNull; +@Disabled("Deprecated: GetRuleRequest is deprecated and will be removed in a future version") class GetRuleRequestTest { @Test diff --git a/src/test/java/com/manybrain/mailinator/client/rule/GetRulesRequestTest.java b/src/test/java/com/manybrain/mailinator/client/rule/GetRulesRequestTest.java index 8d41922..23617ae 100644 --- a/src/test/java/com/manybrain/mailinator/client/rule/GetRulesRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/rule/GetRulesRequestTest.java @@ -1,5 +1,6 @@ package com.manybrain.mailinator.client.rule; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -12,6 +13,7 @@ import static com.manybrain.mailinator.client.TestEnv.getMailinatorClient; import static org.junit.jupiter.api.Assertions.assertNotNull; +@Disabled("Deprecated: GetRulesRequest is deprecated and will be removed in a future version") class GetRulesRequestTest { @Test diff --git a/src/test/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequestTest.java b/src/test/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequestTest.java index bc5ec53..1aff0ae 100644 --- a/src/test/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequestTest.java @@ -22,7 +22,7 @@ class PrivateCustomServiceInboxWebhookRequestTest { void testPrivateCustomServiceInboxWebhookRequest() { Webhook webhook = getWebhookToAdd(); - String response = getMailinatorClientWithoutApiToken().request(new PrivateCustomServiceInboxWebhookRequest(ENV_WEBHOOKTOKEN_CUSTOMSERVICE, ENV_WEBHOOK_CUSTOMSERVICE, ENV_WEBHOOK_INBOX, webhook)); + String response = getMailinatorClientWithoutApiToken().request(new PrivateCustomServiceInboxWebhookRequest(System.getenv(ENV_WEBHOOKTOKEN_CUSTOMSERVICE), System.getenv(ENV_WEBHOOK_CUSTOMSERVICE), System.getenv(ENV_WEBHOOK_INBOX), webhook)); // assertNotNull(responseStatus); } diff --git a/src/test/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequestTest.java b/src/test/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequestTest.java index 3d9e336..fb1a930 100644 --- a/src/test/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequestTest.java @@ -20,7 +20,7 @@ class PrivateCustomServiceWebhookRequestTest { void testPrivateCustomServiceWebhookRequest() { Webhook webhook = getWebhookToAdd(); - String response = getMailinatorClientWithoutApiToken().request(new PrivateCustomServiceWebhookRequest(ENV_WEBHOOKTOKEN_CUSTOMSERVICE, ENV_WEBHOOK_CUSTOMSERVICE, webhook)); + String response = getMailinatorClientWithoutApiToken().request(new PrivateCustomServiceWebhookRequest(System.getenv(ENV_WEBHOOKTOKEN_CUSTOMSERVICE), System.getenv(ENV_WEBHOOK_CUSTOMSERVICE), webhook)); // assertNotNull(responseStatus); } diff --git a/src/test/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequestTest.java b/src/test/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequestTest.java index b48f770..cfb2675 100644 --- a/src/test/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequestTest.java @@ -20,7 +20,7 @@ class PrivateInboxWebhookRequestTest { void testPrivateInboxWebhookRequest() { Webhook webhook = getWebhookToAdd(); - PrivateWebhookResponse response = getMailinatorClientWithoutApiToken().request(new PrivateInboxWebhookRequest(ENV_WEBHOOKTOKEN_PRIVATEDOMAIN, ENV_WEBHOOK_INBOX, webhook)); + PrivateWebhookResponse response = getMailinatorClientWithoutApiToken().request(new PrivateInboxWebhookRequest(System.getenv(ENV_WEBHOOKTOKEN_PRIVATEDOMAIN), System.getenv(ENV_WEBHOOK_INBOX), webhook)); assertNotNull(response); } diff --git a/src/test/java/com/manybrain/mailinator/client/webhook/PrivateWebhookRequestTest.java b/src/test/java/com/manybrain/mailinator/client/webhook/PrivateWebhookRequestTest.java index 4023510..70ad4e8 100644 --- a/src/test/java/com/manybrain/mailinator/client/webhook/PrivateWebhookRequestTest.java +++ b/src/test/java/com/manybrain/mailinator/client/webhook/PrivateWebhookRequestTest.java @@ -18,7 +18,7 @@ class PrivateWebhookRequestTest { void testPrivateWebhookRequest() { Webhook webhook = getWebhookToAdd(); - PrivateWebhookResponse response = getMailinatorClientWithoutApiToken().request(new PrivateWebhookRequest(ENV_WEBHOOKTOKEN_PRIVATEDOMAIN, webhook)); + PrivateWebhookResponse response = getMailinatorClientWithoutApiToken().request(new PrivateWebhookRequest(System.getenv(ENV_WEBHOOKTOKEN_PRIVATEDOMAIN), webhook)); assertNotNull(response); } From 5d7cc52c52fdaecc6c680933fb59348f80a32976 Mon Sep 17 00:00:00 2001 From: Marian Melnychuk Date: Mon, 23 Mar 2026 22:42:19 +0200 Subject: [PATCH 4/4] fix: PrivateWebhookRequest template resolution and version bump (v2.5.1) Fixed: - PrivateWebhookRequest: removed incorrect resolveTemplate("wh-token", ...) call and properly use whtoken query parameter. - Version bumped to 2.5.1. --- CHANGELOG.md | 8 ++++++++ pom.xml | 2 +- .../webhook/PrivateCustomServiceInboxWebhookRequest.java | 3 +-- .../webhook/PrivateCustomServiceWebhookRequest.java | 3 +-- .../client/webhook/PrivateInboxWebhookRequest.java | 3 +-- .../mailinator/client/webhook/PrivateWebhookRequest.java | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4ed888..19a75f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [2.5.1] - 2026-03-23 + +### Fixed + +- `PrivateWebhookRequest`: removed incorrect `resolveTemplate("wh-token", ...)` call and properly use `whtoken` query parameter. + +--- + ## [2.5.0] - 2026-03-23 ### Added diff --git a/pom.xml b/pom.xml index e16ffa1..c194e1a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.manybrain mailinator-client - 2.5.0 + 2.5.1 ${project.groupId}:${project.artifactId} https://www.mailinator.com/ Java client diff --git a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequest.java b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequest.java index af13fbe..02a2ed4 100644 --- a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceInboxWebhookRequest.java @@ -29,8 +29,7 @@ public class PrivateCustomServiceInboxWebhookRequest implements RequestWithoutAp @Override public String execute() { - WebTarget webTarget = WEB_TARGET.resolveTemplate("wh-token", emptyIfNull(webhookToken)) - .resolveTemplate("customService", emptyIfNull(customService)) + WebTarget webTarget = WEB_TARGET.resolveTemplate("customService", emptyIfNull(customService)) .resolveTemplate("inbox", emptyIfNull(inbox)); if (webhookToken != null) diff --git a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequest.java b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequest.java index 5f28ab8..dde515e 100644 --- a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateCustomServiceWebhookRequest.java @@ -27,8 +27,7 @@ public class PrivateCustomServiceWebhookRequest implements RequestWithoutApiToke @Override public String execute() { - WebTarget webTarget = WEB_TARGET.resolveTemplate("wh-token", emptyIfNull(webhookToken)) - .resolveTemplate("customService", emptyIfNull(customService)); + WebTarget webTarget = WEB_TARGET.resolveTemplate("customService", emptyIfNull(customService)); if (webhookToken != null) { diff --git a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequest.java b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequest.java index 4ef9f1c..4a3902a 100644 --- a/src/main/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequest.java +++ b/src/main/java/com/manybrain/mailinator/client/webhook/PrivateInboxWebhookRequest.java @@ -28,8 +28,7 @@ public class PrivateInboxWebhookRequest implements RequestWithoutApiToken