Implement create(), confirm() and match() (2.1.1.1)
This commit is contained in:
parent
dd1e95d6aa
commit
a36f812edf
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user