ソースを参照

Added loadCargoForRouting application service call, which will put a pessimistic lock on a cargo during (re-)routing in order to show benefits of aggregate separation explicitly. Not implemented yet though.

peter_backlund 17 年 前
コミット
0518790dd1

+ 10
- 0
dddsample/src/main/java/se/citerus/dddsample/application/BookingService.java ファイルの表示

@@ -1,5 +1,6 @@
1 1
 package se.citerus.dddsample.application;
2 2
 
3
+import se.citerus.dddsample.domain.model.cargo.Cargo;
3 4
 import se.citerus.dddsample.domain.model.cargo.Itinerary;
4 5
 import se.citerus.dddsample.domain.model.cargo.TrackingId;
5 6
 import se.citerus.dddsample.domain.model.location.UnLocode;
@@ -44,4 +45,13 @@ public interface BookingService {
44 45
    */
45 46
   void changeDestination(TrackingId trackingId, UnLocode unLocode);
46 47
 
48
+  /**
49
+   * Loads a cargo for (re-) routing.
50
+   * Locks the cargo for exclusive modification.
51
+   *
52
+   * @param trackingId tracking id
53
+   * @return The cargo.
54
+   */
55
+  Cargo loadCargoForRouting(TrackingId trackingId);
56
+
47 57
 }

+ 10
- 0
dddsample/src/main/java/se/citerus/dddsample/application/impl/BookingServiceImpl.java ファイルの表示

@@ -60,6 +60,7 @@ public final class BookingServiceImpl implements BookingService {
60 60
   @Override
61 61
   @Transactional
62 62
   public void assignCargoToRoute(final Itinerary itinerary, final TrackingId trackingId) {
63
+    // TODO locking semantics
63 64
     final Cargo cargo = cargoRepository.find(trackingId);
64 65
     Validate.notNull(cargo, "Can't assign itinerary to non-existing cargo " + trackingId);
65 66
     cargo.assignToRoute(itinerary);
@@ -71,6 +72,7 @@ public final class BookingServiceImpl implements BookingService {
71 72
   @Override
72 73
   @Transactional
73 74
   public void changeDestination(final TrackingId trackingId, final UnLocode unLocode) {
75
+    // TODO locking semantics
74 76
     final Cargo cargo = cargoRepository.find(trackingId);
75 77
     Validate.notNull(cargo, "Can't change destination of non-existing cargo " + trackingId);
76 78
     final Location newDestination = locationRepository.find(unLocode);
@@ -82,4 +84,12 @@ public final class BookingServiceImpl implements BookingService {
82 84
     logger.info("Changed destination for cargo " + trackingId + " to " + routeSpecification.destination());
83 85
   }
84 86
 
87
+  @Override
88
+  @Transactional
89
+  public Cargo loadCargoForRouting(TrackingId trackingId) {
90
+    // TODO locking semantics
91
+    final Cargo cargo = cargoRepository.find(trackingId);
92
+    return cargo;
93
+  }
94
+
85 95
 }

+ 1
- 3
dddsample/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/BookingServiceFacadeImpl.java ファイルの表示

@@ -1,6 +1,5 @@
1 1
 package se.citerus.dddsample.interfaces.booking.facade.internal;
2 2
 
3
-import org.apache.log4j.Logger;
4 3
 import se.citerus.dddsample.application.BookingService;
5 4
 import se.citerus.dddsample.domain.model.cargo.Cargo;
6 5
 import se.citerus.dddsample.domain.model.cargo.CargoRepository;
@@ -36,7 +35,6 @@ public class BookingServiceFacadeImpl implements BookingServiceFacade {
36 35
   private LocationRepository locationRepository;
37 36
   private CargoRepository cargoRepository;
38 37
   private VoyageRepository voyageRepository;
39
-  private final Logger logger = Logger.getLogger(BookingServiceFacadeImpl.class);
40 38
 
41 39
   @Override
42 40
   public List<LocationDTO> listShippingLocations() {
@@ -57,7 +55,7 @@ public class BookingServiceFacadeImpl implements BookingServiceFacade {
57 55
 
58 56
   @Override
59 57
   public CargoRoutingDTO loadCargoForRouting(String trackingId) {
60
-    final Cargo cargo = cargoRepository.find(new TrackingId(trackingId));
58
+    final Cargo cargo = bookingService.loadCargoForRouting(new TrackingId(trackingId));
61 59
     final CargoRoutingDTOAssembler assembler = new CargoRoutingDTOAssembler();
62 60
     return assembler.toDTO(cargo);
63 61
   }