Skip to content

Commit

Permalink
STNG-184 Improve all DSP and related classes (#198)
Browse files Browse the repository at this point in the history
* Use Jackson Object Mapper functionality if possible
  • Loading branch information
jkosternl authored Oct 21, 2024
1 parent 2cd78f7 commit c239caf
Show file tree
Hide file tree
Showing 19 changed files with 233 additions and 409 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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> E readEnum(String value, Function<String, E> 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);
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Loading

0 comments on commit c239caf

Please sign in to comment.