From 2fbede8f3a4a3841343662603e438937e6dfad90 Mon Sep 17 00:00:00 2001 From: Niels Thykier Date: Mon, 20 Nov 2023 15:26:34 +0100 Subject: [PATCH] booking: Support getting a booking via CBR in addition to CBRR Signed-off-by: Niels Thykier --- .../standards/booking/party/Carrier.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/booking/src/main/java/org/dcsa/conformance/standards/booking/party/Carrier.java b/booking/src/main/java/org/dcsa/conformance/standards/booking/party/Carrier.java index 0f7b3eec..db6c0070 100644 --- a/booking/src/main/java/org/dcsa/conformance/standards/booking/party/Carrier.java +++ b/booking/src/main/java/org/dcsa/conformance/standards/booking/party/Carrier.java @@ -32,6 +32,7 @@ public class Carrier extends ConformanceParty { private final ObjectMapper objectMapper = new ObjectMapper(); private final Map bookingStatesByCbrr = new HashMap<>(); private final Map cbrrToCbr = new HashMap<>(); + private final Map cbrToCbrr = new HashMap<>(); protected boolean isShipperNotificationEnabled = false; public Carrier( @@ -56,6 +57,7 @@ protected void exportPartyJsonState(ObjectNode targetObjectNode) { "bookingStatesByCbrr", StateManagementUtil.storeMap(objectMapper, bookingStatesByCbrr, BookingState::name)); targetObjectNode.set("cbrrToCbr", StateManagementUtil.storeMap(objectMapper, cbrrToCbr)); + targetObjectNode.set("cbrToCbrr", StateManagementUtil.storeMap(objectMapper, cbrToCbrr)); } @Override @@ -63,11 +65,14 @@ protected void importPartyJsonState(ObjectNode sourceObjectNode) { StateManagementUtil.restoreIntoMap( bookingStatesByCbrr, sourceObjectNode.get("bookingStatesByCbrr"), BookingState::valueOf); StateManagementUtil.restoreIntoMap(cbrrToCbr, sourceObjectNode.get("cbrrToCbr")); + StateManagementUtil.restoreIntoMap(cbrToCbrr, sourceObjectNode.get("cbrToCbrr")); } @Override protected void doReset() { bookingStatesByCbrr.clear(); + cbrrToCbr.clear(); + cbrToCbrr.clear(); } @Override @@ -397,6 +402,7 @@ private void processAndEmitNotificationForStateTransition( if (cbr == null) { cbr = UUID.randomUUID().toString().replace("-", "").toUpperCase(); cbrrToCbr.put(cbrr, cbr); + cbrToCbrr.put(cbr, cbrr); generatedCBR = true; } } @@ -467,16 +473,24 @@ public ConformanceResponse handleRequest(ConformanceRequest request) { } } + private String lastUrlSegment(String url) { + // ".../foo" and ".../foo/" should be the same + return url.substring(1 + url.replaceAll("/++$", "").lastIndexOf("/")); + } + private ConformanceResponse _handleGetBookingRequest(ConformanceRequest request) { - String cbrr = request.url().substring(1 + request.url().lastIndexOf("/")); + var bookingReference = lastUrlSegment(request.url()); + // bookingReference can either be a CBR or CBRR. + var cbrr = cbrToCbrr.getOrDefault(bookingReference, bookingReference); + var booking = persistentMap.load(cbrr); ConformanceResponse response = request.createResponse( 200, Map.of("Api-Version", List.of(apiVersion)), - new ConformanceMessageBody(persistentMap.load(cbrr))); + new ConformanceMessageBody(booking)); addOperatorLogEntry( "Responded to GET booking request '%s' (in state '%s')" - .formatted(cbrr, BookingState.RECEIVED.wireName())); + .formatted(bookingReference, booking.get("bookingStatus"))); return response; }