BookingServiceImpl.java 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package se.citerus.dddsample.application.impl;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.springframework.transaction.annotation.Transactional;
  5. import se.citerus.dddsample.application.BookingService;
  6. import se.citerus.dddsample.domain.model.cargo.*;
  7. import se.citerus.dddsample.domain.model.location.Location;
  8. import se.citerus.dddsample.domain.model.location.LocationRepository;
  9. import se.citerus.dddsample.domain.model.location.UnLocode;
  10. import se.citerus.dddsample.domain.service.RoutingService;
  11. import java.util.Collections;
  12. import java.util.Date;
  13. import java.util.List;
  14. public final class BookingServiceImpl implements BookingService {
  15. private final CargoRepository cargoRepository;
  16. private final LocationRepository locationRepository;
  17. private final RoutingService routingService;
  18. private final Log logger = LogFactory.getLog(getClass());
  19. public BookingServiceImpl(final CargoRepository cargoRepository,
  20. final LocationRepository locationRepository,
  21. final RoutingService routingService) {
  22. this.cargoRepository = cargoRepository;
  23. this.locationRepository = locationRepository;
  24. this.routingService = routingService;
  25. }
  26. @Override
  27. @Transactional
  28. public TrackingId bookNewCargo(final UnLocode originUnLocode,
  29. final UnLocode destinationUnLocode,
  30. final Date arrivalDeadline) {
  31. // TODO modeling this as a cargo factory might be suitable
  32. final TrackingId trackingId = cargoRepository.nextTrackingId();
  33. final Location origin = locationRepository.find(originUnLocode);
  34. final Location destination = locationRepository.find(destinationUnLocode);
  35. final RouteSpecification routeSpecification = new RouteSpecification(origin, destination, arrivalDeadline);
  36. final Cargo cargo = new Cargo(trackingId, routeSpecification);
  37. cargoRepository.store(cargo);
  38. logger.info("Booked new cargo with tracking id " + cargo.trackingId().idString());
  39. return cargo.trackingId();
  40. }
  41. @Override
  42. @Transactional
  43. public List<Itinerary> requestPossibleRoutesForCargo(final TrackingId trackingId) {
  44. final Cargo cargo = cargoRepository.find(trackingId);
  45. if (cargo == null) {
  46. return Collections.emptyList();
  47. }
  48. return routingService.fetchRoutesForSpecification(cargo.routeSpecification());
  49. }
  50. @Override
  51. @Transactional
  52. public void assignCargoToRoute(final Itinerary itinerary, final TrackingId trackingId) {
  53. final Cargo cargo = cargoRepository.find(trackingId);
  54. if (cargo == null) {
  55. throw new IllegalArgumentException("Can't assign itinerary to non-existing cargo " + trackingId);
  56. }
  57. cargo.assignToRoute(itinerary);
  58. cargoRepository.store(cargo);
  59. logger.info("Assigned cargo " + trackingId + " to new route");
  60. }
  61. @Override
  62. @Transactional
  63. public void changeDestination(final TrackingId trackingId, final UnLocode unLocode) {
  64. final Cargo cargo = cargoRepository.find(trackingId);
  65. final Location newDestination = locationRepository.find(unLocode);
  66. final RouteSpecification routeSpecification = new RouteSpecification(
  67. cargo.origin(), newDestination, cargo.routeSpecification().arrivalDeadline()
  68. );
  69. cargo.specifyNewRoute(routeSpecification);
  70. cargoRepository.store(cargo);
  71. logger.info("Changed destination for cargo " + trackingId + " to " + routeSpecification.destination());
  72. }
  73. }