From a36f812edf297cc67cb05b735246a64802940381 Mon Sep 17 00:00:00 2001 From: Tobias Eidelpes Date: Tue, 27 Apr 2021 10:59:09 +0200 Subject: [PATCH] Implement create(), confirm() and match() (2.1.1.1) --- .../ass2/service/trip/impl/TripService.java | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 ass2-service/trip/src/main/java/dst/ass2/service/trip/impl/TripService.java diff --git a/ass2-service/trip/src/main/java/dst/ass2/service/trip/impl/TripService.java b/ass2-service/trip/src/main/java/dst/ass2/service/trip/impl/TripService.java new file mode 100644 index 0000000..5822c98 --- /dev/null +++ b/ass2-service/trip/src/main/java/dst/ass2/service/trip/impl/TripService.java @@ -0,0 +1,189 @@ +package dst.ass2.service.trip.impl; + +import dst.ass1.jpa.dao.*; +import dst.ass1.jpa.model.*; +import dst.ass2.service.api.match.IMatchingService; +import dst.ass2.service.api.trip.*; + +import javax.annotation.Resource; +import javax.inject.Singleton; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; +import java.util.Date; + +@Singleton +public class TripService implements ITripService { + @PersistenceContext + private EntityManager entityManager; + @Resource + private IModelFactory modelFactory; + @Resource + private IDAOFactory daoFactory; + @Resource + private IMatchingService matchingService; + + @Transactional + @Override + public TripDTO create(Long riderId, Long pickupId, Long destinationId) throws EntityNotFoundException { + IRider rider = getRider(riderId); + ILocation pickup = getLocation(pickupId); + ILocation destination = getLocation(destinationId); + + ITrip trip = modelFactory.createTrip(); + trip.setRider(rider); + trip.setPickup(pickup); + trip.setDestination(destination); + trip.setState(TripState.CREATED); + entityManager.persist(trip); + + TripDTO tripDTO = new TripDTO(); + tripDTO.setId(trip.getId()); + tripDTO.setRiderId(riderId); + tripDTO.setPickupId(pickupId); + tripDTO.setDestinationId(destinationId); + MoneyDTO fare; + try { + fare = matchingService.calculateFare(tripDTO); + } catch (InvalidTripException e) { + // TODO: print out logging message + fare = null; + } + tripDTO.setFare(fare); + + return tripDTO; + } + + @Transactional + @Override + public void confirm(Long tripId) throws EntityNotFoundException, IllegalStateException, InvalidTripException { + ITripDAO tripDAO = daoFactory.createTripDAO(); + ITrip trip = tripDAO.findById(tripId); + if (trip == null) + throw new EntityNotFoundException("Could not find trip with id " + tripId); + if (trip.getState() != TripState.CREATED) + throw new IllegalStateException("Trip is not in CREATED state"); + if (trip.getRider() == null) + throw new IllegalStateException("Trip's rider is not set"); + + TripDTO tripDTO = new TripDTO(); + tripDTO.setPickupId(trip.getPickup().getId()); + tripDTO.setDestinationId(trip.getDestination().getId()); + matchingService.calculateFare(tripDTO); + matchingService.queueTripForMatching(tripId); + trip.setState(TripState.QUEUED); + entityManager.merge(trip); + } + + @Transactional(rollbackOn = {Exception.class}) + @Override + public void match(Long tripId, MatchDTO match) throws EntityNotFoundException, DriverNotAvailableException, IllegalStateException { + ITrip trip; + IMatch newMatch; + try { + trip = getTrip(tripId); + if (trip.getState() != TripState.CREATED) + throw new IllegalStateException("Trip is not in CREATED state"); + + IDriver driver = getDriver(match.getDriverId()); + IMatchDAO matchDAO = daoFactory.createMatchDAO(); + for (IMatch m : matchDAO.findAll()) { + if (m.getDriver().getId().equals(driver.getId())) + throw new DriverNotAvailableException("Driver with id " + driver.getId() + " is already busy"); + } + + IVehicle vehicle = getVehicle(match.getVehicleId()); + + newMatch = modelFactory.createMatch(); + newMatch.setDate(new Date()); + newMatch.setTrip(trip); + newMatch.setDriver(driver); + newMatch.setVehicle(vehicle); + + IMoney fare = modelFactory.createMoney(); + fare.setCurrency(match.getFare().getCurrency()); + fare.setValue(match.getFare().getValue()); + newMatch.setFare(fare); + + trip.setMatch(newMatch); + trip.setState(TripState.MATCHED); + } catch (Exception e) { + // Requeue match + matchingService.queueTripForMatching(tripId); + throw e; + } + + entityManager.merge(trip); + entityManager.persist(newMatch); + } + + @Override + public void complete(Long tripId, TripInfoDTO tripInfoDTO) throws EntityNotFoundException { + + } + + @Override + public void cancel(Long tripId) throws EntityNotFoundException { + + } + + @Override + public boolean addStop(TripDTO trip, Long locationId) throws EntityNotFoundException, IllegalStateException { + return false; + } + + @Override + public boolean removeStop(TripDTO trip, Long locationId) throws EntityNotFoundException, IllegalStateException { + return false; + } + + @Override + public void delete(Long tripId) throws EntityNotFoundException { + + } + + @Override + public TripDTO find(Long tripId) { + return null; + } + + private IRider getRider(Long riderId) throws EntityNotFoundException { + IRiderDAO riderDAO = daoFactory.createRiderDAO(); + IRider rider = riderDAO.findById(riderId); + if (rider == null) + throw new EntityNotFoundException("Could not find rider with id " + riderId); + return rider; + } + + private IDriver getDriver(Long driverId) throws EntityNotFoundException { + IDriverDAO driverDAO = daoFactory.createDriverDAO(); + IDriver driver = driverDAO.findById(driverId); + if (driver == null) + throw new EntityNotFoundException("Could not find driver with id " + driverId); + return driver; + } + + private ILocation getLocation(Long locationId) throws EntityNotFoundException { + ILocationDAO locationDAO = daoFactory.createLocationDAO(); + ILocation location = locationDAO.findById(locationId); + if (location == null) + throw new EntityNotFoundException("Could not find driver with id " + locationId); + return location; + } + + private ITrip getTrip(Long tripId) throws EntityNotFoundException { + ITripDAO tripDAO = daoFactory.createTripDAO(); + ITrip trip = tripDAO.findById(tripId); + if (trip == null) + throw new EntityNotFoundException("Could not find trip with id " + tripId); + return trip; + } + + private IVehicle getVehicle(Long vehicleId) throws EntityNotFoundException { + IVehicleDAO vehicleDAO = daoFactory.createVehicleDAO(); + IVehicle vehicle = vehicleDAO.findById(vehicleId); + if (vehicle == null) + throw new EntityNotFoundException("Could not find vehicle with id " + vehicleId); + return vehicle; + } +}