Explorar el Código

Slight restructuring of routingteam subpackage to make external API stand out more.

peter_backlund hace 18 años
padre
commit
d3d4e94f75

+ 8
- 61
dddsample/src/main/java/se/citerus/routingteam/GraphTraversalService.java Ver fichero

1
 package se.citerus.routingteam;
1
 package se.citerus.routingteam;
2
 
2
 
3
-import java.util.*;
3
+import java.util.List;
4
 
4
 
5
-public class GraphTraversalService {
5
+/**
6
+ * Part of the external graph traversal API exposed by the routing team
7
+ * and used by us (booking and tracking team).
8
+ * 
9
+ */
10
+public interface GraphTraversalService {
6
 
11
 
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
-  }
12
+  List<TransitPath> performHeavyCalculations(String originUnLocode, String destinationUnLocode);
66
 
13
 
67
 }
14
 }

+ 43
- 0
dddsample/src/main/java/se/citerus/routingteam/internal/GraphDAO.java Ver fichero

1
+package se.citerus.routingteam.internal;
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
+}

+ 71
- 0
dddsample/src/main/java/se/citerus/routingteam/internal/GraphTraversalServiceImpl.java Ver fichero

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

+ 7
- 0
dddsample/src/main/java/se/citerus/routingteam/internal/package.html Ver fichero

1
+<html>
2
+<body>
3
+<p>
4
+  Internal parts of the routing team application.
5
+</p>
6
+</body>
7
+</html>

+ 2
- 2
dddsample/src/main/resources/context-routing.xml Ver fichero

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

+ 3
- 2
dddsample/src/test/java/se/citerus/dddsample/domain/service/RoutingServiceTest.java Ver fichero

11
 import se.citerus.dddsample.domain.model.location.Location;
11
 import se.citerus.dddsample.domain.model.location.Location;
12
 import se.citerus.dddsample.domain.model.location.LocationRepository;
12
 import se.citerus.dddsample.domain.model.location.LocationRepository;
13
 import static se.citerus.dddsample.domain.model.location.SampleLocations.*;
13
 import static se.citerus.dddsample.domain.model.location.SampleLocations.*;
14
-import se.citerus.routingteam.GraphDAO;
15
 import se.citerus.routingteam.GraphTraversalService;
14
 import se.citerus.routingteam.GraphTraversalService;
15
+import se.citerus.routingteam.internal.GraphDAO;
16
+import se.citerus.routingteam.internal.GraphTraversalServiceImpl;
16
 
17
 
17
 import javax.sql.DataSource;
18
 import javax.sql.DataSource;
18
 import java.util.Arrays;
19
 import java.util.Arrays;
32
     carrierMovementRepository = createMock(CarrierMovementRepository.class);
33
     carrierMovementRepository = createMock(CarrierMovementRepository.class);
33
     routingService.setCarrierMovementRepository(carrierMovementRepository);
34
     routingService.setCarrierMovementRepository(carrierMovementRepository);
34
 
35
 
35
-    GraphTraversalService graphTraversalService = new GraphTraversalService(new GraphDAO(createMock(DataSource.class)) {
36
+    GraphTraversalService graphTraversalService = new GraphTraversalServiceImpl(new GraphDAO(createMock(DataSource.class)) {
36
       public List<String> listLocations() {
37
       public List<String> listLocations() {
37
         return Arrays.asList(TOKYO.unLocode().idString(), STOCKHOLM.unLocode().idString(), GOTHENBURG.unLocode().idString());
38
         return Arrays.asList(TOKYO.unLocode().idString(), STOCKHOLM.unLocode().idString(), GOTHENBURG.unLocode().idString());
38
       }
39
       }