CargoTrackingController.java 3.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package se.citerus.dddsample.interfaces.tracking;
  2. import org.springframework.context.MessageSource;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.validation.BindingResult;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import org.springframework.web.servlet.support.RequestContextUtils;
  8. import se.citerus.dddsample.domain.model.cargo.Cargo;
  9. import se.citerus.dddsample.domain.model.cargo.CargoRepository;
  10. import se.citerus.dddsample.domain.model.cargo.TrackingId;
  11. import se.citerus.dddsample.domain.model.handling.HandlingEvent;
  12. import se.citerus.dddsample.domain.model.handling.HandlingEventRepository;
  13. import javax.servlet.http.HttpServletRequest;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Locale;
  17. import java.util.Map;
  18. /**
  19. * Controller for tracking cargo. This interface sits immediately on top of the
  20. * domain layer, unlike the booking interface which has a a remote facade and supporting
  21. * DTOs in between.
  22. * <p>
  23. * An adapter class, designed for the tracking use case, is used to wrap the domain model
  24. * to make it easier to work with in a web page rendering context. We do not want to apply
  25. * view rendering constraints to the design of our domain model, and the adapter
  26. * helps us shield the domain model classes.
  27. * <p>
  28. *
  29. * @eee se.citerus.dddsample.application.web.CargoTrackingViewAdapter
  30. * @see se.citerus.dddsample.interfaces.booking.web.CargoAdminController
  31. */
  32. @Controller
  33. public final class CargoTrackingController {
  34. private CargoRepository cargoRepository;
  35. private HandlingEventRepository handlingEventRepository;
  36. private MessageSource messageSource;
  37. @RequestMapping(method = RequestMethod.GET)
  38. public Map<String, CargoTrackingViewAdapter> get(final TrackCommand trackCommand) {
  39. return new HashMap<>();
  40. }
  41. @RequestMapping(method = RequestMethod.POST)
  42. protected Map<String, CargoTrackingViewAdapter> onSubmit(final HttpServletRequest request,
  43. final TrackCommand command,
  44. final BindingResult bindingResult) {
  45. new TrackCommandValidator().validate(command, bindingResult);
  46. final TrackingId trackingId = new TrackingId(command.getTrackingId());
  47. final Cargo cargo = cargoRepository.find(trackingId);
  48. final Map<String, CargoTrackingViewAdapter> model = new HashMap<String, CargoTrackingViewAdapter>();
  49. if (cargo != null) {
  50. final Locale locale = RequestContextUtils.getLocale(request);
  51. final List<HandlingEvent> handlingEvents = handlingEventRepository.lookupHandlingHistoryOfCargo(trackingId).distinctEventsByCompletionTime();
  52. model.put("cargo", new CargoTrackingViewAdapter(cargo, messageSource, locale, handlingEvents));
  53. } else {
  54. bindingResult.rejectValue("trackingId", "cargo.unknown_id", new Object[]{command.getTrackingId()}, "Unknown tracking id");
  55. }
  56. return model;
  57. }
  58. public void setCargoRepository(CargoRepository cargoRepository) {
  59. this.cargoRepository = cargoRepository;
  60. }
  61. public void setHandlingEventRepository(HandlingEventRepository handlingEventRepository) {
  62. this.handlingEventRepository = handlingEventRepository;
  63. }
  64. public void setMessageSource(MessageSource messageSource) {
  65. this.messageSource = messageSource;
  66. }
  67. }