/** * Actual pickup, updates the {@link Vehicle} contents. * * @param vehicle The {@link Vehicle} that performs the pickup. * @param parcel The {@link Parcel} that is picked up. * @param time The current time. * @see #pickup(Vehicle, Parcel, TimeLapse) */ protected void doPickup(Vehicle vehicle, Parcel parcel, long time) { synchronized (this) { containerContents.put(vehicle, parcel); containerContentsSize.put(vehicle, containerContentsSize.get(vehicle) + parcel.getNeededCapacity()); parcelState.put(ParcelState.IN_CARGO, parcel); LOGGER.info("{} end pickup of {} by {}", time, parcel, vehicle); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.END_PICKUP, self, time, parcel, vehicle)); } }
assertThat(sub.get(0).getEventType()) .isSameAs(PDPModelEventType.START_DELIVERY); assertThat(sub.get(0).vehicle).isSameAs(v1); assertThat(sub.get(0).parcel).isSameAs(p1); assertThat(sub.get(1).getEventType()) .isSameAs(PDPModelEventType.END_DELIVERY); assertThat(sub.get(1).vehicle).isSameAs(v1); assertThat(sub.get(1).parcel).isSameAs(p1); assertThat(sub.get(2).getEventType()) .isSameAs(PDPModelEventType.START_DELIVERY); assertThat(sub.get(2).vehicle).isSameAs(v0); assertThat(sub.get(2).parcel).isSameAs(p0); assertThat(sub.get(3).getEventType()) .isSameAs(PDPModelEventType.END_DELIVERY); assertThat(sub.get(3).vehicle).isSameAs(v0);
/** * The actual delivery of the specified {@link Parcel} by the specified * {@link Vehicle}. * * @param vehicle The {@link Vehicle} that performs the delivery. * @param parcel The {@link Parcel} that is delivered. * @param time The current time. */ protected void doDeliver(Vehicle vehicle, Parcel parcel, long time) { synchronized (this) { containerContents.remove(vehicle, parcel); containerContentsSize.put(vehicle, containerContentsSize.get(vehicle) - parcel.getNeededCapacity()); parcelState.put(ParcelState.DELIVERED, parcel); LOGGER.info("{} end delivery of {} by {}", time, parcel, vehicle); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.END_DELIVERY, self, time, parcel, vehicle)); } }
/** * The actual dropping of the specified {@link Parcel} by the specified * {@link Vehicle}. * * @param vehicle The {@link Vehicle} that performs the dropping. * @param parcel The {@link Parcel} that is dropped. * @param time The current time. */ protected void doDrop(Vehicle vehicle, Parcel parcel, long time) { synchronized (this) { containerContents.remove(vehicle, parcel); containerContentsSize.put(vehicle, containerContentsSize.get(vehicle) - parcel.getNeededCapacity()); roadModel.addObjectAtSamePosition(parcel, vehicle); parcelState.put(ParcelState.AVAILABLE, parcel); LOGGER.info("{} dropped {} by {}", time, parcel, vehicle); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.PARCEL_AVAILABLE, self, time, parcel, null)); } }
parcelState.put(state, (Parcel) element); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.NEW_PARCEL, self, currentTime, p, null)); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.PARCEL_AVAILABLE, self, currentTime, p, null)); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.NEW_VEHICLE, self, currentTime, null, (Vehicle) element));
@Override public void tick(TimeLapse timeLapse) { synchronized (this) { // TODO this can be optimized by scheduling events upon registering currentTime = timeLapse.getStartTime(); final Collection<Parcel> parcels = parcelState.get(ParcelState.ANNOUNCED); final List<Parcel> newAvailables = newArrayList(); for (final Parcel p : parcels) { if (timeLapse.getStartTime() >= p.getPickupTimeWindow().begin()) { newAvailables.add(p); } } for (final Parcel p : newAvailables) { parcelState.put(ParcelState.AVAILABLE, p); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.PARCEL_AVAILABLE, self, currentTime, p, null)); } } }
.dispatchEvent(new PDPModelEvent(PDPModelEventType.START_PICKUP, self, time.getTime(), parcel, vehicle));
@Override public void drop(Vehicle vehicle, Parcel parcel, TimeLapse time) { synchronized (this) { /* 1 */checkVehicleInRoadModel(vehicle); /* 2 */checkVehicleIdle(vehicle); /* 3 */checkVehicleDoesNotContainParcel(vehicle, parcel); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.START_DELIVERY, self, time.getTime(), parcel, vehicle)); if (time.getTimeLeft() < parcel.getDeliveryDuration()) { vehicleState.put(vehicle, VehicleState.DELIVERING); parcelState.put(ParcelState.DELIVERING, parcel); pendingVehicleActions.put(vehicle, new DropAction(this, vehicle, parcel, parcel.getDeliveryDuration() - time.getTimeLeft())); time.consumeAll(); } else { time.consume(parcel.getDeliveryDuration()); doDrop(vehicle, parcel, time.getTime()); } } }
"the parcel does not allow a delivery now"); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.START_DELIVERY, self, time.getTime(), parcel, vehicle));