瀏覽代碼

Slight refinement of packge structure under application - service is split into things like messagning and remoting.

The external routing team application is moved out to its own top-level package, to highlight the fact that it is a completely separate application from booking/tracking.
peter_backlund 18 年之前
父節點
當前提交
96a1283520
共有 41 個檔案被更改,包括 281 行新增160 行删除
  1. 1
    1
      dddsample/src/main/java/se/citerus/dddsample/application/messaging/HandlingEventMessageDelegate.java
  2. 2
    1
      dddsample/src/main/java/se/citerus/dddsample/application/messaging/JmsEventServiceImpl.java
  3. 2
    1
      dddsample/src/main/java/se/citerus/dddsample/application/messaging/ThreadBasedEventServiceImpl.java
  4. 4
    4
      dddsample/src/main/java/se/citerus/dddsample/application/remote/BookingServiceFacade.java
  5. 8
    8
      dddsample/src/main/java/se/citerus/dddsample/application/remote/BookingServiceFacadeImpl.java
  6. 1
    1
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/CargoRoutingDTO.java
  7. 1
    1
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/CargoTrackingDTO.java
  8. 1
    1
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/HandlingEventDTO.java
  9. 2
    2
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/ItineraryCandidateDTO.java
  10. 1
    1
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/LegDTO.java
  11. 1
    1
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/LocationDTO.java
  12. 2
    2
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/CargoRoutingDTOAssembler.java
  13. 2
    2
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/CargoTrackingDTOAssembler.java
  14. 4
    4
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/ItineraryCandidateDTOAssembler.java
  15. 2
    2
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/LocationDTOAssembler.java
  16. 0
    0
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/package.html
  17. 0
    0
      dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/package.html
  18. 0
    0
      dddsample/src/main/java/se/citerus/dddsample/application/remote/package.html
  19. 0
    87
      dddsample/src/main/java/se/citerus/dddsample/application/service/GraphTraversalService.java
  20. 5
    5
      dddsample/src/main/java/se/citerus/dddsample/application/web/CargoAdminController.java
  21. 2
    2
      dddsample/src/main/java/se/citerus/dddsample/application/web/CargoTrackingController.java
  22. 0
    1
      dddsample/src/main/java/se/citerus/dddsample/application/ws/HandlingEventServiceEndpointImpl.java
  23. 1
    1
      dddsample/src/main/java/se/citerus/dddsample/application/ws/InvalidEventTypeException.java
  24. 1
    1
      dddsample/src/main/java/se/citerus/dddsample/domain/service/EventService.java
  25. 0
    1
      dddsample/src/main/java/se/citerus/dddsample/domain/service/HandlingEventServiceImpl.java
  26. 26
    9
      dddsample/src/main/java/se/citerus/dddsample/domain/service/RoutingServiceImpl.java
  27. 43
    0
      dddsample/src/main/java/se/citerus/routingteam/GraphDAO.java
  28. 67
    0
      dddsample/src/main/java/se/citerus/routingteam/GraphTraversalService.java
  29. 39
    0
      dddsample/src/main/java/se/citerus/routingteam/TransitEdge.java
  30. 29
    0
      dddsample/src/main/java/se/citerus/routingteam/TransitPath.java
  31. 2
    2
      dddsample/src/main/resources/context-messaging-jms.xml
  32. 1
    1
      dddsample/src/main/resources/context-messaging-thread.xml
  33. 4
    4
      dddsample/src/main/resources/context-remote.xml
  34. 6
    3
      dddsample/src/main/resources/context-routing.xml
  35. 0
    0
      dddsample/src/test/java/se/citerus/dddsample/application/service/InMemTransactionManager.java
  36. 3
    2
      dddsample/src/test/java/se/citerus/dddsample/application/service/dto/assembler/CargoRoutingDTOAssemblerTest.java
  37. 3
    2
      dddsample/src/test/java/se/citerus/dddsample/application/service/dto/assembler/ItineraryCandidateDTOAssemblerTest.java
  38. 2
    1
      dddsample/src/test/java/se/citerus/dddsample/application/service/dto/assembler/LocationDTOAssemblerTest.java
  39. 1
    1
      dddsample/src/test/java/se/citerus/dddsample/application/web/CargoTrackingControllerTest.java
  40. 0
    1
      dddsample/src/test/java/se/citerus/dddsample/domain/service/HandlingEventServiceTest.java
  41. 12
    4
      dddsample/src/test/java/se/citerus/dddsample/domain/service/RoutingServiceTest.java

dddsample/src/main/java/se/citerus/dddsample/application/service/HandlingEventMessageDelegate.java → dddsample/src/main/java/se/citerus/dddsample/application/messaging/HandlingEventMessageDelegate.java 查看文件

@@ -1,4 +1,4 @@
1
-package se.citerus.dddsample.application.service;
1
+package se.citerus.dddsample.application.messaging;
2 2
 
3 3
 import org.apache.commons.logging.Log;
4 4
 import org.apache.commons.logging.LogFactory;

dddsample/src/main/java/se/citerus/dddsample/application/service/JmsEventServiceImpl.java → dddsample/src/main/java/se/citerus/dddsample/application/messaging/JmsEventServiceImpl.java 查看文件

@@ -1,9 +1,10 @@
1
-package se.citerus.dddsample.application.service;
1
+package se.citerus.dddsample.application.messaging;
2 2
 
3 3
 import org.springframework.jms.core.JmsOperations;
4 4
 import org.springframework.jms.core.MessageCreator;
5 5
 import se.citerus.dddsample.domain.model.cargo.TrackingId;
6 6
 import se.citerus.dddsample.domain.model.handling.HandlingEvent;
7
+import se.citerus.dddsample.domain.service.EventService;
7 8
 
8 9
 import javax.jms.*;
9 10
 

dddsample/src/main/java/se/citerus/dddsample/application/service/ThreadBasedEventServiceImpl.java → dddsample/src/main/java/se/citerus/dddsample/application/messaging/ThreadBasedEventServiceImpl.java 查看文件

@@ -1,6 +1,7 @@
1
-package se.citerus.dddsample.application.service;
1
+package se.citerus.dddsample.application.messaging;
2 2
 
3 3
 import se.citerus.dddsample.domain.model.handling.HandlingEvent;
4
+import se.citerus.dddsample.domain.service.EventService;
4 5
 import se.citerus.dddsample.domain.service.TrackingService;
5 6
 
6 7
 /**

dddsample/src/main/java/se/citerus/dddsample/application/service/BookingServiceFacade.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/BookingServiceFacade.java 查看文件

@@ -1,8 +1,8 @@
1
-package se.citerus.dddsample.application.service;
1
+package se.citerus.dddsample.application.remote;
2 2
 
3
-import se.citerus.dddsample.application.service.dto.CargoRoutingDTO;
4
-import se.citerus.dddsample.application.service.dto.ItineraryCandidateDTO;
5
-import se.citerus.dddsample.application.service.dto.LocationDTO;
3
+import se.citerus.dddsample.application.remote.dto.CargoRoutingDTO;
4
+import se.citerus.dddsample.application.remote.dto.ItineraryCandidateDTO;
5
+import se.citerus.dddsample.application.remote.dto.LocationDTO;
6 6
 
7 7
 import java.rmi.Remote;
8 8
 import java.rmi.RemoteException;

dddsample/src/main/java/se/citerus/dddsample/application/service/BookingServiceFacadeImpl.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/BookingServiceFacadeImpl.java 查看文件

@@ -1,11 +1,11 @@
1
-package se.citerus.dddsample.application.service;
2
-
3
-import se.citerus.dddsample.application.service.dto.CargoRoutingDTO;
4
-import se.citerus.dddsample.application.service.dto.ItineraryCandidateDTO;
5
-import se.citerus.dddsample.application.service.dto.LocationDTO;
6
-import se.citerus.dddsample.application.service.dto.assembler.CargoRoutingDTOAssembler;
7
-import se.citerus.dddsample.application.service.dto.assembler.ItineraryCandidateDTOAssembler;
8
-import se.citerus.dddsample.application.service.dto.assembler.LocationDTOAssembler;
1
+package se.citerus.dddsample.application.remote;
2
+
3
+import se.citerus.dddsample.application.remote.dto.CargoRoutingDTO;
4
+import se.citerus.dddsample.application.remote.dto.ItineraryCandidateDTO;
5
+import se.citerus.dddsample.application.remote.dto.LocationDTO;
6
+import se.citerus.dddsample.application.remote.dto.assembler.CargoRoutingDTOAssembler;
7
+import se.citerus.dddsample.application.remote.dto.assembler.ItineraryCandidateDTOAssembler;
8
+import se.citerus.dddsample.application.remote.dto.assembler.LocationDTOAssembler;
9 9
 import se.citerus.dddsample.domain.model.cargo.Cargo;
10 10
 import se.citerus.dddsample.domain.model.cargo.CargoRepository;
11 11
 import se.citerus.dddsample.domain.model.cargo.Itinerary;

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/CargoRoutingDTO.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/CargoRoutingDTO.java 查看文件

@@ -1,4 +1,4 @@
1
-package se.citerus.dddsample.application.service.dto;
1
+package se.citerus.dddsample.application.remote.dto;
2 2
 
3 3
 import java.io.Serializable;
4 4
 import java.util.ArrayList;

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/CargoTrackingDTO.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/CargoTrackingDTO.java 查看文件

@@ -1,4 +1,4 @@
1
-package se.citerus.dddsample.application.service.dto;
1
+package se.citerus.dddsample.application.remote.dto;
2 2
 
3 3
 import se.citerus.dddsample.domain.model.cargo.StatusCode;
4 4
 

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/HandlingEventDTO.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/HandlingEventDTO.java 查看文件

@@ -1,4 +1,4 @@
1
-package se.citerus.dddsample.application.service.dto;
1
+package se.citerus.dddsample.application.remote.dto;
2 2
 
3 3
 import java.io.Serializable;
4 4
 import java.util.Date;

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/ItineraryCandidateDTO.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/ItineraryCandidateDTO.java 查看文件

@@ -1,4 +1,4 @@
1
-package se.citerus.dddsample.application.service.dto;
1
+package se.citerus.dddsample.application.remote.dto;
2 2
 
3 3
 import java.io.Serializable;
4 4
 import java.util.Collections;
@@ -26,4 +26,4 @@ public final class ItineraryCandidateDTO implements Serializable {
26 26
   public List<LegDTO> getLegs() {
27 27
     return Collections.unmodifiableList(legs);
28 28
   }
29
-}
29
+}

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/LegDTO.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/LegDTO.java 查看文件

@@ -1,4 +1,4 @@
1
-package se.citerus.dddsample.application.service.dto;
1
+package se.citerus.dddsample.application.remote.dto;
2 2
 
3 3
 import java.io.Serializable;
4 4
 

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/LocationDTO.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/LocationDTO.java 查看文件

@@ -1,4 +1,4 @@
1
-package se.citerus.dddsample.application.service.dto;
1
+package se.citerus.dddsample.application.remote.dto;
2 2
 
3 3
 import java.io.Serializable;
4 4
 

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/assembler/CargoRoutingDTOAssembler.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/CargoRoutingDTOAssembler.java 查看文件

@@ -1,6 +1,6 @@
1
-package se.citerus.dddsample.application.service.dto.assembler;
1
+package se.citerus.dddsample.application.remote.dto.assembler;
2 2
 
3
-import se.citerus.dddsample.application.service.dto.CargoRoutingDTO;
3
+import se.citerus.dddsample.application.remote.dto.CargoRoutingDTO;
4 4
 import se.citerus.dddsample.domain.model.cargo.Cargo;
5 5
 import se.citerus.dddsample.domain.model.cargo.Leg;
6 6
 

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/assembler/CargoTrackingDTOAssembler.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/CargoTrackingDTOAssembler.java 查看文件

@@ -1,6 +1,6 @@
1
-package se.citerus.dddsample.application.service.dto.assembler;
1
+package se.citerus.dddsample.application.remote.dto.assembler;
2 2
 
3
-import se.citerus.dddsample.application.service.dto.CargoTrackingDTO;
3
+import se.citerus.dddsample.application.remote.dto.CargoTrackingDTO;
4 4
 import se.citerus.dddsample.domain.model.cargo.Cargo;
5 5
 import se.citerus.dddsample.domain.model.cargo.DeliveryHistory;
6 6
 import se.citerus.dddsample.domain.model.carrier.CarrierMovement;

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/assembler/ItineraryCandidateDTOAssembler.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/ItineraryCandidateDTOAssembler.java 查看文件

@@ -1,7 +1,7 @@
1
-package se.citerus.dddsample.application.service.dto.assembler;
1
+package se.citerus.dddsample.application.remote.dto.assembler;
2 2
 
3
-import se.citerus.dddsample.application.service.dto.ItineraryCandidateDTO;
4
-import se.citerus.dddsample.application.service.dto.LegDTO;
3
+import se.citerus.dddsample.application.remote.dto.ItineraryCandidateDTO;
4
+import se.citerus.dddsample.application.remote.dto.LegDTO;
5 5
 import se.citerus.dddsample.domain.model.cargo.Itinerary;
6 6
 import se.citerus.dddsample.domain.model.cargo.Leg;
7 7
 import se.citerus.dddsample.domain.model.carrier.CarrierMovement;
@@ -20,7 +20,7 @@ import java.util.List;
20 20
 public class ItineraryCandidateDTOAssembler {
21 21
   
22 22
   public ItineraryCandidateDTO toDTO(final Itinerary itinerary) {
23
-    final List<LegDTO> legDTOs = new ArrayList<LegDTO>(itinerary.legs().size());
23
+    final List<LegDTO> legDTOs = new ArrayList<se.citerus.dddsample.application.remote.dto.LegDTO>(itinerary.legs().size());
24 24
     for (Leg leg : itinerary.legs()) {
25 25
       legDTOs.add(toLegDTO(leg));
26 26
     }

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/assembler/LocationDTOAssembler.java → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/LocationDTOAssembler.java 查看文件

@@ -1,6 +1,6 @@
1
-package se.citerus.dddsample.application.service.dto.assembler;
1
+package se.citerus.dddsample.application.remote.dto.assembler;
2 2
 
3
-import se.citerus.dddsample.application.service.dto.LocationDTO;
3
+import se.citerus.dddsample.application.remote.dto.LocationDTO;
4 4
 import se.citerus.dddsample.domain.model.location.Location;
5 5
 
6 6
 import java.util.ArrayList;

dddsample/src/main/java/se/citerus/dddsample/application/service/dto/assembler/package.html → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/assembler/package.html 查看文件


dddsample/src/main/java/se/citerus/dddsample/application/service/dto/package.html → dddsample/src/main/java/se/citerus/dddsample/application/remote/dto/package.html 查看文件


dddsample/src/main/java/se/citerus/dddsample/application/service/package.html → dddsample/src/main/java/se/citerus/dddsample/application/remote/package.html 查看文件


+ 0
- 87
dddsample/src/main/java/se/citerus/dddsample/application/service/GraphTraversalService.java 查看文件

@@ -1,87 +0,0 @@
1
-package se.citerus.dddsample.application.service;
2
-
3
-import org.springframework.transaction.annotation.Propagation;
4
-import org.springframework.transaction.annotation.Transactional;
5
-import se.citerus.dddsample.application.service.dto.ItineraryCandidateDTO;
6
-import se.citerus.dddsample.application.service.dto.assembler.ItineraryCandidateDTOAssembler;
7
-import se.citerus.dddsample.domain.model.cargo.Itinerary;
8
-import se.citerus.dddsample.domain.model.cargo.Leg;
9
-import se.citerus.dddsample.domain.model.carrier.CarrierMovement;
10
-import se.citerus.dddsample.domain.model.carrier.CarrierMovementId;
11
-import se.citerus.dddsample.domain.model.carrier.CarrierMovementRepository;
12
-import se.citerus.dddsample.domain.model.location.Location;
13
-import se.citerus.dddsample.domain.model.location.LocationRepository;
14
-import se.citerus.dddsample.domain.model.location.UnLocode;
15
-
16
-import java.util.ArrayList;
17
-import java.util.Collections;
18
-import java.util.List;
19
-import java.util.Random;
20
-
21
-public class GraphTraversalService {
22
-
23
-  private LocationRepository locationRepository;
24
-  private CarrierMovementRepository carrierMovementRepository;
25
-
26
-  Random random = new Random();
27
-
28
-  @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
29
-  public List<ItineraryCandidateDTO> performHeavyCalculations(String originUnLocode, String destinationUnLocode) {
30
-    List<Location> allLocations = locationRepository.findAll();
31
-    Location origin = locationRepository.find(new UnLocode(originUnLocode));
32
-    Location destination = locationRepository.find(new UnLocode(destinationUnLocode));
33
-    
34
-    allLocations.remove(origin);
35
-    allLocations.remove(destination);
36
-
37
-    final int candidateCount = getRandomNumberOfCandidates();
38
-    final List<ItineraryCandidateDTO> candidates = new ArrayList<ItineraryCandidateDTO>(candidateCount);
39
-    final ItineraryCandidateDTOAssembler assembler = new ItineraryCandidateDTOAssembler();
40
-
41
-    for (int i = 0; i < candidateCount; i++) {
42
-      allLocations = getRandomChunkOfLocations(allLocations);
43
-      final List<Leg> legs = new ArrayList<Leg>(allLocations.size() - 1);
44
-      final Location firstLegTo = allLocations.get(0);
45
-
46
-      final CarrierMovement cm1 = carrierMovementRepository.find(new CarrierMovementId("CAR_002"));
47
-      legs.add(new Leg(cm1, origin, firstLegTo));
48
-
49
-      for (int j = 0; j < allLocations.size() - 1; j++) {
50
-        legs.add(new Leg(getRandomCarrierMovement(), allLocations.get(j), allLocations.get(j + 1)));
51
-      }
52
-
53
-      final Location lastLegFrom = allLocations.get(allLocations.size() - 1);
54
-      legs.add(new Leg(getRandomCarrierMovement(), lastLegFrom, destination));
55
-
56
-      final Itinerary itinerary = new Itinerary(legs);
57
-      candidates.add(assembler.toDTO(itinerary));
58
-    }
59
-
60
-    return candidates;
61
-  }
62
-
63
-  private CarrierMovement getRandomCarrierMovement() {
64
-    // TODO create new CMs on the fly, with better names than "car 1,2,3"
65
-    final CarrierMovementId id = new CarrierMovementId("CAR_00" + (random.nextInt(9) + 1));
66
-    return carrierMovementRepository.find(id);
67
-  }
68
-
69
-  private int getRandomNumberOfCandidates() {
70
-    return 1 + random.nextInt(4);
71
-  }
72
-
73
-  private List<Location> getRandomChunkOfLocations(List<Location> allLocations) {
74
-    Collections.shuffle(allLocations);
75
-    final int total = allLocations.size();
76
-    final int chunk = total > 4 ? (total - 4) + random.nextInt(5) : total;
77
-    return allLocations.subList(0, chunk);
78
-  }
79
-
80
-  public void setLocationRepository(LocationRepository locationRepository) {
81
-    this.locationRepository = locationRepository;
82
-  }
83
-
84
-  public void setCarrierMovementRepository(CarrierMovementRepository carrierMovementRepository) {
85
-    this.carrierMovementRepository = carrierMovementRepository;
86
-  }
87
-}

+ 5
- 5
dddsample/src/main/java/se/citerus/dddsample/application/web/CargoAdminController.java 查看文件

@@ -1,11 +1,11 @@
1 1
 package se.citerus.dddsample.application.web;
2 2
 
3 3
 import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
4
-import se.citerus.dddsample.application.service.BookingServiceFacade;
5
-import se.citerus.dddsample.application.service.dto.CargoRoutingDTO;
6
-import se.citerus.dddsample.application.service.dto.ItineraryCandidateDTO;
7
-import se.citerus.dddsample.application.service.dto.LegDTO;
8
-import se.citerus.dddsample.application.service.dto.LocationDTO;
4
+import se.citerus.dddsample.application.remote.BookingServiceFacade;
5
+import se.citerus.dddsample.application.remote.dto.CargoRoutingDTO;
6
+import se.citerus.dddsample.application.remote.dto.ItineraryCandidateDTO;
7
+import se.citerus.dddsample.application.remote.dto.LegDTO;
8
+import se.citerus.dddsample.application.remote.dto.LocationDTO;
9 9
 import se.citerus.dddsample.application.web.command.RegistrationCommand;
10 10
 
11 11
 import javax.servlet.http.HttpServletRequest;

+ 2
- 2
dddsample/src/main/java/se/citerus/dddsample/application/web/CargoTrackingController.java 查看文件

@@ -3,8 +3,8 @@ package se.citerus.dddsample.application.web;
3 3
 import org.springframework.validation.BindException;
4 4
 import org.springframework.web.servlet.ModelAndView;
5 5
 import org.springframework.web.servlet.mvc.SimpleFormController;
6
-import se.citerus.dddsample.application.service.dto.CargoTrackingDTO;
7
-import se.citerus.dddsample.application.service.dto.assembler.CargoTrackingDTOAssembler;
6
+import se.citerus.dddsample.application.remote.dto.CargoTrackingDTO;
7
+import se.citerus.dddsample.application.remote.dto.assembler.CargoTrackingDTOAssembler;
8 8
 import se.citerus.dddsample.application.web.command.TrackCommand;
9 9
 import se.citerus.dddsample.domain.model.cargo.Cargo;
10 10
 import se.citerus.dddsample.domain.model.cargo.TrackingId;

+ 0
- 1
dddsample/src/main/java/se/citerus/dddsample/application/ws/HandlingEventServiceEndpointImpl.java 查看文件

@@ -3,7 +3,6 @@ package se.citerus.dddsample.application.ws;
3 3
 import org.apache.commons.lang.StringUtils;
4 4
 import org.apache.commons.logging.Log;
5 5
 import org.apache.commons.logging.LogFactory;
6
-import se.citerus.dddsample.application.service.InvalidEventTypeException;
7 6
 import se.citerus.dddsample.domain.model.cargo.TrackingId;
8 7
 import se.citerus.dddsample.domain.model.carrier.CarrierMovementId;
9 8
 import se.citerus.dddsample.domain.model.handling.HandlingEvent;

dddsample/src/main/java/se/citerus/dddsample/application/service/InvalidEventTypeException.java → dddsample/src/main/java/se/citerus/dddsample/application/ws/InvalidEventTypeException.java 查看文件

@@ -1,4 +1,4 @@
1
-package se.citerus.dddsample.application.service;
1
+package se.citerus.dddsample.application.ws;
2 2
 
3 3
 import se.citerus.dddsample.domain.model.handling.HandlingEvent;
4 4
 

dddsample/src/main/java/se/citerus/dddsample/application/service/EventService.java → dddsample/src/main/java/se/citerus/dddsample/domain/service/EventService.java 查看文件

@@ -1,4 +1,4 @@
1
-package se.citerus.dddsample.application.service;
1
+package se.citerus.dddsample.domain.service;
2 2
 
3 3
 import se.citerus.dddsample.domain.model.handling.HandlingEvent;
4 4
 

+ 0
- 1
dddsample/src/main/java/se/citerus/dddsample/domain/service/HandlingEventServiceImpl.java 查看文件

@@ -2,7 +2,6 @@ package se.citerus.dddsample.domain.service;
2 2
 
3 3
 import org.apache.commons.lang.Validate;
4 4
 import org.springframework.transaction.annotation.Transactional;
5
-import se.citerus.dddsample.application.service.EventService;
6 5
 import se.citerus.dddsample.domain.model.cargo.Cargo;
7 6
 import se.citerus.dddsample.domain.model.cargo.CargoRepository;
8 7
 import se.citerus.dddsample.domain.model.cargo.TrackingId;

+ 26
- 9
dddsample/src/main/java/se/citerus/dddsample/domain/service/RoutingServiceImpl.java 查看文件

@@ -1,14 +1,17 @@
1 1
 package se.citerus.dddsample.domain.service;
2 2
 
3 3
 import org.springframework.transaction.annotation.Transactional;
4
-import se.citerus.dddsample.application.service.GraphTraversalService;
5
-import se.citerus.dddsample.application.service.dto.ItineraryCandidateDTO;
6
-import se.citerus.dddsample.application.service.dto.assembler.ItineraryCandidateDTOAssembler;
7 4
 import se.citerus.dddsample.domain.model.cargo.Itinerary;
5
+import se.citerus.dddsample.domain.model.cargo.Leg;
8 6
 import se.citerus.dddsample.domain.model.cargo.RouteSpecification;
7
+import se.citerus.dddsample.domain.model.carrier.CarrierMovementId;
9 8
 import se.citerus.dddsample.domain.model.carrier.CarrierMovementRepository;
10 9
 import se.citerus.dddsample.domain.model.location.Location;
11 10
 import se.citerus.dddsample.domain.model.location.LocationRepository;
11
+import se.citerus.dddsample.domain.model.location.UnLocode;
12
+import se.citerus.routingteam.GraphTraversalService;
13
+import se.citerus.routingteam.TransitEdge;
14
+import se.citerus.routingteam.TransitPath;
12 15
 
13 16
 import java.util.ArrayList;
14 17
 import java.util.List;
@@ -28,23 +31,37 @@ public class RoutingServiceImpl implements RoutingService {
28 31
     final Location origin = routeSpecification.origin();
29 32
     final Location destination = routeSpecification.destination();
30 33
 
31
-    final List<ItineraryCandidateDTO> candidateDTOs = graphTraversalService.performHeavyCalculations(
34
+    final List<TransitPath> transitPaths = graphTraversalService.performHeavyCalculations(
32 35
       origin.unLocode().idString(),
33 36
       destination.unLocode().idString()
34 37
     );
35 38
     
36
-    final List<Itinerary> itineraries = new ArrayList<Itinerary>(candidateDTOs.size());
39
+    final List<Itinerary> itineraries = new ArrayList<Itinerary>(transitPaths.size());
37 40
 
38
-    for (ItineraryCandidateDTO candidateDTO : candidateDTOs) {
39
-      final Itinerary itinerary = new ItineraryCandidateDTOAssembler().fromDTO(
40
-        candidateDTO, carrierMovementRepository, locationRepository
41
-      );
41
+    for (TransitPath transitPath : transitPaths) {
42
+      final Itinerary itinerary = toItinerary(transitPath);
42 43
       itineraries.add(itinerary);
43 44
     }
44 45
 
45 46
     return itineraries;
46 47
   }
47 48
 
49
+  private Itinerary toItinerary(TransitPath transitPath) {
50
+    List<Leg> legs = new ArrayList(transitPath.getTransitEdges().size());
51
+    for (TransitEdge edge : transitPath.getTransitEdges()) {
52
+      legs.add(toLeg(edge));
53
+    }
54
+    return new Itinerary(legs);
55
+  }
56
+
57
+  private Leg toLeg(TransitEdge edge) {
58
+    return new Leg(
59
+      carrierMovementRepository.find(new CarrierMovementId(edge.getCarrierMovementId())),
60
+      locationRepository.find(new UnLocode(edge.getFromUnLocode())),
61
+      locationRepository.find(new UnLocode(edge.getToUnLocode()))
62
+    );
63
+  }
64
+
48 65
   public void setGraphTraversalService(GraphTraversalService graphTraversalService) {
49 66
     this.graphTraversalService = graphTraversalService;
50 67
   }

+ 43
- 0
dddsample/src/main/java/se/citerus/routingteam/GraphDAO.java 查看文件

@@ -0,0 +1,43 @@
1
+package se.citerus.routingteam;
2
+
3
+import org.springframework.jdbc.core.JdbcTemplate;
4
+import org.springframework.jdbc.core.RowCallbackHandler;
5
+
6
+import javax.sql.DataSource;
7
+import java.sql.ResultSet;
8
+import java.sql.SQLException;
9
+import java.util.ArrayList;
10
+import java.util.List;
11
+
12
+public class GraphDAO {
13
+
14
+  private final JdbcTemplate jt;
15
+
16
+  public GraphDAO(DataSource dataSource) {
17
+    jt = new JdbcTemplate(dataSource);
18
+  }
19
+
20
+  public List<String> listLocations() {
21
+    final List<String> result = new ArrayList();
22
+
23
+    jt.query("select unlocode from location", new RowCallbackHandler() {
24
+      public void processRow(ResultSet resultSet) throws SQLException {
25
+        result.add(resultSet.getString("unlocode"));
26
+      }
27
+    });
28
+
29
+    return result;
30
+  }
31
+
32
+  public void storeCarrierMovementId(String cmId, String from, String to) {
33
+    final String locationSql = "select id from location where unlocode = ?";
34
+
35
+    final Long fromId = jt.queryForLong(locationSql, new Object[]{ from });
36
+    final Long toId = jt.queryForLong(locationSql, new Object[]{ to });
37
+
38
+    final Object[] params = {cmId, fromId, toId};
39
+    jt.update(
40
+      "insert into CarrierMovement (carrier_movement_id,from_id,to_id) " +
41
+      "values (?,?,?)", params);
42
+  }
43
+}

+ 67
- 0
dddsample/src/main/java/se/citerus/routingteam/GraphTraversalService.java 查看文件

@@ -0,0 +1,67 @@
1
+package se.citerus.routingteam;
2
+
3
+import java.util.*;
4
+
5
+public class GraphTraversalService {
6
+
7
+  private GraphDAO dao;
8
+  private Random random;
9
+
10
+  public GraphTraversalService(GraphDAO dao) {
11
+    this.dao = dao;
12
+    this.random = new Random();
13
+  }
14
+
15
+  public List<TransitPath> performHeavyCalculations(String originUnLocode, String destinationUnLocode) {
16
+    List<String> allVertices = dao.listLocations();
17
+    allVertices.remove(originUnLocode);
18
+    allVertices.remove(destinationUnLocode);
19
+
20
+    final int candidateCount = getRandomNumberOfCandidates();
21
+    final List<TransitPath> candidates = new ArrayList<TransitPath>(candidateCount);
22
+
23
+    for (int i = 0; i < candidateCount; i++) {
24
+      allVertices = getRandomChunkOfLocations(allVertices);
25
+      final List<TransitEdge> transitEdges = new ArrayList<TransitEdge>(allVertices.size() - 1);
26
+      final String firstLegTo = allVertices.get(0);
27
+
28
+      transitEdges.add(new TransitEdge(
29
+        getRandomCarrierMovementId(originUnLocode, firstLegTo),
30
+        originUnLocode, firstLegTo));
31
+
32
+      for (int j = 0; j < allVertices.size() - 1; j++) {
33
+        final String curr = allVertices.get(j);
34
+        final String next = allVertices.get(j + 1);
35
+        transitEdges.add(new TransitEdge(getRandomCarrierMovementId(curr, next), curr, next));
36
+      }
37
+
38
+      final String lastLegFrom = allVertices.get(allVertices.size() - 1);
39
+      transitEdges.add(new TransitEdge(
40
+        getRandomCarrierMovementId(lastLegFrom, destinationUnLocode),
41
+        lastLegFrom, destinationUnLocode));
42
+
43
+      candidates.add(new TransitPath(transitEdges));
44
+    }
45
+
46
+    return candidates;
47
+  }
48
+
49
+  private String getRandomCarrierMovementId(String from, String to) {
50
+    final String random = UUID.randomUUID().toString().toUpperCase();
51
+    final String cmId =  random.substring(0, 4);
52
+    dao.storeCarrierMovementId(cmId, from, to);
53
+    return cmId;
54
+  }
55
+
56
+  private int getRandomNumberOfCandidates() {
57
+    return 1 + random.nextInt(4);
58
+  }
59
+
60
+  private List<String> getRandomChunkOfLocations(List<String> allLocations) {
61
+    Collections.shuffle(allLocations);
62
+    final int total = allLocations.size();
63
+    final int chunk = total > 4 ? (total - 4) + random.nextInt(5) : total;
64
+    return allLocations.subList(0, chunk);
65
+  }
66
+
67
+}

+ 39
- 0
dddsample/src/main/java/se/citerus/routingteam/TransitEdge.java 查看文件

@@ -0,0 +1,39 @@
1
+package se.citerus.routingteam;
2
+
3
+import java.io.Serializable;
4
+
5
+/**
6
+ * DTO for a leg in an itinerary.
7
+ */
8
+public final class TransitEdge implements Serializable {
9
+
10
+  private final String carrierMovementId;
11
+  private final String fromUnLocode;
12
+  private final String toUnLocode;
13
+
14
+  /**
15
+   * Constructor.
16
+   *
17
+   * @param carrierMovementId
18
+   * @param fromUnLocode
19
+   * @param toUnLocode
20
+   */
21
+  public TransitEdge(final String carrierMovementId, final String fromUnLocode, final String toUnLocode) {
22
+    this.carrierMovementId = carrierMovementId;
23
+    this.fromUnLocode = fromUnLocode;
24
+    this.toUnLocode = toUnLocode;
25
+  }
26
+
27
+  public String getCarrierMovementId() {
28
+    return carrierMovementId;
29
+  }
30
+
31
+  public String getFromUnLocode() {
32
+    return fromUnLocode;
33
+  }
34
+
35
+  public String getToUnLocode() {
36
+    return toUnLocode;
37
+  }
38
+
39
+}

+ 29
- 0
dddsample/src/main/java/se/citerus/routingteam/TransitPath.java 查看文件

@@ -0,0 +1,29 @@
1
+package se.citerus.routingteam;
2
+
3
+import java.io.Serializable;
4
+import java.util.Collections;
5
+import java.util.List;
6
+
7
+/**
8
+ *
9
+ */
10
+public final class TransitPath implements Serializable {
11
+
12
+  private final List<TransitEdge> transitEdges;
13
+
14
+  /**
15
+   * Constructor.
16
+   *
17
+   * @param transitEdges The legs for this itinerary.
18
+   */
19
+  public TransitPath(final List<TransitEdge> transitEdges) {
20
+    this.transitEdges = transitEdges;
21
+  }
22
+
23
+  /**
24
+   * @return An unmodifiable list DTOs.
25
+   */
26
+  public List<TransitEdge> getTransitEdges() {
27
+    return Collections.unmodifiableList(transitEdges);
28
+  }
29
+}

+ 2
- 2
dddsample/src/main/resources/context-messaging-jms.xml 查看文件

@@ -20,7 +20,7 @@
20 20
 
21 21
   <amq:topic id="handlingEventTopic" name="HandlingEventTopic" physicalName="HandlingEventTopic"/>
22 22
 
23
-  <bean id="handlingEventMessageDelegate" class="se.citerus.dddsample.application.service.HandlingEventMessageDelegate">
23
+  <bean id="handlingEventMessageDelegate" class="se.citerus.dddsample.application.messaging.HandlingEventMessageDelegate">
24 24
     <property name="trackingService" ref="trackingService"/>
25 25
   </bean>
26 26
 
@@ -34,7 +34,7 @@
34 34
     <property name="connectionFactory" ref="jmsConnectionFactory"/>
35 35
   </bean>
36 36
 
37
-  <bean id="eventService" class="se.citerus.dddsample.application.service.JmsEventServiceImpl">
37
+  <bean id="eventService" class="se.citerus.dddsample.application.messaging.JmsEventServiceImpl">
38 38
     <property name="jmsOperations" ref="jmsOperations"/>
39 39
     <property name="destination" ref="handlingEventTopic"/>
40 40
   </bean>

+ 1
- 1
dddsample/src/main/resources/context-messaging-thread.xml 查看文件

@@ -4,7 +4,7 @@
4 4
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 5
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
6 6
 
7
-  <bean id="eventService" class="se.citerus.dddsample.application.service.ThreadBasedEventServiceImpl">
7
+  <bean id="eventService" class="se.citerus.dddsample.application.messaging.ThreadBasedEventServiceImpl">
8 8
     <property name="bookingService" ref="bookingService"/>
9 9
   </bean>
10 10
 

+ 4
- 4
dddsample/src/main/resources/context-remote.xml 查看文件

@@ -46,7 +46,7 @@
46 46
       </list>
47 47
     </property>
48 48
     <property name="target">
49
-      <bean class="se.citerus.dddsample.application.service.BookingServiceFacadeImpl">
49
+      <bean class="se.citerus.dddsample.application.remote.BookingServiceFacadeImpl">
50 50
         <property name="bookingService" ref="bookingService"/>
51 51
         <property name="cargoRepository" ref="cargoRepository"/>
52 52
         <property name="locationRepository" ref="locationRepository"/>
@@ -58,7 +58,7 @@
58 58
   <!-- Wrap all methods with Hibernate interceptor
59 59
   TODO: add necessary aspectj deps and replace config above with this
60 60
   
61
-  <bean id="bookingServiceFacade" class="se.citerus.dddsample.application.service.BookingServiceFacadeImpl">
61
+  <bean id="bookingServiceFacade" class="se.citerus.dddsample.application.remote.BookingServiceFacadeImpl">
62 62
     <property name="bookingService" ref="bookingService"/>
63 63
     <property name="cargoRepository" ref="cargoRepository"/>
64 64
     <property name="locationRepository" ref="locationRepository"/>
@@ -67,13 +67,13 @@
67 67
 
68 68
   <aop:config>
69 69
     <aop:advisor advice-ref="hibernateInterceptor"
70
-                 pointcut="execution (* se.citerus.dddsample.application.service.BookingServiceFacadeImpl(..))"/>
70
+                 pointcut="execution (* se.citerus.dddsample.application.remote.BookingServiceFacadeImpl(..))"/>
71 71
   </aop:config>
72 72
   -->
73 73
 
74 74
   <!-- RMI exposure -->
75 75
   <bean id="rmiBookingServiceFacade" class="org.springframework.remoting.rmi.RmiServiceExporter">
76
-    <property name="serviceInterface" value="se.citerus.dddsample.application.service.BookingServiceFacade"/>
76
+    <property name="serviceInterface" value="se.citerus.dddsample.application.remote.BookingServiceFacade"/>
77 77
     <property name="service" ref="bookingServiceFacade"/>
78 78
     <property name="serviceName" value="BookingService"/>
79 79
   </bean>

+ 6
- 3
dddsample/src/main/resources/context-routing.xml 查看文件

@@ -5,9 +5,12 @@
5 5
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
6 6
 
7 7
   <!-- TODO start an RMI server on boot and wire this across the network -->
8
-  <bean id="graphTraversalService" class="se.citerus.dddsample.application.service.GraphTraversalService">
9
-    <property name="carrierMovementRepository" ref="carrierMovementRepository"/>
10
-    <property name="locationRepository" ref="locationRepository"/>
8
+  <bean id="graphTraversalService" class="se.citerus.routingteam.GraphTraversalService">
9
+    <constructor-arg ref="graphDAO"/>
10
+  </bean>
11
+
12
+  <bean id="graphDAO" class="se.citerus.routingteam.GraphDAO">
13
+    <constructor-arg ref="dataSource"/>
11 14
   </bean>
12 15
 
13 16
 </beans>

dddsample/src/main/java/se/citerus/dddsample/application/service/InMemTransactionManager.java → dddsample/src/test/java/se/citerus/dddsample/application/service/InMemTransactionManager.java 查看文件


+ 3
- 2
dddsample/src/test/java/se/citerus/dddsample/application/service/dto/assembler/CargoRoutingDTOAssemblerTest.java 查看文件

@@ -1,8 +1,9 @@
1 1
 package se.citerus.dddsample.application.service.dto.assembler;
2 2
 
3 3
 import junit.framework.TestCase;
4
-import se.citerus.dddsample.application.service.dto.CargoRoutingDTO;
5
-import se.citerus.dddsample.application.service.dto.LegDTO;
4
+import se.citerus.dddsample.application.remote.dto.CargoRoutingDTO;
5
+import se.citerus.dddsample.application.remote.dto.LegDTO;
6
+import se.citerus.dddsample.application.remote.dto.assembler.CargoRoutingDTOAssembler;
6 7
 import se.citerus.dddsample.domain.model.cargo.Cargo;
7 8
 import se.citerus.dddsample.domain.model.cargo.Itinerary;
8 9
 import se.citerus.dddsample.domain.model.cargo.Leg;

+ 3
- 2
dddsample/src/test/java/se/citerus/dddsample/application/service/dto/assembler/ItineraryCandidateDTOAssemblerTest.java 查看文件

@@ -2,8 +2,9 @@ package se.citerus.dddsample.application.service.dto.assembler;
2 2
 
3 3
 import junit.framework.TestCase;
4 4
 import static org.easymock.EasyMock.*;
5
-import se.citerus.dddsample.application.service.dto.ItineraryCandidateDTO;
6
-import se.citerus.dddsample.application.service.dto.LegDTO;
5
+import se.citerus.dddsample.application.remote.dto.ItineraryCandidateDTO;
6
+import se.citerus.dddsample.application.remote.dto.LegDTO;
7
+import se.citerus.dddsample.application.remote.dto.assembler.ItineraryCandidateDTOAssembler;
7 8
 import se.citerus.dddsample.domain.model.cargo.Itinerary;
8 9
 import se.citerus.dddsample.domain.model.cargo.Leg;
9 10
 import se.citerus.dddsample.domain.model.carrier.CarrierMovement;

+ 2
- 1
dddsample/src/test/java/se/citerus/dddsample/application/service/dto/assembler/LocationDTOAssemblerTest.java 查看文件

@@ -1,7 +1,8 @@
1 1
 package se.citerus.dddsample.application.service.dto.assembler;
2 2
 
3 3
 import junit.framework.TestCase;
4
-import se.citerus.dddsample.application.service.dto.LocationDTO;
4
+import se.citerus.dddsample.application.remote.dto.LocationDTO;
5
+import se.citerus.dddsample.application.remote.dto.assembler.LocationDTOAssembler;
5 6
 import se.citerus.dddsample.domain.model.location.Location;
6 7
 import static se.citerus.dddsample.domain.model.location.SampleLocations.HAMBURG;
7 8
 import static se.citerus.dddsample.domain.model.location.SampleLocations.STOCKHOLM;

+ 1
- 1
dddsample/src/test/java/se/citerus/dddsample/application/web/CargoTrackingControllerTest.java 查看文件

@@ -9,7 +9,7 @@ import org.springframework.validation.BindingResult;
9 9
 import org.springframework.validation.Errors;
10 10
 import org.springframework.validation.FieldError;
11 11
 import org.springframework.web.servlet.ModelAndView;
12
-import se.citerus.dddsample.application.service.dto.CargoTrackingDTO;
12
+import se.citerus.dddsample.application.remote.dto.CargoTrackingDTO;
13 13
 import se.citerus.dddsample.application.web.command.TrackCommand;
14 14
 import se.citerus.dddsample.domain.model.cargo.Cargo;
15 15
 import se.citerus.dddsample.domain.model.cargo.CargoTestHelper;

+ 0
- 1
dddsample/src/test/java/se/citerus/dddsample/domain/service/HandlingEventServiceTest.java 查看文件

@@ -2,7 +2,6 @@ package se.citerus.dddsample.domain.service;
2 2
 
3 3
 import junit.framework.TestCase;
4 4
 import static org.easymock.EasyMock.*;
5
-import se.citerus.dddsample.application.service.EventService;
6 5
 import se.citerus.dddsample.domain.model.cargo.Cargo;
7 6
 import se.citerus.dddsample.domain.model.cargo.CargoRepository;
8 7
 import se.citerus.dddsample.domain.model.cargo.TrackingId;

+ 12
- 4
dddsample/src/test/java/se/citerus/dddsample/domain/service/RoutingServiceTest.java 查看文件

@@ -3,7 +3,6 @@ package se.citerus.dddsample.domain.service;
3 3
 import junit.framework.TestCase;
4 4
 import static org.easymock.EasyMock.*;
5 5
 import se.citerus.dddsample.application.persistence.LocationRepositoryInMem;
6
-import se.citerus.dddsample.application.service.GraphTraversalService;
7 6
 import se.citerus.dddsample.domain.model.cargo.*;
8 7
 import se.citerus.dddsample.domain.model.carrier.CarrierMovement;
9 8
 import se.citerus.dddsample.domain.model.carrier.CarrierMovementId;
@@ -11,7 +10,11 @@ import se.citerus.dddsample.domain.model.carrier.CarrierMovementRepository;
11 10
 import se.citerus.dddsample.domain.model.location.Location;
12 11
 import se.citerus.dddsample.domain.model.location.LocationRepository;
13 12
 import static se.citerus.dddsample.domain.model.location.SampleLocations.*;
13
+import se.citerus.routingteam.GraphDAO;
14
+import se.citerus.routingteam.GraphTraversalService;
14 15
 
16
+import javax.sql.DataSource;
17
+import java.util.Arrays;
15 18
 import java.util.Date;
16 19
 import java.util.List;
17 20
 
@@ -28,9 +31,14 @@ public class RoutingServiceTest extends TestCase {
28 31
     carrierMovementRepository = createMock(CarrierMovementRepository.class);
29 32
     routingService.setCarrierMovementRepository(carrierMovementRepository);
30 33
 
31
-    GraphTraversalService graphTraversalService = new GraphTraversalService();
32
-    graphTraversalService.setCarrierMovementRepository(carrierMovementRepository);
33
-    graphTraversalService.setLocationRepository(locationRepository);
34
+    GraphTraversalService graphTraversalService = new GraphTraversalService(new GraphDAO(createMock(DataSource.class)) {
35
+      public List<String> listLocations() {
36
+        return Arrays.asList(TOKYO.unLocode().idString(), STOCKHOLM.unLocode().idString(), GOTHENBURG.unLocode().idString());
37
+      }
38
+
39
+      public void storeCarrierMovementId(String cmId, String from, String to) {
40
+      }
41
+    });
34 42
     routingService.setGraphTraversalService(graphTraversalService);
35 43
   }
36 44