RoutingServiceImpl.java 3.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package se.citerus.dddsample.service;
  2. import org.springframework.transaction.annotation.Transactional;
  3. import se.citerus.dddsample.domain.*;
  4. import se.citerus.dddsample.repository.CargoRepository;
  5. import se.citerus.dddsample.repository.CarrierMovementRepository;
  6. import se.citerus.dddsample.repository.LocationRepository;
  7. import se.citerus.dddsample.service.dto.ItineraryCandidateDTO;
  8. import se.citerus.dddsample.service.dto.assembler.ItineraryCandidateDTOAssembler;
  9. import java.util.ArrayList;
  10. import java.util.Collections;
  11. import java.util.List;
  12. import java.util.Random;
  13. /**
  14. * Simple routing service implementation that randomly creates a number
  15. * of different itineraries.
  16. */
  17. public class RoutingServiceImpl implements RoutingService {
  18. private LocationRepository locationRepository;
  19. private CargoRepository cargoRepository;
  20. private CarrierMovementRepository carrierMovementRepository;
  21. Random random = new Random();
  22. @Transactional(readOnly = true)
  23. public List<ItineraryCandidateDTO> calculatePossibleRoutes(TrackingId trackingId, Specification specification) {
  24. final Cargo cargo = cargoRepository.find(trackingId);
  25. if (cargo == null) {
  26. return Collections.emptyList();
  27. }
  28. List<Location> allLocations = locationRepository.findAll();
  29. allLocations.remove(cargo.origin());
  30. allLocations.remove(cargo.finalDestination());
  31. final int candidateCount = getRandomNumberOfCandidates();
  32. final List<ItineraryCandidateDTO> candidates = new ArrayList<ItineraryCandidateDTO>(candidateCount);
  33. final ItineraryCandidateDTOAssembler assembler = new ItineraryCandidateDTOAssembler();
  34. for (int i = 0; i < candidateCount; i++) {
  35. allLocations = getRandomChunkOfLocations(allLocations);
  36. final List<Leg> legs = new ArrayList<Leg>(allLocations.size() - 1);
  37. final Location firstLegTo = allLocations.get(0);
  38. final CarrierMovement cm1 = carrierMovementRepository.find(new CarrierMovementId("CAR_002"));
  39. legs.add(new Leg(cm1, cargo.origin(), firstLegTo));
  40. for (int j = 0; j < allLocations.size() - 1; j++) {
  41. legs.add(new Leg(getRandomCarrierMovement(), allLocations.get(j), allLocations.get(j + 1)));
  42. }
  43. final Location lastLegFrom = allLocations.get(allLocations.size() - 1);
  44. legs.add(new Leg(getRandomCarrierMovement(), lastLegFrom, cargo.finalDestination()));
  45. final Itinerary itinerary = new Itinerary(legs);
  46. candidates.add(assembler.toDTO(itinerary));
  47. }
  48. return candidates;
  49. }
  50. private List<Location> getRandomChunkOfLocations(List<Location> allLocations) {
  51. Collections.shuffle(allLocations);
  52. final int total = allLocations.size();
  53. final int chunk = total > 4 ? (total - 4) + random.nextInt(5) : total;
  54. return allLocations.subList(0, chunk);
  55. }
  56. private int getRandomNumberOfCandidates() {
  57. return 1 + random.nextInt(4);
  58. }
  59. private CarrierMovement getRandomCarrierMovement() {
  60. final CarrierMovementId id = new CarrierMovementId("CAR_00" + (random.nextInt(9) + 1));
  61. return carrierMovementRepository.find(id);
  62. }
  63. public void setLocationRepository(LocationRepository locationRepository) {
  64. this.locationRepository = locationRepository;
  65. }
  66. public void setCargoRepository(CargoRepository cargoRepository) {
  67. this.cargoRepository = cargoRepository;
  68. }
  69. public void setCarrierMovementRepository(CarrierMovementRepository carrierMovementRepository) {
  70. this.carrierMovementRepository = carrierMovementRepository;
  71. }
  72. }