package net.java.cargotracker.interfaces.booking.facade.internal; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import net.java.cargotracker.application.BookingService; import net.java.cargotracker.domain.model.cargo.Cargo; import net.java.cargotracker.domain.model.cargo.CargoRepository; import net.java.cargotracker.domain.model.cargo.Itinerary; import net.java.cargotracker.domain.model.cargo.TrackingId; import net.java.cargotracker.domain.model.location.Location; import net.java.cargotracker.domain.model.location.LocationRepository; import net.java.cargotracker.domain.model.location.UnLocode; import net.java.cargotracker.domain.model.voyage.VoyageRepository; import net.java.cargotracker.interfaces.booking.facade.BookingServiceFacade; import net.java.cargotracker.interfaces.booking.facade.dto.CargoRoute; import net.java.cargotracker.interfaces.booking.facade.dto.RouteCandidate; import net.java.cargotracker.interfaces.booking.facade.internal.assembler.CargoRouteDtoAssembler; import net.java.cargotracker.interfaces.booking.facade.internal.assembler.ItineraryCandidateDtoAssembler; import net.java.cargotracker.interfaces.booking.facade.internal.assembler.LocationDtoAssembler; @ApplicationScoped public class DefaultBookingServiceFacade implements BookingServiceFacade, Serializable { private static final long serialVersionUID = 1L; @Inject private BookingService bookingService; @Inject private LocationRepository locationRepository; @Inject private CargoRepository cargoRepository; @Inject private VoyageRepository voyageRepository; @Override public List<net.java.cargotracker.interfaces.booking.facade.dto.Location> listShippingLocations() { List<Location> allLocations = locationRepository.findAll(); LocationDtoAssembler assembler = new LocationDtoAssembler(); return assembler.toDtoList(allLocations); } @Override public String bookNewCargo(String origin, String destination, Date arrivalDeadline) { TrackingId trackingId = bookingService.bookNewCargo( new UnLocode(origin), new UnLocode(destination), arrivalDeadline); return trackingId.getIdString(); } @Override public CargoRoute loadCargoForRouting(String trackingId) { Cargo cargo = cargoRepository.find(new TrackingId(trackingId)); CargoRouteDtoAssembler assembler = new CargoRouteDtoAssembler(); return assembler.toDto(cargo); } @Override public void assignCargoToRoute(String trackingIdStr, RouteCandidate routeCandidateDTO) { Itinerary itinerary = new ItineraryCandidateDtoAssembler() .fromDTO(routeCandidateDTO, voyageRepository, locationRepository); TrackingId trackingId = new TrackingId(trackingIdStr); bookingService.assignCargoToRoute(itinerary, trackingId); } @Override public void changeDestination(String trackingId, String destinationUnLocode) { bookingService.changeDestination(new TrackingId(trackingId), new UnLocode(destinationUnLocode)); } @Override public List<CargoRoute> listAllCargos() { List<Cargo> cargoList = cargoRepository.findAll(); List<CargoRoute> dtoList = new ArrayList<>(cargoList.size()); CargoRouteDtoAssembler assembler = new CargoRouteDtoAssembler(); for (Cargo cargo : cargoList) { dtoList.add(assembler.toDto(cargo)); } return dtoList; } @Override public List<RouteCandidate> requestPossibleRoutesForCargo(String trackingId) { List<Itinerary> itineraries = bookingService .requestPossibleRoutesForCargo(new TrackingId(trackingId)); List<RouteCandidate> routeCandidates = new ArrayList<>( itineraries.size()); ItineraryCandidateDtoAssembler dtoAssembler = new ItineraryCandidateDtoAssembler(); for (Itinerary itinerary : itineraries) { routeCandidates.add(dtoAssembler.toDTO(itinerary)); } return routeCandidates; } }