1 package se.citerus.dddsample.application.impl; 2 3 import org.apache.commons.lang.Validate; 4 import org.apache.commons.logging.Log; 5 import org.apache.commons.logging.LogFactory; 6 import org.springframework.transaction.annotation.Transactional; 7 import se.citerus.dddsample.application.ApplicationEvents; 8 import se.citerus.dddsample.application.CargoInspectionService; 9 import se.citerus.dddsample.domain.model.cargo.Cargo; 10 import se.citerus.dddsample.domain.model.cargo.CargoRepository; 11 import se.citerus.dddsample.domain.model.cargo.TrackingId; 12 import se.citerus.dddsample.domain.model.handling.HandlingEventRepository; 13 import se.citerus.dddsample.domain.model.handling.HandlingHistory; 14 15 public class CargoInspectionServiceImpl implements CargoInspectionService { 16 17 private final ApplicationEvents applicationEvents; 18 private final CargoRepository cargoRepository; 19 private final HandlingEventRepository handlingEventRepository; 20 private final Log logger = LogFactory.getLog(getClass()); 21 22 public CargoInspectionServiceImpl(final ApplicationEvents applicationEvents, 23 final CargoRepository cargoRepository, 24 final HandlingEventRepository handlingEventRepository) { 25 this.applicationEvents = applicationEvents; 26 this.cargoRepository = cargoRepository; 27 this.handlingEventRepository = handlingEventRepository; 28 } 29 30 @Override 31 @Transactional 32 public void inspectCargo(final TrackingId trackingId) { 33 Validate.notNull(trackingId, "Tracking ID is required"); 34 35 final Cargo cargo = cargoRepository.find(trackingId); 36 if (cargo == null) { 37 logger.warn("Can't inspect non-existing cargo " + trackingId); 38 return; 39 } 40 41 final HandlingHistory handlingHistory = handlingEventRepository.lookupHandlingHistoryOfCargo(trackingId); 42 43 cargo.deriveDeliveryProgress(handlingHistory); 44 45 if (cargo.delivery().isMisdirected()) { 46 applicationEvents.cargoWasMisdirected(cargo); 47 } 48 49 if (cargo.delivery().isUnloadedAtDestination()) { 50 applicationEvents.cargoHasArrived(cargo); 51 } 52 53 cargoRepository.store(cargo); 54 } 55 56 }