package org.croudtrip.trips; import org.croudtrip.api.trips.TripOffer; import org.croudtrip.api.trips.TripOfferStatus; import org.croudtrip.api.trips.TripOfferUpdate; import org.croudtrip.db.TripOfferDAO; import org.croudtrip.logs.LogManager; import org.croudtrip.utils.AbstractScheduledTaskExecutor; import org.hibernate.SessionFactory; import java.util.concurrent.TimeUnit; import javax.inject.Inject; /** * Cancels {@link TripOffer}s after 12 hours of inactivity. */ public class ExpireTripOffersExecutor extends AbstractScheduledTaskExecutor { private static final long MAX_ARRIVAL_DELAY = 12 * 60 * 60; // 12 hours private TripOfferDAO tripOfferDAO; private TripsManager tripsManager; @Inject ExpireTripOffersExecutor(TripOfferDAO tripOfferDAO, TripsManager tripsManager, SessionFactory sessionFactory, LogManager logManager) { super( sessionFactory, logManager, 3, TimeUnit.HOURS); this.tripOfferDAO = tripOfferDAO; this.tripsManager = tripsManager; } @Override protected void doRun() throws Exception { for (TripOffer offer : tripOfferDAO.findAll()) { if( offer.getStatus() == TripOfferStatus.FINISHED || offer.getStatus() == TripOfferStatus.CANCELLED) continue; if (offer.getEstimatedArrivalTimeInSeconds() + MAX_ARRIVAL_DELAY < System.currentTimeMillis()/1000) { logManager.d("Offer " + offer.getId() + " expired and will be deleted"); tripsManager.updateOffer(offer, TripOfferUpdate.createCancelUpdate()); } else { long deltaTime = offer.getEstimatedArrivalTimeInSeconds() + MAX_ARRIVAL_DELAY - System.currentTimeMillis()/1000; long hours = deltaTime / 3600; deltaTime %= 3600; long minutes = deltaTime / 60; deltaTime %= 60; long seconds = deltaTime; logManager.d("Offer " + offer.getId() + " will expire in " + hours + "h " + minutes + "min " + seconds + "s."); } } } }