package se.citerus.dddsample.ui; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import se.citerus.dddsample.application.remoting.BookingServiceFacade; import se.citerus.dddsample.application.remoting.dto.CargoRoutingDTO; import se.citerus.dddsample.application.remoting.dto.ItineraryCandidateDTO; import se.citerus.dddsample.application.remoting.dto.LegDTO; import se.citerus.dddsample.application.remoting.dto.LocationDTO; import se.citerus.dddsample.ui.command.RegistrationCommand; import se.citerus.dddsample.ui.command.RouteAssignmentCommand; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Handles cargo booking and routing. Operates against a dedicated remoting service facade, * and could easily be rewritten as a thick Swing client. Completely separated from the domain layer, * unlike the tracking user interface. *

* In order to successfully keep the domain model shielded from user interface considerations, * this approach is generally preferred to the one taken in the tracking controller. However, * there is never any one perfect solution for all situations, so we've chosen to demonstrate * two polarized ways to build user interfaces. * * @see CargoTrackingController */ public final class CargoAdminController extends MultiActionController { private BookingServiceFacade bookingServiceFacade; public Map registrationForm(final HttpServletRequest request, final HttpServletResponse response) throws Exception { final Map map = new HashMap(); final List dtoList = bookingServiceFacade.listShippingLocations(); final List unLocodeStrings = new ArrayList(); for (LocationDTO dto : dtoList) { unLocodeStrings.add(dto.getUnLocode()); } map.put("unlocodes", unLocodeStrings); return map; } public void register(final HttpServletRequest request, final HttpServletResponse response, final RegistrationCommand command) throws Exception { final String trackingId = bookingServiceFacade.registerNewCargo( command.getOriginUnlocode(), command.getDestinationUnlocode() ); response.sendRedirect("show.html?trackingId=" + trackingId); } public Map list(HttpServletRequest request, HttpServletResponse response) throws Exception { final Map map = new HashMap(); final List cargoList = bookingServiceFacade.listAllCargos(); map.put("cargoList", cargoList); return map; } public Map show(final HttpServletRequest request, final HttpServletResponse response) throws Exception { final Map map = new HashMap(); final String trackingId = request.getParameter("trackingId"); final CargoRoutingDTO dto = bookingServiceFacade.loadCargoForRouting(trackingId); map.put("cargo", dto); return map; } public Map selectItinerary(final HttpServletRequest request, final HttpServletResponse response) throws Exception { final Map map = new HashMap(); final String trackingId = request.getParameter("trackingId"); final List itineraryCandidates = bookingServiceFacade.requestPossibleRoutesForCargo(trackingId); if (request.getParameter("spec") != null) { map.put("itineraryCandidates", itineraryCandidates); } final CargoRoutingDTO cargoDTO = bookingServiceFacade.loadCargoForRouting(trackingId); map.put("origin", cargoDTO.getOrigin()); map.put("destination", cargoDTO.getFinalDestination()); map.put("trackingId", trackingId); return map; } public void assignItinerary(final HttpServletRequest request, final HttpServletResponse response, RouteAssignmentCommand command) throws Exception { final List legDTOs = new ArrayList(command.getLegs().size()); for (RouteAssignmentCommand.LegCommand leg : command.getLegs()) { legDTOs.add(new LegDTO(leg.getCarrierMovementId(), leg.getFromUnLocode(), leg.getToUnLocode())); } final ItineraryCandidateDTO selectedItinerary = new ItineraryCandidateDTO(legDTOs); bookingServiceFacade.assignCargoToRoute(command.getTrackingId(), selectedItinerary); response.sendRedirect("list.html"); } public void setBookingServiceFacade(BookingServiceFacade bookingServiceFacade) { this.bookingServiceFacade = bookingServiceFacade; } }