From c55d094826943f184388d5e8047d371a18562d8f Mon Sep 17 00:00:00 2001 From: Aowss Ibrahim Date: Sat, 12 Apr 2025 20:40:55 -0400 Subject: [PATCH 1/9] Refactor UnLocode --- .../handling/UnknownLocationException.java | 2 +- .../domain/model/location/Location.java | 2 +- .../domain/model/location/UnLocode.java | 98 +++++-------------- .../jpa/LocationRepositoryJPA.java | 2 +- .../routing/ExternalRoutingService.java | 4 +- .../assembler/CargoRoutingDTOAssembler.java | 8 +- .../ItineraryCandidateDTOAssembler.java | 2 +- .../assembler/LocationDTOAssembler.java | 2 +- .../domain/model/location/UnLocodeTest.java | 4 +- .../routing/ExternalRoutingServiceTest.java | 2 +- 10 files changed, 40 insertions(+), 86 deletions(-) diff --git a/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownLocationException.java b/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownLocationException.java index 211e59d31..f15bf8cf2 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownLocationException.java +++ b/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownLocationException.java @@ -12,6 +12,6 @@ public UnknownLocationException(final UnLocode unlocode) { @Override public String getMessage() { - return "No location with UN locode " + unlocode.idString() + " exists in the system"; + return "No location with UN locode " + unlocode.unlocode() + " exists in the system"; } } diff --git a/src/main/java/se/citerus/dddsample/domain/model/location/Location.java b/src/main/java/se/citerus/dddsample/domain/model/location/Location.java index d5a6bb12f..634e994dc 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/location/Location.java +++ b/src/main/java/se/citerus/dddsample/domain/model/location/Location.java @@ -43,7 +43,7 @@ public Location(final UnLocode unLocode, final String name) { Objects.requireNonNull(unLocode); Objects.requireNonNull(name); - this.unlocode = unLocode.idString(); + this.unlocode = unLocode.unlocode(); this.name = name; } diff --git a/src/main/java/se/citerus/dddsample/domain/model/location/UnLocode.java b/src/main/java/se/citerus/dddsample/domain/model/location/UnLocode.java index aaa3fe856..71db39cd6 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/location/UnLocode.java +++ b/src/main/java/se/citerus/dddsample/domain/model/location/UnLocode.java @@ -1,72 +1,26 @@ -package se.citerus.dddsample.domain.model.location; - -import org.apache.commons.lang3.Validate; -import se.citerus.dddsample.domain.shared.ValueObject; - -import java.util.Objects; -import java.util.regex.Pattern; - -/** - * United nations location code. - * - * http://www.unece.org/cefact/locode/ - * http://www.unece.org/cefact/locode/DocColumnDescription.htm#LOCODE - */ -public final class UnLocode implements ValueObject { - - private String unlocode; - - // Country code is exactly two letters. - // Location code is usually three letters, but may contain the numbers 2-9 as well - private static final Pattern VALID_PATTERN = Pattern.compile("[a-zA-Z]{2}[a-zA-Z2-9]{3}"); - - /** - * Constructor. - * - * @param countryAndLocation Location string. - */ - public UnLocode(final String countryAndLocation) { - Objects.requireNonNull(countryAndLocation, "Country and location may not be null"); - Validate.isTrue(VALID_PATTERN.matcher(countryAndLocation).matches(), - countryAndLocation + " is not a valid UN/LOCODE (does not match pattern)"); - - this.unlocode = countryAndLocation.toUpperCase(); - } - - /** - * @return country code and location code concatenated, always upper case. - */ - public String idString() { - return unlocode; - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - UnLocode other = (UnLocode) o; - - return sameValueAs(other); - } - - @Override - public int hashCode() { - return unlocode.hashCode(); - } - - @Override - public boolean sameValueAs(UnLocode other) { - return other != null && this.unlocode.equals(other.unlocode); - } - - @Override - public String toString() { - return idString(); - } - - UnLocode() { - // Needed by Hibernate - } - -} +package se.citerus.dddsample.domain.model.location; + +import org.apache.commons.lang3.Validate; + +import java.util.Objects; +import java.util.regex.Pattern; + +/** + * United nations location code. + * + * http://www.unece.org/cefact/locode/ + * http://www.unece.org/cefact/locode/DocColumnDescription.htm#LOCODE + */ +public record UnLocode(String unlocode) { + + private static final Pattern VALID_PATTERN = Pattern.compile("[a-zA-Z]{2}[a-zA-Z2-9]{3}"); + + public UnLocode(String unlocode) { + Objects.requireNonNull(unlocode, "Country and location may not be null"); + Validate.isTrue(VALID_PATTERN.matcher(unlocode).matches(), + unlocode + " is not a valid UN/LOCODE (does not match pattern)"); + + this.unlocode = unlocode.toUpperCase(); + } + +} diff --git a/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/LocationRepositoryJPA.java b/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/LocationRepositoryJPA.java index 9976996d1..d250382f1 100644 --- a/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/LocationRepositoryJPA.java +++ b/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/LocationRepositoryJPA.java @@ -13,7 +13,7 @@ public interface LocationRepositoryJPA extends CrudRepository, LocationRepository { default Location find(final UnLocode unLocode) { - return findByUnLoCode(unLocode.idString()); + return findByUnLoCode(unLocode.unlocode()); } @Query("select loc from Location loc where loc.unlocode = :unlocode") diff --git a/src/main/java/se/citerus/dddsample/infrastructure/routing/ExternalRoutingService.java b/src/main/java/se/citerus/dddsample/infrastructure/routing/ExternalRoutingService.java index 4af9c6718..cc09ad7d7 100644 --- a/src/main/java/se/citerus/dddsample/infrastructure/routing/ExternalRoutingService.java +++ b/src/main/java/se/citerus/dddsample/infrastructure/routing/ExternalRoutingService.java @@ -52,8 +52,8 @@ public List fetchRoutesForSpecification(RouteSpecification routeSpeci final List transitPaths; transitPaths = graphTraversalService.findShortestPath( - origin.unLocode().idString(), - destination.unLocode().idString(), + origin.unLocode().unlocode(), + destination.unLocode().unlocode(), limitations ); diff --git a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java index 8cd3235d5..7f75b5b2d 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java +++ b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java @@ -18,15 +18,15 @@ public class CargoRoutingDTOAssembler { public CargoRoutingDTO toDTO(final Cargo cargo) { final CargoRoutingDTO dto = new CargoRoutingDTO( cargo.trackingId().idString(), - cargo.origin().unLocode().idString(), - cargo.routeSpecification().destination().unLocode().idString(), + cargo.origin().unLocode().unlocode(), + cargo.routeSpecification().destination().unLocode().unlocode(), cargo.routeSpecification().arrivalDeadline(), cargo.delivery().routingStatus().sameValueAs(RoutingStatus.MISROUTED)); for (Leg leg : cargo.itinerary().legs()) { dto.addLeg( leg.voyage().voyageNumber().idString(), - leg.loadLocation().unLocode().idString(), - leg.unloadLocation().unLocode().idString(), + leg.loadLocation().unLocode().unlocode(), + leg.unloadLocation().unLocode().unlocode(), leg.loadTime(), leg.unloadTime()); } diff --git a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/ItineraryCandidateDTOAssembler.java b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/ItineraryCandidateDTOAssembler.java index faff42f4e..4ce5078ba 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/ItineraryCandidateDTOAssembler.java +++ b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/ItineraryCandidateDTOAssembler.java @@ -39,7 +39,7 @@ protected LegDTO toLegDTO(final Leg leg) { final VoyageNumber voyageNumber = leg.voyage().voyageNumber(); final UnLocode from = leg.loadLocation().unLocode(); final UnLocode to = leg.unloadLocation().unLocode(); - return new LegDTO(voyageNumber.idString(), from.idString(), to.idString(), leg.loadTime(), leg.unloadTime()); + return new LegDTO(voyageNumber.idString(), from.unlocode(), to.unlocode(), leg.loadTime(), leg.unloadTime()); } /** diff --git a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/LocationDTOAssembler.java b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/LocationDTOAssembler.java index af2b4c2b7..aa8cd375a 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/LocationDTOAssembler.java +++ b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/LocationDTOAssembler.java @@ -9,7 +9,7 @@ public class LocationDTOAssembler { public LocationDTO toDTO(Location location) { - return new LocationDTO(location.unLocode().idString(), location.name()); + return new LocationDTO(location.unLocode().unlocode(), location.name()); } public List toDTOList(List allLocations) { diff --git a/src/test/java/se/citerus/dddsample/domain/model/location/UnLocodeTest.java b/src/test/java/se/citerus/dddsample/domain/model/location/UnLocodeTest.java index 94d9e2d7e..3b44cc563 100644 --- a/src/test/java/se/citerus/dddsample/domain/model/location/UnLocodeTest.java +++ b/src/test/java/se/citerus/dddsample/domain/model/location/UnLocodeTest.java @@ -26,8 +26,8 @@ public void shouldPreventCreationOfInvalidUnLoCodes(String input) { } @Test - public void testIdString() { - assertThat(new UnLocode("AbcDe").idString()).isEqualTo("ABCDE"); + public void testUnlocodeString() { + assertThat(new UnLocode("AbcDe").unlocode()).isEqualTo("ABCDE"); } @Test diff --git a/src/test/java/se/citerus/dddsample/infrastructure/routing/ExternalRoutingServiceTest.java b/src/test/java/se/citerus/dddsample/infrastructure/routing/ExternalRoutingServiceTest.java index 680653b63..5bb662a17 100644 --- a/src/test/java/se/citerus/dddsample/infrastructure/routing/ExternalRoutingServiceTest.java +++ b/src/test/java/se/citerus/dddsample/infrastructure/routing/ExternalRoutingServiceTest.java @@ -33,7 +33,7 @@ public void setUp() { voyageRepository = mock(VoyageRepository.class); GraphTraversalService graphTraversalService = new GraphTraversalServiceImpl(new GraphDAOStub() { public List listLocations() { - return List.of(TOKYO.unLocode().idString(), STOCKHOLM.unLocode().idString(), GOTHENBURG.unLocode().idString()); + return List.of(TOKYO.unLocode().unlocode(), STOCKHOLM.unLocode().unlocode(), GOTHENBURG.unLocode().unlocode()); } public void storeCarrierMovementId(String cmId, String from, String to) { From 7635ece88bb96b9e264ff0a8449bdbf2b1d1ec48 Mon Sep 17 00:00:00 2001 From: Aowss Ibrahim Date: Sat, 12 Apr 2025 20:56:57 -0400 Subject: [PATCH 2/9] Refactor VoyageNumber --- .../handling/UnknownVoyageException.java | 2 +- .../dddsample/domain/model/voyage/Voyage.java | 4 +- .../domain/model/voyage/VoyageNumber.java | 44 +------------------ .../persistence/jpa/VoyageRepositoryJPA.java | 2 +- .../assembler/CargoRoutingDTOAssembler.java | 2 +- .../ItineraryCandidateDTOAssembler.java | 2 +- .../tracking/CargoTrackingViewAdapter.java | 6 +-- .../ws/CargoTrackingDTOConverter.java | 10 ++--- .../jpa/CarrierMovementRepositoryTest.java | 2 +- 9 files changed, 17 insertions(+), 57 deletions(-) diff --git a/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownVoyageException.java b/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownVoyageException.java index 109846c35..109f8fad5 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownVoyageException.java +++ b/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownVoyageException.java @@ -15,6 +15,6 @@ public UnknownVoyageException(VoyageNumber voyageNumber) { @Override public String getMessage() { - return "No voyage with number " + voyageNumber.idString() + " exists in the system"; + return "No voyage with number " + voyageNumber.number() + " exists in the system"; } } diff --git a/src/main/java/se/citerus/dddsample/domain/model/voyage/Voyage.java b/src/main/java/se/citerus/dddsample/domain/model/voyage/Voyage.java index 29c8a4cbe..a96724ba1 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/voyage/Voyage.java +++ b/src/main/java/se/citerus/dddsample/domain/model/voyage/Voyage.java @@ -39,7 +39,7 @@ public Voyage(final VoyageNumber voyageNumber, final Schedule schedule) { Objects.requireNonNull(voyageNumber, "Voyage number is required"); Objects.requireNonNull(schedule, "Schedule is required"); - this.voyageNumber = voyageNumber.idString(); + this.voyageNumber = voyageNumber.number(); this.carrierMovements = schedule.carrierMovements(); } @@ -75,7 +75,7 @@ public boolean equals(Object o) { @Override public boolean sameIdentityAs(Voyage other) { - return other != null && this.voyageNumber().sameValueAs(other.voyageNumber()); + return other != null && this.voyageNumber().equals(other.voyageNumber()); } @Override diff --git a/src/main/java/se/citerus/dddsample/domain/model/voyage/VoyageNumber.java b/src/main/java/se/citerus/dddsample/domain/model/voyage/VoyageNumber.java index e209700a4..953e5e138 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/voyage/VoyageNumber.java +++ b/src/main/java/se/citerus/dddsample/domain/model/voyage/VoyageNumber.java @@ -1,55 +1,15 @@ package se.citerus.dddsample.domain.model.voyage; -import se.citerus.dddsample.domain.shared.ValueObject; - import java.util.Objects; /** * Identifies a voyage. * */ -public class VoyageNumber implements ValueObject { - - private String number; +public record VoyageNumber(String number) { - public VoyageNumber(String number) { + public VoyageNumber { Objects.requireNonNull(number); - - this.number = number; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null) return false; - if (!(o instanceof VoyageNumber)) return false; - - final VoyageNumber other = (VoyageNumber) o; - - return sameValueAs(other); - } - - @Override - public int hashCode() { - return number.hashCode(); } - @Override - public boolean sameValueAs(VoyageNumber other) { - return other != null && this.number.equals(other.number); - } - - @Override - public String toString() { - return number; - } - - public String idString() { - return number; - } - - VoyageNumber() { - // Needed by Hibernate - } - } diff --git a/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/VoyageRepositoryJPA.java b/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/VoyageRepositoryJPA.java index 6aa2b8d2a..f29534b80 100644 --- a/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/VoyageRepositoryJPA.java +++ b/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/VoyageRepositoryJPA.java @@ -12,7 +12,7 @@ public interface VoyageRepositoryJPA extends CrudRepository, VoyageRepository { default Voyage find(final VoyageNumber voyageNumber) { - return findByVoyageNumber(voyageNumber.idString()); + return findByVoyageNumber(voyageNumber.number()); } @Query("select v from Voyage v where v.voyageNumber = :voyageNumber") diff --git a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java index 7f75b5b2d..03ea32901 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java +++ b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java @@ -24,7 +24,7 @@ public CargoRoutingDTO toDTO(final Cargo cargo) { cargo.delivery().routingStatus().sameValueAs(RoutingStatus.MISROUTED)); for (Leg leg : cargo.itinerary().legs()) { dto.addLeg( - leg.voyage().voyageNumber().idString(), + leg.voyage().voyageNumber().number(), leg.loadLocation().unLocode().unlocode(), leg.unloadLocation().unLocode().unlocode(), leg.loadTime(), diff --git a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/ItineraryCandidateDTOAssembler.java b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/ItineraryCandidateDTOAssembler.java index 4ce5078ba..42de0f97f 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/ItineraryCandidateDTOAssembler.java +++ b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/ItineraryCandidateDTOAssembler.java @@ -39,7 +39,7 @@ protected LegDTO toLegDTO(final Leg leg) { final VoyageNumber voyageNumber = leg.voyage().voyageNumber(); final UnLocode from = leg.loadLocation().unLocode(); final UnLocode to = leg.unloadLocation().unLocode(); - return new LegDTO(voyageNumber.idString(), from.unlocode(), to.unlocode(), leg.loadTime(), leg.unloadTime()); + return new LegDTO(voyageNumber.number(), from.unlocode(), to.unlocode(), leg.loadTime(), leg.unloadTime()); } /** diff --git a/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java b/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java index 04ff20a57..bfba284e9 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java +++ b/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java @@ -84,7 +84,7 @@ public String getStatusText() { args = new Object[] {getDisplayText(delivery.lastKnownLocation())}; break; case ONBOARD_CARRIER: - args = new Object[] {delivery.currentVoyage().voyageNumber().idString()}; + args = new Object[] {delivery.currentVoyage().voyageNumber().number()}; break; case CLAIMED: case NOT_RECEIVED: @@ -195,7 +195,7 @@ public String getType() { */ public String getVoyageNumber() { final Voyage voyage = handlingEvent.voyage(); - return voyage.voyageNumber().idString(); + return voyage.voyageNumber().number(); } /** @@ -212,7 +212,7 @@ public String getDescription() { case LOAD: case UNLOAD: args = new Object[] { - handlingEvent.voyage().voyageNumber().idString(), + handlingEvent.voyage().voyageNumber().number(), handlingEvent.location().name(), handlingEvent.completionTime() }; diff --git a/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java b/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java index 11cf614e6..edc96ae4f 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java +++ b/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java @@ -48,7 +48,7 @@ protected static String convertDescription(HandlingEvent handlingEvent, MessageS case LOAD: case UNLOAD: args = new Object[]{ - handlingEvent.voyage().voyageNumber().idString(), + handlingEvent.voyage().voyageNumber().number(), handlingEvent.location().name(), convertTime(handlingEvent) }; @@ -76,7 +76,7 @@ private static boolean convertIsExpected(HandlingEvent handlingEvent, Cargo carg } private static String convertVoyageNumber(HandlingEvent handlingEvent) { - return handlingEvent.voyage().voyageNumber().idString(); + return handlingEvent.voyage().voyageNumber().number(); } private static String convertType(HandlingEvent handlingEvent) { @@ -106,7 +106,7 @@ protected static String convertStatusText(Cargo cargo, MessageSource messageSour args = new Object[]{delivery.lastKnownLocation().name()}; break; case ONBOARD_CARRIER: - args = new Object[]{delivery.currentVoyage().voyageNumber().idString()}; + args = new Object[]{delivery.currentVoyage().voyageNumber().number()}; break; case CLAIMED: case NOT_RECEIVED: @@ -138,11 +138,11 @@ protected static String convertNextExpectedActivity(Cargo cargo) { HandlingEvent.Type type = activity.type(); if (type.sameValueAs(HandlingEvent.Type.LOAD)) { return - text + type.name().toLowerCase() + " cargo onto voyage " + activity.voyage().voyageNumber() + + text + type.name().toLowerCase() + " cargo onto voyage " + activity.voyage().voyageNumber().number() + " in " + activity.location().name(); } else if (type.sameValueAs(HandlingEvent.Type.UNLOAD)) { return - text + type.name().toLowerCase() + " cargo off of " + activity.voyage().voyageNumber() + + text + type.name().toLowerCase() + " cargo off of " + activity.voyage().voyageNumber().number() + " in " + activity.location().name(); } else { return text + type.name().toLowerCase() + " cargo in " + activity.location().name(); diff --git a/src/test/java/se/citerus/dddsample/infrastructure/persistence/jpa/CarrierMovementRepositoryTest.java b/src/test/java/se/citerus/dddsample/infrastructure/persistence/jpa/CarrierMovementRepositoryTest.java index ad33ea3ca..b14e8ddcd 100644 --- a/src/test/java/se/citerus/dddsample/infrastructure/persistence/jpa/CarrierMovementRepositoryTest.java +++ b/src/test/java/se/citerus/dddsample/infrastructure/persistence/jpa/CarrierMovementRepositoryTest.java @@ -28,7 +28,7 @@ public class CarrierMovementRepositoryTest { public void testFind() { Voyage voyage = voyageRepository.find(new VoyageNumber("0100S")); assertThat(voyage).isNotNull(); - assertThat(voyage.voyageNumber().idString()).isEqualTo("0100S"); + assertThat(voyage.voyageNumber().number()).isEqualTo("0100S"); /* TODO adapt assertThat(carrierMovement.departureLocation()).isEqualTo(STOCKHOLM); assertThat(carrierMovement.arrivalLocation()).isEqualTo(HELSINKI); From b747c77ef668050b41fd59ae3b9094c12904fe28 Mon Sep 17 00:00:00 2001 From: Aowss Ibrahim Date: Sun, 13 Apr 2025 11:11:21 -0400 Subject: [PATCH 3/9] Refactor Schedule --- .../domain/model/voyage/Schedule.java | 38 ++----------------- .../dddsample/domain/model/voyage/Voyage.java | 2 +- 2 files changed, 5 insertions(+), 35 deletions(-) diff --git a/src/main/java/se/citerus/dddsample/domain/model/voyage/Schedule.java b/src/main/java/se/citerus/dddsample/domain/model/voyage/Schedule.java index 5b4e1433a..36c86c8e3 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/voyage/Schedule.java +++ b/src/main/java/se/citerus/dddsample/domain/model/voyage/Schedule.java @@ -1,8 +1,6 @@ package se.citerus.dddsample.domain.model.voyage; import org.apache.commons.lang3.Validate; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import se.citerus.dddsample.domain.shared.ValueObject; import java.util.Collections; import java.util.List; @@ -12,18 +10,14 @@ * A voyage schedule. * */ -public class Schedule implements ValueObject { +public record Schedule(List carrierMovements) { - private List carrierMovements = Collections.emptyList(); + public static final Schedule EMPTY = new Schedule(Collections.emptyList()); - public static final Schedule EMPTY = new Schedule(); - - public Schedule(final List carrierMovements) { + public Schedule { Objects.requireNonNull(carrierMovements); Validate.noNullElements(carrierMovements); - Validate.notEmpty(carrierMovements); - - this.carrierMovements = carrierMovements; +// Validate.notEmpty(carrierMovements); } /** @@ -33,28 +27,4 @@ public List carrierMovements() { return Collections.unmodifiableList(carrierMovements); } - @Override - public boolean sameValueAs(final Schedule other) { - return other != null && this.carrierMovements.equals(other.carrierMovements); - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - final Schedule that = (Schedule) o; - - return sameValueAs(that); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(this.carrierMovements).toHashCode(); - } - - Schedule() { - // Needed by Hibernate - } - } diff --git a/src/main/java/se/citerus/dddsample/domain/model/voyage/Voyage.java b/src/main/java/se/citerus/dddsample/domain/model/voyage/Voyage.java index a96724ba1..241459081 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/voyage/Voyage.java +++ b/src/main/java/se/citerus/dddsample/domain/model/voyage/Voyage.java @@ -35,7 +35,7 @@ protected Voyage() { @Transient public static final Voyage NONE = new Voyage(new VoyageNumber(""), Schedule.EMPTY); - public Voyage(final VoyageNumber voyageNumber, final Schedule schedule) { + public Voyage(final VoyageNumber voyageNumber, final Schedule schedule) { Objects.requireNonNull(voyageNumber, "Voyage number is required"); Objects.requireNonNull(schedule, "Schedule is required"); From 6645f1d6702d0014442473321bae1bedd5c56ee2 Mon Sep 17 00:00:00 2001 From: Aowss Ibrahim Date: Sun, 13 Apr 2025 11:15:06 -0400 Subject: [PATCH 4/9] Refactor HandlingHistory --- .../model/handling/HandlingHistory.java | 26 ++----------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingHistory.java b/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingHistory.java index 97ccccabb..3eebd01a8 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingHistory.java +++ b/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingHistory.java @@ -1,7 +1,6 @@ package se.citerus.dddsample.domain.model.handling; import se.citerus.dddsample.domain.model.cargo.TrackingId; -import se.citerus.dddsample.domain.shared.ValueObject; import java.util.*; import java.util.stream.Collectors; @@ -9,13 +8,11 @@ /** * The handling history of a cargo. */ -public class HandlingHistory implements ValueObject { - - private final List handlingEvents; +public record HandlingHistory(List handlingEvents) { public static final HandlingHistory EMPTY = new HandlingHistory(Collections.emptyList()); - public HandlingHistory(Collection handlingEvents) { + public HandlingHistory(List handlingEvents) { Objects.requireNonNull(handlingEvents, "Handling events are required"); this.handlingEvents = new ArrayList<>(handlingEvents); @@ -56,25 +53,6 @@ public HandlingHistory filterOnCargo(TrackingId trackingId) { return new HandlingHistory(events); } - @Override - public boolean sameValueAs(HandlingHistory other) { - return other != null && this.handlingEvents.equals(other.handlingEvents); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - final HandlingHistory other = (HandlingHistory) o; - return sameValueAs(other); - } - - @Override - public int hashCode() { - return handlingEvents.hashCode(); - } - private static final Comparator BY_COMPLETION_TIME_COMPARATOR = Comparator.comparing(HandlingEvent::completionTime); From aaab74f426666797c3068a973a9afaeda085b403 Mon Sep 17 00:00:00 2001 From: Aowss Ibrahim Date: Sun, 13 Apr 2025 11:18:06 -0400 Subject: [PATCH 5/9] Refactor TransportStatus --- .../dddsample/domain/model/cargo/TransportStatus.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/se/citerus/dddsample/domain/model/cargo/TransportStatus.java b/src/main/java/se/citerus/dddsample/domain/model/cargo/TransportStatus.java index 872f03cff..9ef6b46b8 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/cargo/TransportStatus.java +++ b/src/main/java/se/citerus/dddsample/domain/model/cargo/TransportStatus.java @@ -1,15 +1,8 @@ package se.citerus.dddsample.domain.model.cargo; -import se.citerus.dddsample.domain.shared.ValueObject; - /** * Represents the different transport statuses for a cargo. */ -public enum TransportStatus implements ValueObject { - NOT_RECEIVED, IN_PORT, ONBOARD_CARRIER, CLAIMED, UNKNOWN; - - @Override - public boolean sameValueAs(final TransportStatus other) { - return this.equals(other); - } +public enum TransportStatus { + NOT_RECEIVED, IN_PORT, ONBOARD_CARRIER, CLAIMED, UNKNOWN } From 83869d9d7b364456f097d0bc90d7a9e76265b714 Mon Sep 17 00:00:00 2001 From: Aowss Ibrahim Date: Sun, 13 Apr 2025 11:24:17 -0400 Subject: [PATCH 6/9] Refactor TrackingId --- .../application/impl/BookingServiceImpl.java | 2 +- .../dddsample/domain/model/cargo/Cargo.java | 4 +- .../domain/model/cargo/TrackingId.java | 48 +------------------ .../model/handling/HandlingHistory.java | 2 +- .../model/handling/UnknownCargoException.java | 2 +- .../jms/JmsApplicationEventsImpl.java | 6 +-- .../persistence/jpa/CargoRepositoryJPA.java | 2 +- .../jpa/HandlingEventRepositoryJPA.java | 2 +- .../internal/BookingServiceFacadeImpl.java | 2 +- .../assembler/CargoRoutingDTOAssembler.java | 2 +- .../tracking/CargoTrackingViewAdapter.java | 2 +- .../ws/CargoTrackingDTOConverter.java | 2 +- .../SynchronousApplicationEventsStub.java | 2 +- .../inmemory/CargoRepositoryInMem.java | 12 ++--- .../persistence/jpa/CargoRepositoryTest.java | 4 +- .../HandlingReportIntegrationTest.java | 2 +- 16 files changed, 26 insertions(+), 70 deletions(-) diff --git a/src/main/java/se/citerus/dddsample/application/impl/BookingServiceImpl.java b/src/main/java/se/citerus/dddsample/application/impl/BookingServiceImpl.java index 198c36cbf..7657a101f 100644 --- a/src/main/java/se/citerus/dddsample/application/impl/BookingServiceImpl.java +++ b/src/main/java/se/citerus/dddsample/application/impl/BookingServiceImpl.java @@ -41,7 +41,7 @@ public TrackingId bookNewCargo(final UnLocode originUnLocode, Cargo cargo = cargoFactory.createCargo(originUnLocode, destinationUnLocode, arrivalDeadline); cargoRepository.store(cargo); - logger.info("Booked new cargo with tracking id {}", cargo.trackingId().idString()); + logger.info("Booked new cargo with tracking id {}", cargo.trackingId().id()); return cargo.trackingId(); } diff --git a/src/main/java/se/citerus/dddsample/domain/model/cargo/Cargo.java b/src/main/java/se/citerus/dddsample/domain/model/cargo/Cargo.java index 0c1770901..bd6279c6a 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/cargo/Cargo.java +++ b/src/main/java/se/citerus/dddsample/domain/model/cargo/Cargo.java @@ -73,7 +73,7 @@ public Cargo(final TrackingId trackingId, final RouteSpecification routeSpecific Objects.requireNonNull(trackingId, "Tracking ID is required"); Objects.requireNonNull(routeSpecification, "Route specification is required"); - this.trackingId = trackingId.idString(); + this.trackingId = trackingId.id(); // Cargo origin never changes, even if the route specification changes. // However, at creation, cargo origin can be derived from the initial route specification. this.origin = routeSpecification.origin(); @@ -87,7 +87,7 @@ public Cargo(final TrackingId trackingId, final RouteSpecification routeSpecific public Cargo(TrackingId trackingId, RouteSpecification routeSpecification, Itinerary itinerary) { Objects.requireNonNull(trackingId, "Tracking ID is required"); Objects.requireNonNull(routeSpecification, "Route specification is required"); - this.trackingId = trackingId.idString(); + this.trackingId = trackingId.id(); this.origin = routeSpecification.origin(); this.routeSpecification = routeSpecification; this.itinerary = itinerary.legs(); diff --git a/src/main/java/se/citerus/dddsample/domain/model/cargo/TrackingId.java b/src/main/java/se/citerus/dddsample/domain/model/cargo/TrackingId.java index bcc92be7a..d180097ef 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/cargo/TrackingId.java +++ b/src/main/java/se/citerus/dddsample/domain/model/cargo/TrackingId.java @@ -1,7 +1,6 @@ package se.citerus.dddsample.domain.model.cargo; import org.apache.commons.lang3.Validate; -import se.citerus.dddsample.domain.shared.ValueObject; import java.util.Objects; @@ -9,54 +8,11 @@ * Uniquely identifies a particular cargo. Automatically generated by the application. * */ -public final class TrackingId implements ValueObject { +public record TrackingId(String id) { - private String id; - - /** - * Constructor. - * - * @param id Id string. - */ - public TrackingId(final String id) { + public TrackingId { Objects.requireNonNull(id); Validate.notEmpty(id); - this.id = id; - } - - /** - * @return String representation of this tracking id. - */ - public String idString() { - return id; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - TrackingId other = (TrackingId) o; - - return sameValueAs(other); } - @Override - public int hashCode() { - return id.hashCode(); - } - - @Override - public boolean sameValueAs(TrackingId other) { - return other != null && this.id.equals(other.id); - } - - @Override - public String toString() { - return id; - } - - TrackingId() { - // Needed by Hibernate - } } diff --git a/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingHistory.java b/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingHistory.java index 3eebd01a8..f7d143bfd 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingHistory.java +++ b/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingHistory.java @@ -48,7 +48,7 @@ public HandlingEvent mostRecentlyCompletedEvent() { */ public HandlingHistory filterOnCargo(TrackingId trackingId) { List events = handlingEvents.stream() - .filter(he -> he.cargo().trackingId().sameValueAs(trackingId)) + .filter(he -> he.cargo().trackingId().equals(trackingId)) .collect(Collectors.toList()); return new HandlingHistory(events); } diff --git a/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownCargoException.java b/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownCargoException.java index 81a423e3e..9b488ca29 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownCargoException.java +++ b/src/main/java/se/citerus/dddsample/domain/model/handling/UnknownCargoException.java @@ -21,6 +21,6 @@ public UnknownCargoException(final TrackingId trackingId) { */ @Override public String getMessage() { - return "No cargo with tracking id " + trackingId.idString() + " exists in the system"; + return "No cargo with tracking id " + trackingId.id() + " exists in the system"; } } diff --git a/src/main/java/se/citerus/dddsample/infrastructure/messaging/jms/JmsApplicationEventsImpl.java b/src/main/java/se/citerus/dddsample/infrastructure/messaging/jms/JmsApplicationEventsImpl.java index 85480a496..2fa427e28 100644 --- a/src/main/java/se/citerus/dddsample/infrastructure/messaging/jms/JmsApplicationEventsImpl.java +++ b/src/main/java/se/citerus/dddsample/infrastructure/messaging/jms/JmsApplicationEventsImpl.java @@ -37,19 +37,19 @@ public JmsApplicationEventsImpl(JmsOperations jmsOperations, Destination cargoHa public void cargoWasHandled(final HandlingEvent event) { final Cargo cargo = event.cargo(); logger.info("Cargo was handled {}", cargo); - jmsOperations.send(cargoHandledQueue, session -> session.createTextMessage(cargo.trackingId().idString())); + jmsOperations.send(cargoHandledQueue, session -> session.createTextMessage(cargo.trackingId().id())); } @Override public void cargoWasMisdirected(final Cargo cargo) { logger.info("Cargo was misdirected {}", cargo); - jmsOperations.send(misdirectedCargoQueue, session -> session.createTextMessage(cargo.trackingId().idString())); + jmsOperations.send(misdirectedCargoQueue, session -> session.createTextMessage(cargo.trackingId().id())); } @Override public void cargoHasArrived(final Cargo cargo) { logger.info("Cargo has arrived {}", cargo); - jmsOperations.send(deliveredCargoQueue, session -> session.createTextMessage(cargo.trackingId().idString())); + jmsOperations.send(deliveredCargoQueue, session -> session.createTextMessage(cargo.trackingId().id())); } @Override diff --git a/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/CargoRepositoryJPA.java b/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/CargoRepositoryJPA.java index 67435d525..29c4371fe 100644 --- a/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/CargoRepositoryJPA.java +++ b/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/CargoRepositoryJPA.java @@ -16,7 +16,7 @@ public interface CargoRepositoryJPA extends CrudRepository, CargoRepository { default Cargo find(TrackingId trackingId) { - return findByTrackingId(trackingId.idString()); + return findByTrackingId(trackingId.id()); } @Query("select c from Cargo c where c.trackingId = :trackingId") diff --git a/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/HandlingEventRepositoryJPA.java b/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/HandlingEventRepositoryJPA.java index b4827ce69..a4a4c6103 100644 --- a/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/HandlingEventRepositoryJPA.java +++ b/src/main/java/se/citerus/dddsample/infrastructure/persistence/jpa/HandlingEventRepositoryJPA.java @@ -20,7 +20,7 @@ default void store(final HandlingEvent event) { } default HandlingHistory lookupHandlingHistoryOfCargo(final TrackingId trackingId) { - return new HandlingHistory(getHandlingHistoryOfCargo(trackingId.idString())); + return new HandlingHistory(getHandlingHistoryOfCargo(trackingId.id())); } @Query("select he from HandlingEvent he where he.cargo.trackingId = :trackingId and he.location is not NULL") diff --git a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/BookingServiceFacadeImpl.java b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/BookingServiceFacadeImpl.java index 11bf1803f..031e49fec 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/BookingServiceFacadeImpl.java +++ b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/BookingServiceFacadeImpl.java @@ -56,7 +56,7 @@ public String bookNewCargo(String origin, String destination, Instant arrivalDea new UnLocode(destination), arrivalDeadline ); - return trackingId.idString(); + return trackingId.id(); } @Override diff --git a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java index 03ea32901..4cd378ae3 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java +++ b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java @@ -17,7 +17,7 @@ public class CargoRoutingDTOAssembler { */ public CargoRoutingDTO toDTO(final Cargo cargo) { final CargoRoutingDTO dto = new CargoRoutingDTO( - cargo.trackingId().idString(), + cargo.trackingId().id(), cargo.origin().unLocode().unlocode(), cargo.routeSpecification().destination().unLocode().unlocode(), cargo.routeSpecification().arrivalDeadline(), diff --git a/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java b/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java index bfba284e9..6e7d8d178 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java +++ b/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java @@ -115,7 +115,7 @@ public String getOrigin() { * @return Cargo tracking id. */ public String getTrackingId() { - return cargo.trackingId().idString(); + return cargo.trackingId().id(); } public String getEta() { diff --git a/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java b/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java index edc96ae4f..33c5c9144 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java +++ b/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java @@ -93,7 +93,7 @@ private static String convertLocation(HandlingEvent handlingEvent) { } private static String convertTrackingId(Cargo cargo) { - return cargo.trackingId().idString(); + return cargo.trackingId().id(); } protected static String convertStatusText(Cargo cargo, MessageSource messageSource, Locale locale) { diff --git a/src/test/java/se/citerus/dddsample/infrastructure/messaging/stub/SynchronousApplicationEventsStub.java b/src/test/java/se/citerus/dddsample/infrastructure/messaging/stub/SynchronousApplicationEventsStub.java index 207a7b5a2..95cb10c90 100644 --- a/src/test/java/se/citerus/dddsample/infrastructure/messaging/stub/SynchronousApplicationEventsStub.java +++ b/src/test/java/se/citerus/dddsample/infrastructure/messaging/stub/SynchronousApplicationEventsStub.java @@ -27,7 +27,7 @@ public void cargoWasMisdirected(Cargo cargo) { @Override public void cargoHasArrived(Cargo cargo) { - System.out.println("EVENT: cargo has arrived: " + cargo.trackingId().idString()); + System.out.println("EVENT: cargo has arrived: " + cargo.trackingId().id()); } @Override diff --git a/src/test/java/se/citerus/dddsample/infrastructure/persistence/inmemory/CargoRepositoryInMem.java b/src/test/java/se/citerus/dddsample/infrastructure/persistence/inmemory/CargoRepositoryInMem.java index b3530a77e..441473c7a 100644 --- a/src/test/java/se/citerus/dddsample/infrastructure/persistence/inmemory/CargoRepositoryInMem.java +++ b/src/test/java/se/citerus/dddsample/infrastructure/persistence/inmemory/CargoRepositoryInMem.java @@ -34,11 +34,11 @@ public CargoRepositoryInMem() { } public Cargo find(final TrackingId trackingId) { - return cargoDb.get(trackingId.idString()); + return cargoDb.get(trackingId.id()); } public void store(final Cargo cargo) { - cargoDb.put(cargo.trackingId().idString(), cargo); + cargoDb.put(cargo.trackingId().id(), cargo); } public TrackingId nextTrackingId() { @@ -56,22 +56,22 @@ public void init() throws Exception { final TrackingId xyz = new TrackingId("XYZ"); final Cargo cargoXYZ = createCargoWithDeliveryHistory( xyz, STOCKHOLM, MELBOURNE, handlingEventRepository.lookupHandlingHistoryOfCargo(xyz)); - cargoDb.put(xyz.idString(), cargoXYZ); + cargoDb.put(xyz.id(), cargoXYZ); final TrackingId zyx = new TrackingId("ZYX"); final Cargo cargoZYX = createCargoWithDeliveryHistory( zyx, MELBOURNE, STOCKHOLM, handlingEventRepository.lookupHandlingHistoryOfCargo(zyx)); - cargoDb.put(zyx.idString(), cargoZYX); + cargoDb.put(zyx.id(), cargoZYX); final TrackingId abc = new TrackingId("ABC"); final Cargo cargoABC = createCargoWithDeliveryHistory( abc, STOCKHOLM, HELSINKI, handlingEventRepository.lookupHandlingHistoryOfCargo(abc)); - cargoDb.put(abc.idString(), cargoABC); + cargoDb.put(abc.id(), cargoABC); final TrackingId cba = new TrackingId("CBA"); final Cargo cargoCBA = createCargoWithDeliveryHistory( cba, HELSINKI, STOCKHOLM, handlingEventRepository.lookupHandlingHistoryOfCargo(cba)); - cargoDb.put(cba.idString(), cargoCBA); + cargoDb.put(cba.id(), cargoCBA); } public void setHandlingEventRepository(final HandlingEventRepository handlingEventRepository) { diff --git a/src/test/java/se/citerus/dddsample/infrastructure/persistence/jpa/CargoRepositoryTest.java b/src/test/java/se/citerus/dddsample/infrastructure/persistence/jpa/CargoRepositoryTest.java index 17f8e24c2..eeecfb601 100644 --- a/src/test/java/se/citerus/dddsample/infrastructure/persistence/jpa/CargoRepositoryTest.java +++ b/src/test/java/se/citerus/dddsample/infrastructure/persistence/jpa/CargoRepositoryTest.java @@ -126,8 +126,8 @@ public void testSave() { flush(); Cargo result = entityManager.createQuery( - String.format("from Cargo c where c.trackingId = '%s'", trackingId.idString()), Cargo.class).getSingleResult(); - assertThat(result.trackingId().idString()).isEqualTo("AAA"); + String.format("from Cargo c where c.trackingId = '%s'", trackingId.id()), Cargo.class).getSingleResult(); + assertThat(result.trackingId().id()).isEqualTo("AAA"); assertThat(result.routeSpecification().origin().id()).isEqualTo(origin.id()); assertThat(result.routeSpecification().destination().id()).isEqualTo(destination.id()); diff --git a/src/test/java/se/citerus/dddsample/interfaces/handling/HandlingReportIntegrationTest.java b/src/test/java/se/citerus/dddsample/interfaces/handling/HandlingReportIntegrationTest.java index f98275e5f..7ad9c333e 100644 --- a/src/test/java/se/citerus/dddsample/interfaces/handling/HandlingReportIntegrationTest.java +++ b/src/test/java/se/citerus/dddsample/interfaces/handling/HandlingReportIntegrationTest.java @@ -68,7 +68,7 @@ void shouldReturn201ResponseWhenHandlingReportIsSubmitted() throws Exception { HandlingHistory handlingHistory = repo.lookupHandlingHistoryOfCargo(new TrackingId("ABC123")); HandlingEvent handlingEvent = handlingHistory.mostRecentlyCompletedEvent(); - assertThat(handlingEvent.cargo().trackingId().idString()).isEqualTo("ABC123"); + assertThat(handlingEvent.cargo().trackingId().id()).isEqualTo("ABC123"); assertThat(handlingEvent) .extracting("type", "location.unlocode") .containsExactly(HandlingEvent.Type.CUSTOMS, "USDAL"); From 5312b6075b9505fea824a6f8aeaccd4727218844 Mon Sep 17 00:00:00 2001 From: Aowss Ibrahim Date: Sun, 13 Apr 2025 11:28:52 -0400 Subject: [PATCH 7/9] Refactor HandlingEvent.Type --- .../se/citerus/dddsample/domain/model/cargo/Delivery.java | 2 +- .../dddsample/domain/model/handling/HandlingEvent.java | 8 +------- .../interfaces/tracking/CargoTrackingViewAdapter.java | 4 ++-- .../interfaces/tracking/ws/CargoTrackingDTOConverter.java | 4 ++-- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/se/citerus/dddsample/domain/model/cargo/Delivery.java b/src/main/java/se/citerus/dddsample/domain/model/cargo/Delivery.java index fe9631c39..4544c21ee 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/cargo/Delivery.java +++ b/src/main/java/se/citerus/dddsample/domain/model/cargo/Delivery.java @@ -303,7 +303,7 @@ private RoutingStatus calculateRoutingStatus(Itinerary itinerary, RouteSpecifica private boolean calculateUnloadedAtDestination(RouteSpecification routeSpecification) { return lastEvent != null && - HandlingEvent.Type.UNLOAD.sameValueAs(lastEvent.type()) && + HandlingEvent.Type.UNLOAD.equals(lastEvent.type()) && routeSpecification.destination().sameIdentityAs(lastEvent.location()); } diff --git a/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingEvent.java b/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingEvent.java index 70805fe88..f9bc436de 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingEvent.java +++ b/src/main/java/se/citerus/dddsample/domain/model/handling/HandlingEvent.java @@ -7,7 +7,6 @@ import se.citerus.dddsample.domain.model.location.Location; import se.citerus.dddsample.domain.model.voyage.Voyage; import se.citerus.dddsample.domain.shared.DomainEvent; -import se.citerus.dddsample.domain.shared.ValueObject; import java.time.Instant; import java.util.Objects; @@ -62,7 +61,7 @@ public final class HandlingEvent implements DomainEvent { * Handling event type. Either requires or prohibits a carrier movement * association, it's never optional. */ - public enum Type implements ValueObject { + public enum Type { LOAD(true), UNLOAD(true), RECEIVE(false), @@ -94,11 +93,6 @@ public boolean prohibitsVoyage() { return !requiresVoyage(); } - @Override - public boolean sameValueAs(Type other) { - return this.equals(other); - } - } /** diff --git a/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java b/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java index 6e7d8d178..062754ae0 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java +++ b/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java @@ -133,11 +133,11 @@ public String getNextExpectedActivity() { String text = "Next expected activity is to "; HandlingEvent.Type type = activity.type(); - if (type.sameValueAs(HandlingEvent.Type.LOAD)) { + if (type.equals(HandlingEvent.Type.LOAD)) { return text + type.name().toLowerCase() + " cargo onto voyage " + activity.voyage().voyageNumber() + " in " + activity.location().name(); - } else if (type.sameValueAs(HandlingEvent.Type.UNLOAD)) { + } else if (type.equals(HandlingEvent.Type.UNLOAD)) { return text + type.name().toLowerCase() + " cargo off of " + activity.voyage().voyageNumber() + " in " + activity.location().name(); diff --git a/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java b/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java index 33c5c9144..226773ccd 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java +++ b/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java @@ -136,11 +136,11 @@ protected static String convertNextExpectedActivity(Cargo cargo) { String text = "Next expected activity is to "; HandlingEvent.Type type = activity.type(); - if (type.sameValueAs(HandlingEvent.Type.LOAD)) { + if (type.equals(HandlingEvent.Type.LOAD)) { return text + type.name().toLowerCase() + " cargo onto voyage " + activity.voyage().voyageNumber().number() + " in " + activity.location().name(); - } else if (type.sameValueAs(HandlingEvent.Type.UNLOAD)) { + } else if (type.equals(HandlingEvent.Type.UNLOAD)) { return text + type.name().toLowerCase() + " cargo off of " + activity.voyage().voyageNumber().number() + " in " + activity.location().name(); From dd76ad73fcb406fca5631773d2e98841f081dee6 Mon Sep 17 00:00:00 2001 From: Aowss Ibrahim Date: Sun, 13 Apr 2025 11:37:11 -0400 Subject: [PATCH 8/9] Refactor RoutingStatus enum --- .../dddsample/domain/model/cargo/RoutingStatus.java | 12 ++---------- .../internal/assembler/CargoRoutingDTOAssembler.java | 2 +- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/java/se/citerus/dddsample/domain/model/cargo/RoutingStatus.java b/src/main/java/se/citerus/dddsample/domain/model/cargo/RoutingStatus.java index e97e10f96..1dbbf38d4 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/cargo/RoutingStatus.java +++ b/src/main/java/se/citerus/dddsample/domain/model/cargo/RoutingStatus.java @@ -1,16 +1,8 @@ package se.citerus.dddsample.domain.model.cargo; -import se.citerus.dddsample.domain.shared.ValueObject; - /** * Routing status. */ -public enum RoutingStatus implements ValueObject { - NOT_ROUTED, ROUTED, MISROUTED; - - @Override - public boolean sameValueAs(final RoutingStatus other) { - return this.equals(other); - } - +public enum RoutingStatus { + NOT_ROUTED, ROUTED, MISROUTED } diff --git a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java index 4cd378ae3..c62a25883 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java +++ b/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/assembler/CargoRoutingDTOAssembler.java @@ -21,7 +21,7 @@ public CargoRoutingDTO toDTO(final Cargo cargo) { cargo.origin().unLocode().unlocode(), cargo.routeSpecification().destination().unLocode().unlocode(), cargo.routeSpecification().arrivalDeadline(), - cargo.delivery().routingStatus().sameValueAs(RoutingStatus.MISROUTED)); + cargo.delivery().routingStatus() == RoutingStatus.MISROUTED); for (Leg leg : cargo.itinerary().legs()) { dto.addLeg( leg.voyage().voyageNumber().number(), From 5df8727159a513c13acf29f680b1ed09a0b249cf Mon Sep 17 00:00:00 2001 From: Aowss Ibrahim Date: Sun, 13 Apr 2025 11:40:30 -0400 Subject: [PATCH 9/9] Use == instead of equals for HandlingEvent.Type --- .../se/citerus/dddsample/domain/model/cargo/Delivery.java | 2 +- .../interfaces/tracking/CargoTrackingViewAdapter.java | 4 ++-- .../interfaces/tracking/ws/CargoTrackingDTOConverter.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/se/citerus/dddsample/domain/model/cargo/Delivery.java b/src/main/java/se/citerus/dddsample/domain/model/cargo/Delivery.java index 4544c21ee..e9fa79e33 100644 --- a/src/main/java/se/citerus/dddsample/domain/model/cargo/Delivery.java +++ b/src/main/java/se/citerus/dddsample/domain/model/cargo/Delivery.java @@ -303,7 +303,7 @@ private RoutingStatus calculateRoutingStatus(Itinerary itinerary, RouteSpecifica private boolean calculateUnloadedAtDestination(RouteSpecification routeSpecification) { return lastEvent != null && - HandlingEvent.Type.UNLOAD.equals(lastEvent.type()) && + HandlingEvent.Type.UNLOAD == lastEvent.type() && routeSpecification.destination().sameIdentityAs(lastEvent.location()); } diff --git a/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java b/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java index 062754ae0..293ee746f 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java +++ b/src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingViewAdapter.java @@ -133,11 +133,11 @@ public String getNextExpectedActivity() { String text = "Next expected activity is to "; HandlingEvent.Type type = activity.type(); - if (type.equals(HandlingEvent.Type.LOAD)) { + if (type == HandlingEvent.Type.LOAD) { return text + type.name().toLowerCase() + " cargo onto voyage " + activity.voyage().voyageNumber() + " in " + activity.location().name(); - } else if (type.equals(HandlingEvent.Type.UNLOAD)) { + } else if (type == HandlingEvent.Type.UNLOAD) { return text + type.name().toLowerCase() + " cargo off of " + activity.voyage().voyageNumber() + " in " + activity.location().name(); diff --git a/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java b/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java index 226773ccd..73893cb12 100644 --- a/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java +++ b/src/main/java/se/citerus/dddsample/interfaces/tracking/ws/CargoTrackingDTOConverter.java @@ -136,11 +136,11 @@ protected static String convertNextExpectedActivity(Cargo cargo) { String text = "Next expected activity is to "; HandlingEvent.Type type = activity.type(); - if (type.equals(HandlingEvent.Type.LOAD)) { + if (type == HandlingEvent.Type.LOAD) { return text + type.name().toLowerCase() + " cargo onto voyage " + activity.voyage().voyageNumber().number() + " in " + activity.location().name(); - } else if (type.equals(HandlingEvent.Type.UNLOAD)) { + } else if (type == HandlingEvent.Type.UNLOAD) { return text + type.name().toLowerCase() + " cargo off of " + activity.voyage().voyageNumber().number() + " in " + activity.location().name();