From c239caf0ebaabe9574472252cadcb688ea51b11b Mon Sep 17 00:00:00 2001 From: "J. Koster" Date: Mon, 21 Oct 2024 15:18:33 +0200 Subject: [PATCH] STNG-184 Improve all DSP and related classes (#198) * Use Jackson Object Mapper functionality if possible --- .../booking/party/BookingShipper.java | 51 ++++++++-------- .../party/CarrierScenarioParameters.java | 52 ++++------------ .../party/DynamicScenarioParameters.java | 59 +++--------------- .../party/DynamicScenarioParametersTest.java | 41 +++++++++++++ .../cs/party/DynamicScenarioParameters.java | 27 ++------ .../core/party/ScenarioParameters.java | 13 ++++ .../conformance/core/toolkit/JsonToolkit.java | 3 +- .../core/traffic/ConformanceMessage.java | 29 ++++----- .../party/CarrierScenarioParameters.java | 14 +---- .../party/DynamicScenarioParameters.java | 20 +++--- .../eblissuance/party/EblIssuanceCarrier.java | 46 ++++++++------ .../party/SuppliedScenarioParameters.java | 38 +++--------- .../party/SuppliedScenarioParameters.java | 28 +++------ .../ebl/party/CarrierScenarioParameters.java | 61 +++++-------------- .../ebl/party/DynamicScenarioParameters.java | 43 +++---------- .../models/DynamicScenarioParameters.java | 43 ++++--------- .../models/ReceiverScenarioParameters.java | 22 ++----- .../models/SenderScenarioParameters.java | 31 +++------- .../conformance/sandbox/SandboxWaiting.java | 21 +++---- 19 files changed, 233 insertions(+), 409 deletions(-) create mode 100644 booking/src/test/java/org/dcsa/conformance/standards/booking/party/DynamicScenarioParametersTest.java create mode 100644 core/src/main/java/org/dcsa/conformance/core/party/ScenarioParameters.java diff --git a/booking/src/main/java/org/dcsa/conformance/standards/booking/party/BookingShipper.java b/booking/src/main/java/org/dcsa/conformance/standards/booking/party/BookingShipper.java index 1d4f9912..431e1446 100644 --- a/booking/src/main/java/org/dcsa/conformance/standards/booking/party/BookingShipper.java +++ b/booking/src/main/java/org/dcsa/conformance/standards/booking/party/BookingShipper.java @@ -109,35 +109,36 @@ private void sendBookingRequest(JsonNode actionPrompt) { } private JsonNode replaceBookingPlaceHolders(JsonNode actionPrompt) { - - CarrierScenarioParameters carrierScenarioParameters = + CarrierScenarioParameters csp = CarrierScenarioParameters.fromJson(actionPrompt.get("csp")); var scenarioType = ScenarioType.valueOf(actionPrompt.required("scenarioType").asText()); return JsonToolkit.templateFileToJsonNode( - "/standards/booking/messages/"+ scenarioType.bookingTemplate(apiVersion), + "/standards/booking/messages/" + scenarioType.bookingTemplate(apiVersion), Map.ofEntries( - Map.entry( - "SERVICE_CONTRACT_REFERENCE_PLACEHOLDER", - carrierScenarioParameters.serviceContractReference()), - Map.entry( - "CONTRACT_QUOTATION_REFERENCE_PLACEHOLDER", - carrierScenarioParameters.contractQuotationReference()), - Map.entry( - "CARRIER_EXPORT_VOYAGE_NUMBER_PLACEHOLDER", carrierScenarioParameters.carrierExportVoyageNumber()), - Map.entry( - "CARRIER_SERVICE_NAME_PLACEHOLDER", carrierScenarioParameters.carrierServiceName()), - Map.entry( - "COMMODITY_HS_CODE_1", carrierScenarioParameters.hsCodes1()), - Map.entry( - "COMMODITY_HS_CODE_2", carrierScenarioParameters.hsCodes1()), - Map.entry( - "COMMODITY_TYPE_1_PLACEHOLDER", carrierScenarioParameters.commodityType1() ), - Map.entry( - "COMMODITY_TYPE_2_PLACEHOLDER", carrierScenarioParameters.commodityType2() ), - Map.entry( - "POL_UNLOCATION_CODE_PLACEHOLDER", carrierScenarioParameters.polUNLocationCode()), - Map.entry( - "POD_UNLOCATION_CODE_PLACEHOLDER", carrierScenarioParameters.podUNLocationCode()) )); + Map.entry("SERVICE_CONTRACT_REFERENCE_PLACEHOLDER", csp.serviceContractReference()), + Map.entry( + "CONTRACT_QUOTATION_REFERENCE_PLACEHOLDER", + Objects.requireNonNullElse(csp.contractQuotationReference(), "")), + Map.entry( + "CARRIER_EXPORT_VOYAGE_NUMBER_PLACEHOLDER", + Objects.requireNonNullElse(csp.carrierExportVoyageNumber(), "")), + Map.entry( + "CARRIER_SERVICE_NAME_PLACEHOLDER", + Objects.requireNonNullElse(csp.carrierServiceName(), "")), + Map.entry("COMMODITY_HS_CODE_1", Objects.requireNonNullElse(csp.hsCodes1(), "")), + Map.entry("COMMODITY_HS_CODE_2", Objects.requireNonNullElse(csp.hsCodes1(), "")), + Map.entry( + "COMMODITY_TYPE_1_PLACEHOLDER", + Objects.requireNonNullElse(csp.commodityType1(), "")), + Map.entry( + "COMMODITY_TYPE_2_PLACEHOLDER", + Objects.requireNonNullElse(csp.commodityType2(), "")), + Map.entry( + "POL_UNLOCATION_CODE_PLACEHOLDER", + Objects.requireNonNullElse(csp.polUNLocationCode(), "")), + Map.entry( + "POD_UNLOCATION_CODE_PLACEHOLDER", + Objects.requireNonNullElse(csp.podUNLocationCode(), "")))); } private void sendCancelBookingRequest(JsonNode actionPrompt) { diff --git a/booking/src/main/java/org/dcsa/conformance/standards/booking/party/CarrierScenarioParameters.java b/booking/src/main/java/org/dcsa/conformance/standards/booking/party/CarrierScenarioParameters.java index 10d49e90..526602e4 100644 --- a/booking/src/main/java/org/dcsa/conformance/standards/booking/party/CarrierScenarioParameters.java +++ b/booking/src/main/java/org/dcsa/conformance/standards/booking/party/CarrierScenarioParameters.java @@ -3,48 +3,22 @@ import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import org.dcsa.conformance.core.party.ScenarioParameters; public record CarrierScenarioParameters( - String serviceContractReference, - String contractQuotationReference, - String carrierExportVoyageNumber, - String carrierServiceName, - String hsCodes1, - String commodityType1, - String hsCodes2, - String commodityType2, - String polUNLocationCode, - String podUNLocationCode - ) { - public ObjectNode toJson() { - return OBJECT_MAPPER - .createObjectNode() - .put("serviceContractReference", serviceContractReference()) - .put("contractQuotationReference", contractQuotationReference()) - .put("carrierExportVoyageNumber", carrierExportVoyageNumber()) - .put("carrierServiceName", carrierServiceName()) - .put("hsCodes1", hsCodes1() ) - .put("commodityType1", commodityType1() ) - .put("hsCodes2", hsCodes2() ) - .put("commodityType2", commodityType2() ) - .put("polUNLocationCode", polUNLocationCode() ) - .put("podUNLocationCode", podUNLocationCode() ); - } + String serviceContractReference, + String contractQuotationReference, + String carrierExportVoyageNumber, + String carrierServiceName, + String hsCodes1, + String commodityType1, + String hsCodes2, + String commodityType2, + String polUNLocationCode, + String podUNLocationCode) + implements ScenarioParameters { public static CarrierScenarioParameters fromJson(JsonNode jsonNode) { - ObjectNode cspNode = (ObjectNode) jsonNode; - - return new CarrierScenarioParameters( - cspNode.required("serviceContractReference").asText(), - cspNode.required("contractQuotationReference").asText(), - cspNode.required("carrierExportVoyageNumber").asText(), - cspNode.required("carrierServiceName").asText(), - cspNode.required("hsCodes1").asText(), - cspNode.required("commodityType1").asText(), - cspNode.required("hsCodes2").asText(), - cspNode.required("commodityType2").asText(), - cspNode.required("polUNLocationCode").asText(), - cspNode.required("podUNLocationCode").asText()); + return OBJECT_MAPPER.convertValue(jsonNode, CarrierScenarioParameters.class); } } diff --git a/booking/src/main/java/org/dcsa/conformance/standards/booking/party/DynamicScenarioParameters.java b/booking/src/main/java/org/dcsa/conformance/standards/booking/party/DynamicScenarioParameters.java index 2692de58..5914a71a 100644 --- a/booking/src/main/java/org/dcsa/conformance/standards/booking/party/DynamicScenarioParameters.java +++ b/booking/src/main/java/org/dcsa/conformance/standards/booking/party/DynamicScenarioParameters.java @@ -2,69 +2,24 @@ import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import java.util.function.Function; import lombok.NonNull; import lombok.With; +import org.dcsa.conformance.core.party.ScenarioParameters; import org.dcsa.conformance.standards.booking.checks.ScenarioType; @With +@JsonInclude(JsonInclude.Include.NON_NULL) public record DynamicScenarioParameters( - @NonNull - ScenarioType scenarioType, + @NonNull ScenarioType scenarioType, String carrierBookingRequestReference, String carrierBookingReference, JsonNode booking, - JsonNode updatedBooking - ) { - public ObjectNode toJson() { - ObjectNode dspNode = OBJECT_MAPPER.createObjectNode(); - dspNode.put("scenarioType", scenarioType.name()); - if (carrierBookingRequestReference != null) { - dspNode.put("carrierBookingRequestReference", carrierBookingRequestReference); - } - if (carrierBookingReference != null) { - dspNode.put("carrierBookingReference", carrierBookingReference); - } - if (booking != null) { - dspNode.replace("booking", booking); - } - if (updatedBooking != null) { - dspNode.replace("updatedBooking", updatedBooking); - } - return dspNode; - } - - private static BookingState bookingState(String value) { - if (value == null) { - return null; - } - return BookingState.valueOf(value); - } - - private static BookingCancellationState bookingCancellationState(String value) { - if (value == null) { - return null; - } - return BookingCancellationState.valueOf(value); - } - - private static E readEnum(String value, Function mapper) { - if (value == null) { - return null; - } - return mapper.apply(value); - } + JsonNode updatedBooking) + implements ScenarioParameters { public static DynamicScenarioParameters fromJson(JsonNode jsonNode) { - ObjectNode dspNode = (ObjectNode) jsonNode; - return new DynamicScenarioParameters( - readEnum(jsonNode.required("scenarioType").asText(), ScenarioType::valueOf), - dspNode.path("carrierBookingRequestReference").asText(null), - dspNode.path("carrierBookingReference").asText(null), - dspNode.path("booking"), - dspNode.path("updatedBooking") - ); + return OBJECT_MAPPER.convertValue(jsonNode, DynamicScenarioParameters.class); } } diff --git a/booking/src/test/java/org/dcsa/conformance/standards/booking/party/DynamicScenarioParametersTest.java b/booking/src/test/java/org/dcsa/conformance/standards/booking/party/DynamicScenarioParametersTest.java new file mode 100644 index 00000000..69fd4d5f --- /dev/null +++ b/booking/src/test/java/org/dcsa/conformance/standards/booking/party/DynamicScenarioParametersTest.java @@ -0,0 +1,41 @@ +package org.dcsa.conformance.standards.booking.party; + +import static org.junit.jupiter.api.Assertions.*; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dcsa.conformance.standards.booking.checks.ScenarioType; +import org.junit.jupiter.api.Test; + +class DynamicScenarioParametersTest { + + private final DynamicScenarioParameters dsp = + new DynamicScenarioParameters(ScenarioType.DG, "cbrr", "cbr", null, null); + + private final CarrierScenarioParameters csp = + new CarrierScenarioParameters( + "scr", "cqr", "cevn", null, "h1", "ct1", "h2", "ct2", "pol", "pod"); + + @Test + void testDSPToJsonConversion() { + JsonNode jsonNode = dsp.toJson(); + assertEquals(3, (long) jsonNode.properties().size()); + } + + @Test + void testDSPFromJsonNode() { + DynamicScenarioParameters dspNew = DynamicScenarioParameters.fromJson(dsp.toJson()); + assertEquals(dsp.toString(), dspNew.toString()); + } + + @Test + void testCSPToJsonConversion() { + JsonNode jsonNode = csp.toJson(); + assertEquals(10, (long) jsonNode.properties().size()); + } + + @Test + void testCSPFromJsonNode() { + CarrierScenarioParameters cspNew = CarrierScenarioParameters.fromJson(csp.toJson()); + assertEquals(csp.toString(), cspNew.toString()); + } +} diff --git a/commercial-schedules/src/main/java/org/dcsa/conformance/standards/cs/party/DynamicScenarioParameters.java b/commercial-schedules/src/main/java/org/dcsa/conformance/standards/cs/party/DynamicScenarioParameters.java index 07ec8483..b96778b5 100644 --- a/commercial-schedules/src/main/java/org/dcsa/conformance/standards/cs/party/DynamicScenarioParameters.java +++ b/commercial-schedules/src/main/java/org/dcsa/conformance/standards/cs/party/DynamicScenarioParameters.java @@ -2,32 +2,17 @@ import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.With; +import org.dcsa.conformance.core.party.ScenarioParameters; @With -public record DynamicScenarioParameters(String cursor, String firstPage, String secondPage) { +@JsonInclude(JsonInclude.Include.NON_NULL) +public record DynamicScenarioParameters(String cursor, String firstPage, String secondPage) + implements ScenarioParameters { public static DynamicScenarioParameters fromJson(JsonNode jsonNode) { - ObjectNode dspNode = (ObjectNode) jsonNode; - return new DynamicScenarioParameters( - dspNode.path("cursor").asText(), - dspNode.path("firstPage").asText(), - dspNode.path("secondPage").asText()); - } - - public ObjectNode toJson() { - ObjectNode dspNode = OBJECT_MAPPER.createObjectNode(); - if (cursor != null) { - dspNode.put("cursor", cursor); - } - if (firstPage != null) { - dspNode.put("firstPage", firstPage); - } - if (secondPage != null) { - dspNode.put("secondPage", secondPage); - } - return dspNode; + return OBJECT_MAPPER.convertValue(jsonNode, DynamicScenarioParameters.class); } } diff --git a/core/src/main/java/org/dcsa/conformance/core/party/ScenarioParameters.java b/core/src/main/java/org/dcsa/conformance/core/party/ScenarioParameters.java new file mode 100644 index 00000000..1378b481 --- /dev/null +++ b/core/src/main/java/org/dcsa/conformance/core/party/ScenarioParameters.java @@ -0,0 +1,13 @@ +package org.dcsa.conformance.core.party; + +import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; + +import com.fasterxml.jackson.databind.node.ObjectNode; + +public interface ScenarioParameters { + + default ObjectNode toJson() { + return OBJECT_MAPPER.valueToTree(this); + } + +} diff --git a/core/src/main/java/org/dcsa/conformance/core/toolkit/JsonToolkit.java b/core/src/main/java/org/dcsa/conformance/core/toolkit/JsonToolkit.java index 537d861a..c0b2cb05 100644 --- a/core/src/main/java/org/dcsa/conformance/core/toolkit/JsonToolkit.java +++ b/core/src/main/java/org/dcsa/conformance/core/toolkit/JsonToolkit.java @@ -41,7 +41,8 @@ public static JsonNode templateFileToJsonNode( new String(inputStream.readAllBytes(), StandardCharsets.UTF_8)); } if (replacements != null) - replacements.forEach((key, value) -> jsonString.set(jsonString.get().replaceAll(key, value))); + replacements.forEach( + (key, value) -> jsonString.set(jsonString.get().replaceAll(key, value))); return OBJECT_MAPPER.readTree(jsonString.get()); } diff --git a/core/src/main/java/org/dcsa/conformance/core/traffic/ConformanceMessage.java b/core/src/main/java/org/dcsa/conformance/core/traffic/ConformanceMessage.java index 15cfb32f..5c0d931c 100644 --- a/core/src/main/java/org/dcsa/conformance/core/traffic/ConformanceMessage.java +++ b/core/src/main/java/org/dcsa/conformance/core/traffic/ConformanceMessage.java @@ -1,13 +1,12 @@ package org.dcsa.conformance.core.traffic; +import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; + import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import org.dcsa.conformance.core.toolkit.JsonToolkit; - import java.util.Collection; import java.util.Map; - -import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; +import org.dcsa.conformance.core.toolkit.JsonToolkit; public record ConformanceMessage( String sourcePartyName, @@ -19,25 +18,21 @@ public record ConformanceMessage( long timestamp) { public ObjectNode toJson() { - ObjectNode objectNode = OBJECT_MAPPER.createObjectNode(); - objectNode.put("sourcePartyName", sourcePartyName); - objectNode.put("sourcePartyRole", sourcePartyRole); - objectNode.put("targetPartyName", targetPartyName); - objectNode.put("targetPartyRole", targetPartyRole); + ObjectNode objectNode = OBJECT_MAPPER.valueToTree(this); + // Apply custom serialization objectNode.set("headers", JsonToolkit.mapOfStringToStringCollectionToJson(headers)); objectNode.set("body", body.toJson()); - objectNode.put("timestamp", timestamp); return objectNode; } public static ConformanceMessage fromJson(ObjectNode objectNode) { return new ConformanceMessage( - objectNode.get("sourcePartyName").asText(), - objectNode.get("sourcePartyRole").asText(), - objectNode.get("targetPartyName").asText(), - objectNode.get("targetPartyRole").asText(), - JsonToolkit.mapOfStringToStringCollectionFromJson((ArrayNode) objectNode.get("headers")), - ConformanceMessageBody.fromJson((ObjectNode) objectNode.get("body")), - objectNode.get("timestamp").asLong()); + objectNode.get("sourcePartyName").asText(), + objectNode.get("sourcePartyRole").asText(), + objectNode.get("targetPartyName").asText(), + objectNode.get("targetPartyRole").asText(), + JsonToolkit.mapOfStringToStringCollectionFromJson((ArrayNode) objectNode.get("headers")), + ConformanceMessageBody.fromJson((ObjectNode) objectNode.get("body")), + objectNode.get("timestamp").asLong()); } } diff --git a/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/CarrierScenarioParameters.java b/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/CarrierScenarioParameters.java index fe5aa5e1..e261c231 100644 --- a/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/CarrierScenarioParameters.java +++ b/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/CarrierScenarioParameters.java @@ -3,19 +3,11 @@ import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import org.dcsa.conformance.core.party.ScenarioParameters; -public record CarrierScenarioParameters( - String carrierSigningKeyPEM - ) { - public ObjectNode toJson() { - return OBJECT_MAPPER - .createObjectNode() - .put("carrierSigningKeyPEM", carrierSigningKeyPEM); - } +public record CarrierScenarioParameters(String carrierSigningKeyPEM) implements ScenarioParameters { public static CarrierScenarioParameters fromJson(JsonNode jsonNode) { - return new CarrierScenarioParameters( - jsonNode.required("carrierSigningKeyPEM").asText()); + return OBJECT_MAPPER.convertValue(jsonNode, CarrierScenarioParameters.class); } } diff --git a/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/DynamicScenarioParameters.java b/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/DynamicScenarioParameters.java index 8a341ae2..060c0478 100644 --- a/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/DynamicScenarioParameters.java +++ b/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/DynamicScenarioParameters.java @@ -1,24 +1,18 @@ package org.dcsa.conformance.standards.eblissuance.party; +import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; + +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.With; +import org.dcsa.conformance.core.party.ScenarioParameters; import org.dcsa.conformance.standards.eblissuance.action.EblType; -import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; - @With -public record DynamicScenarioParameters( - EblType eblType) { - public ObjectNode toJson() { - return OBJECT_MAPPER - .createObjectNode() - .put("eblType", eblType.name()); - } +@JsonInclude(JsonInclude.Include.NON_NULL) +public record DynamicScenarioParameters(EblType eblType) implements ScenarioParameters { public static DynamicScenarioParameters fromJson(JsonNode jsonNode) { - return new DynamicScenarioParameters( - EblType.valueOf(jsonNode.required("eblType").asText()) - ); + return OBJECT_MAPPER.convertValue(jsonNode, DynamicScenarioParameters.class); } } diff --git a/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/EblIssuanceCarrier.java b/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/EblIssuanceCarrier.java index 630be8d2..a76ce1aa 100644 --- a/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/EblIssuanceCarrier.java +++ b/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/EblIssuanceCarrier.java @@ -5,13 +5,11 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; - import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.function.Consumer; - import lombok.extern.slf4j.Slf4j; import org.dcsa.conformance.core.party.ConformanceParty; import org.dcsa.conformance.core.party.CounterpartConfiguration; @@ -121,21 +119,35 @@ private void sendIssuanceRequest(JsonNode actionPrompt) { } var jsonRequestBody = - (ObjectNode)JsonToolkit.templateFileToJsonNode( - "/standards/eblissuance/messages/eblissuance-v%s-request.json" - .formatted(apiVersion), - Map.ofEntries( - Map.entry("TRANSPORT_DOCUMENT_REFERENCE_PLACEHOLDER", tdr), - Map.entry("SHIPPING_INSTRUCTION_REFERENCE_PLACEHOLDER", sir), - Map.entry("BOOKING_REFERENCE_PLACEHOLDER", br), - Map.entry("SEND_TO_PLATFORM_PLACEHOLDER", ssp.sendToPlatform()), - Map.entry("ISSUE_TO_LEGAL_NAME_PLACEHOLDER", ssp.issueToLegalName()), - Map.entry("ISSUE_TO_PARTY_CODE_PLACEHOLDER", ssp.issueToPartyCode()), - Map.entry("ISSUE_TO_CODE_LIST_NAME_PLACEHOLDER", ssp.issueToCodeListName()), - Map.entry("CONSIGNEE_LEGAL_NAME_PLACEHOLDER", ssp.consigneeOrEndorseeLegalName()), - Map.entry("CONSIGNEE_PARTY_CODE_PLACEHOLDER", ssp.consigneeOrEndorseePartyCode()), - Map.entry("CONSIGNEE_CODE_LIST_NAME_PLACEHOLDER", ssp.consigneeOrEndorseeCodeListName()) - )); + (ObjectNode) + JsonToolkit.templateFileToJsonNode( + "/standards/eblissuance/messages/eblissuance-v%s-request.json" + .formatted(apiVersion), + Map.ofEntries( + Map.entry("TRANSPORT_DOCUMENT_REFERENCE_PLACEHOLDER", tdr), + Map.entry("SHIPPING_INSTRUCTION_REFERENCE_PLACEHOLDER", sir), + Map.entry("BOOKING_REFERENCE_PLACEHOLDER", br), + Map.entry( + "SEND_TO_PLATFORM_PLACEHOLDER", + Objects.requireNonNullElse(ssp.sendToPlatform(), "")), + Map.entry( + "ISSUE_TO_LEGAL_NAME_PLACEHOLDER", + Objects.requireNonNullElse(ssp.issueToLegalName(), "")), + Map.entry( + "ISSUE_TO_PARTY_CODE_PLACEHOLDER", + Objects.requireNonNullElse(ssp.issueToPartyCode(), "")), + Map.entry( + "ISSUE_TO_CODE_LIST_NAME_PLACEHOLDER", + Objects.requireNonNullElse(ssp.issueToCodeListName(), "")), + Map.entry( + "CONSIGNEE_LEGAL_NAME_PLACEHOLDER", + Objects.requireNonNullElse(ssp.consigneeOrEndorseeLegalName(), "")), + Map.entry( + "CONSIGNEE_PARTY_CODE_PLACEHOLDER", + Objects.requireNonNullElse(ssp.consigneeOrEndorseePartyCode(), "")), + Map.entry( + "CONSIGNEE_CODE_LIST_NAME_PLACEHOLDER", + Objects.requireNonNullElse(ssp.consigneeOrEndorseeCodeListName(), "")))); if (eblType.isToOrder()) { var td = (ObjectNode)jsonRequestBody.path("document"); diff --git a/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/SuppliedScenarioParameters.java b/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/SuppliedScenarioParameters.java index d84a6f04..b379dc65 100644 --- a/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/SuppliedScenarioParameters.java +++ b/ebl-issuance/src/main/java/org/dcsa/conformance/standards/eblissuance/party/SuppliedScenarioParameters.java @@ -3,37 +3,19 @@ import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import org.dcsa.conformance.core.party.ScenarioParameters; public record SuppliedScenarioParameters( - String sendToPlatform, - String issueToLegalName, - String issueToPartyCode, - String issueToCodeListName, - String consigneeOrEndorseeLegalName, - String consigneeOrEndorseePartyCode, - String consigneeOrEndorseeCodeListName - ) { - public ObjectNode toJson() { - return OBJECT_MAPPER - .createObjectNode() - .put("sendToPlatform", sendToPlatform) - .put("issueToLegalName", issueToLegalName) - .put("issueToPartyCode", issueToPartyCode) - .put("issueToCodeListName", issueToCodeListName) - .put("consigneeOrEndorseeLegalName", consigneeOrEndorseeLegalName) - .put("consigneeOrEndorseePartyCode", consigneeOrEndorseePartyCode) - .put("consigneeOrEndorseeCodeListName", consigneeOrEndorseeCodeListName); - } + String sendToPlatform, + String issueToLegalName, + String issueToPartyCode, + String issueToCodeListName, + String consigneeOrEndorseeLegalName, + String consigneeOrEndorseePartyCode, + String consigneeOrEndorseeCodeListName) + implements ScenarioParameters { public static SuppliedScenarioParameters fromJson(JsonNode jsonNode) { - return new SuppliedScenarioParameters( - jsonNode.required("sendToPlatform").asText(), - jsonNode.required("issueToLegalName").asText(), - jsonNode.required("issueToPartyCode").asText(), - jsonNode.required("issueToCodeListName").asText(), - jsonNode.required("consigneeOrEndorseeLegalName").asText(), - jsonNode.required("consigneeOrEndorseePartyCode").asText(), - jsonNode.required("consigneeOrEndorseeCodeListName").asText()); + return OBJECT_MAPPER.convertValue(jsonNode, SuppliedScenarioParameters.class); } } diff --git a/ebl-surrender/src/main/java/org/dcsa/conformance/standards/eblsurrender/party/SuppliedScenarioParameters.java b/ebl-surrender/src/main/java/org/dcsa/conformance/standards/eblsurrender/party/SuppliedScenarioParameters.java index f93c8e19..d1ab7663 100644 --- a/ebl-surrender/src/main/java/org/dcsa/conformance/standards/eblsurrender/party/SuppliedScenarioParameters.java +++ b/ebl-surrender/src/main/java/org/dcsa/conformance/standards/eblsurrender/party/SuppliedScenarioParameters.java @@ -3,30 +3,16 @@ import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import org.dcsa.conformance.core.party.ScenarioParameters; public record SuppliedScenarioParameters( - String transportDocumentReference, - JsonNode issueToParty, - JsonNode carrierParty, - JsonNode surrendereeParty -) { - public ObjectNode toJson() { - var r = OBJECT_MAPPER - .createObjectNode() - .put("transportDocumentReference", transportDocumentReference); - - r.set("issueToParty", issueToParty); - r.set("carrierParty", carrierParty); - r.set("surrendereeParty", surrendereeParty); - return r; - } + String transportDocumentReference, + JsonNode issueToParty, + JsonNode carrierParty, + JsonNode surrendereeParty) + implements ScenarioParameters { public static SuppliedScenarioParameters fromJson(JsonNode jsonNode) { - return new SuppliedScenarioParameters( - jsonNode.required("transportDocumentReference").asText(), - jsonNode.required("issueToParty"), - jsonNode.required("carrierParty"), - jsonNode.required("surrendereeParty")); + return OBJECT_MAPPER.convertValue(jsonNode, SuppliedScenarioParameters.class); } } diff --git a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/CarrierScenarioParameters.java b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/CarrierScenarioParameters.java index 4d54b448..51d313cf 100644 --- a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/CarrierScenarioParameters.java +++ b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/CarrierScenarioParameters.java @@ -1,55 +1,24 @@ package org.dcsa.conformance.standards.ebl.party; -import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import org.dcsa.conformance.core.party.ScenarioParameters; +@JsonInclude(JsonInclude.Include.NON_NULL) public record CarrierScenarioParameters( - String carrierBookingReference, - String commoditySubreference, - String commoditySubreference2, - String equipmentReference, - String equipmentReference2, - String invoicePayableAtUNLocationCode, - String consignmentItemHSCode, - String consignmentItem2HSCode, - String descriptionOfGoods, - String descriptionOfGoods2, - String outerPackagingDescription - ) { - public ObjectNode toJson() { - var node = OBJECT_MAPPER - .createObjectNode() - .put("carrierBookingReference", carrierBookingReference) - .put("equipmentReference", equipmentReference) - .put("invoicePayableAtUNLocationCode", invoicePayableAtUNLocationCode) - .put("consignmentItemHSCode", consignmentItemHSCode) - .put("descriptionOfGoods", descriptionOfGoods); - - if (commoditySubreference != null) { - node.put("commoditySubreference", commoditySubreference); - } - if (commoditySubreference2 != null) { - node.put("commoditySubreference2", commoditySubreference2); - } - if (equipmentReference != null) { - node.put("equipmentReference", equipmentReference); - } - if (equipmentReference2 != null) { - node.put("equipmentReference2", equipmentReference2); - } - if (consignmentItem2HSCode != null) { - node.put("consignmentItem2HSCode", consignmentItem2HSCode); - } - if (descriptionOfGoods2 != null) { - node.put("descriptionOfGoods2", descriptionOfGoods2); - } - if (outerPackagingDescription != null) { - node.put("outerPackagingDescription", outerPackagingDescription); - } - return node; - } + String carrierBookingReference, + String commoditySubreference, + String commoditySubreference2, + String equipmentReference, + String equipmentReference2, + String invoicePayableAtUNLocationCode, + String consignmentItemHSCode, + String consignmentItem2HSCode, + String descriptionOfGoods, + String descriptionOfGoods2, + String outerPackagingDescription) + implements ScenarioParameters { public static CarrierScenarioParameters fromJson(JsonNode jsonNode) { return new CarrierScenarioParameters( diff --git a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/DynamicScenarioParameters.java b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/DynamicScenarioParameters.java index 54ad37c3..ba0c0cb6 100644 --- a/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/DynamicScenarioParameters.java +++ b/ebl/src/main/java/org/dcsa/conformance/standards/ebl/party/DynamicScenarioParameters.java @@ -1,62 +1,35 @@ package org.dcsa.conformance.standards.ebl.party; -import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import java.util.function.Function; import lombok.NonNull; import lombok.With; +import org.dcsa.conformance.core.party.ScenarioParameters; import org.dcsa.conformance.standards.ebl.checks.ScenarioType; @With +@JsonInclude(JsonInclude.Include.NON_NULL) public record DynamicScenarioParameters( - @NonNull - ScenarioType scenarioType, + @NonNull ScenarioType scenarioType, String shippingInstructionsReference, String transportDocumentReference, JsonNode shippingInstructions, JsonNode updatedShippingInstructions, boolean newTransportDocumentContent, JsonNode transportDocument, - JsonNode previousTransportDocument) { - public ObjectNode toJson() { - var node = OBJECT_MAPPER.createObjectNode() - .put("scenarioType", scenarioType.name()) - .put("shippingInstructionsReference", shippingInstructionsReference) - .put("transportDocumentReference", transportDocumentReference) - .put("newTransportDocumentContent", newTransportDocumentContent); - node.replace("shippingInstructions", shippingInstructions); - node.replace("updatedShippingInstructions", updatedShippingInstructions); - node.replace("transportDocument", transportDocument); - node.replace("previousTransportDocument", previousTransportDocument); - return node; - } - - private static > String serializeEnum(E v, Function mapper) { - if (v == null) { - return null; - } - return mapper.apply(v); - } - - private static E readEnum(String value, Function mapper) { - if (value == null) { - return null; - } - return mapper.apply(value); - } + JsonNode previousTransportDocument) + implements ScenarioParameters { public static DynamicScenarioParameters fromJson(JsonNode jsonNode) { return new DynamicScenarioParameters( - readEnum(jsonNode.required("scenarioType").asText(), ScenarioType::valueOf), + ScenarioType.valueOf(jsonNode.required("scenarioType").asText()), jsonNode.path("shippingInstructionsReference").asText(null), jsonNode.path("transportDocumentReference").asText(null), jsonNode.path("shippingInstructions"), jsonNode.path("updatedShippingInstructions"), jsonNode.path("newTransportDocumentContent").asBoolean(false), jsonNode.path("transportDocument"), - jsonNode.path("previousTransportDocument") - ); + jsonNode.path("previousTransportDocument")); } } diff --git a/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/DynamicScenarioParameters.java b/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/DynamicScenarioParameters.java index b4af2e98..aa8b92c2 100644 --- a/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/DynamicScenarioParameters.java +++ b/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/DynamicScenarioParameters.java @@ -2,44 +2,23 @@ import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import lombok.With; - import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; +import lombok.With; +import org.dcsa.conformance.core.party.ScenarioParameters; @With +@JsonInclude(JsonInclude.Include.NON_NULL) public record DynamicScenarioParameters( - String transportDocumentChecksum, - int documentCount, - Set documentChecksums, - String envelopeReference, - JsonNode receiverValidation -) { - public ObjectNode toJson() { - var node = OBJECT_MAPPER.createObjectNode() - .put("transportDocumentChecksum", transportDocumentChecksum) - .put("documentCount", documentCount) - .put("envelopeReference", envelopeReference); - var jsonDocumentChecksums = node.putArray("documentChecksums"); - for (var checksum : documentChecksums) { - jsonDocumentChecksums.add(checksum); - } - node.set("receiverValidation", receiverValidation); - return node; - } + String transportDocumentChecksum, + int documentCount, + Set documentChecksums, + String envelopeReference, + JsonNode receiverValidation) + implements ScenarioParameters { public static DynamicScenarioParameters fromJson(JsonNode jsonNode) { - return new DynamicScenarioParameters( - jsonNode.required("transportDocumentChecksum").asText(null), - jsonNode.required("documentCount").asInt(), - StreamSupport.stream(jsonNode.required("documentChecksums").spliterator(), false) - .map(JsonNode::asText) - .collect(Collectors.toUnmodifiableSet()), - jsonNode.required("envelopeReference").asText(), - jsonNode.path("receiverValidation") - ); + return OBJECT_MAPPER.convertValue(jsonNode, DynamicScenarioParameters.class); } } diff --git a/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/ReceiverScenarioParameters.java b/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/ReceiverScenarioParameters.java index ae6044d2..9b6234bc 100644 --- a/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/ReceiverScenarioParameters.java +++ b/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/ReceiverScenarioParameters.java @@ -2,27 +2,17 @@ import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.With; +import org.dcsa.conformance.core.party.ScenarioParameters; @With -public record ReceiverScenarioParameters( - JsonNode receiverParty, - String receiverPublicKeyPEM -) { - public ObjectNode toJson() { - var r = OBJECT_MAPPER - .createObjectNode() - .put("receiverPublicKeyPEM", receiverPublicKeyPEM); - r.set("receiverParty", receiverParty); - return r; - } +@JsonInclude(JsonInclude.Include.NON_NULL) +public record ReceiverScenarioParameters(JsonNode receiverParty, String receiverPublicKeyPEM) + implements ScenarioParameters { public static ReceiverScenarioParameters fromJson(JsonNode jsonNode) { - return new ReceiverScenarioParameters( - jsonNode.required("receiverParty"), - jsonNode.required("receiverPublicKeyPEM").asText() - ); + return OBJECT_MAPPER.convertValue(jsonNode, ReceiverScenarioParameters.class); } } diff --git a/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/SenderScenarioParameters.java b/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/SenderScenarioParameters.java index 828a6bb1..7ac46622 100644 --- a/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/SenderScenarioParameters.java +++ b/pint/src/main/java/org/dcsa/conformance/standards/eblinterop/models/SenderScenarioParameters.java @@ -1,33 +1,20 @@ package org.dcsa.conformance.standards.eblinterop.models; +import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; + import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.With; - -import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; +import org.dcsa.conformance.core.party.ScenarioParameters; @With public record SenderScenarioParameters( - String transportDocumentReference, - String eblPlatform, - String senderPublicKeyPEM, - String carrierPublicKeyPEM - ) { - public ObjectNode toJson() { - return OBJECT_MAPPER - .createObjectNode() - .put("transportDocumentReference", transportDocumentReference) - .put("eblPlatform", eblPlatform) - .put("senderPublicKeyPEM", senderPublicKeyPEM) - .put("carrierPublicKeyPEM", carrierPublicKeyPEM); - } + String transportDocumentReference, + String eblPlatform, + String senderPublicKeyPEM, + String carrierPublicKeyPEM) + implements ScenarioParameters { public static SenderScenarioParameters fromJson(JsonNode jsonNode) { - return new SenderScenarioParameters( - jsonNode.required("transportDocumentReference").asText(), - jsonNode.required("eblPlatform").asText(), - jsonNode.required("senderPublicKeyPEM").asText(), - jsonNode.required("carrierPublicKeyPEM").asText() - ); + return OBJECT_MAPPER.convertValue(jsonNode, SenderScenarioParameters.class); } } diff --git a/sandbox/src/main/java/org/dcsa/conformance/sandbox/SandboxWaiting.java b/sandbox/src/main/java/org/dcsa/conformance/sandbox/SandboxWaiting.java index a69f11ee..5d4caf11 100644 --- a/sandbox/src/main/java/org/dcsa/conformance/sandbox/SandboxWaiting.java +++ b/sandbox/src/main/java/org/dcsa/conformance/sandbox/SandboxWaiting.java @@ -1,22 +1,17 @@ package org.dcsa.conformance.sandbox; -import com.fasterxml.jackson.databind.node.ObjectNode; - import static org.dcsa.conformance.core.toolkit.JsonToolkit.OBJECT_MAPPER; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + public record SandboxWaiting(String who, String forWhom, String toDoWhat) { - ObjectNode toJson() { - return OBJECT_MAPPER - .createObjectNode() - .put("who", who) - .put("forWhom", forWhom) - .put("toDoWhat", toDoWhat); + + public ObjectNode toJson() { + return OBJECT_MAPPER.valueToTree(this); } - static SandboxWaiting fromJson(ObjectNode objectNode) { - return new SandboxWaiting( - objectNode.get("who").asText(), - objectNode.get("forWhom").asText(), - objectNode.get("toDoWhat").asText()); + public static SandboxWaiting fromJson(JsonNode jsonNode) { + return OBJECT_MAPPER.convertValue(jsonNode, SandboxWaiting.class); } }