diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f700bee95..236a6972b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,20 +16,28 @@ on: jobs: formatting: runs-on: ubuntu-latest + strategy: + matrix: + java: [17] steps: - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + java-version: ${{matrix.java}} + distribution: 'temurin' + - name: Print Java Version + run: java -version - uses: axel-op/googlejavaformat-action@v3 with: - # This version works will all IDEs including Eclipse. - version: 1.6 + args: "--set-exit-if-changed --dry-run --skip-reflowing-long-strings" + version: v1.22.0 skip-commit: true - # args: "--dry-run --set-exit-if-changed" build: runs-on: ubuntu-latest needs: [formatting] strategy: matrix: - java: [11] + java: [17] steps: - uses: actions/checkout@v3 - name: Set up Java diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index b3198a7e2..d41fb0a28 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -15,7 +15,7 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: '11' + java-version: '17' - name: Cache Maven packages uses: actions/cache@v3 diff --git a/README.md b/README.md index 2824670ad..6337cf672 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The [project website](https://eclipse-ee4j.github.io/cargotracker/) has detailed The simplest steps are the following (no IDE required): * Get the project source code. -* Ensure you are running Java SE 11 or Java SE 17. +* Ensure you are running Java SE 17+. * Make sure JAVA_HOME is set. * As long as you have Maven set up properly, navigate to the project source root and type: ``` diff --git a/nightly.yml b/nightly.yml index e7d63ef3f..32aa1def1 100644 --- a/nightly.yml +++ b/nightly.yml @@ -46,7 +46,7 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: '11' + java-version: '17' - name: Cache Maven packages uses: actions/cache@v3 diff --git a/pom.xml b/pom.xml index 05e2e562e..6524d18d3 100644 --- a/pom.xml +++ b/pom.xml @@ -21,8 +21,8 @@ UTF-8 UTF-8 - 11 - 10.0.0 + 17 + 11.0.0-M2 @@ -32,7 +32,7 @@ org.jboss.arquillian arquillian-bom - 1.7.1.Final + 1.8.0.Final import pom @@ -52,6 +52,13 @@ ${jakartaee-api.version} provided + + + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.2 + + org.apache.commons @@ -113,13 +120,26 @@ org.apache.maven.plugins maven-compiler-plugin - 3.11.0 + 3.13.0 + org.apache.maven.plugins maven-resources-plugin 3.3.1 + + com.diffplug.spotless + spotless-maven-plugin + 2.37.0 + + + + 1.22.0 + + + + org.apache.maven.plugins maven-war-plugin @@ -139,7 +159,7 @@ true - 6.2023.12 + 6.2024.7 http://localhost:8080/cargo-tracker/rest/graph-traversal/shortest-path org.h2.jdbcx.JdbcDataSource @@ -455,6 +475,7 @@ pom test + @@ -463,7 +484,7 @@ io.openliberty.tools liberty-maven-plugin - 3.8.2 + 3.10.3 diff --git a/src/main/java/org/eclipse/cargotracker/application/BookingService.java b/src/main/java/org/eclipse/cargotracker/application/BookingService.java index feea5ef94..71d2fbe5e 100644 --- a/src/main/java/org/eclipse/cargotracker/application/BookingService.java +++ b/src/main/java/org/eclipse/cargotracker/application/BookingService.java @@ -1,10 +1,10 @@ package org.eclipse.cargotracker.application; -import java.time.LocalDate; -import java.util.List; import jakarta.validation.Valid; import jakarta.validation.constraints.Future; import jakarta.validation.constraints.NotNull; +import java.time.LocalDate; +import java.util.List; import org.eclipse.cargotracker.domain.model.cargo.Itinerary; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; import org.eclipse.cargotracker.domain.model.location.UnLocode; diff --git a/src/main/java/org/eclipse/cargotracker/application/HandlingEventService.java b/src/main/java/org/eclipse/cargotracker/application/HandlingEventService.java index 953261a02..7536ae01c 100644 --- a/src/main/java/org/eclipse/cargotracker/application/HandlingEventService.java +++ b/src/main/java/org/eclipse/cargotracker/application/HandlingEventService.java @@ -1,8 +1,8 @@ package org.eclipse.cargotracker.application; -import java.time.LocalDateTime; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; import org.eclipse.cargotracker.domain.model.handling.CannotCreateHandlingEventException; import org.eclipse.cargotracker.domain.model.handling.HandlingEvent; diff --git a/src/main/java/org/eclipse/cargotracker/application/internal/DefaultBookingService.java b/src/main/java/org/eclipse/cargotracker/application/internal/DefaultBookingService.java index 93e8c2f45..248446639 100644 --- a/src/main/java/org/eclipse/cargotracker/application/internal/DefaultBookingService.java +++ b/src/main/java/org/eclipse/cargotracker/application/internal/DefaultBookingService.java @@ -1,12 +1,11 @@ package org.eclipse.cargotracker.application.internal; +import jakarta.ejb.Stateless; +import jakarta.inject.Inject; import java.time.LocalDate; -import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import jakarta.ejb.Stateless; -import jakarta.inject.Inject; import org.eclipse.cargotracker.application.BookingService; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.CargoRepository; @@ -49,7 +48,7 @@ public List requestPossibleRoutesForCargo(TrackingId trackingId) { Cargo cargo = cargoRepository.find(trackingId); if (cargo == null) { - return Collections.emptyList(); + return List.of(); } return routingService.fetchRoutesForSpecification(cargo.getRouteSpecification()); diff --git a/src/main/java/org/eclipse/cargotracker/application/internal/DefaultCargoInspectionService.java b/src/main/java/org/eclipse/cargotracker/application/internal/DefaultCargoInspectionService.java index 5acd8b7b7..6e309eebb 100644 --- a/src/main/java/org/eclipse/cargotracker/application/internal/DefaultCargoInspectionService.java +++ b/src/main/java/org/eclipse/cargotracker/application/internal/DefaultCargoInspectionService.java @@ -1,9 +1,9 @@ package org.eclipse.cargotracker.application.internal; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.ejb.Stateless; import jakarta.inject.Inject; +import java.util.logging.Level; +import java.util.logging.Logger; import org.eclipse.cargotracker.application.ApplicationEvents; import org.eclipse.cargotracker.application.CargoInspectionService; import org.eclipse.cargotracker.domain.model.cargo.Cargo; diff --git a/src/main/java/org/eclipse/cargotracker/application/internal/DefaultHandlingEventService.java b/src/main/java/org/eclipse/cargotracker/application/internal/DefaultHandlingEventService.java index a453eec71..d06241aba 100644 --- a/src/main/java/org/eclipse/cargotracker/application/internal/DefaultHandlingEventService.java +++ b/src/main/java/org/eclipse/cargotracker/application/internal/DefaultHandlingEventService.java @@ -1,9 +1,9 @@ package org.eclipse.cargotracker.application.internal; -import java.time.LocalDateTime; -import java.util.logging.Logger; import jakarta.ejb.Stateless; import jakarta.inject.Inject; +import java.time.LocalDateTime; +import java.util.logging.Logger; import org.eclipse.cargotracker.application.ApplicationEvents; import org.eclipse.cargotracker.application.HandlingEventService; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; diff --git a/src/main/java/org/eclipse/cargotracker/application/util/ApplicationSettings.java b/src/main/java/org/eclipse/cargotracker/application/util/ApplicationSettings.java index 40b92eb5b..3ab36b031 100644 --- a/src/main/java/org/eclipse/cargotracker/application/util/ApplicationSettings.java +++ b/src/main/java/org/eclipse/cargotracker/application/util/ApplicationSettings.java @@ -1,8 +1,9 @@ package org.eclipse.cargotracker.application.util; -import java.io.Serializable; import jakarta.persistence.Entity; import jakarta.persistence.Id; +import java.io.Serial; +import java.io.Serializable; /** * Application settings. Although this is stored in the database, it is not a true part of the @@ -10,7 +11,7 @@ */ @Entity public class ApplicationSettings implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Id private Long id; diff --git a/src/main/java/org/eclipse/cargotracker/application/util/RestConfiguration.java b/src/main/java/org/eclipse/cargotracker/application/util/RestConfiguration.java index 4888b5f80..a85570fe4 100644 --- a/src/main/java/org/eclipse/cargotracker/application/util/RestConfiguration.java +++ b/src/main/java/org/eclipse/cargotracker/application/util/RestConfiguration.java @@ -1,9 +1,9 @@ package org.eclipse.cargotracker.application.util; -import java.util.HashMap; -import java.util.Map; import jakarta.ws.rs.ApplicationPath; import jakarta.ws.rs.core.Application; +import java.util.HashMap; +import java.util.Map; import org.glassfish.jersey.server.ServerProperties; /** Jakarta REST configuration. */ diff --git a/src/main/java/org/eclipse/cargotracker/application/util/SampleDataGenerator.java b/src/main/java/org/eclipse/cargotracker/application/util/SampleDataGenerator.java index 4d02dae1f..97a1431c8 100644 --- a/src/main/java/org/eclipse/cargotracker/application/util/SampleDataGenerator.java +++ b/src/main/java/org/eclipse/cargotracker/application/util/SampleDataGenerator.java @@ -1,9 +1,5 @@ package org.eclipse.cargotracker.application.util; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.logging.Logger; import jakarta.annotation.PostConstruct; import jakarta.ejb.Singleton; import jakarta.ejb.Startup; @@ -14,6 +10,11 @@ import jakarta.persistence.LockModeType; import jakarta.persistence.NoResultException; import jakarta.persistence.PersistenceContext; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Logger; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.Itinerary; import org.eclipse.cargotracker.domain.model.cargo.Leg; @@ -107,7 +108,7 @@ private void loadSampleCargos() { Itinerary itinerary1 = new Itinerary( - Arrays.asList( + List.of( new Leg( SampleVoyages.HONGKONG_TO_NEW_YORK, SampleLocations.HONGKONG, diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Cargo.java b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Cargo.java index 9e924a78a..004f9028f 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Cargo.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Cargo.java @@ -1,6 +1,5 @@ package org.eclipse.cargotracker.domain.model.cargo; -import java.io.Serializable; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -9,6 +8,9 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.NamedQuery; import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.util.Objects; import org.apache.commons.lang3.Validate; import org.eclipse.cargotracker.domain.model.handling.HandlingEvent; import org.eclipse.cargotracker.domain.model.handling.HandlingHistory; @@ -57,7 +59,7 @@ query = "Select c from Cargo c where c.trackingId = :trackingId") public class Cargo implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; @@ -113,12 +115,16 @@ public RouteSpecification getRouteSpecification() { return routeSpecification; } - /** @return The delivery. Never null. */ + /** + * @return The delivery. Never null. + */ public Delivery getDelivery() { return delivery; } - /** @return The itinerary. Never null. */ + /** + * @return The itinerary. Never null. + */ public Itinerary getItinerary() { return DomainObjectUtils.nullSafe(this.itinerary, Itinerary.EMPTY_ITINERARY); } @@ -158,32 +164,17 @@ public void deriveDeliveryProgress(HandlingHistory handlingHistory) { this.delivery = Delivery.derivedFrom(getRouteSpecification(), getItinerary(), handlingHistory); } - /** - * @param object to compare - * @return True if they have the same identity - * @see #sameIdentityAs(Cargo) - */ @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object == null || !(object instanceof Cargo)) { - return false; - } - - Cargo other = (Cargo) object; - return sameIdentityAs(other); - } + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Cargo cargo)) return false; - private boolean sameIdentityAs(Cargo other) { - return other != null && trackingId.sameValueAs(other.trackingId); + return Objects.equals(trackingId, cargo.trackingId); } - /** @return Hash code of tracking id. */ @Override public int hashCode() { - return trackingId.hashCode(); + return Objects.hash(trackingId); } @Override diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Delivery.java b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Delivery.java index a84e63f6a..327a4a2f2 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Delivery.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Delivery.java @@ -9,10 +9,6 @@ import static org.eclipse.cargotracker.domain.model.cargo.TransportStatus.ONBOARD_CARRIER; import static org.eclipse.cargotracker.domain.model.cargo.TransportStatus.UNKNOWN; -import java.io.Serializable; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.Iterator; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import jakarta.persistence.Embedded; @@ -21,9 +17,13 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Iterator; +import java.util.Objects; import org.apache.commons.lang3.Validate; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; import org.eclipse.cargotracker.domain.model.handling.HandlingEvent; import org.eclipse.cargotracker.domain.model.handling.HandlingHistory; import org.eclipse.cargotracker.domain.model.location.Location; @@ -36,8 +36,7 @@ */ @Embeddable public class Delivery implements Serializable { - - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; // Null object pattern. public static final LocalDateTime ETA_UNKOWN = null; @@ -183,7 +182,9 @@ public HandlingActivity getNextExpectedActivity() { return nextExpectedActivity; } - /** @return True if the cargo has been unloaded at the final destination. */ + /** + * @return True if the cargo has been unloaded at the final destination. + */ public boolean isUnloadedAtDestination() { return isUnloadedAtDestination; } @@ -213,18 +214,12 @@ private TransportStatus calculateTransportStatus() { return NOT_RECEIVED; } - switch (lastEvent.getType()) { - case LOAD: - return ONBOARD_CARRIER; - case UNLOAD: - case RECEIVE: - case CUSTOMS: - return IN_PORT; - case CLAIM: - return CLAIMED; - default: - return UNKNOWN; - } + return switch (lastEvent.getType()) { + case LOAD -> ONBOARD_CARRIER; + case UNLOAD, RECEIVE, CUSTOMS -> IN_PORT; + case CLAIM -> CLAIMED; + default -> UNKNOWN; + }; } private Location calculateLastKnownLocation() { @@ -271,44 +266,43 @@ private HandlingActivity calculateNextExpectedActivity( return new HandlingActivity(HandlingEvent.Type.RECEIVE, routeSpecification.getOrigin()); } - switch (lastEvent.getType()) { - case LOAD: - for (Leg leg : itinerary.getLegs()) { - if (leg.getLoadLocation().sameIdentityAs(lastEvent.getLocation())) { - return new HandlingActivity( - HandlingEvent.Type.UNLOAD, leg.getUnloadLocation(), leg.getVoyage()); - } - } - - return NO_ACTIVITY; - - case UNLOAD: + return switch (lastEvent.getType()) { + case LOAD -> + itinerary.getLegs().stream() + .filter(leg -> leg.getLoadLocation().sameIdentityAs(lastEvent.getLocation())) + .findFirst() + .map( + leg -> + new HandlingActivity( + HandlingEvent.Type.UNLOAD, leg.getUnloadLocation(), leg.getVoyage())) + .orElse(NO_ACTIVITY); + case UNLOAD -> { for (Iterator iterator = itinerary.getLegs().iterator(); iterator.hasNext(); ) { Leg leg = iterator.next(); - - if (leg.getUnloadLocation().sameIdentityAs(lastEvent.getLocation())) { - if (iterator.hasNext()) { - Leg nextLeg = iterator.next(); - return new HandlingActivity( - HandlingEvent.Type.LOAD, nextLeg.getLoadLocation(), nextLeg.getVoyage()); - } else { - return new HandlingActivity(HandlingEvent.Type.CLAIM, leg.getUnloadLocation()); - } - } + yield getHandlingActivity(leg, iterator); } - - return NO_ACTIVITY; - - case RECEIVE: + yield NO_ACTIVITY; + } + case RECEIVE -> { Leg firstLeg = itinerary.getLegs().iterator().next(); - - return new HandlingActivity( + yield new HandlingActivity( HandlingEvent.Type.LOAD, firstLeg.getLoadLocation(), firstLeg.getVoyage()); + } + default -> NO_ACTIVITY; + }; + } - case CLAIM: - default: - return NO_ACTIVITY; + private HandlingActivity getHandlingActivity(Leg leg, Iterator iterator) { + if (leg.getUnloadLocation().sameIdentityAs(lastEvent.getLocation())) { + if (iterator.hasNext()) { + Leg nextLeg = iterator.next(); + return new HandlingActivity( + HandlingEvent.Type.LOAD, nextLeg.getLoadLocation(), nextLeg.getVoyage()); + } else { + return new HandlingActivity(HandlingEvent.Type.CLAIM, leg.getUnloadLocation()); + } } + return NO_ACTIVITY; } private RoutingStatus calculateRoutingStatus( @@ -334,49 +328,34 @@ private boolean onTrack() { return routingStatus.equals(ROUTED) && !misdirected; } - private boolean sameValueAs(Delivery other) { - return other != null - && new EqualsBuilder() - .append(this.transportStatus, other.transportStatus) - .append(this.lastKnownLocation, other.lastKnownLocation) - .append(this.currentVoyage, other.currentVoyage) - .append(this.misdirected, other.misdirected) - .append(this.eta, other.eta) - .append(this.nextExpectedActivity, other.nextExpectedActivity) - .append(this.isUnloadedAtDestination, other.isUnloadedAtDestination) - .append(this.routingStatus, other.routingStatus) - .append(this.calculatedAt, other.calculatedAt) - .append(this.lastEvent, other.lastEvent) - .isEquals(); - } - @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || !(o instanceof Delivery)) { - return false; - } - - Delivery other = (Delivery) o; - - return sameValueAs(other); + if (this == o) return true; + if (!(o instanceof Delivery delivery)) return false; + return misdirected == delivery.misdirected + && isUnloadedAtDestination == delivery.isUnloadedAtDestination + && transportStatus == delivery.transportStatus + && Objects.equals(lastKnownLocation, delivery.lastKnownLocation) + && Objects.equals(currentVoyage, delivery.currentVoyage) + && Objects.equals(eta, delivery.eta) + && Objects.equals(nextExpectedActivity, delivery.nextExpectedActivity) + && routingStatus == delivery.routingStatus + && Objects.equals(calculatedAt, delivery.calculatedAt) + && Objects.equals(lastEvent, delivery.lastEvent); } @Override public int hashCode() { - return new HashCodeBuilder() - .append(transportStatus) - .append(lastKnownLocation) - .append(currentVoyage) - .append(misdirected) - .append(eta) - .append(nextExpectedActivity) - .append(isUnloadedAtDestination) - .append(routingStatus) - .append(calculatedAt) - .append(lastEvent) - .toHashCode(); + return Objects.hash( + transportStatus, + lastKnownLocation, + currentVoyage, + misdirected, + eta, + nextExpectedActivity, + isUnloadedAtDestination, + routingStatus, + calculatedAt, + lastEvent); } } diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/HandlingActivity.java b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/HandlingActivity.java index 385f52949..3c58cc9f5 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/HandlingActivity.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/HandlingActivity.java @@ -1,6 +1,5 @@ package org.eclipse.cargotracker.domain.model.cargo; -import java.io.Serializable; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import jakarta.persistence.EnumType; @@ -8,9 +7,10 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.util.Objects; import org.apache.commons.lang3.Validate; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; import org.eclipse.cargotracker.domain.model.handling.HandlingEvent; import org.eclipse.cargotracker.domain.model.location.Location; import org.eclipse.cargotracker.domain.model.voyage.Voyage; @@ -22,7 +22,7 @@ @Embeddable public class HandlingActivity implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Enumerated(EnumType.STRING) @Column(name = "next_expected_handling_event_type") @@ -70,41 +70,19 @@ public Voyage getVoyage() { return voyage; } - private boolean sameValueAs(HandlingActivity other) { - return other != null - && new EqualsBuilder() - .append(this.type, other.type) - .append(this.location, other.location) - .append(this.voyage, other.voyage) - .isEquals(); - } - @Override - public int hashCode() { - return new HashCodeBuilder() - .append(this.type) - .append(this.location) - .append(this.voyage) - .toHashCode(); + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof HandlingActivity that)) return false; + + return type == that.type + && Objects.equals(location, that.location) + && Objects.equals(voyage, that.voyage); } @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - - if (obj == null) { - return false; - } - - if (!(obj instanceof HandlingActivity)) { - return false; - } - - HandlingActivity other = (HandlingActivity) obj; - - return sameValueAs(other); + public int hashCode() { + return Objects.hash(type, location, voyage); } public boolean isEmpty() { diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Itinerary.java b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Itinerary.java index cb59917c7..8be88b913 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Itinerary.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Itinerary.java @@ -1,9 +1,5 @@ package org.eclipse.cargotracker.domain.model.cargo; -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; import jakarta.persistence.CascadeType; import jakarta.persistence.Embeddable; import jakarta.persistence.JoinColumn; @@ -11,14 +7,19 @@ import jakarta.persistence.OrderColumn; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; +import java.util.Objects; import org.apache.commons.lang3.Validate; import org.eclipse.cargotracker.domain.model.handling.HandlingEvent; import org.eclipse.cargotracker.domain.model.location.Location; @Embeddable public class Itinerary implements Serializable { - - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; // Null object pattern. public static final Itinerary EMPTY_ITINERARY = new Itinerary(); @@ -49,54 +50,30 @@ public List getLegs() { /** Test if the given handling event is expected when executing this itinerary. */ public boolean isExpected(HandlingEvent event) { if (legs.isEmpty()) { - return true; + return true; // Handle empty case } - switch (event.getType()) { - case RECEIVE: - { - // Check that the first leg's origin is the event's location - Leg leg = legs.get(0); - return leg.getLoadLocation().equals(event.getLocation()); - } - - case LOAD: - { - return legs.stream() + Leg firstLeg = legs.get(0); + Leg lastLeg = legs.get(legs.size() - 1); + + return switch (event.getType()) { + case RECEIVE -> firstLeg.getLoadLocation().equals(event.getLocation()); + case LOAD -> + legs.stream() .anyMatch( leg -> leg.getLoadLocation().equals(event.getLocation()) && leg.getVoyage().equals(event.getVoyage())); - } - - case UNLOAD: - { - // Check that the there is one leg with same unload location and - // voyage - return legs.stream() + case UNLOAD -> + legs.stream() .anyMatch( leg -> leg.getUnloadLocation().equals(event.getLocation()) && leg.getVoyage().equals(event.getVoyage())); - } - - case CLAIM: - { - // Check that the last leg's destination is from the event's - // location - Leg leg = getLastLeg(); - - return leg.getUnloadLocation().equals(event.getLocation()); - } - - case CUSTOMS: - { - return true; - } - - default: - throw new RuntimeException("Event case is not handled"); - } + case CLAIM -> lastLeg.getUnloadLocation().equals(event.getLocation()); + case CUSTOMS -> true; // Always allow customs events? (Consider if this is appropriate for + // your logic) + }; } Location getInitialDepartureLocation() { @@ -115,7 +92,9 @@ Location getFinalArrivalLocation() { } } - /** @return Date when cargo arrives at final destination. */ + /** + * @return Date when cargo arrives at final destination. + */ LocalDateTime getFinalArrivalDate() { Leg lastLeg = getLastLeg(); @@ -126,7 +105,9 @@ LocalDateTime getFinalArrivalDate() { } } - /** @return The last leg on the itinerary. */ + /** + * @return The last leg on the itinerary. + */ Leg getLastLeg() { if (legs.isEmpty()) { return null; @@ -135,28 +116,16 @@ Leg getLastLeg() { } } - private boolean sameValueAs(Itinerary other) { - return other != null && legs.equals(other.legs); - } - @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o == null || !(o instanceof Itinerary)) { - return false; - } - - Itinerary itinerary = (Itinerary) o; - - return sameValueAs(itinerary); + if (this == o) return true; + if (!(o instanceof Itinerary itinerary)) return false; + return Objects.equals(legs, itinerary.legs); } @Override public int hashCode() { - return legs.hashCode(); + return Objects.hashCode(legs); } @Override diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Leg.java b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Leg.java index 8283e402b..c0b593b82 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Leg.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/Leg.java @@ -1,8 +1,5 @@ package org.eclipse.cargotracker.domain.model.cargo; -import java.io.Serializable; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -10,16 +7,19 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Objects; +import java.util.StringJoiner; import org.apache.commons.lang3.Validate; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; import org.eclipse.cargotracker.domain.model.location.Location; import org.eclipse.cargotracker.domain.model.voyage.Voyage; @Entity public class Leg implements Serializable { - - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; @@ -89,58 +89,31 @@ public LocalDateTime getUnloadTime() { return this.unloadTime; } - private boolean sameValueAs(Leg other) { - return other != null - && new EqualsBuilder() - .append(this.voyage, other.voyage) - .append(this.loadLocation, other.loadLocation) - .append(this.unloadLocation, other.unloadLocation) - .append(this.loadTime, other.loadTime) - .append(this.unloadTime, other.unloadTime) - .isEquals(); - } - @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o == null || !(o instanceof Leg)) { - return false; - } - - Leg leg = (Leg) o; - - return sameValueAs(leg); + if (this == o) return true; + if (!(o instanceof Leg leg)) return false; + return Objects.equals(voyage, leg.voyage) + && Objects.equals(loadLocation, leg.loadLocation) + && Objects.equals(unloadLocation, leg.unloadLocation) + && Objects.equals(loadTime, leg.loadTime) + && Objects.equals(unloadTime, leg.unloadTime); } @Override public int hashCode() { - return new HashCodeBuilder() - .append(voyage) - .append(loadLocation) - .append(unloadLocation) - .append(loadTime) - .append(unloadTime) - .toHashCode(); + return Objects.hash(voyage, loadLocation, unloadLocation, loadTime, unloadTime); } @Override public String toString() { - return "Leg{" - + "id=" - + id - + ", voyage=" - + voyage - + ", loadLocation=" - + loadLocation - + ", unloadLocation=" - + unloadLocation - + ", loadTime=" - + loadTime - + ", unloadTime=" - + unloadTime - + '}'; + return new StringJoiner(", ", Leg.class.getSimpleName() + "[", "]") + .add("id=" + id) + .add("voyage=" + voyage) + .add("loadLocation=" + loadLocation) + .add("unloadLocation=" + unloadLocation) + .add("loadTime=" + loadTime) + .add("unloadTime=" + unloadTime) + .toString(); } } diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/RouteSpecification.java b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/RouteSpecification.java index 87e998105..bfb7b3b8b 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/RouteSpecification.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/RouteSpecification.java @@ -1,15 +1,15 @@ package org.eclipse.cargotracker.domain.model.cargo; -import java.io.Serializable; -import java.time.LocalDate; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.util.Objects; import org.apache.commons.lang3.Validate; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; import org.eclipse.cargotracker.domain.model.location.Location; import org.eclipse.cargotracker.domain.shared.AbstractSpecification; @@ -19,7 +19,7 @@ @Embeddable public class RouteSpecification extends AbstractSpecification implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @ManyToOne @JoinColumn(name = "spec_origin_id", updatable = false) @@ -72,36 +72,18 @@ && getDestination().sameIdentityAs(itinerary.getFinalArrivalLocation()) && getArrivalDeadline().isAfter(itinerary.getFinalArrivalDate().toLocalDate()); } - private boolean sameValueAs(RouteSpecification other) { - return other != null - && new EqualsBuilder() - .append(this.origin, other.origin) - .append(this.destination, other.destination) - .append(this.arrivalDeadline, other.arrivalDeadline) - .isEquals(); - } - @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o == null || !(o instanceof RouteSpecification)) { - return false; - } - - RouteSpecification that = (RouteSpecification) o; + if (this == o) return true; + if (!(o instanceof RouteSpecification that)) return false; - return sameValueAs(that); + return Objects.equals(origin, that.origin) + && Objects.equals(destination, that.destination) + && Objects.equals(arrivalDeadline, that.arrivalDeadline); } @Override public int hashCode() { - return new HashCodeBuilder() - .append(this.origin) - .append(this.destination) - .append(this.arrivalDeadline) - .toHashCode(); + return Objects.hash(origin, destination, arrivalDeadline); } } diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/TrackingId.java b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/TrackingId.java index 63c3aee25..84d912b3c 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/cargo/TrackingId.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/cargo/TrackingId.java @@ -1,16 +1,17 @@ package org.eclipse.cargotracker.domain.model.cargo; -import java.io.Serializable; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import jakarta.validation.constraints.NotEmpty; +import java.io.Serial; +import java.io.Serializable; +import java.util.Objects; import org.apache.commons.lang3.Validate; /** Uniquely identifies a particular cargo. Automatically generated by the application. */ @Embeddable public class TrackingId implements Serializable { - - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Column(name = "tracking_id", unique = true, updatable = false) @NotEmpty(message = "Tracking ID cannot be empty.") @@ -29,26 +30,14 @@ public String getIdString() { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o == null || !(o instanceof TrackingId)) { - return false; - } - - TrackingId other = (TrackingId) o; - - return sameValueAs(other); + if (this == o) return true; + if (!(o instanceof TrackingId that)) return false; + return Objects.equals(id, that.id); } @Override public int hashCode() { - return id.hashCode(); - } - - boolean sameValueAs(TrackingId other) { - return other != null && this.id.equals(other.id); + return Objects.hashCode(id); } @Override diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/handling/CannotCreateHandlingEventException.java b/src/main/java/org/eclipse/cargotracker/domain/model/handling/CannotCreateHandlingEventException.java index 103b7be0d..457032988 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/handling/CannotCreateHandlingEventException.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/handling/CannotCreateHandlingEventException.java @@ -1,6 +1,7 @@ package org.eclipse.cargotracker.domain.model.handling; import jakarta.ejb.ApplicationException; +import java.io.Serial; /** * If a {@link HandlingEvent} can't be created from a given set of parameters. @@ -11,7 +12,7 @@ @ApplicationException(rollback = true) public class CannotCreateHandlingEventException extends Exception { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; public CannotCreateHandlingEventException(Exception e) { super(e); diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingEvent.java b/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingEvent.java index 393ed0d1e..70c11706b 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingEvent.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingEvent.java @@ -1,8 +1,5 @@ package org.eclipse.cargotracker.domain.model.handling; -import java.io.Serializable; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -14,9 +11,13 @@ import jakarta.persistence.NamedQuery; import jakarta.persistence.Transient; import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Objects; +import java.util.StringJoiner; import org.apache.commons.lang3.Validate; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; import org.eclipse.cargotracker.domain.model.location.Location; @@ -44,7 +45,7 @@ query = "Select e from HandlingEvent e where e.cargo.trackingId = :trackingId") public class HandlingEvent implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; @@ -198,66 +199,33 @@ public String getSummary() { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o == null || !(o instanceof HandlingEvent)) { - return false; - } - - HandlingEvent event = (HandlingEvent) o; - - return sameEventAs(event); - } - - private boolean sameEventAs(HandlingEvent other) { - return other != null - && new EqualsBuilder() - .append(this.cargo, other.cargo) - .append(this.voyage, other.voyage) - .append(this.completionTime, other.completionTime) - .append(this.location, other.location) - .append(this.type, other.type) - .isEquals(); + if (this == o) return true; + if (!(o instanceof HandlingEvent that)) return false; + return type == that.type + && Objects.equals(voyage, that.voyage) + && Objects.equals(location, that.location) + && Objects.equals(completionTime, that.completionTime) + && Objects.equals(cargo, that.cargo); } @Override public int hashCode() { - return new HashCodeBuilder() - .append(cargo) - .append(voyage) - .append(completionTime) - .append(location) - .append(type) - .toHashCode(); + return Objects.hash(type, voyage, location, completionTime, cargo); } @Override public String toString() { - StringBuilder builder = - new StringBuilder("\n--- Handling event ---\n") - .append("Cargo: ") - .append(cargo.getTrackingId()) - .append("\n") - .append("Type: ") - .append(type) - .append("\n") - .append("Location: ") - .append(location.getName()) - .append("\n") - .append("Completed on: ") - .append(completionTime) - .append("\n") - .append("Registered on: ") - .append(registrationTime) - .append("\n"); - + StringJoiner joiner = new StringJoiner("\n", "\n--- Handling event ---\n", "\n"); + joiner + .add("Cargo: " + cargo.getTrackingId()) + .add("Type: " + type) + .add("Location: " + location.getName()) + .add("Completed on: " + completionTime) + .add("Registered on: " + registrationTime); if (voyage != null) { - builder.append("Voyage: ").append(voyage.getVoyageNumber()).append("\n"); + joiner.add("Voyage: " + voyage.getVoyageNumber()); } - - return builder.toString(); + return joiner.toString(); } /** @@ -288,12 +256,16 @@ private Type(boolean voyageRequired) { this.voyageRequired = voyageRequired; } - /** @return True if a voyage association is required for this event type. */ + /** + * @return True if a voyage association is required for this event type. + */ public boolean requiresVoyage() { return voyageRequired; } - /** @return True if a voyage association is prohibited for this event type. */ + /** + * @return True if a voyage association is prohibited for this event type. + */ public boolean prohibitsVoyage() { return !requiresVoyage(); } diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingEventFactory.java b/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingEventFactory.java index 70b23b924..e45297166 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingEventFactory.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingEventFactory.java @@ -1,9 +1,11 @@ package org.eclipse.cargotracker.domain.model.handling; -import java.io.Serializable; -import java.time.LocalDateTime; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Optional; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.CargoRepository; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; @@ -17,7 +19,7 @@ @ApplicationScoped public class HandlingEventFactory implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Inject private CargoRepository cargoRepository; @Inject private VoyageRepository voyageRepository; @@ -60,13 +62,8 @@ public HandlingEvent createHandlingEvent( } private Cargo findCargo(TrackingId trackingId) throws UnknownCargoException { - Cargo cargo = cargoRepository.find(trackingId); - - if (cargo == null) { - throw new UnknownCargoException(trackingId); - } - - return cargo; + return Optional.ofNullable(cargoRepository.find(trackingId)) + .orElseThrow(() -> new UnknownCargoException(trackingId)); } private Voyage findVoyage(VoyageNumber voyageNumber) throws UnknownVoyageException { @@ -74,22 +71,12 @@ private Voyage findVoyage(VoyageNumber voyageNumber) throws UnknownVoyageExcepti return null; } - Voyage voyage = voyageRepository.find(voyageNumber); - - if (voyage == null) { - throw new UnknownVoyageException(voyageNumber); - } - - return voyage; + return Optional.ofNullable(voyageRepository.find(voyageNumber)) + .orElseThrow(() -> new UnknownVoyageException(voyageNumber)); } private Location findLocation(UnLocode unlocode) throws UnknownLocationException { - Location location = locationRepository.find(unlocode); - - if (location == null) { - throw new UnknownLocationException(unlocode); - } - - return location; + return Optional.ofNullable(locationRepository.find(unlocode)) + .orElseThrow(() -> new UnknownLocationException(unlocode)); } } diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingHistory.java b/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingHistory.java index 8c4d22e0b..00819513a 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingHistory.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/handling/HandlingHistory.java @@ -39,7 +39,9 @@ public List getDistinctEventsByCompletionTime() { return Collections.unmodifiableList(ordered); } - /** @return Most recently completed event, or null if the delivery history is empty. */ + /** + * @return Most recently completed event, or null if the delivery history is empty. + */ public HandlingEvent getMostRecentlyCompletedEvent() { List distinctEvents = getDistinctEventsByCompletionTime(); diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownCargoException.java b/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownCargoException.java index d51e87457..cf4e2551c 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownCargoException.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownCargoException.java @@ -1,15 +1,18 @@ package org.eclipse.cargotracker.domain.model.handling; +import java.io.Serial; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; /** Thrown when trying to register an event with an unknown tracking id. */ public class UnknownCargoException extends CannotCreateHandlingEventException { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final TrackingId trackingId; - /** @param trackingId cargo tracking id */ + /** + * @param trackingId cargo tracking id + */ public UnknownCargoException(TrackingId trackingId) { this.trackingId = trackingId; } diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownLocationException.java b/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownLocationException.java index 90537b304..afad05b0b 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownLocationException.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownLocationException.java @@ -1,10 +1,11 @@ package org.eclipse.cargotracker.domain.model.handling; +import java.io.Serial; import org.eclipse.cargotracker.domain.model.location.UnLocode; public class UnknownLocationException extends CannotCreateHandlingEventException { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final UnLocode unlocode; diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownVoyageException.java b/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownVoyageException.java index 46cb00e03..46aaaedc5 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownVoyageException.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/handling/UnknownVoyageException.java @@ -1,11 +1,12 @@ package org.eclipse.cargotracker.domain.model.handling; +import java.io.Serial; import org.eclipse.cargotracker.domain.model.voyage.VoyageNumber; /** Thrown when trying to register an event with an unknown carrier movement id. */ public class UnknownVoyageException extends CannotCreateHandlingEventException { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final VoyageNumber voyageNumber; diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/location/Location.java b/src/main/java/org/eclipse/cargotracker/domain/model/location/Location.java index 782559426..aa365ddb9 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/location/Location.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/location/Location.java @@ -1,6 +1,5 @@ package org.eclipse.cargotracker.domain.model.location; -import java.io.Serializable; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -8,6 +7,9 @@ import jakarta.persistence.NamedQuery; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.util.Objects; import org.apache.commons.lang3.Validate; /** @@ -23,7 +25,7 @@ query = "Select l from Location l where l.unLocode = :unLocode") public class Location implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; // Special Location object that marks an unknown location. public static final Location UNKNOWN = new Location(new UnLocode("XXXXX"), "Unknown location"); @@ -49,47 +51,37 @@ public Location(UnLocode unLocode, String name) { this.name = name; } - /** @return UN location code for this location. */ + /** + * @return UN location code for this location. + */ public UnLocode getUnLocode() { return unLocode; } - /** @return Actual name of this location, e.g. "Stockholm". */ + /** + * @return Actual name of this location, e.g. "Stockholm". + */ public String getName() { return name; } - /** - * @param object to compare - * @return Since this is an entiy this will be true iff UN locodes are equal. - */ @Override - public boolean equals(Object object) { - if (object == null) { - return false; - } - - if (this == object) { - return true; - } - - if (!(object instanceof Location)) { - return false; - } - - Location other = (Location) object; - - return sameIdentityAs(other); + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Location location)) return false; + return Objects.equals(unLocode, location.unLocode); } public boolean sameIdentityAs(Location other) { - return this.unLocode.sameValueAs(other.unLocode); + return Objects.equals(this.unLocode, other.unLocode); } - /** @return Hash code of UN locode. */ + /** + * @return Hash code of UN locode. + */ @Override public int hashCode() { - return unLocode.hashCode(); + return Objects.hash(unLocode); } @Override diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/location/UnLocode.java b/src/main/java/org/eclipse/cargotracker/domain/model/location/UnLocode.java index ab0b84a70..ba8865da6 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/location/UnLocode.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/location/UnLocode.java @@ -1,9 +1,11 @@ package org.eclipse.cargotracker.domain.model.location; -import java.io.Serializable; import jakarta.persistence.Embeddable; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Pattern; +import java.io.Serial; +import java.io.Serializable; +import java.util.Objects; import org.apache.commons.lang3.Validate; /** @@ -15,7 +17,7 @@ @Embeddable public class UnLocode implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private static final java.util.regex.Pattern VALID_PATTERN = java.util.regex.Pattern.compile("[a-zA-Z]{2}[a-zA-Z2-9]{3}"); @@ -31,7 +33,9 @@ public UnLocode() { // Nothing to initialize. } - /** @param countryAndLocation Location string. */ + /** + * @param countryAndLocation Location string. + */ public UnLocode(String countryAndLocation) { Validate.notNull(countryAndLocation, "Country and location may not be null."); Validate.isTrue( @@ -41,33 +45,23 @@ public UnLocode(String countryAndLocation) { this.unlocode = countryAndLocation.toUpperCase(); } - /** @return country code and location code concatenated, always upper case. */ + /** + * @return country code and location code concatenated, always upper case. + */ public String getIdString() { return unlocode; } @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o == null || !(o instanceof UnLocode)) { - return false; - } - - UnLocode other = (UnLocode) o; - - return sameValueAs(other); + if (this == o) return true; + if (!(o instanceof UnLocode unLocode)) return false; + return Objects.equals(unlocode, unLocode.unlocode); } @Override public int hashCode() { - return unlocode.hashCode(); - } - - boolean sameValueAs(UnLocode other) { - return other != null && this.unlocode.equals(other.unlocode); + return Objects.hashCode(unlocode); } @Override diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/CarrierMovement.java b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/CarrierMovement.java index 77f46fc93..85eec9731 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/CarrierMovement.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/CarrierMovement.java @@ -1,8 +1,5 @@ package org.eclipse.cargotracker.domain.model.voyage; -import java.io.Serializable; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -11,9 +8,12 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Objects; import org.apache.commons.lang3.Validate; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; import org.eclipse.cargotracker.domain.model.location.Location; /** A carrier movement is a vessel voyage from one location to another. */ @@ -21,7 +21,7 @@ @Table(name = "carrier_movement") public class CarrierMovement implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; // Null object pattern public static final CarrierMovement NONE = @@ -85,36 +85,16 @@ public LocalDateTime getArrivalTime() { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o == null || !(o instanceof CarrierMovement)) { - return false; - } - - CarrierMovement that = (CarrierMovement) o; - - return sameValueAs(that); + if (this == o) return true; + if (!(o instanceof CarrierMovement that)) return false; + return Objects.equals(departureLocation, that.departureLocation) + && Objects.equals(arrivalLocation, that.arrivalLocation) + && Objects.equals(departureTime, that.departureTime) + && Objects.equals(arrivalTime, that.arrivalTime); } @Override public int hashCode() { - return new HashCodeBuilder() - .append(this.departureLocation) - .append(this.departureTime) - .append(this.arrivalLocation) - .append(this.arrivalTime) - .toHashCode(); - } - - private boolean sameValueAs(CarrierMovement other) { - return other != null - && new EqualsBuilder() - .append(this.departureLocation, other.departureLocation) - .append(this.departureTime, other.departureTime) - .append(this.arrivalLocation, other.arrivalLocation) - .append(this.arrivalTime, other.arrivalTime) - .isEquals(); + return Objects.hash(departureLocation, arrivalLocation, departureTime, arrivalTime); } } diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/SampleVoyages.java b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/SampleVoyages.java index fbe13640c..4dae4ebcb 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/SampleVoyages.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/SampleVoyages.java @@ -85,6 +85,7 @@ public class SampleVoyages { LocalDateTime.now().minusYears(1).plusMonths(3).plusDays(20).plusHours(18), LocalDateTime.now().minusYears(1).plusMonths(3).plusDays(22).plusHours(9)) .build(); + /** * Voyage number 0100S (by ship) * @@ -129,6 +130,7 @@ public class SampleVoyages { .plusHours(23) .plusMinutes(10)) .build(); + /** * Voyage number 0200T (by train) * @@ -160,6 +162,7 @@ public class SampleVoyages { .plusHours(19) .plusMinutes(30)) .build(); + /** * Voyage number 0300A (by airplane) * @@ -200,6 +203,7 @@ public class SampleVoyages { .plusHours(11) .plusMinutes(15)) .build(); + /** * Voyage number 0301S (by ship) * @@ -222,6 +226,7 @@ public class SampleVoyages { .plusHours(15) .plusMinutes(45)) .build(); + /** * Voyage number 0400S (by ship) * diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/Schedule.java b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/Schedule.java index 3509f0f2c..3504731fe 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/Schedule.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/Schedule.java @@ -1,8 +1,5 @@ package org.eclipse.cargotracker.domain.model.voyage; -import java.io.Serializable; -import java.util.Collections; -import java.util.List; import jakarta.persistence.CascadeType; import jakarta.persistence.Embeddable; import jakarta.persistence.JoinColumn; @@ -10,14 +7,18 @@ import jakarta.persistence.OrderColumn; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.util.Collections; +import java.util.List; +import java.util.Objects; import org.apache.commons.lang3.Validate; -import org.apache.commons.lang3.builder.HashCodeBuilder; /** A voyage schedule. */ @Embeddable public class Schedule implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; // Null object pattern. public static final Schedule EMPTY = new Schedule(); @@ -46,27 +47,15 @@ public List getCarrierMovements() { return Collections.unmodifiableList(carrierMovements); } - private boolean sameValueAs(Schedule other) { - return other != null && this.carrierMovements.equals(other.carrierMovements); - } - @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o == null || !(o instanceof Schedule)) { - return false; - } - - Schedule that = (Schedule) o; - - return sameValueAs(that); + if (this == o) return true; + if (!(o instanceof Schedule schedule)) return false; + return Objects.equals(carrierMovements, schedule.carrierMovements); } @Override public int hashCode() { - return new HashCodeBuilder().append(this.carrierMovements).toHashCode(); + return Objects.hashCode(carrierMovements); } } diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/Voyage.java b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/Voyage.java index a09a841c5..97a466f86 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/Voyage.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/Voyage.java @@ -1,15 +1,16 @@ package org.eclipse.cargotracker.domain.model.voyage; -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.NamedQuery; import jakarta.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; import org.apache.commons.lang3.Validate; import org.eclipse.cargotracker.domain.model.location.Location; @@ -19,7 +20,7 @@ query = "Select v from Voyage v where v.voyageNumber = :voyageNumber") @NamedQuery(name = "Voyage.findAll", query = "Select v from Voyage v order by v.voyageNumber") public class Voyage implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; // Null object pattern public static final Voyage NONE = new Voyage(new VoyageNumber(""), Schedule.EMPTY); @@ -93,8 +94,8 @@ public String toString() { */ public static class Builder { - private List carrierMovements = new ArrayList<>(); - private VoyageNumber voyageNumber; + private final List carrierMovements = new ArrayList<>(); + private final VoyageNumber voyageNumber; private Location departureLocation; public Builder(VoyageNumber voyageNumber, Location departureLocation) { diff --git a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/VoyageNumber.java b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/VoyageNumber.java index 9cea76e12..f96bf4bec 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/model/voyage/VoyageNumber.java +++ b/src/main/java/org/eclipse/cargotracker/domain/model/voyage/VoyageNumber.java @@ -1,15 +1,17 @@ package org.eclipse.cargotracker.domain.model.voyage; -import java.io.Serializable; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import jakarta.validation.constraints.NotEmpty; +import java.io.Serial; +import java.io.Serializable; +import java.util.Objects; import org.apache.commons.lang3.Validate; @Embeddable public class VoyageNumber implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Column(name = "voyage_number") @NotEmpty(message = "Voyage number cannot be empty.") @@ -27,26 +29,14 @@ public VoyageNumber(String number) { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o == null) { - return false; - } - - if (!(o instanceof VoyageNumber)) { - return false; - } - - VoyageNumber other = (VoyageNumber) o; - - return sameValueAs(other); + if (this == o) return true; + if (!(o instanceof VoyageNumber that)) return false; + return Objects.equals(number, that.number); } @Override public int hashCode() { - return number.hashCode(); + return Objects.hashCode(number); } boolean sameValueAs(VoyageNumber other) { diff --git a/src/main/java/org/eclipse/cargotracker/domain/shared/AbstractSpecification.java b/src/main/java/org/eclipse/cargotracker/domain/shared/AbstractSpecification.java index 34889108c..37418a4a2 100644 --- a/src/main/java/org/eclipse/cargotracker/domain/shared/AbstractSpecification.java +++ b/src/main/java/org/eclipse/cargotracker/domain/shared/AbstractSpecification.java @@ -6,10 +6,6 @@ */ public abstract class AbstractSpecification implements Specification { - /** {@inheritDoc} */ - @Override - public abstract boolean isSatisfiedBy(T t); - /** {@inheritDoc} */ @Override public Specification and(Specification specification) { diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/events/cdi/CargoUpdated.java b/src/main/java/org/eclipse/cargotracker/infrastructure/events/cdi/CargoUpdated.java index 818b21829..48b442f3c 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/events/cdi/CargoUpdated.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/events/cdi/CargoUpdated.java @@ -4,9 +4,9 @@ import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.RUNTIME; +import jakarta.inject.Qualifier; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import jakarta.inject.Qualifier; @Qualifier @Retention(RUNTIME) diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/logging/LoggerProducer.java b/src/main/java/org/eclipse/cargotracker/infrastructure/logging/LoggerProducer.java index 51c9f6360..6580b1bb9 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/logging/LoggerProducer.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/logging/LoggerProducer.java @@ -1,15 +1,16 @@ package org.eclipse.cargotracker.infrastructure.logging; -import java.io.Serializable; -import java.util.logging.Logger; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; import jakarta.enterprise.inject.spi.InjectionPoint; +import java.io.Serial; +import java.io.Serializable; +import java.util.logging.Logger; @ApplicationScoped public class LoggerProducer implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Produces public Logger produceLogger(InjectionPoint injectionPoint) { diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/CargoHandledConsumer.java b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/CargoHandledConsumer.java index e469a4e58..e779a781b 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/CargoHandledConsumer.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/CargoHandledConsumer.java @@ -1,7 +1,5 @@ package org.eclipse.cargotracker.infrastructure.messaging.jms; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.ejb.ActivationConfigProperty; import jakarta.ejb.MessageDriven; import jakarta.inject.Inject; @@ -9,6 +7,8 @@ import jakarta.jms.Message; import jakarta.jms.MessageListener; import jakarta.jms.TextMessage; +import java.util.logging.Level; +import java.util.logging.Logger; import org.eclipse.cargotracker.application.CargoInspectionService; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/DeliveredCargoConsumer.java b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/DeliveredCargoConsumer.java index 555c4ae4b..14effbb23 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/DeliveredCargoConsumer.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/DeliveredCargoConsumer.java @@ -1,13 +1,13 @@ package org.eclipse.cargotracker.infrastructure.messaging.jms; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.ejb.ActivationConfigProperty; import jakarta.ejb.MessageDriven; import jakarta.inject.Inject; import jakarta.jms.JMSException; import jakarta.jms.Message; import jakarta.jms.MessageListener; +import java.util.logging.Level; +import java.util.logging.Logger; @MessageDriven( activationConfig = { diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/JmsApplicationEvents.java b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/JmsApplicationEvents.java index c408b3af9..2230eb395 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/JmsApplicationEvents.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/JmsApplicationEvents.java @@ -1,13 +1,14 @@ package org.eclipse.cargotracker.infrastructure.messaging.jms; -import java.io.Serializable; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.annotation.Resource; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.jms.Destination; import jakarta.jms.JMSContext; +import java.io.Serial; +import java.io.Serializable; +import java.util.logging.Level; +import java.util.logging.Logger; import org.eclipse.cargotracker.application.ApplicationEvents; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.handling.HandlingEvent; @@ -15,8 +16,7 @@ @ApplicationScoped public class JmsApplicationEvents implements ApplicationEvents, Serializable { - - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private static final int LOW_PRIORITY = 0; @Inject JMSContext jmsContext; diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/MisdirectedCargoConsumer.java b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/MisdirectedCargoConsumer.java index 1ef9859e7..13d5f7b02 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/MisdirectedCargoConsumer.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/MisdirectedCargoConsumer.java @@ -1,13 +1,13 @@ package org.eclipse.cargotracker.infrastructure.messaging.jms; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.ejb.ActivationConfigProperty; import jakarta.ejb.MessageDriven; import jakarta.inject.Inject; import jakarta.jms.JMSException; import jakarta.jms.Message; import jakarta.jms.MessageListener; +import java.util.logging.Level; +import java.util.logging.Logger; @MessageDriven( activationConfig = { diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/RejectedRegistrationAttemptsConsumer.java b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/RejectedRegistrationAttemptsConsumer.java index 940df712a..061e28c64 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/RejectedRegistrationAttemptsConsumer.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/messaging/jms/RejectedRegistrationAttemptsConsumer.java @@ -1,13 +1,13 @@ package org.eclipse.cargotracker.infrastructure.messaging.jms; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.ejb.ActivationConfigProperty; import jakarta.ejb.MessageDriven; import jakarta.inject.Inject; import jakarta.jms.JMSException; import jakarta.jms.Message; import jakarta.jms.MessageListener; +import java.util.logging.Level; +import java.util.logging.Logger; @MessageDriven( activationConfig = { diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaCargoRepository.java b/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaCargoRepository.java index 19bff18cc..00c9ff1c9 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaCargoRepository.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaCargoRepository.java @@ -1,16 +1,17 @@ package org.eclipse.cargotracker.infrastructure.persistence.jpa; -import java.io.Serializable; -import java.util.List; -import java.util.UUID; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Event; import jakarta.inject.Inject; import jakarta.persistence.EntityManager; import jakarta.persistence.NoResultException; import jakarta.persistence.PersistenceContext; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.CargoRepository; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; @@ -19,7 +20,7 @@ @ApplicationScoped public class JpaCargoRepository implements CargoRepository, Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Inject private Logger logger; diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaHandlingEventRepository.java b/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaHandlingEventRepository.java index 059056c1d..ed7d77667 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaHandlingEventRepository.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaHandlingEventRepository.java @@ -1,9 +1,10 @@ package org.eclipse.cargotracker.infrastructure.persistence.jpa; -import java.io.Serializable; import jakarta.enterprise.context.ApplicationScoped; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; +import java.io.Serial; +import java.io.Serializable; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; import org.eclipse.cargotracker.domain.model.handling.HandlingEvent; import org.eclipse.cargotracker.domain.model.handling.HandlingEventRepository; @@ -12,7 +13,7 @@ @ApplicationScoped public class JpaHandlingEventRepository implements HandlingEventRepository, Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @PersistenceContext private EntityManager entityManager; diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaLocationRepository.java b/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaLocationRepository.java index 7a6de0a91..60cc07b70 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaLocationRepository.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaLocationRepository.java @@ -1,10 +1,11 @@ package org.eclipse.cargotracker.infrastructure.persistence.jpa; -import java.io.Serializable; -import java.util.List; import jakarta.enterprise.context.ApplicationScoped; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; import org.eclipse.cargotracker.domain.model.location.Location; import org.eclipse.cargotracker.domain.model.location.LocationRepository; import org.eclipse.cargotracker.domain.model.location.UnLocode; @@ -12,7 +13,7 @@ @ApplicationScoped public class JpaLocationRepository implements LocationRepository, Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @PersistenceContext private EntityManager entityManager; diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaVoyageRepository.java b/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaVoyageRepository.java index aac78e93b..f5661015e 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaVoyageRepository.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/persistence/jpa/JpaVoyageRepository.java @@ -1,10 +1,11 @@ package org.eclipse.cargotracker.infrastructure.persistence.jpa; -import java.io.Serializable; -import java.util.List; import jakarta.enterprise.context.ApplicationScoped; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; import org.eclipse.cargotracker.domain.model.voyage.Voyage; import org.eclipse.cargotracker.domain.model.voyage.VoyageNumber; import org.eclipse.cargotracker.domain.model.voyage.VoyageRepository; @@ -12,7 +13,7 @@ @ApplicationScoped public class JpaVoyageRepository implements VoyageRepository, Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @PersistenceContext private EntityManager entityManager; diff --git a/src/main/java/org/eclipse/cargotracker/infrastructure/routing/ExternalRoutingService.java b/src/main/java/org/eclipse/cargotracker/infrastructure/routing/ExternalRoutingService.java index 3e95023e1..1a0df19da 100644 --- a/src/main/java/org/eclipse/cargotracker/infrastructure/routing/ExternalRoutingService.java +++ b/src/main/java/org/eclipse/cargotracker/infrastructure/routing/ExternalRoutingService.java @@ -1,10 +1,5 @@ package org.eclipse.cargotracker.infrastructure.routing; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.stream.Collectors; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import jakarta.ejb.Stateless; @@ -13,6 +8,10 @@ import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.GenericType; import jakarta.ws.rs.core.MediaType; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import org.eclipse.cargotracker.domain.model.cargo.Itinerary; import org.eclipse.cargotracker.domain.model.cargo.Leg; import org.eclipse.cargotracker.domain.model.cargo.RouteSpecification; @@ -60,14 +59,13 @@ public List fetchRoutesForSpecification(RouteSpecification routeSpeci .queryParam("origin", origin) .queryParam("destination", destination) .request(MediaType.APPLICATION_JSON_TYPE) - .get(new GenericType>() {}); + .get(new GenericType<>() {}); // The returned result is then translated back into our domain model. List itineraries = new ArrayList<>(); // Use the specification to safe-guard against invalid itineraries - transitPaths - .stream() + transitPaths.stream() .map(this::toItinerary) .forEach( itinerary -> { @@ -83,17 +81,16 @@ public List fetchRoutesForSpecification(RouteSpecification routeSpeci } private Itinerary toItinerary(TransitPath transitPath) { - List legs = - transitPath.getTransitEdges().stream().map(this::toLeg).collect(Collectors.toList()); + List legs = transitPath.getTransitEdges().stream().map(this::toLeg).toList(); return new Itinerary(legs); } private Leg toLeg(TransitEdge edge) { return new Leg( - voyageRepository.find(new VoyageNumber(edge.getVoyageNumber())), - locationRepository.find(new UnLocode(edge.getFromUnLocode())), - locationRepository.find(new UnLocode(edge.getToUnLocode())), - edge.getFromDate(), - edge.getToDate()); + voyageRepository.find(new VoyageNumber(edge.voyageNumber())), + locationRepository.find(new UnLocode(edge.fromUnLocode())), + locationRepository.find(new UnLocode(edge.toUnLocode())), + edge.fromDate(), + edge.toDate()); } } diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/Coordinates.java b/src/main/java/org/eclipse/cargotracker/interfaces/Coordinates.java index ededd74d5..b3edc4d92 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/Coordinates.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/Coordinates.java @@ -4,21 +4,4 @@ * At the moment, coordinates are effectively a shared DTO in the interface layer. It may be * converted to a domain level concern at some point. * */ -public class Coordinates { - - private final double latitude; - private final double longitude; - - public Coordinates(double latitude, double longitude) { - this.latitude = latitude; - this.longitude = longitude; - } - - public double getLatitude() { - return latitude; - } - - public double getLongitude() { - return longitude; - } -} +public record Coordinates(double latitude, double longitude) {} diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/CargoRoute.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/CargoRoute.java index c4f371b83..3e55a2894 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/CargoRoute.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/CargoRoute.java @@ -1,5 +1,6 @@ package org.eclipse.cargotracker.interfaces.booking.facade.dto; +import java.io.Serial; import java.io.Serializable; import java.time.LocalDate; import java.util.Collections; @@ -9,7 +10,7 @@ /** DTO for registering and routing a cargo. */ public class CargoRoute implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final String trackingId; private final Location origin; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/CargoStatus.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/CargoStatus.java index ed1e8db4b..07b5ef343 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/CargoStatus.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/CargoStatus.java @@ -1,64 +1,30 @@ package org.eclipse.cargotracker.interfaces.booking.facade.dto; -import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class CargoStatus { +public record CargoStatus( + String trackingId, + String destination, + String statusText, + boolean misdirected, + String eta, + String nextExpectedActivity, + List events) { - private final String trackingId; - private final String destination; - private final String statusText; - private final boolean misdirected; - private final String eta; - private final String nextExpectedActivity; - private final List events; - - public CargoStatus( - String trackigId, - String destination, - String statusText, - boolean misdirected, - String eta, - String nextExpectedActivity, - List handlingEvents) { - this.trackingId = trackigId; - this.destination = destination; - this.statusText = statusText; - this.misdirected = misdirected; - this.eta = eta; - this.nextExpectedActivity = nextExpectedActivity; - this.events = new ArrayList<>(handlingEvents.size()); - - events.addAll(handlingEvents); - } - - public String getTrackingId() { - return trackingId; + public CargoStatus { + events = List.copyOf(events); } - public String getDestination() { - return destination; + @Override + public List events() { + return Collections.unmodifiableList(events); } - /** @return A readable string describing the cargo status. */ + /** + * @return A readable string describing the cargo status. + */ public String getStatusText() { return statusText; } - - public boolean isMisdirected() { - return misdirected; - } - - public String getEta() { - return eta; - } - - public String getNextExpectedActivity() { - return nextExpectedActivity; - } - - public List getEvents() { - return Collections.unmodifiableList(events); - } } diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/Leg.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/Leg.java index d9e08497c..86220b61a 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/Leg.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/Leg.java @@ -1,18 +1,15 @@ package org.eclipse.cargotracker.interfaces.booking.facade.dto; +import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; import org.eclipse.cargotracker.application.util.DateConverter; /** DTO for a leg in an itinerary. */ -public class Leg implements Serializable { - - private static final long serialVersionUID = 1L; - private final String voyageNumber; - private final Location from; - private final Location to; - private final String loadTime; - private final String unloadTime; +public record Leg( + String voyageNumber, Location from, Location to, String loadTime, String unloadTime) + implements Serializable { + @Serial private static final long serialVersionUID = 1L; public Leg( String voyageNumber, @@ -20,11 +17,12 @@ public Leg( Location to, LocalDateTime loadTime, LocalDateTime unloadTime) { - this.voyageNumber = voyageNumber; - this.from = from; - this.to = to; - this.loadTime = DateConverter.toString(loadTime); - this.unloadTime = DateConverter.toString(unloadTime); + this( + voyageNumber, + from, + to, + DateConverter.toString(loadTime), + DateConverter.toString(unloadTime)); } public String getVoyageNumber() { @@ -36,11 +34,11 @@ public String getFrom() { } public String getFromUnLocode() { - return from.getUnLocode(); + return from.unLocode(); } public String getFromName() { - return from.getName(); + return from.name(); } public String getTo() { @@ -48,11 +46,11 @@ public String getTo() { } public String getToName() { - return to.getName(); + return to.name(); } public String getToUnLocode() { - return to.getUnLocode(); + return to.unLocode(); } public String getLoadTime() { @@ -62,20 +60,4 @@ public String getLoadTime() { public String getUnloadTime() { return unloadTime; } - - @Override - public String toString() { - return "Leg{" - + "voyageNumber=" - + voyageNumber - + ", from=" - + from.getUnLocode() - + ", to=" - + to.getUnLocode() - + ", loadTime=" - + loadTime - + ", unloadTime=" - + unloadTime - + '}'; - } } diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/Location.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/Location.java index 623fdde39..c4c794794 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/Location.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/Location.java @@ -3,18 +3,9 @@ import java.io.Serializable; /** Location DTO. */ -public class Location implements Serializable { - - private static final long serialVersionUID = 1L; - - private String unLocode; - private String name; - - public Location(String unLocode, String name) { - this.unLocode = unLocode; - this.name = name; - } +public record Location(String unLocode, String name) implements Serializable { + // keeping this for compatibility with the original code public String getUnLocode() { return unLocode; } @@ -22,9 +13,4 @@ public String getUnLocode() { public String getName() { return name; } - - @Override - public String toString() { - return name + " (" + unLocode + ")"; - } } diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/RouteCandidate.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/RouteCandidate.java index cdcb2f051..effeb0810 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/RouteCandidate.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/RouteCandidate.java @@ -1,26 +1,7 @@ package org.eclipse.cargotracker.interfaces.booking.facade.dto; import java.io.Serializable; -import java.util.Collections; import java.util.List; /** DTO for presenting and selecting an itinerary from a collection of candidates. */ -public class RouteCandidate implements Serializable { - - private static final long serialVersionUID = 1L; - - private List legs; - - public RouteCandidate(List legs) { - this.legs = legs; - } - - public List getLegs() { - return Collections.unmodifiableList(legs); - } - - @Override - public String toString() { - return "RouteCandidate{" + "legs=" + legs + '}'; - } -} +public record RouteCandidate(List legs) implements Serializable {} diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/TrackingEvents.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/TrackingEvents.java index 977ddfafd..16903a12d 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/TrackingEvents.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/dto/TrackingEvents.java @@ -1,26 +1,3 @@ package org.eclipse.cargotracker.interfaces.booking.facade.dto; -public class TrackingEvents { - - private final boolean expected; - private final String description; - private final String time; - - public TrackingEvents(boolean expected, String description, String time) { - this.expected = expected; - this.description = description; - this.time = time; - } - - public boolean isExpected() { - return expected; - } - - public String getDescription() { - return description; - } - - public String getTime() { - return time; - } -} +public record TrackingEvents(boolean expected, String description, String time) {} diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/DefaultBookingServiceFacade.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/DefaultBookingServiceFacade.java index 334eed541..68397e1f0 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/DefaultBookingServiceFacade.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/DefaultBookingServiceFacade.java @@ -1,12 +1,11 @@ package org.eclipse.cargotracker.interfaces.booking.facade.internal; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import java.io.Serial; import java.io.Serializable; import java.time.LocalDate; -import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; import org.eclipse.cargotracker.application.BookingService; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.CargoRepository; @@ -30,7 +29,7 @@ @ApplicationScoped public class DefaultBookingServiceFacade implements BookingServiceFacade, Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Inject private BookingService bookingService; @Inject private LocationRepository locationRepository; @@ -86,22 +85,14 @@ public void changeDeadline(String trackingId, LocalDate arrivalDeadline) { @Override // TODO [DDD] Is this the correct DTO here? public List listAllCargos() { - List cargos = cargoRepository.findAll(); - List routes; - routes = cargos.stream().map(cargoRouteDtoAssembler::toDto).collect(Collectors.toList()); - - return routes; + return cargoRepository.findAll().stream().map(cargoRouteDtoAssembler::toDto).toList(); } - @Override public List listAllTrackingIds() { - List trackingIds = new ArrayList<>(); - cargoRepository - .findAll() - .forEach(cargo -> trackingIds.add(cargo.getTrackingId().getIdString())); - - return trackingIds; + return cargoRepository.findAll().stream() + .map(cargo -> cargo.getTrackingId().getIdString()) + .toList(); } @Override @@ -126,12 +117,6 @@ public List requestPossibleRoutesForCargo(String trackingId) { List itineraries = bookingService.requestPossibleRoutesForCargo(new TrackingId(trackingId)); - List routeCandidates = - itineraries - .stream() - .map(itineraryCandidateDtoAssembler::toDto) - .collect(Collectors.toList()); - - return routeCandidates; + return itineraries.stream().map(itineraryCandidateDtoAssembler::toDto).toList(); } } diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/CargoRouteDtoAssembler.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/CargoRouteDtoAssembler.java index af996a6a7..22cf58c40 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/CargoRouteDtoAssembler.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/CargoRouteDtoAssembler.java @@ -1,10 +1,8 @@ package org.eclipse.cargotracker.interfaces.booking.facade.internal.assembler; -import static java.util.stream.Collectors.toList; - -import java.util.List; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import java.util.List; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.RoutingStatus; import org.eclipse.cargotracker.domain.model.cargo.TransportStatus; @@ -18,10 +16,7 @@ public class CargoRouteDtoAssembler { public CargoRoute toDto(Cargo cargo) { List legs = - cargo - .getItinerary() - .getLegs() - .stream() + cargo.getItinerary().getLegs().stream() .map( leg -> new Leg( @@ -30,7 +25,7 @@ public CargoRoute toDto(Cargo cargo) { locationDtoAssembler.toDto(leg.getUnloadLocation()), leg.getLoadTime(), leg.getUnloadTime())) - .collect(toList()); + .toList(); return new CargoRoute( cargo.getTrackingId().getIdString(), diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/CargoStatusDtoAssembler.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/CargoStatusDtoAssembler.java index 9d391902f..c8c8f549a 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/CargoStatusDtoAssembler.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/CargoStatusDtoAssembler.java @@ -1,10 +1,9 @@ package org.eclipse.cargotracker.interfaces.booking.facade.internal.assembler; -import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import java.time.LocalDateTime; +import java.util.List; import org.eclipse.cargotracker.application.util.DateConverter; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.Delivery; @@ -22,10 +21,9 @@ public CargoStatus toDto(Cargo cargo, List handlingEvents) { List trackingEvents; trackingEvents = - handlingEvents - .stream() + handlingEvents.stream() .map(handlingEvent -> assembler.toDto(cargo, handlingEvent)) - .collect(Collectors.toList()); + .toList(); return new CargoStatus( cargo.getTrackingId().getIdString(), @@ -39,21 +37,15 @@ public CargoStatus toDto(Cargo cargo, List handlingEvents) { private String getCargoStatusText(Cargo cargo) { Delivery delivery = cargo.getDelivery(); - - switch (delivery.getTransportStatus()) { - case IN_PORT: - return "In port " + delivery.getLastKnownLocation().getName(); - case ONBOARD_CARRIER: - return "Onboard voyage " + delivery.getCurrentVoyage().getVoyageNumber().getIdString(); - case CLAIMED: - return "Claimed"; - case NOT_RECEIVED: - return "Not received"; - case UNKNOWN: - return "Unknown"; - default: - return "[Unknown status]"; // Should never happen. - } + return switch (delivery.getTransportStatus()) { + case IN_PORT -> "In port " + delivery.getLastKnownLocation().getName(); + case ONBOARD_CARRIER -> + "Onboard voyage " + delivery.getCurrentVoyage().getVoyageNumber().getIdString(); + case CLAIMED -> "Claimed"; + case NOT_RECEIVED -> "Not received"; + case UNKNOWN -> "Unknown"; + default -> "[Unknown status]"; // Should never happen. + }; } private String getEta(Cargo cargo) { diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/ItineraryCandidateDtoAssembler.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/ItineraryCandidateDtoAssembler.java index 24eeb4721..cd67fd166 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/ItineraryCandidateDtoAssembler.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/ItineraryCandidateDtoAssembler.java @@ -1,10 +1,9 @@ package org.eclipse.cargotracker.interfaces.booking.facade.internal.assembler; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import java.util.ArrayList; +import java.util.List; import org.eclipse.cargotracker.application.util.DateConverter; import org.eclipse.cargotracker.domain.model.cargo.Itinerary; import org.eclipse.cargotracker.domain.model.cargo.Leg; @@ -23,7 +22,7 @@ public class ItineraryCandidateDtoAssembler { public RouteCandidate toDto(Itinerary itinerary) { List legDTOs = - itinerary.getLegs().stream().map(this::toLegDTO).collect(Collectors.toList()); + itinerary.getLegs().stream().map(this::toLegDTO).toList(); return new RouteCandidate(legDTOs); } @@ -41,10 +40,10 @@ public Itinerary fromDTO( RouteCandidate routeCandidateDTO, VoyageRepository voyageRepository, LocationRepository locationRepository) { - List legs = new ArrayList<>(routeCandidateDTO.getLegs().size()); + List legs = new ArrayList<>(routeCandidateDTO.legs().size()); for (org.eclipse.cargotracker.interfaces.booking.facade.dto.Leg legDTO : - routeCandidateDTO.getLegs()) { + routeCandidateDTO.legs()) { VoyageNumber voyageNumber = new VoyageNumber(legDTO.getVoyageNumber()); Voyage voyage = voyageRepository.find(voyageNumber); Location from = locationRepository.find(new UnLocode(legDTO.getFromUnLocode())); diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/LocationDtoAssembler.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/LocationDtoAssembler.java index 2bde65a6a..ea1eedbf2 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/LocationDtoAssembler.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/LocationDtoAssembler.java @@ -1,9 +1,8 @@ package org.eclipse.cargotracker.interfaces.booking.facade.internal.assembler; +import jakarta.enterprise.context.ApplicationScoped; import java.util.Comparator; import java.util.List; -import java.util.stream.Collectors; -import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.cargotracker.domain.model.location.Location; @ApplicationScoped @@ -16,14 +15,12 @@ public org.eclipse.cargotracker.interfaces.booking.facade.dto.Location toDto(Loc public List toDtoList( List allLocations) { - List dtoList = - allLocations - .stream() - .map(this::toDto) - .sorted( - Comparator.comparing( - org.eclipse.cargotracker.interfaces.booking.facade.dto.Location::getUnLocode)) - .collect(Collectors.toList()); - return dtoList; + + return allLocations.stream() + .map(this::toDto) + .sorted( + Comparator.comparing( + org.eclipse.cargotracker.interfaces.booking.facade.dto.Location::getUnLocode)) + .toList(); } } diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/TrackingEventsDtoAssembler.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/TrackingEventsDtoAssembler.java index e0a675f4f..ab7d6deab 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/TrackingEventsDtoAssembler.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/facade/internal/assembler/TrackingEventsDtoAssembler.java @@ -25,20 +25,13 @@ private String timeFrom(HandlingEvent event) { } private String descriptionFrom(HandlingEvent.Type type, String location, String voyageNumber) { - switch (type) { - case LOAD: - return "Loaded onto voyage " + voyageNumber + " in " + location; - case UNLOAD: - return "Unloaded off voyage " + voyageNumber + " in " + location; - case RECEIVE: - return "Received in " + location; - case CLAIM: - return "Claimed in " + location; - case CUSTOMS: - return "Cleared customs in " + location; - default: - return "[Unknown]"; - } + return switch (type) { + case LOAD -> "Loaded onto voyage " + voyageNumber + " in " + location; + case UNLOAD -> "Unloaded off voyage " + voyageNumber + " in " + location; + case RECEIVE -> "Received in " + location; + case CLAIM -> "Claimed in " + location; + case CUSTOMS -> "Cleared customs in " + location; + }; } private String voyageNumberFrom(HandlingEvent handlingEvent) { diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/sse/RealtimeCargoTrackingService.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/sse/RealtimeCargoTrackingService.java index 087e20ea5..a78361959 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/sse/RealtimeCargoTrackingService.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/sse/RealtimeCargoTrackingService.java @@ -1,7 +1,5 @@ package org.eclipse.cargotracker.interfaces.booking.sse; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import jakarta.ejb.Singleton; @@ -16,6 +14,8 @@ import jakarta.ws.rs.sse.Sse; import jakarta.ws.rs.sse.SseBroadcaster; import jakarta.ws.rs.sse.SseEventSink; +import java.util.logging.Level; +import java.util.logging.Logger; import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.CargoRepository; import org.eclipse.cargotracker.infrastructure.events.cdi.CargoUpdated; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/Booking.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/Booking.java index 5e580a58a..2abc7e473 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/Booking.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/Booking.java @@ -1,16 +1,17 @@ package org.eclipse.cargotracker.interfaces.booking.web; -import java.io.Serializable; -import java.time.LocalDate; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.List; import jakarta.annotation.PostConstruct; import jakarta.faces.application.FacesMessage; import jakarta.faces.context.FacesContext; import jakarta.faces.flow.FlowScoped; import jakarta.inject.Inject; import jakarta.inject.Named; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; import org.eclipse.cargotracker.interfaces.booking.facade.BookingServiceFacade; import org.eclipse.cargotracker.interfaces.booking.facade.dto.Location; import org.primefaces.PrimeFaces; @@ -29,7 +30,7 @@ @FlowScoped("booking") public class Booking implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private static final long MIN_JOURNEY_DURATION = 1; // Journey should be 1 day minimum. @@ -83,8 +84,7 @@ public String getOriginUnlocode() { public void setOriginUnlocode(String originUnlocode) { this.originUnlocode = originUnlocode; this.originName = - locations - .stream() + locations.stream() .filter(location -> location.getUnLocode().equalsIgnoreCase(originUnlocode)) .findAny() .get() @@ -102,8 +102,7 @@ public String getDestinationUnlocode() { public void setDestinationUnlocode(String destinationUnlocode) { this.destinationUnlocode = destinationUnlocode; this.destinationName = - locations - .stream() + locations.stream() .filter(location -> location.getUnLocode().equalsIgnoreCase(destinationUnlocode)) .findAny() .get() @@ -137,11 +136,7 @@ public boolean isBookable() { public void deadlineUpdated() { duration = ChronoUnit.DAYS.between(today, arrivalDeadline); - if (duration >= MIN_JOURNEY_DURATION) { - bookable = true; - } else { - bookable = false; - } + bookable = duration >= MIN_JOURNEY_DURATION; PrimeFaces.current().ajax().update("dateForm:durationPanel"); PrimeFaces.current().ajax().update("dateForm:bookBtn"); diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeArrivalDeadline.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeArrivalDeadline.java index a085d5be6..c10e926cc 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeArrivalDeadline.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeArrivalDeadline.java @@ -1,10 +1,11 @@ package org.eclipse.cargotracker.interfaces.booking.web; -import java.io.Serializable; -import java.time.LocalDate; import jakarta.faces.view.ViewScoped; import jakarta.inject.Inject; import jakarta.inject.Named; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; import org.eclipse.cargotracker.application.util.DateConverter; import org.eclipse.cargotracker.interfaces.booking.facade.BookingServiceFacade; import org.eclipse.cargotracker.interfaces.booking.facade.dto.CargoRoute; @@ -24,7 +25,7 @@ @ViewScoped public class ChangeArrivalDeadline implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Inject private BookingServiceFacade bookingServiceFacade; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeArrivalDeadlineDialog.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeArrivalDeadlineDialog.java index 2458be2ef..1806d5698 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeArrivalDeadlineDialog.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeArrivalDeadlineDialog.java @@ -1,12 +1,13 @@ package org.eclipse.cargotracker.interfaces.booking.web; +import jakarta.enterprise.context.SessionScoped; +import jakarta.inject.Named; +import java.io.Serial; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import jakarta.enterprise.context.SessionScoped; -import jakarta.inject.Named; import org.primefaces.PrimeFaces; import org.primefaces.event.SelectEvent; @@ -14,7 +15,7 @@ @SessionScoped public class ChangeArrivalDeadlineDialog implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; public void showDialog(String trackingId) { Map options = new HashMap<>(); diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeDestination.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeDestination.java index 3b07573e7..40525114a 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeDestination.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeDestination.java @@ -1,11 +1,11 @@ package org.eclipse.cargotracker.interfaces.booking.web; -import java.io.Serializable; -import java.util.List; -import java.util.stream.Collectors; import jakarta.faces.view.ViewScoped; import jakarta.inject.Inject; import jakarta.inject.Named; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; import org.eclipse.cargotracker.interfaces.booking.facade.BookingServiceFacade; import org.eclipse.cargotracker.interfaces.booking.facade.dto.CargoRoute; import org.eclipse.cargotracker.interfaces.booking.facade.dto.Location; @@ -25,7 +25,7 @@ @ViewScoped public class ChangeDestination implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Inject private BookingServiceFacade bookingServiceFacade; @@ -51,19 +51,15 @@ public List getLocations() { } public List getPotentialDestinations() { - // Potential destination = All Locations - Origin - Current Destination - List destinationsToRemove = - locations - .stream() - .filter( - location -> - location.getUnLocode().equalsIgnoreCase(cargo.getOriginCode()) - || location.getUnLocode().equalsIgnoreCase(cargo.getFinalDestinationCode())) - .collect(Collectors.toList()); - - locations.removeAll(destinationsToRemove); - - return locations; + String originCode = cargo.getOriginCode().toLowerCase(); + String destinationCode = cargo.getFinalDestinationCode().toLowerCase(); + + return locations.stream() + .filter( + location -> + !location.getUnLocode().toLowerCase().equals(originCode) + && !location.getUnLocode().toLowerCase().equals(destinationCode)) + .toList(); } public String getDestinationUnlocode() { diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeDestinationDialog.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeDestinationDialog.java index bf8866a9a..3d7a36674 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeDestinationDialog.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ChangeDestinationDialog.java @@ -1,12 +1,13 @@ package org.eclipse.cargotracker.interfaces.booking.web; +import jakarta.enterprise.context.SessionScoped; +import jakarta.inject.Named; +import java.io.Serial; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import jakarta.enterprise.context.SessionScoped; -import jakarta.inject.Named; import org.primefaces.PrimeFaces; import org.primefaces.event.SelectEvent; @@ -14,7 +15,7 @@ @SessionScoped public class ChangeDestinationDialog implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; public void showDialog(String trackingId) { Map options = new HashMap<>(); diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ItinerarySelection.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ItinerarySelection.java index 9246579a0..1f55c52eb 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ItinerarySelection.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ItinerarySelection.java @@ -1,10 +1,11 @@ package org.eclipse.cargotracker.interfaces.booking.web; -import java.io.Serializable; -import java.util.List; import jakarta.faces.view.ViewScoped; import jakarta.inject.Inject; import jakarta.inject.Named; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; import org.eclipse.cargotracker.interfaces.booking.facade.BookingServiceFacade; import org.eclipse.cargotracker.interfaces.booking.facade.dto.CargoRoute; import org.eclipse.cargotracker.interfaces.booking.facade.dto.RouteCandidate; @@ -23,7 +24,7 @@ @ViewScoped public class ItinerarySelection implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Inject private BookingServiceFacade bookingServiceFacade; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ListCargo.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ListCargo.java index 57b602db7..2aa5dfb2c 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ListCargo.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/ListCargo.java @@ -2,11 +2,11 @@ import static java.util.stream.Collectors.toList; -import java.util.List; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.RequestScoped; import jakarta.inject.Inject; import jakarta.inject.Named; +import java.util.List; import org.eclipse.cargotracker.interfaces.booking.facade.BookingServiceFacade; import org.eclipse.cargotracker.interfaces.booking.facade.dto.CargoRoute; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/Track.java b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/Track.java index daf93509d..6d422557e 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/Track.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/booking/web/Track.java @@ -1,11 +1,12 @@ package org.eclipse.cargotracker.interfaces.booking.web; -import java.io.Serializable; -import java.util.List; import jakarta.annotation.PostConstruct; import jakarta.faces.view.ViewScoped; import jakarta.inject.Inject; import jakarta.inject.Named; +import java.io.Serial; +import java.io.Serializable; +import java.util.List; import org.eclipse.cargotracker.interfaces.booking.facade.BookingServiceFacade; import org.eclipse.cargotracker.interfaces.booking.facade.dto.CargoStatus; @@ -23,7 +24,7 @@ @ViewScoped public class Track implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Inject private BookingServiceFacade bookingServiceFacade; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/handling/HandlingEventRegistrationAttempt.java b/src/main/java/org/eclipse/cargotracker/interfaces/handling/HandlingEventRegistrationAttempt.java index 094223f94..9771b4e19 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/handling/HandlingEventRegistrationAttempt.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/handling/HandlingEventRegistrationAttempt.java @@ -1,5 +1,6 @@ package org.eclipse.cargotracker.interfaces.handling; +import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; @@ -15,7 +16,7 @@ */ public class HandlingEventRegistrationAttempt implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final LocalDateTime registrationTime; private final LocalDateTime completionTime; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventFilesCheckpoint.java b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventFilesCheckpoint.java index 57f8988de..0a017d9ec 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventFilesCheckpoint.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventFilesCheckpoint.java @@ -1,13 +1,14 @@ package org.eclipse.cargotracker.interfaces.handling.file; import java.io.File; +import java.io.Serial; import java.io.Serializable; import java.util.LinkedList; import java.util.List; public class EventFilesCheckpoint implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private List files = new LinkedList<>(); private int fileIndex = 0; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventItemReader.java b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventItemReader.java index f96ccb8dc..5b85c2500 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventItemReader.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventItemReader.java @@ -1,5 +1,10 @@ package org.eclipse.cargotracker.interfaces.handling.file; +import jakarta.batch.api.chunk.AbstractItemReader; +import jakarta.batch.runtime.context.JobContext; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import jakarta.inject.Named; import java.io.File; import java.io.RandomAccessFile; import java.io.Serializable; @@ -8,11 +13,6 @@ import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; -import jakarta.batch.api.chunk.AbstractItemReader; -import jakarta.batch.runtime.context.JobContext; -import jakarta.enterprise.context.Dependent; -import jakarta.inject.Inject; -import jakarta.inject.Named; import org.eclipse.cargotracker.application.util.DateConverter; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; import org.eclipse.cargotracker.domain.model.handling.HandlingEvent; @@ -141,11 +141,8 @@ private Object parseLine(String line) throws EventLineParseException { throw new EventLineParseException("Cannot parse event type", e, line); } - HandlingEventRegistrationAttempt attempt = - new HandlingEventRegistrationAttempt( - LocalDateTime.now(), completionTime, trackingId, voyageNumber, eventType, unLocode); - - return attempt; + return new HandlingEventRegistrationAttempt( + LocalDateTime.now(), completionTime, trackingId, voyageNumber, eventType, unLocode); } @Override diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventItemWriter.java b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventItemWriter.java index 834f007da..9ef15220c 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventItemWriter.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventItemWriter.java @@ -1,17 +1,17 @@ package org.eclipse.cargotracker.interfaces.handling.file; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.PrintWriter; -import java.io.Serializable; -import java.util.List; import jakarta.batch.api.chunk.AbstractItemWriter; import jakarta.batch.runtime.context.JobContext; import jakarta.enterprise.context.Dependent; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.transaction.Transactional; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.PrintWriter; +import java.io.Serializable; +import java.util.List; import org.eclipse.cargotracker.application.ApplicationEvents; import org.eclipse.cargotracker.application.util.DateConverter; import org.eclipse.cargotracker.interfaces.handling.HandlingEventRegistrationAttempt; @@ -49,9 +49,8 @@ public void writeItems(List items) throws Exception { + ".csv", true)))) { - items - .stream() - .map(item -> (HandlingEventRegistrationAttempt) item) + items.stream() + .map(HandlingEventRegistrationAttempt.class::cast) .forEach( attempt -> { applicationEvents.receivedHandlingEventRegistrationAttempt(attempt); diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventLineParseException.java b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventLineParseException.java index c953dfbc7..c11e743ab 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventLineParseException.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/EventLineParseException.java @@ -1,8 +1,10 @@ package org.eclipse.cargotracker.interfaces.handling.file; +import java.io.Serial; + public class EventLineParseException extends RuntimeException { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final String line; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/FileProcessorJobListener.java b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/FileProcessorJobListener.java index e98038037..2361f6825 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/FileProcessorJobListener.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/FileProcessorJobListener.java @@ -1,12 +1,12 @@ package org.eclipse.cargotracker.interfaces.handling.file; -import java.util.Date; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.batch.api.listener.JobListener; import jakarta.enterprise.context.Dependent; import jakarta.inject.Inject; import jakarta.inject.Named; +import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; @Dependent @Named("FileProcessorJobListener") diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/LineParseExceptionListener.java b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/LineParseExceptionListener.java index 98eadbf79..3865fcdc0 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/LineParseExceptionListener.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/handling/file/LineParseExceptionListener.java @@ -1,16 +1,16 @@ package org.eclipse.cargotracker.interfaces.handling.file; +import jakarta.batch.api.chunk.listener.SkipReadListener; +import jakarta.batch.runtime.context.JobContext; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import jakarta.inject.Named; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.util.logging.Level; import java.util.logging.Logger; -import jakarta.batch.api.chunk.listener.SkipReadListener; -import jakarta.batch.runtime.context.JobContext; -import jakarta.enterprise.context.Dependent; -import jakarta.inject.Inject; -import jakarta.inject.Named; @Dependent @Named("LineParseExceptionListener") diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/handling/mobile/EventLogger.java b/src/main/java/org/eclipse/cargotracker/interfaces/handling/mobile/EventLogger.java index 66bdac625..42600c88f 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/handling/mobile/EventLogger.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/handling/mobile/EventLogger.java @@ -2,14 +2,6 @@ import static java.util.stream.Collectors.toMap; -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.function.Function; import jakarta.annotation.PostConstruct; import jakarta.faces.application.FacesMessage; import jakarta.faces.context.FacesContext; @@ -17,9 +9,16 @@ import jakarta.faces.view.ViewScoped; import jakarta.inject.Inject; import jakarta.inject.Named; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; import org.eclipse.cargotracker.application.ApplicationEvents; import org.eclipse.cargotracker.application.util.DateConverter; -import org.eclipse.cargotracker.domain.model.cargo.Cargo; import org.eclipse.cargotracker.domain.model.cargo.CargoRepository; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; import org.eclipse.cargotracker.domain.model.cargo.TransportStatus; @@ -37,7 +36,7 @@ @ViewScoped public class EventLogger implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Inject private CargoRepository cargoRepository; @Inject private LocationRepository locationRepository; @@ -82,8 +81,7 @@ public List getLocations() { // Move this to a separate utility if it is used in other parts of the UI. public Map getEventTypes() { return Collections.unmodifiableMap( - Arrays.asList(HandlingEvent.Type.values()) - .stream() + Arrays.stream(HandlingEvent.Type.values()) .collect(toMap(Function.identity(), Function.identity()))); } @@ -125,44 +123,33 @@ public String getCompletionTimePattern() { @PostConstruct public void init() { - List cargos = cargoRepository.findAll(); - - trackingIds = new ArrayList<>(cargos.size()); - - // List only routed cargo that is not claimed yet. - cargos - .stream() - .filter( - cargo -> - !cargo.getItinerary().getLegs().isEmpty() - && !(cargo - .getDelivery() - .getTransportStatus() - .sameValueAs(TransportStatus.CLAIMED))) - .map(cargo -> cargo.getTrackingId().getIdString()) - .forEachOrdered(trackingId -> trackingIds.add(new SelectItem(trackingId, trackingId))); + trackingIds = + cargoRepository.findAll().stream() + .filter(cargo -> !cargo.getItinerary().getLegs().isEmpty()) + .filter( + cargo -> + !cargo.getDelivery().getTransportStatus().sameValueAs(TransportStatus.CLAIMED)) + .map(cargo -> cargo.getTrackingId().getIdString()) + .map(this::buildSelectItem) + .toList(); - List locations = locationRepository.findAll(); + this.locations = locationRepository.findAll().stream().map(this::buildSelectItem).toList(); - this.locations = new ArrayList<>(locations.size()); - - locations.forEach( - location -> { - String locationCode = location.getUnLocode().getIdString(); - this.locations.add( - new SelectItem(locationCode, location.getName() + " (" + locationCode + ")")); - }); - - List voyages = voyageRepository.findAll(); + this.voyages = + voyageRepository.findAll().stream() + .map(Voyage::getVoyageNumber) + .map(VoyageNumber::getIdString) + .map(this::buildSelectItem) + .toList(); + } - this.voyages = new ArrayList<>(voyages.size()); + private SelectItem buildSelectItem(String trackingIdLocal) { + return new SelectItem(trackingIdLocal, trackingIdLocal); + } - voyages.forEach( - voyage -> - this.voyages.add( - new SelectItem( - voyage.getVoyageNumber().getIdString(), - voyage.getVoyageNumber().getIdString()))); + private SelectItem buildSelectItem(Location locationLocal) { + String locationCode = locationLocal.getUnLocode().getIdString(); + return buildSelectItem(locationCode); } public String onFlowProcess(FlowEvent event) { @@ -194,9 +181,6 @@ private boolean validate(final String step) { public void submit() { VoyageNumber voyage; - TrackingId trackingId = new TrackingId(this.trackingId); - UnLocode location = new UnLocode(this.location); - if (eventType.requiresVoyage()) { voyage = new VoyageNumber(voyageNumber); } else { @@ -205,7 +189,12 @@ public void submit() { HandlingEventRegistrationAttempt attempt = new HandlingEventRegistrationAttempt( - LocalDateTime.now(), completionTime, trackingId, voyage, eventType, location); + LocalDateTime.now(), + completionTime, + new TrackingId(this.trackingId), + voyage, + eventType, + new UnLocode(this.location)); applicationEvents.receivedHandlingEventRegistrationAttempt(attempt); diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/handling/rest/HandlingReportService.java b/src/main/java/org/eclipse/cargotracker/interfaces/handling/rest/HandlingReportService.java index f01ac7e0d..aad354bdb 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/handling/rest/HandlingReportService.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/handling/rest/HandlingReportService.java @@ -1,6 +1,5 @@ package org.eclipse.cargotracker.interfaces.handling.rest; -import java.time.LocalDateTime; import jakarta.ejb.Stateless; import jakarta.inject.Inject; import jakarta.validation.Valid; @@ -8,6 +7,7 @@ import jakarta.ws.rs.Consumes; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; +import java.time.LocalDateTime; import org.eclipse.cargotracker.application.ApplicationEvents; import org.eclipse.cargotracker.application.util.DateConverter; import org.eclipse.cargotracker.domain.model.cargo.TrackingId; diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/tracking/web/CargoTrackingViewAdapter.java b/src/main/java/org/eclipse/cargotracker/interfaces/tracking/web/CargoTrackingViewAdapter.java index 6cb7ef3c0..183d767c7 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/tracking/web/CargoTrackingViewAdapter.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/tracking/web/CargoTrackingViewAdapter.java @@ -83,24 +83,20 @@ public String getStatusCode() { return cargo.getDelivery().getTransportStatus().name(); } - /** @return A readable string describing the cargo status. */ + /** + * @return A readable string describing the cargo status. + */ public String getStatusText() { Delivery delivery = cargo.getDelivery(); - switch (delivery.getTransportStatus()) { - case IN_PORT: - return "In port " + cargo.getRouteSpecification().getDestination().getName(); - case ONBOARD_CARRIER: - return "Onboard voyage " + delivery.getCurrentVoyage().getVoyageNumber().getIdString(); - case CLAIMED: - return "Claimed"; - case NOT_RECEIVED: - return "Not received"; - case UNKNOWN: - return "Unknown"; - default: - return "[Unknown status]"; // Should never happen. - } + return switch (delivery.getTransportStatus()) { + case IN_PORT -> "In port " + cargo.getRouteSpecification().getDestination().getName(); + case ONBOARD_CARRIER -> + "Onboard voyage " + delivery.getCurrentVoyage().getVoyageNumber().getIdString(); + case CLAIMED -> "Claimed"; + case NOT_RECEIVED -> "Not received"; + case UNKNOWN -> "Unknown"; + }; } public boolean isMisdirected() { @@ -146,7 +142,9 @@ public String getNextExpectedActivity() { } } - /** @return An unmodifiable list of handling event view adapters. */ + /** + * @return An unmodifiable list of handling event view adapters. + */ public List getEvents() { return Collections.unmodifiableList(events); } @@ -169,26 +167,21 @@ public boolean isExpected() { } public String getDescription() { - switch (handlingEvent.getType()) { - case LOAD: - return "Loaded onto voyage " - + handlingEvent.getVoyage().getVoyageNumber().getIdString() - + " in " - + handlingEvent.getLocation().getName(); - case UNLOAD: - return "Unloaded off voyage " - + handlingEvent.getVoyage().getVoyageNumber().getIdString() - + " in " - + handlingEvent.getLocation().getName(); - case RECEIVE: - return "Received in " + handlingEvent.getLocation().getName(); - case CLAIM: - return "Claimed in " + handlingEvent.getLocation().getName(); - case CUSTOMS: - return "Cleared customs in " + handlingEvent.getLocation().getName(); - default: - return "[Unknown]"; - } + return switch (handlingEvent.getType()) { + case LOAD -> + "Loaded onto voyage " + + handlingEvent.getVoyage().getVoyageNumber().getIdString() + + " in " + + handlingEvent.getLocation().getName(); + case UNLOAD -> + "Unloaded off voyage " + + handlingEvent.getVoyage().getVoyageNumber().getIdString() + + " in " + + handlingEvent.getLocation().getName(); + case RECEIVE -> "Received in " + handlingEvent.getLocation().getName(); + case CLAIM -> "Claimed in " + handlingEvent.getLocation().getName(); + case CUSTOMS -> "Cleared customs in " + handlingEvent.getLocation().getName(); + }; } } } diff --git a/src/main/java/org/eclipse/cargotracker/interfaces/tracking/web/Track.java b/src/main/java/org/eclipse/cargotracker/interfaces/tracking/web/Track.java index 4e53ff9c8..9cb02b142 100644 --- a/src/main/java/org/eclipse/cargotracker/interfaces/tracking/web/Track.java +++ b/src/main/java/org/eclipse/cargotracker/interfaces/tracking/web/Track.java @@ -1,21 +1,12 @@ package org.eclipse.cargotracker.interfaces.tracking.web; -import static java.nio.charset.StandardCharsets.UTF_8; - -import java.io.Serializable; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; import jakarta.faces.view.ViewScoped; import jakarta.inject.Inject; import jakarta.inject.Named; -import jakarta.json.bind.JsonbBuilder; -import org.eclipse.cargotracker.domain.model.cargo.Cargo; +import java.io.Serial; +import java.io.Serializable; +import java.util.logging.Logger; import org.eclipse.cargotracker.domain.model.cargo.CargoRepository; -import org.eclipse.cargotracker.domain.model.cargo.TrackingId; -import org.eclipse.cargotracker.domain.model.handling.HandlingEvent; import org.eclipse.cargotracker.domain.model.handling.HandlingEventRepository; /** @@ -33,7 +24,7 @@ @ViewScoped public class Track implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; @Inject private transient Logger logger; @@ -58,27 +49,4 @@ public void setTrackingId(String trackingId) { public CargoTrackingViewAdapter getCargo() { return cargo; } - - public String getCargoAsJson() { - try { - return URLEncoder.encode(JsonbBuilder.create().toJson(cargo), UTF_8.name()); - } catch (UnsupportedEncodingException ex) { - logger.log(Level.WARNING, "URL encoding error.", ex); - return ""; // Should never happen. - } - } - - public void onTrackById() { - Cargo cargo = cargoRepository.find(new TrackingId(trackingId)); - - if (cargo != null) { - List handlingEvents = - handlingEventRepository - .lookupHandlingHistoryOfCargo(new TrackingId(trackingId)) - .getDistinctEventsByCompletionTime(); - this.cargo = new CargoTrackingViewAdapter(cargo, handlingEvents); - } else { - this.cargo = null; - } - } } diff --git a/src/main/java/org/eclipse/pathfinder/api/GraphTraversalService.java b/src/main/java/org/eclipse/pathfinder/api/GraphTraversalService.java index 73e157771..f9ad73bd5 100644 --- a/src/main/java/org/eclipse/pathfinder/api/GraphTraversalService.java +++ b/src/main/java/org/eclipse/pathfinder/api/GraphTraversalService.java @@ -1,11 +1,5 @@ package org.eclipse.pathfinder.api; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; import jakarta.ejb.Stateless; import jakarta.inject.Inject; import jakarta.validation.constraints.NotNull; @@ -15,6 +9,12 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.QueryParam; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; import org.eclipse.pathfinder.internal.GraphDao; @Stateless @@ -24,9 +24,11 @@ public class GraphTraversalService { private static final long ONE_MIN_MS = 1000 * 60; private static final long ONE_DAY_MS = ONE_MIN_MS * 60 * 24; private static final String UNLOCODE_PATTERN_VIOLATION_MESSAGE = - "UN location code value must be five characters long, " - + "the first two must be alphabetic and " - + "the last three must be alphanumeric (excluding 0 and 1)."; + """ + UN location code value must be five characters long, \ + the first two must be alphabetic and \ + the last three must be alphanumeric (excluding 0 and 1).\ + """; private final Random random = new Random(); @Inject private GraphDao dao; diff --git a/src/main/java/org/eclipse/pathfinder/api/TransitEdge.java b/src/main/java/org/eclipse/pathfinder/api/TransitEdge.java index 6903adf91..b48a62afc 100644 --- a/src/main/java/org/eclipse/pathfinder/api/TransitEdge.java +++ b/src/main/java/org/eclipse/pathfinder/api/TransitEdge.java @@ -4,86 +4,10 @@ import java.time.LocalDateTime; /** Represents an edge in a path through a graph, describing the route of a cargo. */ -public class TransitEdge implements Serializable { - - private static final long serialVersionUID = 1L; - - private String voyageNumber; - private String fromUnLocode; - private String toUnLocode; - private LocalDateTime fromDate; - private LocalDateTime toDate; - - public TransitEdge() { - // Nothing to do. - } - - public TransitEdge( - String voyageNumber, - String fromUnLocode, - String toUnLocode, - LocalDateTime fromDate, - LocalDateTime toDate) { - this.voyageNumber = voyageNumber; - this.fromUnLocode = fromUnLocode; - this.toUnLocode = toUnLocode; - this.fromDate = fromDate; - this.toDate = toDate; - } - - public String getVoyageNumber() { - return voyageNumber; - } - - public void setVoyageNumber(String voyageNumber) { - this.voyageNumber = voyageNumber; - } - - public String getFromUnLocode() { - return fromUnLocode; - } - - public void setFromUnLocode(String fromUnLocode) { - this.fromUnLocode = fromUnLocode; - } - - public String getToUnLocode() { - return toUnLocode; - } - - public void setToUnLocode(String toUnLocode) { - this.toUnLocode = toUnLocode; - } - - public LocalDateTime getFromDate() { - return fromDate; - } - - public void setFromDate(LocalDateTime fromDate) { - this.fromDate = fromDate; - } - - public LocalDateTime getToDate() { - return toDate; - } - - public void setToDate(LocalDateTime toDate) { - this.toDate = toDate; - } - - @Override - public String toString() { - return "TransitEdge{" - + "voyageNumber=" - + voyageNumber - + ", fromUnLocode=" - + fromUnLocode - + ", toUnLocode=" - + toUnLocode - + ", fromDate=" - + fromDate - + ", toDate=" - + toDate - + '}'; - } -} +public record TransitEdge( + String voyageNumber, + String fromUnLocode, + String toUnLocode, + LocalDateTime fromDate, + LocalDateTime toDate) + implements Serializable {} diff --git a/src/main/java/org/eclipse/pathfinder/api/TransitPath.java b/src/main/java/org/eclipse/pathfinder/api/TransitPath.java index 4d8522582..2bad8851d 100644 --- a/src/main/java/org/eclipse/pathfinder/api/TransitPath.java +++ b/src/main/java/org/eclipse/pathfinder/api/TransitPath.java @@ -1,14 +1,15 @@ package org.eclipse.pathfinder.api; +import jakarta.xml.bind.annotation.XmlRootElement; +import java.io.Serial; import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class TransitPath implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private List transitEdges; diff --git a/src/main/java/org/eclipse/pathfinder/internal/GraphDao.java b/src/main/java/org/eclipse/pathfinder/internal/GraphDao.java index 104bb6106..c77aa401a 100644 --- a/src/main/java/org/eclipse/pathfinder/internal/GraphDao.java +++ b/src/main/java/org/eclipse/pathfinder/internal/GraphDao.java @@ -1,22 +1,22 @@ package org.eclipse.pathfinder.internal; +import jakarta.enterprise.context.ApplicationScoped; +import java.io.Serial; import java.io.Serializable; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Random; -import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class GraphDao implements Serializable { - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final Random random = new Random(); public List listLocations() { return new ArrayList<>( - Arrays.asList( + List.of( "CNHKG", "AUMEL", "SESTO", "FIHEL", "USCHI", "JNTKO", "DEHAM", "CNSHA", "NLRTM", "SEGOT", "CNHGH", "USNYC", "USDAL")); } @@ -24,17 +24,12 @@ public List listLocations() { public String getVoyageNumber(String from, String to) { int i = random.nextInt(5); - switch (i) { - case 0: - return "0100S"; - case 1: - return "0200T"; - case 2: - return "0300A"; - case 3: - return "0301S"; - default: - return "0400S"; - } + return switch (i) { + case 0 -> "0100S"; + case 1 -> "0200T"; + case 2 -> "0300A"; + case 3 -> "0301S"; + default -> "0400S"; + }; } } diff --git a/src/main/webapp/admin/route.xhtml b/src/main/webapp/admin/route.xhtml index 396052f04..e96b7788a 100644 --- a/src/main/webapp/admin/route.xhtml +++ b/src/main/webapp/admin/route.xhtml @@ -72,7 +72,7 @@
- { diff --git a/src/test/java/org/eclipse/cargotracker/scenario/CargoLifecycleScenarioTest.java b/src/test/java/org/eclipse/cargotracker/scenario/CargoLifecycleScenarioTest.java index f39ad3b6e..60305bfec 100644 --- a/src/test/java/org/eclipse/cargotracker/scenario/CargoLifecycleScenarioTest.java +++ b/src/test/java/org/eclipse/cargotracker/scenario/CargoLifecycleScenarioTest.java @@ -200,8 +200,7 @@ public void testCargoFromHongkongToStockholm() throws Exception { noSuchVoyageNumber, noSuchUnLocode, HandlingEvent.Type.LOAD); - fail( - "Should not be able to register a handling event with invalid location and voyage"); + fail("Should not be able to register a handling event with invalid location and voyage"); } catch (CannotCreateHandlingEventException expected) { }