Просмотр исходного кода

Change view technology from jsp to thymeleaf in admin application.

marlin 11 лет назад
Родитель
Сommit
d15bdbac52
32 измененных файлов: 18916 добавлений и 588 удалений
  1. 0
    16
      pom.xml
  2. 2
    0
      src/main/java/se/citerus/dddsample/domain/model/cargo/CargoRepository.java
  3. 2
    2
      src/main/java/se/citerus/dddsample/interfaces/booking/facade/BookingServiceFacade.java
  4. 101
    93
      src/main/java/se/citerus/dddsample/interfaces/booking/web/CargoAdminController.java
  5. 3
    2
      src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingController.java
  6. 18
    33
      src/main/resources/context-interfaces.xml
  7. 13
    20
      src/main/webapp/WEB-INF/booking-servlet.xml
  8. 0
    5
      src/main/webapp/WEB-INF/decorators.xml
  9. 0
    33
      src/main/webapp/WEB-INF/jsp/admin/list.jsp
  10. 0
    46
      src/main/webapp/WEB-INF/jsp/admin/pickNewDestination.jsp
  11. 0
    94
      src/main/webapp/WEB-INF/jsp/admin/registrationForm.jsp
  12. 0
    67
      src/main/webapp/WEB-INF/jsp/admin/selectItinerary.jsp
  13. 0
    77
      src/main/webapp/WEB-INF/jsp/admin/show.jsp
  14. 0
    34
      src/main/webapp/WEB-INF/jsp/adminDecorator.jsp
  15. 0
    7
      src/main/webapp/WEB-INF/jspf/include.jspf
  16. 40
    0
      src/main/webapp/WEB-INF/templates/admin/list.html
  17. 50
    0
      src/main/webapp/WEB-INF/templates/admin/pickNewDestination.html
  18. 69
    0
      src/main/webapp/WEB-INF/templates/admin/registrationForm.html
  19. 73
    0
      src/main/webapp/WEB-INF/templates/admin/selectItinerary.html
  20. 70
    0
      src/main/webapp/WEB-INF/templates/admin/show.html
  21. 24
    0
      src/main/webapp/WEB-INF/templates/adminDecorator.html
  22. 0
    0
      src/main/webapp/WEB-INF/templates/pub/track.html
  23. 1
    15
      src/main/webapp/WEB-INF/tracking-servlet.xml
  24. 0
    22
      src/main/webapp/WEB-INF/web.xml
  25. 473
    0
      src/main/webapp/css/bootstrap-datepicker.css
  26. 6760
    0
      src/main/webapp/css/bootstrap.css
  27. Двоичные данные
      src/main/webapp/fonts/glyphicons-halflings-regular.ttf
  28. Двоичные данные
      src/main/webapp/fonts/glyphicons-halflings-regular.woff
  29. Двоичные данные
      src/main/webapp/fonts/glyphicons-halflings-regular.woff2
  30. 2007
    0
      src/main/webapp/js/bootstrap-datepicker.js
  31. 9210
    0
      src/main/webapp/js/jquery-2.1.4.js
  32. 0
    22
      src/test/java/se/citerus/dddsample/interfaces/booking/web/CargoAdminControllerTest.java

+ 0
- 16
pom.xml Просмотреть файл

@@ -244,22 +244,6 @@
244 244
           <version>3.1.0</version>
245 245
           <scope>provided</scope>
246 246
       </dependency>
247
-      <dependency>
248
-      <groupId>taglibs</groupId>
249
-      <artifactId>standard</artifactId>
250
-      <version>1.1.2</version>
251
-    </dependency>
252
-    <dependency>
253
-      <groupId>javax.servlet</groupId>
254
-      <artifactId>jstl</artifactId>
255
-      <version>1.1.2</version>
256
-    </dependency>
257
-    <dependency>
258
-      <groupId>opensymphony</groupId>
259
-      <artifactId>sitemesh</artifactId>
260
-      <version>2.3</version>
261
-      <scope>runtime</scope>
262
-    </dependency>
263 247
     <dependency>
264 248
       <groupId>org.apache.activemq</groupId>
265 249
       <artifactId>activemq-core</artifactId>

+ 2
- 0
src/main/java/se/citerus/dddsample/domain/model/cargo/CargoRepository.java Просмотреть файл

@@ -1,5 +1,7 @@
1 1
 package se.citerus.dddsample.domain.model.cargo;
2 2
 
3
+import org.springframework.transaction.annotation.Transactional;
4
+
3 5
 import java.util.List;
4 6
 
5 7
 public interface CargoRepository {

+ 2
- 2
src/main/java/se/citerus/dddsample/interfaces/booking/facade/BookingServiceFacade.java Просмотреть файл

@@ -11,9 +11,9 @@ import java.util.List;
11 11
 
12 12
 /**
13 13
  * This facade shields the domain layer - model, services, repositories -
14
- * from concerns about such things as the user interface and remoting.
14
+ * from concerns about such things as the user interface.
15 15
  */
16
-public interface BookingServiceFacade extends Remote {
16
+public interface BookingServiceFacade {
17 17
 
18 18
   String bookNewCargo(String origin, String destination, Date arrivalDeadline) throws RemoteException;
19 19
 

+ 101
- 93
src/main/java/se/citerus/dddsample/interfaces/booking/web/CargoAdminController.java Просмотреть файл

@@ -1,8 +1,11 @@
1 1
 package se.citerus.dddsample.interfaces.booking.web;
2 2
 
3 3
 import org.springframework.beans.propertyeditors.CustomDateEditor;
4
+import org.springframework.stereotype.Controller;
4 5
 import org.springframework.web.bind.ServletRequestDataBinder;
5
-import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
6
+import org.springframework.web.bind.annotation.InitBinder;
7
+import org.springframework.web.bind.annotation.RequestMapping;
8
+import org.springframework.web.bind.annotation.RequestMethod;
6 9
 import se.citerus.dddsample.interfaces.booking.facade.BookingServiceFacade;
7 10
 import se.citerus.dddsample.interfaces.booking.facade.dto.CargoRoutingDTO;
8 11
 import se.citerus.dddsample.interfaces.booking.facade.dto.LegDTO;
@@ -12,124 +15,129 @@ import se.citerus.dddsample.interfaces.booking.facade.dto.RouteCandidateDTO;
12 15
 import javax.servlet.http.HttpServletRequest;
13 16
 import javax.servlet.http.HttpServletResponse;
14 17
 import java.text.SimpleDateFormat;
15
-import java.util.*;
18
+import java.util.ArrayList;
19
+import java.util.Date;
20
+import java.util.List;
21
+import java.util.Map;
16 22
 
17 23
 /**
18 24
  * Handles cargo booking and routing. Operates against a dedicated remoting service facade,
19 25
  * and could easily be rewritten as a thick Swing client. Completely separated from the domain layer,
20 26
  * unlike the tracking user interface.
21
- * <p/>
27
+ * <p>
22 28
  * In order to successfully keep the domain model shielded from user interface considerations,
23 29
  * this approach is generally preferred to the one taken in the tracking controller. However,
24 30
  * there is never any one perfect solution for all situations, so we've chosen to demonstrate
25
- * two polarized ways to build user interfaces.   
31
+ * two polarized ways to build user interfaces.
26 32
  *
27 33
  * @see se.citerus.dddsample.interfaces.tracking.CargoTrackingController
28 34
  */
29
-public final class CargoAdminController extends MultiActionController {
35
+@Controller
36
+public final class CargoAdminController {
30 37
 
31
-  private BookingServiceFacade bookingServiceFacade;
38
+    private BookingServiceFacade bookingServiceFacade;
32 39
 
33
-  @Override
34
-  protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
35
-    super.initBinder(request, binder);
36
-    binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm"), false));
37
-  }
40
+    @InitBinder
41
+    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
42
+        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm"), false));
43
+    }
44
+
45
+    @RequestMapping("/registration")
46
+    public String registration(HttpServletRequest request, HttpServletResponse response, Map<String, Object> model) throws Exception {
47
+        List<LocationDTO> dtoList = bookingServiceFacade.listShippingLocations();
38 48
 
39
-  public Map registrationForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
40
-    Map<String, Object> map = new HashMap<String, Object>();
41
-    List<LocationDTO> dtoList = bookingServiceFacade.listShippingLocations();
49
+        List<String> unLocodeStrings = new ArrayList<String>();
42 50
 
43
-    List<String> unLocodeStrings = new ArrayList<String>();
51
+        for (LocationDTO dto : dtoList) {
52
+            unLocodeStrings.add(dto.getUnLocode());
53
+        }
44 54
 
45
-    for (LocationDTO dto : dtoList) {
46
-      unLocodeStrings.add(dto.getUnLocode());
55
+        model.put("unlocodes", unLocodeStrings);
56
+        model.put("locations", dtoList);
57
+        return "templates/admin/registrationForm";
47 58
     }
48 59
 
49
-    map.put("unlocodes", unLocodeStrings);
50
-    map.put("locations", dtoList);
51
-    return map;
52
-  }
53
-
54
-  public void register(HttpServletRequest request, HttpServletResponse response,
55
-                       RegistrationCommand command) throws Exception {
56
-    Date arrivalDeadline = new SimpleDateFormat("M/dd/yyyy").parse(command.getArrivalDeadline());
57
-    String trackingId = bookingServiceFacade.bookNewCargo(
58
-      command.getOriginUnlocode(), command.getDestinationUnlocode(), arrivalDeadline
59
-    );
60
-    response.sendRedirect("show.html?trackingId=" + trackingId);
61
-  }
62
-
63
-  public Map list(HttpServletRequest request, HttpServletResponse response) throws Exception {
64
-    Map<String, Object> map = new HashMap<String, Object>();
65
-    List<CargoRoutingDTO> cargoList = bookingServiceFacade.listAllCargos();
66
-
67
-    map.put("cargoList", cargoList);
68
-    return map;
69
-  }
70
-
71
-  public Map show(HttpServletRequest request, HttpServletResponse response) throws Exception {
72
-    Map<String, Object> map = new HashMap<String, Object>();
73
-    String trackingId = request.getParameter("trackingId");
74
-    CargoRoutingDTO dto = bookingServiceFacade.loadCargoForRouting(trackingId);
75
-    map.put("cargo", dto);
76
-    return map;
77
-  }
78
-
79
-  public Map selectItinerary(HttpServletRequest request, HttpServletResponse response) throws Exception {
80
-    Map<String, Object> map = new HashMap<String, Object>();
81
-    String trackingId = request.getParameter("trackingId");
82
-
83
-    List<RouteCandidateDTO> routeCandidates = bookingServiceFacade.requestPossibleRoutesForCargo(trackingId);
84
-    map.put("routeCandidates", routeCandidates);
85
-
86
-    CargoRoutingDTO cargoDTO = bookingServiceFacade.loadCargoForRouting(trackingId);
87
-    map.put("cargo", cargoDTO);
88
-
89
-    return map;
90
-  }
91
-
92
-  public void assignItinerary(HttpServletRequest request, HttpServletResponse response, RouteAssignmentCommand command) throws Exception {
93
-    List<LegDTO> legDTOs = new ArrayList<LegDTO>(command.getLegs().size());
94
-    for (RouteAssignmentCommand.LegCommand leg : command.getLegs()) {
95
-      legDTOs.add(new LegDTO(
96
-        leg.getVoyageNumber(),
97
-        leg.getFromUnLocode(),
98
-        leg.getToUnLocode(),
99
-        leg.getFromDate(),
100
-        leg.getToDate())
101
-      );
60
+    @RequestMapping(value = "/register", method = RequestMethod.POST)
61
+    public void register(HttpServletRequest request, HttpServletResponse response,
62
+                         RegistrationCommand command) throws Exception {
63
+        Date arrivalDeadline = new SimpleDateFormat("M/dd/yyyy").parse(command.getArrivalDeadline());
64
+        String trackingId = bookingServiceFacade.bookNewCargo(
65
+                command.getOriginUnlocode(), command.getDestinationUnlocode(), arrivalDeadline
66
+        );
67
+        response.sendRedirect("show?trackingId=" + trackingId);
102 68
     }
103 69
 
104
-    RouteCandidateDTO selectedRoute = new RouteCandidateDTO(legDTOs);
70
+    @RequestMapping("/list")
71
+    public String list(HttpServletRequest request, HttpServletResponse response, Map<String, Object> model) throws Exception {
72
+        List<CargoRoutingDTO> cargoList = bookingServiceFacade.listAllCargos();
105 73
 
106
-    bookingServiceFacade.assignCargoToRoute(command.getTrackingId(), selectedRoute);
74
+        model.put("cargoList", cargoList);
75
+        return "templates/admin/list";
76
+    }
107 77
 
108
-    response.sendRedirect("show.html?trackingId=" + command.getTrackingId());
109
-    //response.sendRedirect("list.html");
110
-  }
78
+    @RequestMapping("/show")
79
+    public String show(HttpServletRequest request, HttpServletResponse response, Map<String, Object> model) throws Exception {
80
+        String trackingId = request.getParameter("trackingId");
81
+        CargoRoutingDTO dto = bookingServiceFacade.loadCargoForRouting(trackingId);
82
+        model.put("cargo", dto);
83
+        return "templates/admin/show";
84
+    }
111 85
 
112
-  public Map pickNewDestination(HttpServletRequest request, HttpServletResponse response) throws Exception {
113
-    Map<String, Object> map = new HashMap<String, Object>();
86
+    @RequestMapping("/selectItinerary")
87
+    public String selectItinerary(HttpServletRequest request, HttpServletResponse response, Map<String, Object> model) throws Exception {
88
+        String trackingId = request.getParameter("trackingId");
114 89
 
115
-    List<LocationDTO> locations = bookingServiceFacade.listShippingLocations();
116
-    map.put("locations", locations);
90
+        List<RouteCandidateDTO> routeCandidates = bookingServiceFacade.requestPossibleRoutesForCargo(trackingId);
91
+        model.put("routeCandidates", routeCandidates);
117 92
 
118
-    String trackingId = request.getParameter("trackingId");
119
-    CargoRoutingDTO cargo = bookingServiceFacade.loadCargoForRouting(trackingId);
120
-    map.put("cargo", cargo);
93
+        CargoRoutingDTO cargoDTO = bookingServiceFacade.loadCargoForRouting(trackingId);
94
+        model.put("cargo", cargoDTO);
121 95
 
122
-    return map;
123
-  }
96
+        return "templates/admin/selectItinerary";
97
+    }
98
+
99
+    @RequestMapping(value = "/assignItinerary", method = RequestMethod.POST)
100
+    public void assignItinerary(HttpServletRequest request, HttpServletResponse response, RouteAssignmentCommand command) throws Exception {
101
+        List<LegDTO> legDTOs = new ArrayList<LegDTO>(command.getLegs().size());
102
+        for (RouteAssignmentCommand.LegCommand leg : command.getLegs()) {
103
+            legDTOs.add(new LegDTO(
104
+                            leg.getVoyageNumber(),
105
+                            leg.getFromUnLocode(),
106
+                            leg.getToUnLocode(),
107
+                            leg.getFromDate(),
108
+                            leg.getToDate())
109
+            );
110
+        }
111
+
112
+        RouteCandidateDTO selectedRoute = new RouteCandidateDTO(legDTOs);
113
+
114
+        bookingServiceFacade.assignCargoToRoute(command.getTrackingId(), selectedRoute);
115
+
116
+        response.sendRedirect("show.html?trackingId=" + command.getTrackingId());
117
+        //response.sendRedirect("list.html");
118
+    }
124 119
 
125
-  public void changeDestination(HttpServletRequest request, HttpServletResponse response) throws Exception {
126
-    String trackingId = request.getParameter("trackingId");
127
-    String unLocode = request.getParameter("unlocode");
128
-    bookingServiceFacade.changeDestination(trackingId, unLocode);
129
-    response.sendRedirect("show.html?trackingId=" + trackingId);
130
-  }
120
+    @RequestMapping(value = "/pickNewDestination")
121
+    public String pickNewDestination(HttpServletRequest request, HttpServletResponse response, Map<String, Object> model) throws Exception {
122
+        List<LocationDTO> locations = bookingServiceFacade.listShippingLocations();
123
+        model.put("locations", locations);
131 124
 
132
-  public void setBookingServiceFacade(BookingServiceFacade bookingServiceFacade) {
133
-    this.bookingServiceFacade = bookingServiceFacade;
134
-  }
125
+        String trackingId = request.getParameter("trackingId");
126
+        CargoRoutingDTO cargo = bookingServiceFacade.loadCargoForRouting(trackingId);
127
+        model.put("cargo", cargo);
128
+
129
+        return "templates/admin/pickNewDestination";
130
+    }
131
+
132
+    @RequestMapping(value = "/changeDestination", method = RequestMethod.POST)
133
+    public void changeDestination(HttpServletRequest request, HttpServletResponse response) throws Exception {
134
+        String trackingId = request.getParameter("trackingId");
135
+        String unLocode = request.getParameter("unlocode");
136
+        bookingServiceFacade.changeDestination(trackingId, unLocode);
137
+        response.sendRedirect("show.html?trackingId=" + trackingId);
138
+    }
139
+
140
+    public void setBookingServiceFacade(BookingServiceFacade bookingServiceFacade) {
141
+        this.bookingServiceFacade = bookingServiceFacade;
142
+    }
135 143
 }

+ 3
- 2
src/main/java/se/citerus/dddsample/interfaces/tracking/CargoTrackingController.java Просмотреть файл

@@ -33,6 +33,7 @@ import java.util.Map;
33 33
  * @see se.citerus.dddsample.interfaces.booking.web.CargoAdminController
34 34
  */
35 35
 @Controller
36
+@RequestMapping("/track")
36 37
 public final class CargoTrackingController {
37 38
 
38 39
     private CargoRepository cargoRepository;
@@ -40,8 +41,8 @@ public final class CargoTrackingController {
40 41
     private MessageSource messageSource;
41 42
 
42 43
     @RequestMapping(method = RequestMethod.GET)
43
-    public Map<String, CargoTrackingViewAdapter> get(final TrackCommand trackCommand) {
44
-        return new HashMap<>();
44
+    public TrackCommand get() {
45
+        return new TrackCommand();
45 46
     }
46 47
 
47 48
     @RequestMapping(method = RequestMethod.POST)

+ 18
- 33
src/main/resources/context-interfaces.xml Просмотреть файл

@@ -3,10 +3,13 @@
3 3
 <beans xmlns="http://www.springframework.org/schema/beans"
4 4
        xmlns:task="http://www.springframework.org/schema/task"
5 5
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6
+       xmlns:mvc="http://www.springframework.org/schema/mvc"
6 7
        xmlns:jaxws="http://cxf.apache.org/jaxws"
7 8
        xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
8 9
                            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
9
-                           http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
10
+                           http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
11
+                           http://www.springframework.org/schema/mvc
12
+                           http://www.springframework.org/schema/mvc/spring-mvc.xsd">
10 13
 
11 14
     <import resource="classpath:META-INF/cxf/cxf.xml"/>
12 15
 
@@ -36,23 +39,7 @@
36 39
 
37 40
     <bean id="handlingReportConsumptionSupport" class="se.citerus.dddsample.interfaces.handling.HandlingReportParser"/>
38 41
 
39
-    <!-- RMI exposed booking service facade, which operates in an open Hibernate session -->
40
-
41
-
42
-    <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate4.support.OpenSessionInterceptor">
43
-        <property name="sessionFactory" ref="sessionFactory"/>
44
-    </bean>
45
-
46
-    <bean id="bookingServiceFacade" class="org.springframework.aop.framework.ProxyFactoryBean">
47
-        <property name="target" ref="bookingServiceFacadeTarget"/>
48
-        <property name="interceptorNames">
49
-            <list>
50
-                <value>hibernateInterceptor</value>
51
-            </list>
52
-        </property>
53
-    </bean>
54
-
55
-    <bean id="bookingServiceFacadeTarget"
42
+    <bean id="bookingServiceFacade"
56 43
           class="se.citerus.dddsample.interfaces.booking.facade.internal.BookingServiceFacadeImpl">
57 44
         <property name="bookingService" ref="bookingService"/>
58 45
         <property name="cargoRepository" ref="cargoRepository"/>
@@ -60,22 +47,17 @@
60 47
         <property name="voyageRepository" ref="voyageRepository"/>
61 48
     </bean>
62 49
 
63
-    <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
64
-        <property name="serviceInterface" value="se.citerus.dddsample.interfaces.booking.facade.BookingServiceFacade"/>
65
-        <property name="service" ref="bookingServiceFacade"/>
66
-        <property name="serviceName" value="BookingService"/>
50
+    <bean name="/*" class="se.citerus.dddsample.interfaces.booking.web.CargoAdminController">
51
+        <property name="bookingServiceFacade" ref="bookingServiceFacade"/>
67 52
     </bean>
68 53
 
69 54
 
70 55
     <!-- Tracking web application support -->
71 56
 
72
-
73
-    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
74
-        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
75
-        <property name="prefix" value="/WEB-INF/jsp/pub/"/>
76
-        <property name="suffix" value=".jsp"/>
77
-        <property name="requestContextAttribute" value="rc"/>
78
-        <property name="cache" value="false"/>
57
+    <bean class="se.citerus.dddsample.interfaces.tracking.CargoTrackingController">
58
+        <property name="cargoRepository" ref="cargoRepository"/>
59
+        <property name="handlingEventRepository" ref="handlingEventRepository"/>
60
+        <property name="messageSource" ref="messageSource"/>
79 61
     </bean>
80 62
 
81 63
     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
@@ -86,9 +68,12 @@
86 68
         <property name="defaultLocale" value="en"/>
87 69
     </bean>
88 70
 
89
-    <bean id="openSessionInViewInterceptor"
90
-          class="org.springframework.orm.hibernate4.support.OpenSessionInViewInterceptor">
91
-        <property name="sessionFactory" ref="sessionFactory"/>
92
-    </bean>
71
+    <mvc:interceptors>
72
+        <bean id="openSessionInViewInterceptor" class="org.springframework.orm.hibernate4.support.OpenSessionInViewInterceptor">
73
+            <property name="sessionFactory" ref="sessionFactory"/>
74
+        </bean>
75
+    </mvc:interceptors>
76
+
77
+    <mvc:annotation-driven/>
93 78
 
94 79
 </beans>

+ 13
- 20
src/main/webapp/WEB-INF/booking-servlet.xml Просмотреть файл

@@ -3,27 +3,20 @@
3 3
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 4
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
5 5
 
6
-  <!-- The booking web application is meant to be able run in a different JVM
7
-       from the main server application, communicating using RMI.
6
+    <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
7
+        <property name="templateMode" value="HTML5"/>
8
+        <property name="prefix" value="/WEB-INF/"/>
9
+        <property name="suffix" value=".html"/>
10
+    </bean>
8 11
 
9
-       For convenience purposes, it is run as a separate webapp (separate dispatcher servlet)
10
-       from the rest of the application, inside the same JVM, but still using RMI. -->
12
+    <bean id="templateEngine"
13
+          class="org.thymeleaf.spring4.SpringTemplateEngine">
14
+        <property name="templateResolver" ref="templateResolver"/>
15
+    </bean>
11 16
 
12
-  <bean id="remoteBookingService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
13
-    <property name="serviceUrl" value="rmi://localhost:1099/BookingService"/>
14
-    <property name="serviceInterface" value="se.citerus.dddsample.interfaces.booking.facade.BookingServiceFacade"/>
15
-  </bean>
16
-
17
-  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
18
-    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
19
-    <property name="prefix" value="/WEB-INF/jsp/admin/"/>
20
-    <property name="suffix" value=".jsp"/>
21
-    <property name="requestContextAttribute" value="rc"/>
22
-    <property name="cache" value="false"/>
23
-  </bean>
24
-
25
-  <bean name="/*" class="se.citerus.dddsample.interfaces.booking.web.CargoAdminController">
26
-    <property name="bookingServiceFacade" ref="remoteBookingService"/>
27
-  </bean>
17
+    <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
18
+        <property name="viewNames" value="templates/admin/*"/>
19
+        <property name="templateEngine" ref="templateEngine"/>
20
+    </bean>
28 21
 
29 22
 </beans>

+ 0
- 5
src/main/webapp/WEB-INF/decorators.xml Просмотреть файл

@@ -1,5 +0,0 @@
1
-<decorators defaultdir="/WEB-INF/jsp">
2
-  <decorator name="admin" page="adminDecorator.jsp">
3
-    <pattern>/admin</pattern>
4
-  </decorator>
5
-</decorators>

+ 0
- 33
src/main/webapp/WEB-INF/jsp/admin/list.jsp Просмотреть файл

@@ -1,33 +0,0 @@
1
-<html>
2
-<head>
3
-  <title>Cargo Administration</title>
4
-</head>
5
-<body>
6
-  <table border="1" width="600">
7
-    <caption>All cargos</caption>
8
-    <thead>
9
-      <tr>
10
-        <td>Tracking ID</td>
11
-        <td>Origin</td>
12
-        <td>Destination</td>
13
-        <td>Routed</td>
14
-      </tr>
15
-    </thead>
16
-    <tbody>
17
-      <c:forEach items="${cargoList}" var="cargo">
18
-      <tr>
19
-        <td>
20
-          <c:url value="/admin/show.html" var="showUrl">
21
-            <c:param name="trackingId" value="${cargo.trackingId}"/>
22
-          </c:url>
23
-          <a href="${showUrl}">${cargo.trackingId}</a>
24
-        </td>
25
-        <td>${cargo.origin}</td>
26
-        <td>${cargo.finalDestination}</td>
27
-        <td>${cargo.misrouted ? "Misrouted" : (cargo.routed ? "Yes" : "No")}</td>
28
-      </tr>  
29
-      </c:forEach>
30
-    </tbody>
31
-  </table>
32
-</body>
33
-</html>

+ 0
- 46
src/main/webapp/WEB-INF/jsp/admin/pickNewDestination.jsp Просмотреть файл

@@ -1,46 +0,0 @@
1
-<html>
2
-<head>
3
-  <title>Cargo Administration</title>
4
-  <style type="text/css">
5
-    td {
6
-      align: left;
7
-    }
8
-  </style>
9
-</head>
10
-<body>
11
-<div id="container">
12
-  <form action="<c:url value="/admin/changeDestination.html"/>" method="post">
13
-  <input type="hidden" name="trackingId" value="${cargo.trackingId}"/>
14
-  <table>
15
-    <caption>Change destination for cargo ${cargo.trackingId}</caption>
16
-    <tbody>
17
-      <tr>
18
-        <td>Current destination</td>
19
-        <td>
20
-            ${cargo.finalDestination}
21
-        </td>
22
-      </tr>
23
-      <tr>
24
-        <td>New destination</td>
25
-        <td>
26
-          <select name="unlocode">
27
-            <c:forEach items="${locations}" var="location">
28
-            <option value="${location.unLocode}">${location.unLocode}</option>
29
-            </c:forEach>
30
-          </select>
31
-        </td>
32
-      </tr>
33
-    </tbody>
34
-    <tfoot>
35
-      <tr>
36
-        <td> </td>
37
-        <td>
38
-          <input type="submit" value="Change destination"/>
39
-        </td>
40
-      </tr>
41
-    </tfoot>
42
-  </table>
43
-  </form>
44
-</div>
45
-</body>
46
-</html>

+ 0
- 94
src/main/webapp/WEB-INF/jsp/admin/registrationForm.jsp Просмотреть файл

@@ -1,94 +0,0 @@
1
-<html>
2
-<head>
3
-  <title>Cargo Administration</title>
4
-    <!--CSS file (default YUI Sam Skin) -->
5
-	<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.7.0/build/calendar/assets/skins/sam/calendar.css"/>
6
-
7
-	<!-- Dependencies -->
8
-	<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/yahoo-dom-event/yahoo-dom-event.js"></script>
9
-
10
-	<!-- Source file -->
11
-	<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/calendar/calendar-min.js"></script>
12
-    <script type="text/javascript">
13
-
14
-        var cal
15
-        function pickDate() {
16
-        }
17
-
18
-        function datePicked(type,args,obj) {
19
-            var dates = args[0];
20
-            var date = dates[0];
21
-            var year = date[0], month = date[1], day = date[2];
22
-
23
-            var arrivalDeadline = document.getElementById("arrivalDeadline");
24
-            arrivalDeadline.value = month + "/" + day + "/" + year;
25
-
26
-            cal.dispose();
27
-        }
28
-    </script>
29
-    <style type="text/css">
30
-        td {
31
-          align: left;
32
-        }
33
-        .yui-calcontainer {
34
-            font-size: 9pt;
35
-        }
36
-    </style>
37
-</head>
38
-<body>
39
-<div id="container">
40
-  <form action="<c:url value="/admin/register.html"/>" method="post">
41
-  <table>
42
-    <caption>Book new cargo</caption>
43
-    <tbody>
44
-      <tr>
45
-        <td>Origin</td>
46
-        <td>
47
-          <select name="originUnlocode">
48
-            <c:forEach items="${unlocodes}" var="u">
49
-            <option value="${u}">${u}</option>
50
-            </c:forEach>
51
-          </select>
52
-        </td>
53
-      </tr>
54
-      <tr>
55
-        <td>Destination</td>
56
-        <td>
57
-          <select name="destinationUnlocode">
58
-            <c:forEach items="${unlocodes}" var="u">
59
-            <option value="${u}">${u}</option>
60
-            </c:forEach>
61
-          </select>
62
-        </td>
63
-      </tr>
64
-        <tr>
65
-          <td>Arrival deadline:</td>
66
-          <td>
67
-            <input name="arrivalDeadline" type="text" size="10" id="arrivalDeadline" value="${param.arrivalDeadline}"/>&nbsp;
68
-          </td>
69
-        </tr>
70
-        <tr>
71
-            <td></td>
72
-            <td class="yui-skin-sam">
73
-                <div id="cal1Container"></div>
74
-            </td>
75
-        </tr>
76
-    </tbody>
77
-    <tfoot>
78
-      <tr>
79
-        <td> </td>
80
-        <td>
81
-          <input type="submit" value="Book"/>
82
-        </td>
83
-      </tr>
84
-    </tfoot>
85
-  </table>
86
-  </form>
87
-</div>
88
-<script type="text/javascript">
89
-    cal = new YAHOO.widget.Calendar('cal1Container');
90
-    cal.render();
91
-    cal.selectEvent.subscribe(datePicked)
92
-</script>
93
-</body>
94
-</html>

+ 0
- 67
src/main/webapp/WEB-INF/jsp/admin/selectItinerary.jsp Просмотреть файл

@@ -1,67 +0,0 @@
1
-<html>
2
-<head>
3
-  <title>Cargo Administration</title>
4
-</head>
5
-<body>
6
-<div id="container">
7
-  <table>
8
-    <caption>Select route</caption>
9
-    <tr>
10
-      <td>
11
-          Cargo ${cargo.trackingId} is going from ${cargo.origin} to ${cargo.finalDestination}
12
-      </td>
13
-    </tr>
14
-  </table>
15
-  <c:url value="/admin/assignItinerary.html" var="postUrl"/>
16
-  <c:if test="${empty routeCandidates}">
17
-      <p>No routes found that satisfy the route specification.
18
-          Try setting an arrival deadline futher into the future (a few weeks at least).
19
-      </p>
20
-  </c:if>
21
-
22
-  <c:forEach items="${routeCandidates}" var="it" varStatus="itStatus">
23
-      <form action="${postUrl}" method="post">
24
-        <input type="hidden" name="trackingId" value="${cargo.trackingId}"/>
25
-        <table>
26
-          <caption>Route candidate ${itStatus.index + 1}</caption>
27
-          <thead>
28
-            <tr>
29
-              <td>Voyage</td>
30
-              <td>From</td>
31
-              <td></td>
32
-              <td>To</td>
33
-              <td></td>
34
-            </tr>
35
-          </thead>
36
-          <tbody>
37
-            <c:forEach items="${it.legs}" var="leg" varStatus="legStatus">
38
-              <input type="hidden" name="legs[${legStatus.index}].voyageNumber" value="${leg.voyageNumber}"/>
39
-              <input type="hidden" name="legs[${legStatus.index}].fromUnLocode" value="${leg.from}"/>
40
-              <input type="hidden" name="legs[${legStatus.index}].toUnLocode" value="${leg.to}"/>
41
-              <input type="hidden" name="legs[${legStatus.index}].fromDate" value="<fmt:formatDate value="${leg.loadTime}" pattern="yyyy-MM-dd hh:mm"/>"/>
42
-              <input type="hidden" name="legs[${legStatus.index}].toDate" value="<fmt:formatDate value="${leg.unloadTime}" pattern="yyyy-MM-dd hh:mm"/>"/>
43
-              <tr>
44
-                <td>${leg.voyageNumber}</td>
45
-                <td>${leg.from}</td>
46
-                <td><fmt:formatDate value="${leg.loadTime}" pattern="yyyy-MM-dd hh:mm"/></td>
47
-                <td>${leg.to}</td>
48
-                <td><fmt:formatDate value="${leg.unloadTime}" pattern="yyyy-MM-dd hh:mm"/></td>
49
-              </tr>
50
-            </c:forEach>
51
-          </tbody>
52
-          <tfoot>
53
-            <tr>
54
-              <td colspan="3">
55
-                <p>
56
-                  <input type="submit" value="Assign cargo to this route"/>
57
-                </p>
58
-              </td>
59
-            </tr>
60
-          </tfoot>
61
-        </table>
62
-      </form>
63
-  </c:forEach>
64
-
65
-</div>
66
-</body>
67
-</html>

+ 0
- 77
src/main/webapp/WEB-INF/jsp/admin/show.jsp Просмотреть файл

@@ -1,77 +0,0 @@
1
-<html>
2
-<head>
3
-  <title>Cargo Administration</title>
4
-</head>
5
-<body>
6
-<div id="container">
7
-  <table>
8
-    <caption>Details for cargo ${cargo.trackingId}</caption>
9
-    <tbody>
10
-      <tr>
11
-        <td>Origin</td>
12
-        <td>${cargo.origin}</td>
13
-      </tr>
14
-      <tr>
15
-        <td>Destination</td>
16
-        <td>
17
-            ${cargo.finalDestination}
18
-        </td>
19
-      </tr>
20
-      <tr>
21
-          <td></td>
22
-          <td>
23
-           <c:url value="/admin/pickNewDestination.html" var="cdUrl">
24
-               <c:param name="trackingId" value="${cargo.trackingId}"/>
25
-           </c:url>
26
-            <a href="${cdUrl}">Change destination</a>    
27
-          </td>
28
-      </tr>
29
-      <tr>
30
-        <td>Arrival deadline</td>
31
-        <td><fmt:formatDate value="${cargo.arrivalDeadline}" pattern="yyyy-MM-dd hh:mm"/></td>
32
-      </tr>
33
-    </tbody>
34
-  </table>
35
-  <p></p>
36
-  <c:choose>
37
-    <c:when test="${cargo.routed}">
38
-      <c:if test="${cargo.misrouted}">
39
-          <c:url value="/admin/selectItinerary.html" var="selectUrl">
40
-            <c:param name="trackingId" value="${cargo.trackingId}"/>
41
-          </c:url>
42
-        <p><em>Cargo is misrouted - <a href="${selectUrl}">reroute this cargo</a></em></p>    
43
-      </c:if>
44
-      <table border="1">
45
-        <caption>Itinerary</caption>
46
-        <thead>
47
-          <tr>
48
-            <td>Voyage number</td>
49
-            <td colspan="2">Load</td>
50
-            <td colspan="2">Unload</td>
51
-          </tr>
52
-        </thead>
53
-        <tbody>
54
-          <c:forEach items="${cargo.legs}" var="leg">
55
-            <tr>
56
-              <td>${leg.voyageNumber}</td>
57
-              <td>${leg.from}</td>
58
-              <td>(<fmt:formatDate value="${leg.loadTime}" pattern="yyyy-MM-dd hh:mm"/>)</td>
59
-              <td>${leg.to}</td>
60
-              <td>(<fmt:formatDate value="${leg.unloadTime}" pattern="yyyy-MM-dd hh:mm"/>)</td>
61
-            </tr>
62
-          </c:forEach>
63
-        </tbody>
64
-      </table>
65
-    </c:when>
66
-    <c:otherwise>
67
-      <p>
68
-        <c:url value="/admin/selectItinerary.html" var="selectUrl">
69
-          <c:param name="trackingId" value="${cargo.trackingId}"/>
70
-        </c:url>
71
-        <strong>Not routed</strong> - <a href="${selectUrl}">Route this cargo</a>
72
-      </p>
73
-    </c:otherwise>
74
-  </c:choose>
75
-</div>
76
-</body>
77
-</html>

+ 0
- 34
src/main/webapp/WEB-INF/jsp/adminDecorator.jsp Просмотреть файл

@@ -1,34 +0,0 @@
1
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
-
3
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
-<head>
5
-  <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
6
-  <title><decorator:title/></title>
7
-  <script type="text/javascript" charset="UTF-8"></script>
8
-  <style type="text/css" title="style" media="screen">
9
-    @import "${rc.contextPath}/admin.css";
10
-  </style>
11
-  <decorator:head/>
12
-</head>
13
-<body>
14
-  <div id="outer">
15
-    <img id="logotype" src="<c:url value="/images/dddsample_logotype_small.png"/>" alt=""/>
16
-    <h1>Cargo Booking and Routing</h1>
17
-    <ul id="menu">
18
-      <li>
19
-        <a href="${rc.contextPath}/admin/list.html">
20
-          List all cargos
21
-        </a>
22
-      </li>
23
-      <li>
24
-        <a href="${rc.contextPath}/admin/registrationForm.html">
25
-          Book new cargo
26
-        </a>
27
-      </li>
28
-    </ul>
29
-    <div id="body">
30
-      <decorator:body/>
31
-    </div>
32
-  </div>
33
-</body>
34
-</html>

+ 0
- 7
src/main/webapp/WEB-INF/jspf/include.jspf Просмотреть файл

@@ -1,7 +0,0 @@
1
-<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
2
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3
-<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
4
-<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
5
-<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
6
-
7
-<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>

+ 40
- 0
src/main/webapp/WEB-INF/templates/admin/list.html Просмотреть файл

@@ -0,0 +1,40 @@
1
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
2
+
3
+<html xmlns="http://www.w3.org/1999/xhtml"
4
+      xmlns:th="http://www.thymeleaf.org">
5
+
6
+<head>
7
+    <title>Cargo Administration</title>
8
+    <link rel="stylesheet" type="text/css" th:href="@{/admin.css}"/>
9
+</head>
10
+
11
+<body>
12
+<div id="outer">
13
+    <div th:replace="templates/adminDecorator :: adminbody"/>
14
+    <div id="body">
15
+        <table border="1" width="600">
16
+            <caption>All cargos</caption>
17
+            <thead>
18
+            <tr>
19
+                <td>Tracking ID</td>
20
+                <td>Origin</td>
21
+                <td>Destination</td>
22
+                <td>Routed</td>
23
+            </tr>
24
+            </thead>
25
+            <tbody>
26
+            <tr th:each="cargo : ${cargoList}">
27
+                <td>
28
+                    <a th:href="@{/admin/show(trackingId=${cargo.trackingId})}"
29
+                       th:text="${cargo.trackingId}">Tracking id</a>
30
+                </td>
31
+                <td th:text="${cargo.origin}">Origin</td>
32
+                <td th:text="${cargo.finalDestination}">Final destination</td>
33
+                <td th:text="(${cargo.misrouted} ? 'Misrouted' : '') + (${cargo.routed} ? 'Yes' : 'No')"></td>
34
+            </tr>
35
+            </tbody>
36
+        </table>
37
+    </div>
38
+</div>
39
+</body>
40
+</html>

+ 50
- 0
src/main/webapp/WEB-INF/templates/admin/pickNewDestination.html Просмотреть файл

@@ -0,0 +1,50 @@
1
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
2
+
3
+<html xmlns="http://www.w3.org/1999/xhtml"
4
+      xmlns:th="http://www.thymeleaf.org">
5
+
6
+<head>
7
+    <title>Cargo Administration</title>
8
+    <link rel="stylesheet" type="text/css" th:href="@{/admin.css}"/>
9
+
10
+    <style type="text/css">
11
+        td {
12
+            align: left;
13
+        }
14
+    </style>
15
+</head>
16
+
17
+<body>
18
+<div th:replace="templates/adminDecorator :: adminbody"/>
19
+<div id="container">
20
+  <form th:action="@{/admin/changeDestination}" method="post">
21
+  <input type="hidden" name="trackingId" th:value="${cargo.trackingId}"/>
22
+  <table>
23
+    <caption>Change destination for cargo <span th:text="${cargo.trackingId}"/></caption>
24
+    <tbody>
25
+      <tr>
26
+        <td>Current destination</td>
27
+        <td th:text="${cargo.finalDestination}"/>
28
+      </tr>
29
+      <tr>
30
+        <td>New destination</td>
31
+        <td>
32
+          <select name="unlocode">
33
+            <option th:each="location : ${locations}" th:value="${location.unLocode}" th:text="${location.unLocode}"/>
34
+          </select>
35
+        </td>
36
+      </tr>
37
+    </tbody>
38
+    <tfoot>
39
+      <tr>
40
+        <td> </td>
41
+        <td>
42
+          <input type="submit" value="Change destination"/>
43
+        </td>
44
+      </tr>
45
+    </tfoot>
46
+  </table>
47
+  </form>
48
+</div>
49
+</body>
50
+</html>

+ 69
- 0
src/main/webapp/WEB-INF/templates/admin/registrationForm.html Просмотреть файл

@@ -0,0 +1,69 @@
1
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
2
+
3
+<html xmlns="http://www.w3.org/1999/xhtml"
4
+      xmlns:th="http://www.thymeleaf.org">
5
+
6
+<head>
7
+    <title>Cargo Administration</title>
8
+
9
+    <link rel="stylesheet" type="text/css" th:href="@{/admin.css}"/>
10
+    <link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.css}"/>
11
+    <link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap-datepicker.css}"/>
12
+</head>
13
+<body>
14
+<div th:replace="templates/adminDecorator :: adminbody"/>
15
+<div id="container">
16
+    <form th:action="@{/admin/register}" method="post">
17
+        <table>
18
+            <caption>Book new cargo</caption>
19
+            <tbody>
20
+            <tr>
21
+                <td>Origin</td>
22
+                <td>
23
+                    <select name="originUnlocode">
24
+                        <th:block th:each="unlocode : ${unlocodes}">
25
+                            <option th:value="${unlocode}" th:text="${unlocode}">unlocode</option>
26
+                        </th:block>
27
+                    </select>
28
+                </td>
29
+            </tr>
30
+            <tr>
31
+                <td>Destination</td>
32
+                <td>
33
+                    <select name="destinationUnlocode">
34
+                        <th:block th:each="unlocode : ${unlocodes}">
35
+                            <option th:value="${unlocode}" th:text="${unlocode}">unlocode</option>
36
+                        </th:block>
37
+                    </select>
38
+                </td>
39
+            </tr>
40
+            <tr>
41
+                <td>Arrival deadline:</td>
42
+                <td>
43
+                    <input name="arrivalDeadline" type="text" size="10" id="arrivalDeadline" th:value="${#dates.format(#dates.createNow(),'dd/MM/yyyy')}"/>
44
+                    <p class="glyphicon glyphicon-calendar"></p>
45
+                </td>
46
+            </tr>
47
+            </tbody>
48
+            <tfoot>
49
+            <tr>
50
+                <td></td>
51
+                <td>
52
+                    <input type="submit" value="Book"/>
53
+                </td>
54
+            </tr>
55
+            </tfoot>
56
+        </table>
57
+    </form>
58
+</div>
59
+<script th:src="@{/js/jquery-2.1.4.js}"></script>
60
+<script th:src="@{/js/bootstrap-datepicker.js}"></script>
61
+<script type="text/javascript">
62
+    $(document).ready(function () {
63
+        $('#arrivalDeadline').datepicker({
64
+            format: "dd/mm/yyyy"
65
+        });
66
+    });
67
+</script>
68
+</body>
69
+</html>

+ 73
- 0
src/main/webapp/WEB-INF/templates/admin/selectItinerary.html Просмотреть файл

@@ -0,0 +1,73 @@
1
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
2
+
3
+<html xmlns="http://www.w3.org/1999/xhtml"
4
+      xmlns:th="http://www.thymeleaf.org">
5
+
6
+<head>
7
+    <title>Cargo Administration</title>
8
+    <link rel="stylesheet" type="text/css" th:href="@{/admin.css}"/>
9
+</head>
10
+<body>
11
+<div th:replace="templates/adminDecorator :: adminbody"/>
12
+<div id="container">
13
+    <table>
14
+        <caption>Select route</caption>
15
+        <tr>
16
+            <td>
17
+                Cargo <span th:text="${cargo.trackingId}"/> is going from <span th:text="${cargo.origin}"/> to <span
18
+                    th:text="${cargo.finalDestination}"/>
19
+            </td>
20
+        </tr>
21
+    </table>
22
+
23
+    <p th:if="${#lists.isEmpty(routeCandidates)}">No routes found that satisfy the route specification.
24
+        Try setting an arrival deadline futher into the future (a few weeks at least).
25
+    </p>
26
+
27
+    <form th:each="it,itStatus : ${routeCandidates}" th:action="@{/admin/assignItinerary}" method="post">
28
+        <input type="hidden" name="trackingId" th:value="${cargo.trackingId}"/>
29
+        <table>
30
+            <caption>Route candidate <span th:text="${itStatus.count}"/></caption>
31
+            <thead>
32
+            <tr>
33
+                <td>Voyage</td>
34
+                <td>From</td>
35
+                <td></td>
36
+                <td>To</td>
37
+                <td></td>
38
+            </tr>
39
+            </thead>
40
+            <tbody>
41
+            <th:block th:each="leg,legStatus : ${it.legs}">
42
+                <input type="hidden" th:name="|legs[${legStatus.index}].voyageNumber|" th:value="${leg.voyageNumber}"/>
43
+                <input type="hidden" th:name="|legs[${legStatus.index}].fromUnLocode|" th:value="${leg.from}"/>
44
+                <input type="hidden" th:name="|legs[${legStatus.index}].toUnLocode|" th:value="${leg.to}"/>
45
+
46
+                <input type="hidden" th:name="|legs[${legStatus.index}].fromDate|"
47
+                       th:value="${#dates.format(leg.loadTime,'yyyy-MM-dd hh:mm')}"/>
48
+                <input type="hidden" th:name="|legs[${legStatus.index}].toDate|"
49
+                       th:value="${#dates.format(leg.unloadTime,'yyyy-MM-dd hh:mm')}"/>
50
+                <tr>
51
+                    <td th:text="${leg.voyageNumber}"></td>
52
+                    <td th:text="${leg.from}"></td>
53
+                    <td th:text="${#dates.format(leg.loadTime,'yyyy-MM-dd hh:mm')}"/>
54
+                    <td th:text="${leg.to}"></td>
55
+                    <td th:text="${#dates.format(leg.unloadTime,'yyyy-MM-dd hh:mm')}"/>
56
+                </tr>
57
+            </th:block>
58
+            </tbody>
59
+            <tfoot>
60
+            <tr>
61
+                <td colspan="3">
62
+                    <p>
63
+                        <input type="submit" value="Assign cargo to this route"/>
64
+                    </p>
65
+                </td>
66
+            </tr>
67
+            </tfoot>
68
+        </table>
69
+    </form>
70
+
71
+</div>
72
+</body>
73
+</html>

+ 70
- 0
src/main/webapp/WEB-INF/templates/admin/show.html Просмотреть файл

@@ -0,0 +1,70 @@
1
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
2
+
3
+<html xmlns="http://www.w3.org/1999/xhtml"
4
+      xmlns:th="http://www.thymeleaf.org">
5
+
6
+<head>
7
+    <title>Cargo Administration</title>
8
+
9
+    <link rel="stylesheet" type="text/css" th:href="@{/admin.css}"/>
10
+</head>
11
+<body>
12
+<div th:replace="templates/adminDecorator :: adminbody"/>
13
+<div id="container">
14
+    <table>
15
+        <caption th:text="'Details for cargo ' + ${cargo.trackingId}"></caption>
16
+        <tbody>
17
+        <tr>
18
+            <td>Origin</td>
19
+            <td th:text="${cargo.origin}"></td>
20
+        </tr>
21
+        <tr>
22
+            <td>Destination</td>
23
+            <td th:text="${cargo.finalDestination}"></td>
24
+        </tr>
25
+        <tr>
26
+            <td></td>
27
+            <td>
28
+                <a th:href="@{/admin/pickNewDestination(trackingId=${cargo.trackingId})}">Change destination</a>
29
+            </td>
30
+        </tr>
31
+        <tr>
32
+            <td>Arrival deadline</td>
33
+            <td th:text="${#dates.format(cargo.arrivalDeadline,'dd/MM/yyyy')}"/>
34
+        </tr>
35
+        </tbody>
36
+    </table>
37
+    <p></p>
38
+    <th:block th:if="${cargo.routed}">
39
+        <th:block th:if="${cargo.misrouted}">
40
+            <p><em>Cargo is misrouted - <a th:href="@{/admin/selectItinerary(trackingId=${cargo.trackingId})}">reroute
41
+                this cargo</a></em></p>
42
+        </th:block>
43
+        <table border="1">
44
+            <caption>Itinerary</caption>
45
+            <thead>
46
+            <tr>
47
+                <td>Voyage number</td>
48
+                <td colspan="2">Load</td>
49
+                <td colspan="2">Unload</td>
50
+            </tr>
51
+            </thead>
52
+            <tbody>
53
+            <tr th:each="leg : ${cargo.legs}">
54
+                <td th:text="${leg.voyageNumber}"></td>
55
+                <td th:text="${leg.from}"></td>
56
+                <td th:text="${#dates.format(leg.loadTime,'dd/MM/yyyy')}"/>
57
+                <td th:text="${leg.to}"></td>
58
+                <td th:text="${#dates.format(leg.unloadTime,'dd/MM/yyyy')}"/>
59
+            </tr>
60
+            </tbody>
61
+        </table>
62
+    </th:block>
63
+    <th:block th:if="${!cargo.routed}">
64
+        <p>
65
+            <strong>Not routed</strong> - <a th:href="@{/admin/selectItinerary(trackingId=${cargo.trackingId})}">Route this cargo</a>
66
+        </p>
67
+    </th:block>
68
+</div>
69
+</body>
70
+</html>

+ 24
- 0
src/main/webapp/WEB-INF/templates/adminDecorator.html Просмотреть файл

@@ -0,0 +1,24 @@
1
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
2
+
3
+<html xmlns="http://www.w3.org/1999/xhtml"
4
+      xmlns:th="http://www.thymeleaf.org">
5
+
6
+<body>
7
+<th:block th:fragment="adminbody">
8
+    <img id="logotype" th:src="@{/images/dddsample_logotype_small.png}" alt=""/>
9
+    <h1>Cargo Booking and Routing</h1>
10
+    <ul id="menu">
11
+        <li>
12
+            <a th:href="@{/admin/list.html}">
13
+                List all cargos
14
+            </a>
15
+        </li>
16
+        <li>
17
+            <a th:href="@{/admin/registration}">
18
+                Book new cargo
19
+            </a>
20
+        </li>
21
+    </ul>
22
+</th:block>
23
+</body>
24
+</html>

src/main/webapp/WEB-INF/thymeleaf/pub/track.html → src/main/webapp/WEB-INF/templates/pub/track.html Просмотреть файл


+ 1
- 15
src/main/webapp/WEB-INF/tracking-servlet.xml Просмотреть файл

@@ -3,25 +3,11 @@
3 3
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 4
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
5 5
 
6
-  <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
7
-    <property name="interceptors">
8
-      <list>
9
-        <ref bean="openSessionInViewInterceptor"/>
10
-      </list>
11
-    </property>
12
-  </bean>
13
-
14
-  <bean name="/track" class="se.citerus.dddsample.interfaces.tracking.CargoTrackingController">
15
-    <property name="cargoRepository" ref="cargoRepository"/>
16
-    <property name="handlingEventRepository" ref="handlingEventRepository"/>
17
-    <property name="messageSource" ref="messageSource"/>
18
-  </bean>
19
-
20 6
   <bean id="trackCommandValidator" class="se.citerus.dddsample.interfaces.tracking.TrackCommandValidator"/>
21 7
 
22 8
   <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
23 9
     <property name="templateMode" value="HTML5" />
24
-    <property name="prefix" value="/WEB-INF/thymeleaf/pub/"/>
10
+    <property name="prefix" value="/WEB-INF/templates/pub/"/>
25 11
     <property name="suffix" value=".html"/>
26 12
   </bean>
27 13
 

+ 0
- 22
src/main/webapp/WEB-INF/web.xml Просмотреть файл

@@ -65,27 +65,5 @@
65 65
     <url-pattern>/ws/*</url-pattern>
66 66
   </servlet-mapping>
67 67
 
68
-  <filter>
69
-    <filter-name>sitemesh</filter-name>
70
-    <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
71
-  </filter>
72
-
73
-  <filter-mapping>
74
-    <filter-name>sitemesh</filter-name>
75
-    <servlet-name>booking</servlet-name>
76
-  </filter-mapping>
77
-
78
-  <filter-mapping>
79
-    <filter-name>sitemesh</filter-name>
80
-    <servlet-name>tracking</servlet-name>
81
-  </filter-mapping>
82
-
83
-  <jsp-config>
84
-    <jsp-property-group>
85
-      <url-pattern>*.jsp</url-pattern>
86
-      <include-prelude>/WEB-INF/jspf/include.jspf</include-prelude>
87
-      <trim-directive-whitespaces>true</trim-directive-whitespaces>
88
-    </jsp-property-group>
89
-  </jsp-config>
90 68
 
91 69
 </web-app>

+ 473
- 0
src/main/webapp/css/bootstrap-datepicker.css Просмотреть файл

@@ -0,0 +1,473 @@
1
+/*!
2
+ * Datepicker for Bootstrap v1.6.0-dev (https://github.com/eternicode/bootstrap-datepicker)
3
+ *
4
+ * Copyright 2012 Stefan Petre
5
+ * Improvements by Andrew Rowls
6
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
7
+ */
8
+.datepicker {
9
+  padding: 4px;
10
+  -webkit-border-radius: 4px;
11
+  -moz-border-radius: 4px;
12
+  border-radius: 4px;
13
+  direction: ltr;
14
+}
15
+.datepicker-inline {
16
+  width: 220px;
17
+}
18
+.datepicker.datepicker-rtl {
19
+  direction: rtl;
20
+}
21
+.datepicker.datepicker-rtl table tr td span {
22
+  float: right;
23
+}
24
+.datepicker-dropdown {
25
+  top: 0;
26
+  left: 0;
27
+}
28
+.datepicker-dropdown:before {
29
+  content: '';
30
+  display: inline-block;
31
+  border-left: 7px solid transparent;
32
+  border-right: 7px solid transparent;
33
+  border-bottom: 7px solid #999999;
34
+  border-top: 0;
35
+  border-bottom-color: rgba(0, 0, 0, 0.2);
36
+  position: absolute;
37
+}
38
+.datepicker-dropdown:after {
39
+  content: '';
40
+  display: inline-block;
41
+  border-left: 6px solid transparent;
42
+  border-right: 6px solid transparent;
43
+  border-bottom: 6px solid #ffffff;
44
+  border-top: 0;
45
+  position: absolute;
46
+}
47
+.datepicker-dropdown.datepicker-orient-left:before {
48
+  left: 6px;
49
+}
50
+.datepicker-dropdown.datepicker-orient-left:after {
51
+  left: 7px;
52
+}
53
+.datepicker-dropdown.datepicker-orient-right:before {
54
+  right: 6px;
55
+}
56
+.datepicker-dropdown.datepicker-orient-right:after {
57
+  right: 7px;
58
+}
59
+.datepicker-dropdown.datepicker-orient-bottom:before {
60
+  top: -7px;
61
+}
62
+.datepicker-dropdown.datepicker-orient-bottom:after {
63
+  top: -6px;
64
+}
65
+.datepicker-dropdown.datepicker-orient-top:before {
66
+  bottom: -7px;
67
+  border-bottom: 0;
68
+  border-top: 7px solid #999999;
69
+}
70
+.datepicker-dropdown.datepicker-orient-top:after {
71
+  bottom: -6px;
72
+  border-bottom: 0;
73
+  border-top: 6px solid #ffffff;
74
+}
75
+.datepicker > div {
76
+  display: none;
77
+}
78
+.datepicker table {
79
+  margin: 0;
80
+  -webkit-touch-callout: none;
81
+  -webkit-user-select: none;
82
+  -khtml-user-select: none;
83
+  -moz-user-select: none;
84
+  -ms-user-select: none;
85
+  user-select: none;
86
+}
87
+.datepicker td,
88
+.datepicker th {
89
+  text-align: center;
90
+  width: 20px;
91
+  height: 20px;
92
+  -webkit-border-radius: 4px;
93
+  -moz-border-radius: 4px;
94
+  border-radius: 4px;
95
+  border: none;
96
+}
97
+.table-striped .datepicker table tr td,
98
+.table-striped .datepicker table tr th {
99
+  background-color: transparent;
100
+}
101
+.datepicker table tr td.day:hover,
102
+.datepicker table tr td.day.focused {
103
+  background: #eeeeee;
104
+  cursor: pointer;
105
+}
106
+.datepicker table tr td.old,
107
+.datepicker table tr td.new {
108
+  color: #999999;
109
+}
110
+.datepicker table tr td.disabled,
111
+.datepicker table tr td.disabled:hover {
112
+  background: none;
113
+  color: #999999;
114
+  cursor: default;
115
+}
116
+.datepicker table tr td.highlighted {
117
+  background: #d9edf7;
118
+  border-radius: 0;
119
+}
120
+.datepicker table tr td.today,
121
+.datepicker table tr td.today:hover,
122
+.datepicker table tr td.today.disabled,
123
+.datepicker table tr td.today.disabled:hover {
124
+  background-color: #fde19a;
125
+  background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a);
126
+  background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a);
127
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
128
+  background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a);
129
+  background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a);
130
+  background-image: linear-gradient(to bottom, #fdd49a, #fdf59a);
131
+  background-repeat: repeat-x;
132
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
133
+  border-color: #fdf59a #fdf59a #fbed50;
134
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
135
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
136
+  color: #000;
137
+}
138
+.datepicker table tr td.today:hover,
139
+.datepicker table tr td.today:hover:hover,
140
+.datepicker table tr td.today.disabled:hover,
141
+.datepicker table tr td.today.disabled:hover:hover,
142
+.datepicker table tr td.today:active,
143
+.datepicker table tr td.today:hover:active,
144
+.datepicker table tr td.today.disabled:active,
145
+.datepicker table tr td.today.disabled:hover:active,
146
+.datepicker table tr td.today.active,
147
+.datepicker table tr td.today:hover.active,
148
+.datepicker table tr td.today.disabled.active,
149
+.datepicker table tr td.today.disabled:hover.active,
150
+.datepicker table tr td.today.disabled,
151
+.datepicker table tr td.today:hover.disabled,
152
+.datepicker table tr td.today.disabled.disabled,
153
+.datepicker table tr td.today.disabled:hover.disabled,
154
+.datepicker table tr td.today[disabled],
155
+.datepicker table tr td.today:hover[disabled],
156
+.datepicker table tr td.today.disabled[disabled],
157
+.datepicker table tr td.today.disabled:hover[disabled] {
158
+  background-color: #fdf59a;
159
+}
160
+.datepicker table tr td.today:active,
161
+.datepicker table tr td.today:hover:active,
162
+.datepicker table tr td.today.disabled:active,
163
+.datepicker table tr td.today.disabled:hover:active,
164
+.datepicker table tr td.today.active,
165
+.datepicker table tr td.today:hover.active,
166
+.datepicker table tr td.today.disabled.active,
167
+.datepicker table tr td.today.disabled:hover.active {
168
+  background-color: #fbf069 \9;
169
+}
170
+.datepicker table tr td.today:hover:hover {
171
+  color: #000;
172
+}
173
+.datepicker table tr td.today.active:hover {
174
+  color: #fff;
175
+}
176
+.datepicker table tr td.range,
177
+.datepicker table tr td.range:hover,
178
+.datepicker table tr td.range.disabled,
179
+.datepicker table tr td.range.disabled:hover {
180
+  background: #eeeeee;
181
+  -webkit-border-radius: 0;
182
+  -moz-border-radius: 0;
183
+  border-radius: 0;
184
+}
185
+.datepicker table tr td.range.today,
186
+.datepicker table tr td.range.today:hover,
187
+.datepicker table tr td.range.today.disabled,
188
+.datepicker table tr td.range.today.disabled:hover {
189
+  background-color: #f3d17a;
190
+  background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a);
191
+  background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a);
192
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
193
+  background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a);
194
+  background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a);
195
+  background-image: linear-gradient(to bottom, #f3c17a, #f3e97a);
196
+  background-repeat: repeat-x;
197
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
198
+  border-color: #f3e97a #f3e97a #edde34;
199
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
200
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
201
+  -webkit-border-radius: 0;
202
+  -moz-border-radius: 0;
203
+  border-radius: 0;
204
+}
205
+.datepicker table tr td.range.today:hover,
206
+.datepicker table tr td.range.today:hover:hover,
207
+.datepicker table tr td.range.today.disabled:hover,
208
+.datepicker table tr td.range.today.disabled:hover:hover,
209
+.datepicker table tr td.range.today:active,
210
+.datepicker table tr td.range.today:hover:active,
211
+.datepicker table tr td.range.today.disabled:active,
212
+.datepicker table tr td.range.today.disabled:hover:active,
213
+.datepicker table tr td.range.today.active,
214
+.datepicker table tr td.range.today:hover.active,
215
+.datepicker table tr td.range.today.disabled.active,
216
+.datepicker table tr td.range.today.disabled:hover.active,
217
+.datepicker table tr td.range.today.disabled,
218
+.datepicker table tr td.range.today:hover.disabled,
219
+.datepicker table tr td.range.today.disabled.disabled,
220
+.datepicker table tr td.range.today.disabled:hover.disabled,
221
+.datepicker table tr td.range.today[disabled],
222
+.datepicker table tr td.range.today:hover[disabled],
223
+.datepicker table tr td.range.today.disabled[disabled],
224
+.datepicker table tr td.range.today.disabled:hover[disabled] {
225
+  background-color: #f3e97a;
226
+}
227
+.datepicker table tr td.range.today:active,
228
+.datepicker table tr td.range.today:hover:active,
229
+.datepicker table tr td.range.today.disabled:active,
230
+.datepicker table tr td.range.today.disabled:hover:active,
231
+.datepicker table tr td.range.today.active,
232
+.datepicker table tr td.range.today:hover.active,
233
+.datepicker table tr td.range.today.disabled.active,
234
+.datepicker table tr td.range.today.disabled:hover.active {
235
+  background-color: #efe24b \9;
236
+}
237
+.datepicker table tr td.selected,
238
+.datepicker table tr td.selected:hover,
239
+.datepicker table tr td.selected.disabled,
240
+.datepicker table tr td.selected.disabled:hover {
241
+  background-color: #9e9e9e;
242
+  background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080);
243
+  background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080);
244
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
245
+  background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080);
246
+  background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080);
247
+  background-image: linear-gradient(to bottom, #b3b3b3, #808080);
248
+  background-repeat: repeat-x;
249
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
250
+  border-color: #808080 #808080 #595959;
251
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
252
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
253
+  color: #fff;
254
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
255
+}
256
+.datepicker table tr td.selected:hover,
257
+.datepicker table tr td.selected:hover:hover,
258
+.datepicker table tr td.selected.disabled:hover,
259
+.datepicker table tr td.selected.disabled:hover:hover,
260
+.datepicker table tr td.selected:active,
261
+.datepicker table tr td.selected:hover:active,
262
+.datepicker table tr td.selected.disabled:active,
263
+.datepicker table tr td.selected.disabled:hover:active,
264
+.datepicker table tr td.selected.active,
265
+.datepicker table tr td.selected:hover.active,
266
+.datepicker table tr td.selected.disabled.active,
267
+.datepicker table tr td.selected.disabled:hover.active,
268
+.datepicker table tr td.selected.disabled,
269
+.datepicker table tr td.selected:hover.disabled,
270
+.datepicker table tr td.selected.disabled.disabled,
271
+.datepicker table tr td.selected.disabled:hover.disabled,
272
+.datepicker table tr td.selected[disabled],
273
+.datepicker table tr td.selected:hover[disabled],
274
+.datepicker table tr td.selected.disabled[disabled],
275
+.datepicker table tr td.selected.disabled:hover[disabled] {
276
+  background-color: #808080;
277
+}
278
+.datepicker table tr td.selected:active,
279
+.datepicker table tr td.selected:hover:active,
280
+.datepicker table tr td.selected.disabled:active,
281
+.datepicker table tr td.selected.disabled:hover:active,
282
+.datepicker table tr td.selected.active,
283
+.datepicker table tr td.selected:hover.active,
284
+.datepicker table tr td.selected.disabled.active,
285
+.datepicker table tr td.selected.disabled:hover.active {
286
+  background-color: #666666 \9;
287
+}
288
+.datepicker table tr td.active,
289
+.datepicker table tr td.active:hover,
290
+.datepicker table tr td.active.disabled,
291
+.datepicker table tr td.active.disabled:hover {
292
+  background-color: #006dcc;
293
+  background-image: -moz-linear-gradient(to bottom, #0088cc, #0044cc);
294
+  background-image: -ms-linear-gradient(to bottom, #0088cc, #0044cc);
295
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
296
+  background-image: -webkit-linear-gradient(to bottom, #0088cc, #0044cc);
297
+  background-image: -o-linear-gradient(to bottom, #0088cc, #0044cc);
298
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
299
+  background-repeat: repeat-x;
300
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
301
+  border-color: #0044cc #0044cc #002a80;
302
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
303
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
304
+  color: #fff;
305
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
306
+}
307
+.datepicker table tr td.active:hover,
308
+.datepicker table tr td.active:hover:hover,
309
+.datepicker table tr td.active.disabled:hover,
310
+.datepicker table tr td.active.disabled:hover:hover,
311
+.datepicker table tr td.active:active,
312
+.datepicker table tr td.active:hover:active,
313
+.datepicker table tr td.active.disabled:active,
314
+.datepicker table tr td.active.disabled:hover:active,
315
+.datepicker table tr td.active.active,
316
+.datepicker table tr td.active:hover.active,
317
+.datepicker table tr td.active.disabled.active,
318
+.datepicker table tr td.active.disabled:hover.active,
319
+.datepicker table tr td.active.disabled,
320
+.datepicker table tr td.active:hover.disabled,
321
+.datepicker table tr td.active.disabled.disabled,
322
+.datepicker table tr td.active.disabled:hover.disabled,
323
+.datepicker table tr td.active[disabled],
324
+.datepicker table tr td.active:hover[disabled],
325
+.datepicker table tr td.active.disabled[disabled],
326
+.datepicker table tr td.active.disabled:hover[disabled] {
327
+  background-color: #0044cc;
328
+}
329
+.datepicker table tr td.active:active,
330
+.datepicker table tr td.active:hover:active,
331
+.datepicker table tr td.active.disabled:active,
332
+.datepicker table tr td.active.disabled:hover:active,
333
+.datepicker table tr td.active.active,
334
+.datepicker table tr td.active:hover.active,
335
+.datepicker table tr td.active.disabled.active,
336
+.datepicker table tr td.active.disabled:hover.active {
337
+  background-color: #003399 \9;
338
+}
339
+.datepicker table tr td span {
340
+  display: block;
341
+  width: 23%;
342
+  height: 54px;
343
+  line-height: 54px;
344
+  float: left;
345
+  margin: 1%;
346
+  cursor: pointer;
347
+  -webkit-border-radius: 4px;
348
+  -moz-border-radius: 4px;
349
+  border-radius: 4px;
350
+}
351
+.datepicker table tr td span:hover {
352
+  background: #eeeeee;
353
+}
354
+.datepicker table tr td span.disabled,
355
+.datepicker table tr td span.disabled:hover {
356
+  background: none;
357
+  color: #999999;
358
+  cursor: default;
359
+}
360
+.datepicker table tr td span.active,
361
+.datepicker table tr td span.active:hover,
362
+.datepicker table tr td span.active.disabled,
363
+.datepicker table tr td span.active.disabled:hover {
364
+  background-color: #006dcc;
365
+  background-image: -moz-linear-gradient(to bottom, #0088cc, #0044cc);
366
+  background-image: -ms-linear-gradient(to bottom, #0088cc, #0044cc);
367
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
368
+  background-image: -webkit-linear-gradient(to bottom, #0088cc, #0044cc);
369
+  background-image: -o-linear-gradient(to bottom, #0088cc, #0044cc);
370
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
371
+  background-repeat: repeat-x;
372
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
373
+  border-color: #0044cc #0044cc #002a80;
374
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
375
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
376
+  color: #fff;
377
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
378
+}
379
+.datepicker table tr td span.active:hover,
380
+.datepicker table tr td span.active:hover:hover,
381
+.datepicker table tr td span.active.disabled:hover,
382
+.datepicker table tr td span.active.disabled:hover:hover,
383
+.datepicker table tr td span.active:active,
384
+.datepicker table tr td span.active:hover:active,
385
+.datepicker table tr td span.active.disabled:active,
386
+.datepicker table tr td span.active.disabled:hover:active,
387
+.datepicker table tr td span.active.active,
388
+.datepicker table tr td span.active:hover.active,
389
+.datepicker table tr td span.active.disabled.active,
390
+.datepicker table tr td span.active.disabled:hover.active,
391
+.datepicker table tr td span.active.disabled,
392
+.datepicker table tr td span.active:hover.disabled,
393
+.datepicker table tr td span.active.disabled.disabled,
394
+.datepicker table tr td span.active.disabled:hover.disabled,
395
+.datepicker table tr td span.active[disabled],
396
+.datepicker table tr td span.active:hover[disabled],
397
+.datepicker table tr td span.active.disabled[disabled],
398
+.datepicker table tr td span.active.disabled:hover[disabled] {
399
+  background-color: #0044cc;
400
+}
401
+.datepicker table tr td span.active:active,
402
+.datepicker table tr td span.active:hover:active,
403
+.datepicker table tr td span.active.disabled:active,
404
+.datepicker table tr td span.active.disabled:hover:active,
405
+.datepicker table tr td span.active.active,
406
+.datepicker table tr td span.active:hover.active,
407
+.datepicker table tr td span.active.disabled.active,
408
+.datepicker table tr td span.active.disabled:hover.active {
409
+  background-color: #003399 \9;
410
+}
411
+.datepicker table tr td span.old,
412
+.datepicker table tr td span.new {
413
+  color: #999999;
414
+}
415
+.datepicker .datepicker-switch {
416
+  width: 145px;
417
+}
418
+.datepicker .datepicker-switch,
419
+.datepicker .prev,
420
+.datepicker .next,
421
+.datepicker tfoot tr th {
422
+  cursor: pointer;
423
+}
424
+.datepicker .datepicker-switch:hover,
425
+.datepicker .prev:hover,
426
+.datepicker .next:hover,
427
+.datepicker tfoot tr th:hover {
428
+  background: #eeeeee;
429
+}
430
+.datepicker .cw {
431
+  font-size: 10px;
432
+  width: 12px;
433
+  padding: 0 2px 0 5px;
434
+  vertical-align: middle;
435
+}
436
+.input-append.date .add-on,
437
+.input-prepend.date .add-on {
438
+  cursor: pointer;
439
+}
440
+.input-append.date .add-on i,
441
+.input-prepend.date .add-on i {
442
+  margin-top: 3px;
443
+}
444
+.input-daterange input {
445
+  text-align: center;
446
+}
447
+.input-daterange input:first-child {
448
+  -webkit-border-radius: 3px 0 0 3px;
449
+  -moz-border-radius: 3px 0 0 3px;
450
+  border-radius: 3px 0 0 3px;
451
+}
452
+.input-daterange input:last-child {
453
+  -webkit-border-radius: 0 3px 3px 0;
454
+  -moz-border-radius: 0 3px 3px 0;
455
+  border-radius: 0 3px 3px 0;
456
+}
457
+.input-daterange .add-on {
458
+  display: inline-block;
459
+  width: auto;
460
+  min-width: 16px;
461
+  height: 18px;
462
+  padding: 4px 5px;
463
+  font-weight: normal;
464
+  line-height: 18px;
465
+  text-align: center;
466
+  text-shadow: 0 1px 0 #ffffff;
467
+  vertical-align: middle;
468
+  background-color: #eeeeee;
469
+  border: 1px solid #ccc;
470
+  margin-left: -5px;
471
+  margin-right: -5px;
472
+}
473
+/*# sourceMappingURL=bootstrap-datepicker.css.map */

+ 6760
- 0
src/main/webapp/css/bootstrap.css
Разница между файлами не показана из-за своего большого размера
Просмотреть файл


Двоичные данные
src/main/webapp/fonts/glyphicons-halflings-regular.ttf Просмотреть файл


Двоичные данные
src/main/webapp/fonts/glyphicons-halflings-regular.woff Просмотреть файл


Двоичные данные
src/main/webapp/fonts/glyphicons-halflings-regular.woff2 Просмотреть файл


+ 2007
- 0
src/main/webapp/js/bootstrap-datepicker.js
Разница между файлами не показана из-за своего большого размера
Просмотреть файл


+ 9210
- 0
src/main/webapp/js/jquery-2.1.4.js
Разница между файлами не показана из-за своего большого размера
Просмотреть файл


+ 0
- 22
src/test/java/se/citerus/dddsample/interfaces/booking/web/CargoAdminControllerTest.java Просмотреть файл

@@ -1,22 +0,0 @@
1
-package se.citerus.dddsample.interfaces.booking.web;
2
-
3
-import org.easymock.EasyMock;
4
-import org.junit.Test;
5
-import org.springframework.mock.web.MockHttpServletRequest;
6
-import org.springframework.mock.web.MockHttpServletResponse;
7
-import se.citerus.dddsample.interfaces.booking.facade.BookingServiceFacade;
8
-
9
-public class CargoAdminControllerTest {
10
-
11
-    @Test
12
-    public void testAssignItinerary() throws Exception {
13
-        CargoAdminController cargoAdminController = new CargoAdminController();
14
-        BookingServiceFacade bookingServiceFacade = EasyMock.createMock(BookingServiceFacade.class);
15
-        cargoAdminController.setBookingServiceFacade(bookingServiceFacade);
16
-
17
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", "assignItinerary.html");
18
-        MockHttpServletResponse response = new MockHttpServletResponse();
19
-
20
-        cargoAdminController.handleRequest(request, response);
21
-    }
22
-}