{
final String trackingId = cargo.trackingId().get().id().get();
final RouteSpecification routeSpec = cargo.routeSpecification().get();
routeSpec.print();
NextHandlingEvent nextEvent = null;
Date time = null;
String port = null;
String voyageNumber = null;
Voyage voyage;
HandlingEventType type = null;
String wrongPort = null;
String wrongVoyage = null;
// First cargo with id 11 is not routed
// ROUTE
if( i > 11 )
{
final List<Itinerary> routes = routingService.fetchRoutesForSpecification( routeSpec );
final Itinerary itinerary = routes.get( 0 );
new AssignCargoToRoute( cargo, itinerary ).assign();
}
// MISROUTE: Route specification not satisfied with itinerary
if( i == 12 )
{
Location origin = routeSpec.origin().get();
Location dest = routeSpec.destination().get();
Location badDest = null;
Query<Location> locations = uow.newQuery( module.newQueryBuilder( Location.class ) );
for( Location loc : locations )
{
if( !origin.equals( loc ) && !dest.equals( loc ) )
{
badDest = loc;
break;
}
}
final RouteSpecification unsatisfiedRouteSpec =
routeSpecFactory.build( origin, badDest, new Date(), new DateTime().plusDays( 25 )
.toDate() );
cargo.routeSpecification().set( unsatisfiedRouteSpec );
new InspectUnhandledCargo( cargo ).inspect();
}
// RECEIVE
if( i > 13 )
{
nextEvent = cargo.delivery().get().nextHandlingEvent().get();
port = nextEvent.location().get().getCode();
final Date mockTime = new Date();
registerEvent( mockTime, mockTime, trackingId, RECEIVE, port, null );
}
// MISDIRECT: LOAD onto wrong carrier
if( i == 15 )
{
nextEvent = cargo.delivery().get().nextHandlingEvent().get();
time = nextEvent.time().get();
port = nextEvent.location().get().getCode();
voyageNumber = nextEvent.voyage().get().voyageNumber().get().number().get();
// Find earliest wrong carrier movement (voyage) with same departure location
final Query<Voyage> voyages = module.currentUnitOfWork()
.newQuery( module.newQueryBuilder( Voyage.class ) );
int depth = 0;
do
{
for( Voyage voy : voyages )
{
if( voy.voyageNumber().get().number().get().equals( voyageNumber ) )
{
continue;
}
if( depth >= voy.schedule().get().carrierMovements().get().size() )
{
continue;
}
// Carrier movement at current depth
final CarrierMovement movement = voy.schedule()
.get()
.carrierMovements()
.get()
.get( depth );
final boolean goingFromSamePort = movement.departureLocation()
.get()
.getCode()
.equals( port );
final boolean notGoingToDestination = !movement.arrivalLocation()
.get()
.equals( routeSpec.destination().get() );
if( goingFromSamePort && notGoingToDestination )
{
wrongVoyage = voy.voyageNumber().get().number().get();
break;
}
}
}
while( wrongVoyage == null && depth++ < 10 );
registerEvent( time, time, trackingId, LOAD, port, wrongVoyage );
}
// LOAD
if( i > 15 )
{
nextEvent = cargo.delivery().get().nextHandlingEvent().get();
time = nextEvent.time().get();
port = nextEvent.location().get().getCode();
voyageNumber = nextEvent.voyage().get().voyageNumber().get().number().get();
registerEvent( time, time, trackingId, LOAD, port, voyageNumber );
// Cargo is now on board carrier
nextEvent = cargo.delivery().get().nextHandlingEvent().get();
time = nextEvent.time().get();
type = nextEvent.handlingEventType().get();
port = nextEvent.location().get().getCode();
voyageNumber = nextEvent.voyage().get().voyageNumber().get().number().get();
}
// MISDIRECT: UNLOAD from carrier in wrong location
if( i == 17 )
{
voyage = uow.get( Voyage.class, voyageNumber );
for( CarrierMovement movement : voyage.schedule().get().carrierMovements().get() )
{
final String arrivalPort = movement.arrivalLocation().get().getCode();
// Take first voyage with different arrival location
if( !arrivalPort.equals( port ) )
{
wrongPort = movement.arrivalLocation().get().unLocode().get().code().get();
break;
}
}
registerEvent( time, time, trackingId, UNLOAD, wrongPort, voyageNumber );
}
// UNLOAD
if( i > 17 )
{
nextEvent = cargo.delivery().get().nextHandlingEvent().get();
time = nextEvent.time().get();
port = nextEvent.location().get().getCode();
voyageNumber = nextEvent.voyage().get().voyageNumber().get().number().get();
registerEvent( time, time, trackingId, UNLOAD, port, voyageNumber );
// Cargo is now in midpoint location
nextEvent = cargo.delivery().get().nextHandlingEvent().get();
time = nextEvent.time().get();
type = nextEvent.handlingEventType().get();
port = nextEvent.location().get().getCode();
}
// CUSTOMS: Customs handling in midpoint location (doesn't affect misdirection status)
if( i == 19 )
{
registerEvent( time, time, trackingId, CUSTOMS, port, null );
}
// MISDIRECT: Unexpected claim before reaching destination
if( i == 20 )
{
registerEvent( time, time, trackingId, CLAIM, port, null );
}
// Complete all LOAD/UNLOADS
if( i > 20 )
{
do
{
//noinspection ConstantConditions
voyageNumber = nextEvent.voyage().get().voyageNumber().get().number().get();
registerEvent( time, time, trackingId, type, port, voyageNumber );
nextEvent = cargo.delivery().get().nextHandlingEvent().get();
time = nextEvent.time().get();
port = nextEvent.location().get().getCode();
type = nextEvent.handlingEventType().get();
}
while( type != HandlingEventType.CLAIM );
}
// CLAIM at destination - this ends the life cycle of the cargo delivery