Procházet zdrojové kódy

Extracted DTO assembling code to separate classes.

Jesper Hammarbäck před 18 roky
rodič
revize
be4f41598e

+ 7
- 57
dddsample/src/main/java/se/citerus/dddsample/service/CargoServiceImpl.java Zobrazit soubor

@@ -9,6 +9,8 @@ import se.citerus.dddsample.repository.CargoRepository;
9 9
 import se.citerus.dddsample.repository.CarrierMovementRepository;
10 10
 import se.citerus.dddsample.repository.LocationRepository;
11 11
 import se.citerus.dddsample.service.dto.*;
12
+import se.citerus.dddsample.service.dto.assembler.CargoRoutingDTOAssembler;
13
+import se.citerus.dddsample.service.dto.assembler.CargoTrackingDTOAssembler;
12 14
 
13 15
 import java.util.ArrayList;
14 16
 import java.util.List;
@@ -57,35 +59,7 @@ public final class CargoServiceImpl implements CargoService {
57 59
       return null;
58 60
     }
59 61
 
60
-    final DeliveryHistory deliveryHistory = cargo.deliveryHistory();
61
-
62
-    // TODO: use DTO assemblers
63
-    final Location currentLocation = deliveryHistory.currentLocation();
64
-    final CarrierMovement currentCarrierMovement = deliveryHistory.currentCarrierMovement();
65
-    final CargoTrackingDTO dto = new CargoTrackingDTO(
66
-      cargo.trackingId().idString(),
67
-      cargo.origin().toString(),
68
-      cargo.finalDestination().toString(),
69
-      deliveryHistory.status(),
70
-      currentLocation == null ? null : currentLocation.unLocode().idString(),
71
-      currentCarrierMovement == null ? null : currentCarrierMovement.carrierMovementId().idString(),
72
-      cargo.isMisdirected()
73
-    );
74
-
75
-    final List<HandlingEvent> events = deliveryHistory.eventsOrderedByCompletionTime();
76
-    for (HandlingEvent event : events) {
77
-      final CarrierMovement cm = event.carrierMovement();
78
-      final String carrierIdString = (cm == null) ? "" : cm.carrierMovementId().idString();
79
-      dto.addEvent(new HandlingEventDTO(
80
-        event.location().toString(),
81
-        event.type().toString(),
82
-        carrierIdString,
83
-        event.completionTime(),
84
-        cargo.itinerary().isExpected(event)
85
-      ));
86
-    }
87
-    return dto;
88
-
62
+    return new CargoTrackingDTOAssembler().toDTO(cargo);
89 63
   }
90 64
 
91 65
   // TODO: move this to another class?
@@ -114,22 +88,11 @@ public final class CargoServiceImpl implements CargoService {
114 88
   public List<CargoRoutingDTO> loadAllForRouting() {
115 89
     final List<Cargo> allCargos = cargoRepository.findAll();
116 90
 
117
-    // TODO: use DTO assembler
91
+    final CargoRoutingDTOAssembler assembler = new CargoRoutingDTOAssembler();
118 92
     final List<CargoRoutingDTO> dtoList = new ArrayList<CargoRoutingDTO>(allCargos.size());
93
+
119 94
     for (Cargo cargo : allCargos) {
120
-      final CargoRoutingDTO dto = new CargoRoutingDTO(
121
-        cargo.trackingId().idString(),
122
-        cargo.origin().toString(),
123
-        cargo.finalDestination().toString()
124
-      );
125
-      for (Leg leg : cargo.itinerary().legs()) {
126
-        dto.addLeg(
127
-          leg.carrierMovement().carrierMovementId().idString(),
128
-          leg.from().unLocode().idString(),
129
-          leg.to().unLocode().idString()
130
-        );
131
-      }
132
-      dtoList.add(dto);
95
+      dtoList.add(assembler.toDTO(cargo));
133 96
     }
134 97
 
135 98
     return dtoList;
@@ -143,20 +106,7 @@ public final class CargoServiceImpl implements CargoService {
143 106
       return null;
144 107
     }
145 108
 
146
-    // TODO: use DTO assembler
147
-    final CargoRoutingDTO dto = new CargoRoutingDTO(
148
-      cargo.trackingId().idString(),
149
-      cargo.origin().toString(),
150
-      cargo.finalDestination().toString()
151
-    );
152
-    for (Leg leg : cargo.itinerary().legs()) {
153
-      dto.addLeg(
154
-        leg.carrierMovement().carrierMovementId().idString(),
155
-        leg.from().toString(),
156
-        leg.to().toString()
157
-      );
158
-    }
159
-    return dto;
109
+    return new CargoRoutingDTOAssembler().toDTO(cargo);
160 110
   }
161 111
 
162 112
   @Transactional(readOnly = false)

+ 16
- 18
dddsample/src/main/java/se/citerus/dddsample/service/RoutingServiceImpl.java Zobrazit soubor

@@ -5,8 +5,8 @@ import se.citerus.dddsample.domain.*;
5 5
 import se.citerus.dddsample.repository.CargoRepository;
6 6
 import se.citerus.dddsample.repository.CarrierMovementRepository;
7 7
 import se.citerus.dddsample.repository.LocationRepository;
8
-import se.citerus.dddsample.service.dto.assembler.DTOAssembler;
9 8
 import se.citerus.dddsample.service.dto.ItineraryCandidateDTO;
9
+import se.citerus.dddsample.service.dto.assembler.ItineraryCandidateDTOAssembler;
10 10
 
11 11
 import java.util.ArrayList;
12 12
 import java.util.Collections;
@@ -27,39 +27,37 @@ public class RoutingServiceImpl implements RoutingService {
27 27
 
28 28
   @Transactional(readOnly = true)
29 29
   public List<ItineraryCandidateDTO> calculatePossibleRoutes(TrackingId trackingId, Specification specification) {
30
-    Cargo cargo = cargoRepository.find(trackingId);
30
+    final Cargo cargo = cargoRepository.find(trackingId);
31 31
     if (cargo == null) {
32 32
       return Collections.emptyList();
33 33
     }
34
+
34 35
     List<Location> allLocations = locationRepository.findAll();
35 36
 
36 37
     allLocations.remove(cargo.origin());
37 38
     allLocations.remove(cargo.finalDestination());
38 39
 
39
-    int candidateCount = getRandomNumberOfCandidates();
40
-    List<ItineraryCandidateDTO> candidates = new ArrayList<ItineraryCandidateDTO>(candidateCount);
40
+    final int candidateCount = getRandomNumberOfCandidates();
41
+    final List<ItineraryCandidateDTO> candidates = new ArrayList<ItineraryCandidateDTO>(candidateCount);
42
+    final ItineraryCandidateDTOAssembler assembler = new ItineraryCandidateDTOAssembler();
41 43
 
42 44
     for (int i = 0; i < candidateCount; i++) {
43 45
       allLocations = getRandomChunkOfLocations(allLocations);
44
-      List<Leg> legs = new ArrayList<Leg>(allLocations.size() - 1);
45
-
46
-      Location firstLegTo = allLocations.get(0);
46
+      final List<Leg> legs = new ArrayList<Leg>(allLocations.size() - 1);
47
+      final Location firstLegTo = allLocations.get(0);
47 48
 
48
-      CarrierMovement cm1 = carrierMovementRepository.find(new CarrierMovementId("CAR_002"));
49
+      final CarrierMovement cm1 = carrierMovementRepository.find(new CarrierMovementId("CAR_002"));
49 50
       legs.add(new Leg(cm1, cargo.origin(), firstLegTo));
50 51
 
51 52
       for (int j = 0; j < allLocations.size() - 1; j++) {
52
-        legs.add(new Leg(
53
-            getRandomCarrierMovement(),
54
-            allLocations.get(j), allLocations.get(j + 1)));
53
+        legs.add(new Leg(getRandomCarrierMovement(), allLocations.get(j), allLocations.get(j + 1)));
55 54
       }
56 55
 
57
-      Location lastLegFrom = allLocations.get(allLocations.size() - 1);
56
+      final Location lastLegFrom = allLocations.get(allLocations.size() - 1);
58 57
       legs.add(new Leg(getRandomCarrierMovement(), lastLegFrom, cargo.finalDestination()));
59 58
 
60
-      Itinerary itinerary = new Itinerary(legs);
61
-
62
-      candidates.add(DTOAssembler.toItineraryCandidateDTO(itinerary));
59
+      final Itinerary itinerary = new Itinerary(legs);
60
+      candidates.add(assembler.toDTO(itinerary));
63 61
     }
64 62
 
65 63
     return candidates;
@@ -67,8 +65,8 @@ public class RoutingServiceImpl implements RoutingService {
67 65
 
68 66
   private List<Location> getRandomChunkOfLocations(List<Location> allLocations) {
69 67
     Collections.shuffle(allLocations);
70
-    int total = allLocations.size();
71
-    int chunk = total > 4 ? (total - 4) + random.nextInt(5) : total;
68
+    final int total = allLocations.size();
69
+    final int chunk = total > 4 ? (total - 4) + random.nextInt(5) : total;
72 70
     return allLocations.subList(0, chunk);
73 71
   }
74 72
 
@@ -77,7 +75,7 @@ public class RoutingServiceImpl implements RoutingService {
77 75
   }
78 76
 
79 77
   private CarrierMovement getRandomCarrierMovement() {
80
-    CarrierMovementId id = new CarrierMovementId("CAR_00" + (random.nextInt(9) + 1));
78
+    final CarrierMovementId id = new CarrierMovementId("CAR_00" + (random.nextInt(9) + 1));
81 79
     return carrierMovementRepository.find(id);
82 80
   }
83 81
 

+ 7
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/CargoRoutingDTO.java Zobrazit soubor

@@ -14,6 +14,13 @@ public final class CargoRoutingDTO {
14 14
   private final String finalDestination;
15 15
   private final List<LegDTO> legs;
16 16
 
17
+  /**
18
+   * Constructor.
19
+   *
20
+   * @param trackingId
21
+   * @param origin
22
+   * @param finalDestination
23
+   */
17 24
   public CargoRoutingDTO(final String trackingId, final String origin, final String finalDestination) {
18 25
     this.trackingId = trackingId;
19 26
     this.origin = origin;

+ 11
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/CargoTrackingDTO.java Zobrazit soubor

@@ -21,6 +21,17 @@ public final class CargoTrackingDTO implements Serializable {
21 21
   private final StatusCode statusCode;
22 22
   private final boolean misdirected;
23 23
 
24
+  /**
25
+   * Constructor.
26
+   *
27
+   * @param trackingId
28
+   * @param origin
29
+   * @param finalDestination
30
+   * @param statusCode
31
+   * @param currentLocationId
32
+   * @param carrierMovementId
33
+   * @param isMisdirected
34
+   */
24 35
   public CargoTrackingDTO(final String trackingId, final String origin, final String finalDestination,
25 36
                           final StatusCode statusCode, final String currentLocationId, final String carrierMovementId,
26 37
                           final boolean isMisdirected) {

+ 9
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/HandlingEventDTO.java Zobrazit soubor

@@ -14,6 +14,15 @@ public final class HandlingEventDTO implements Serializable {
14 14
   private final Date time;
15 15
   private boolean expected;
16 16
 
17
+  /**
18
+   * Constructor.
19
+   *
20
+   * @param location
21
+   * @param type
22
+   * @param carrier
23
+   * @param time
24
+   * @param expected
25
+   */
17 26
   public HandlingEventDTO(final String location, final String type, final String carrier, final Date time,
18 27
                           final boolean expected) {
19 28
     this.location = location;

+ 5
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/ItineraryCandidateDTO.java Zobrazit soubor

@@ -10,6 +10,11 @@ public final class ItineraryCandidateDTO {
10 10
 
11 11
   private final List<LegDTO> legs;
12 12
 
13
+  /**
14
+   * Constructor.
15
+   *
16
+   * @param legs The legs for this itinerary.
17
+   */
13 18
   public ItineraryCandidateDTO(final List<LegDTO> legs) {
14 19
     this.legs = legs;
15 20
   }

+ 7
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/LegDTO.java Zobrazit soubor

@@ -9,6 +9,13 @@ public final class LegDTO {
9 9
   private final String from;
10 10
   private final String to;
11 11
 
12
+  /**
13
+   * Constructor.
14
+   *
15
+   * @param carrierMovementId
16
+   * @param from
17
+   * @param to
18
+   */
12 19
   public LegDTO(final String carrierMovementId, final String from, final String to) {
13 20
     this.carrierMovementId = carrierMovementId;
14 21
     this.from = from;

+ 28
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/assembler/CargoRoutingDTOAssembler.java Zobrazit soubor

@@ -0,0 +1,28 @@
1
+package se.citerus.dddsample.service.dto.assembler;
2
+
3
+import se.citerus.dddsample.domain.Cargo;
4
+import se.citerus.dddsample.domain.Leg;
5
+import se.citerus.dddsample.service.dto.CargoRoutingDTO;
6
+
7
+/**
8
+ * Assembler class for the CargoRoutingDTO.
9
+ */
10
+public class CargoRoutingDTOAssembler {
11
+
12
+  public CargoRoutingDTO toDTO(final Cargo cargo) {
13
+    final CargoRoutingDTO dto = new CargoRoutingDTO(
14
+      cargo.trackingId().idString(),
15
+      cargo.origin().toString(),
16
+      cargo.finalDestination().toString()
17
+    );
18
+    for (Leg leg : cargo.itinerary().legs()) {
19
+      dto.addLeg(
20
+        leg.carrierMovement().carrierMovementId().idString(),
21
+        leg.from().toString(),
22
+        leg.to().toString()
23
+      );
24
+    }
25
+    return dto;
26
+  }
27
+
28
+}

+ 46
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/assembler/CargoTrackingDTOAssembler.java Zobrazit soubor

@@ -0,0 +1,46 @@
1
+package se.citerus.dddsample.service.dto.assembler;
2
+
3
+import se.citerus.dddsample.domain.*;
4
+import se.citerus.dddsample.service.dto.CargoTrackingDTO;
5
+import se.citerus.dddsample.service.dto.HandlingEventDTO;
6
+
7
+import java.util.List;
8
+
9
+/**
10
+ * Assembler class for the CargoTrackingDTO.
11
+ */
12
+public class CargoTrackingDTOAssembler {
13
+
14
+  public CargoTrackingDTO toDTO(final Cargo cargo) {
15
+    final DeliveryHistory deliveryHistory = cargo.deliveryHistory();
16
+    final Location currentLocation = deliveryHistory.currentLocation();
17
+    final CarrierMovement currentCarrierMovement = deliveryHistory.currentCarrierMovement();
18
+    final CargoTrackingDTO dto = new CargoTrackingDTO(
19
+      cargo.trackingId().idString(),
20
+      cargo.origin().toString(),
21
+      cargo.finalDestination().toString(),
22
+      deliveryHistory.status(),
23
+      currentLocation == null ? null : currentLocation.unLocode().idString(),
24
+      currentCarrierMovement == null ? null : currentCarrierMovement.carrierMovementId().idString(),
25
+      cargo.isMisdirected()
26
+    );
27
+
28
+    final List<HandlingEvent> events = deliveryHistory.eventsOrderedByCompletionTime();
29
+    for (HandlingEvent event : events) {
30
+      final CarrierMovement cm = event.carrierMovement();
31
+      final String carrierIdString = (cm == null) ? "" : cm.carrierMovementId().idString();
32
+      dto.addEvent(toHandlingEventDTO(cargo, event, carrierIdString));
33
+    }
34
+    return dto;
35
+  }
36
+
37
+  protected HandlingEventDTO toHandlingEventDTO(final Cargo cargo, HandlingEvent event, String carrierIdString) {
38
+    return new HandlingEventDTO(
39
+      event.location().toString(),
40
+      event.type().toString(),
41
+      carrierIdString,
42
+      event.completionTime(),
43
+      cargo.itinerary().isExpected(event)
44
+    );
45
+  }
46
+}

dddsample/src/main/java/se/citerus/dddsample/service/dto/assembler/DTOAssembler.java → dddsample/src/main/java/se/citerus/dddsample/service/dto/assembler/ItineraryCandidateDTOAssembler.java Zobrazit soubor

@@ -1,32 +1,33 @@
1
-package se.citerus.dddsample.service.dto.assembler;
2
-
3
-import se.citerus.dddsample.domain.Itinerary;
4
-import se.citerus.dddsample.domain.Leg;
5
-import se.citerus.dddsample.domain.CarrierMovementId;
6
-import se.citerus.dddsample.domain.UnLocode;
7
-import se.citerus.dddsample.service.dto.ItineraryCandidateDTO;
8
-import se.citerus.dddsample.service.dto.LegDTO;
9
-
10
-import java.util.ArrayList;
11
-import java.util.List;
12
-
13
-/**
14
- * Handles assembly of DTOs from the domain model.
15
- */
16
-public class DTOAssembler {
17
-
18
-  public static ItineraryCandidateDTO toItineraryCandidateDTO(final Itinerary itinerary) {
19
-    final List<LegDTO> legDTOs = new ArrayList<LegDTO>(itinerary.legs().size());
20
-    for (Leg leg : itinerary.legs()) {
21
-      legDTOs.add(toLegDTO(leg));
22
-    }
23
-    return new ItineraryCandidateDTO(legDTOs);
24
-  }
25
-
26
-  private static LegDTO toLegDTO(final Leg leg) {
27
-    final CarrierMovementId id = leg.carrierMovement().carrierMovementId();
28
-    final UnLocode from = leg.from().unLocode();
29
-    final UnLocode to = leg.to().unLocode();
30
-    return new LegDTO(id.idString(), from.idString(), to.idString());
31
-  }
32
-}
1
+package se.citerus.dddsample.service.dto.assembler;
2
+
3
+import se.citerus.dddsample.domain.CarrierMovementId;
4
+import se.citerus.dddsample.domain.Itinerary;
5
+import se.citerus.dddsample.domain.Leg;
6
+import se.citerus.dddsample.domain.UnLocode;
7
+import se.citerus.dddsample.service.dto.ItineraryCandidateDTO;
8
+import se.citerus.dddsample.service.dto.LegDTO;
9
+
10
+import java.util.ArrayList;
11
+import java.util.List;
12
+
13
+/**
14
+ * Assembler class for the ItineraryCandidateDTO.
15
+ */
16
+public class ItineraryCandidateDTOAssembler {
17
+
18
+  public ItineraryCandidateDTO toDTO(final Itinerary itinerary) {
19
+    final List<LegDTO> legDTOs = new ArrayList<LegDTO>(itinerary.legs().size());
20
+    for (Leg leg : itinerary.legs()) {
21
+      legDTOs.add(toLegDTO(leg));
22
+    }
23
+    return new ItineraryCandidateDTO(legDTOs);
24
+  }
25
+
26
+  protected LegDTO toLegDTO(final Leg leg) {
27
+    final CarrierMovementId id = leg.carrierMovement().carrierMovementId();
28
+    final UnLocode from = leg.from().unLocode();
29
+    final UnLocode to = leg.to().unLocode();
30
+    return new LegDTO(id.idString(), from.idString(), to.idString());
31
+  }
32
+
33
+}

+ 15
- 16
dddsample/src/test/java/se/citerus/dddsample/web/CargoTrackingControllerTest.java Zobrazit soubor

@@ -35,7 +35,7 @@ public class CargoTrackingControllerTest extends TestCase {
35 35
     response = new MockHttpServletResponse();
36 36
     session = new MockHttpSession(servletContext);
37 37
     request.setSession(session);
38
-    
38
+
39 39
     controller = new CargoTrackingController();
40 40
     controller.setFormView("test-form");
41 41
     controller.setSuccessView("test-success");
@@ -46,18 +46,17 @@ public class CargoTrackingControllerTest extends TestCase {
46 46
     return new EmptyStubCargoService() {
47 47
 
48 48
       public CargoTrackingDTO track(TrackingId trackingId) {
49
-        Cargo cargo = new Cargo(trackingId, HONGKONG, TOKYO);
50
-        HandlingEvent event = new HandlingEvent(cargo, new Date(10L), new Date(20L), HandlingEvent.Type.RECEIVE, HONGKONG, null);
51
-
52
-        // TODO: use DTO assemblers
53
-        CargoTrackingDTO cargoDTO = new CargoTrackingDTO(
54
-                cargo.trackingId().idString(),
55
-                cargo.origin().unLocode().idString(),
56
-                cargo.finalDestination().unLocode().idString(),
57
-                StatusCode.CLAIMED,
58
-                "AAAAA",
59
-                "BALO",
60
-                false);
49
+        final Cargo cargo = new Cargo(trackingId, HONGKONG, TOKYO);
50
+        final HandlingEvent event = new HandlingEvent(cargo, new Date(10L), new Date(20L), HandlingEvent.Type.RECEIVE, HONGKONG, null);
51
+
52
+        final CargoTrackingDTO cargoDTO = new CargoTrackingDTO(
53
+          cargo.trackingId().idString(),
54
+          cargo.origin().unLocode().idString(),
55
+          cargo.finalDestination().unLocode().idString(),
56
+          StatusCode.CLAIMED,
57
+          "AAAAA",
58
+          "BALO",
59
+          false);
61 60
         cargoDTO.addEvent(new HandlingEventDTO(
62 61
           event.location().unLocode().idString(),
63 62
           event.type().toString(),
@@ -68,7 +67,7 @@ public class CargoTrackingControllerTest extends TestCase {
68 67
       }
69 68
     };
70 69
   }
71
-  
70
+
72 71
   private CargoService getCargoServiceNullMock() {
73 72
     return new EmptyStubCargoService();
74 73
   }
@@ -86,7 +85,7 @@ public class CargoTrackingControllerTest extends TestCase {
86 85
 
87 86
   public void testHandlePost() throws Exception {
88 87
     controller.setCargoService(getCargoServiceMock());
89
-    request.addParameter("trackingId","JKL456");
88
+    request.addParameter("trackingId", "JKL456");
90 89
     request.setMethod("POST");
91 90
 
92 91
     ModelAndView mav = controller.handleRequest(request, response);
@@ -102,7 +101,7 @@ public class CargoTrackingControllerTest extends TestCase {
102 101
     controller.setCargoService(getCargoServiceNullMock());
103 102
     request.setMethod("POST");
104 103
     request.setParameter("trackingId", "unknown-id");
105
-    
104
+
106 105
     ModelAndView mav = controller.handleRequest(request, response);
107 106
 
108 107
     assertEquals("test-form", mav.getViewName());