package net.java.cargotracker.application.internal; import net.java.cargotracker.infrastructure.events.cdi.CargoInspected; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.Stateless; import javax.enterprise.event.Event; import javax.inject.Inject; import net.java.cargotracker.application.ApplicationEvents; import net.java.cargotracker.application.CargoInspectionService; import net.java.cargotracker.domain.model.cargo.Cargo; import net.java.cargotracker.domain.model.cargo.CargoRepository; import net.java.cargotracker.domain.model.cargo.TrackingId; import net.java.cargotracker.domain.model.handling.HandlingEventRepository; import net.java.cargotracker.domain.model.handling.HandlingHistory; @Stateless public class DefaultCargoInspectionService implements CargoInspectionService { @Inject private ApplicationEvents applicationEvents; @Inject private CargoRepository cargoRepository; @Inject private HandlingEventRepository handlingEventRepository; @Inject @CargoInspected private Event<Cargo> cargoInspected; private static final Logger logger = Logger.getLogger( DefaultCargoInspectionService.class.getName()); @Override public void inspectCargo(TrackingId trackingId) { Cargo cargo = cargoRepository.find(trackingId); if (cargo == null) { logger.log(Level.WARNING, "Can't inspect non-existing cargo {0}", trackingId); return; } HandlingHistory handlingHistory = handlingEventRepository .lookupHandlingHistoryOfCargo(trackingId); cargo.deriveDeliveryProgress(handlingHistory); if (cargo.getDelivery().isMisdirected()) { applicationEvents.cargoWasMisdirected(cargo); } if (cargo.getDelivery().isUnloadedAtDestination()) { applicationEvents.cargoHasArrived(cargo); } cargoRepository.store(cargo); cargoInspected.fire(cargo); } }