package org.sculptor.dddsample.cargo.serviceimpl; import java.util.List; import org.apache.commons.lang.Validate; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.joda.time.DateTime; import org.sculptor.dddsample.cargo.domain.Cargo; import org.sculptor.dddsample.cargo.domain.Itinerary; import org.sculptor.dddsample.cargo.domain.RouteSpecification; import org.sculptor.dddsample.cargo.domain.TrackingId; import org.sculptor.dddsample.cargo.exception.CargoNotFoundException; import org.sculptor.dddsample.location.domain.Location; import org.sculptor.dddsample.location.domain.UnLocode; import org.sculptor.dddsample.location.exception.LocationNotFoundException; import org.sculptor.framework.context.ServiceContext; import org.springframework.stereotype.Service; /** * Implementation of BookingService. */ @Service("bookingService") public class BookingServiceImpl extends BookingServiceImplBase { private static final Log LOG = LogFactory.getLog(BookingServiceImpl.class); public BookingServiceImpl() { } public TrackingId bookNewCargo(ServiceContext ctx, UnLocode originCode, UnLocode destinationCode) throws LocationNotFoundException { Validate.notNull(originCode); Validate.notNull(destinationCode); final TrackingId trackingId = getCargoRepository().nextTrackingId(); final Location origin = findLocation(ctx, originCode); final Location destination = findLocation(ctx, destinationCode); Cargo cargo = new Cargo(trackingId, origin, destination); getCargoRepository().save(cargo); LOG.info("Registered new cargo with tracking id " + cargo.getTrackingId().getIdentifier()); return cargo.getTrackingId(); } public List<Itinerary> requestPossibleRoutesForCargo(ServiceContext ctx, TrackingId trackingId) throws CargoNotFoundException, LocationNotFoundException { Validate.notNull(trackingId); final Cargo cargo = getCargoRepository().find(trackingId); final RouteSpecification routeSpecification = RouteSpecification.forCargo(cargo, new DateTime()); return fetchRoutes(ctx, routeSpecification); } public void assignCargoToRoute(ServiceContext ctx, TrackingId trackingId, Itinerary itinerary) throws CargoNotFoundException { Validate.notNull(trackingId); Validate.notNull(itinerary); final Cargo cargo = getCargoRepository().find(trackingId); cargo.attachItinerary(itinerary); getCargoRepository().save(cargo); LOG.info("Assigned cargo " + trackingId + " to new route"); } }