package net.java.cargotracker.interfaces.tracking.web;
import java.text.SimpleDateFormat;
import java.util.*;
import net.java.cargotracker.domain.model.cargo.Cargo;
import net.java.cargotracker.domain.model.cargo.Delivery;
import net.java.cargotracker.domain.model.cargo.HandlingActivity;
import net.java.cargotracker.domain.model.handling.HandlingEvent;
import net.java.cargotracker.domain.model.location.Location;
import net.java.cargotracker.domain.model.voyage.Voyage;
/**
* View adapter for displaying a cargo in a tracking context.
*/
public class CargoTrackingViewAdapter {
private Cargo cargo;
private List<HandlingEventViewAdapter> events;
private String FORMAT = "yyyy-MM-dd hh:mm";
public CargoTrackingViewAdapter(Cargo cargo,
List<HandlingEvent> handlingEvents) {
this.cargo = cargo;
this.events = new ArrayList<>(
handlingEvents.size());
for (HandlingEvent handlingEvent : handlingEvents) {
events.add(new HandlingEventViewAdapter(handlingEvent));
}
}
/**
* @param location a location
* @return A formatted string for displaying the location.
*/
private String getDisplayText(Location location) {
return location.getName();
}
/**
* @return An unmodifiable list of handling event view adapters.
*/
public List<HandlingEventViewAdapter> getEvents() {
return Collections.unmodifiableList(events);
}
/**
* @return A translated string describing the cargo status.
*/
public String getStatusText() {
Delivery delivery = cargo.getDelivery();
switch (delivery.getTransportStatus()) {
case IN_PORT:
return "In port " + getDisplayText(delivery.getLastKnownLocation());
case ONBOARD_CARRIER:
return "Onboard voyage "
+ delivery.getCurrentVoyage().getVoyageNumber().getIdString();
case CLAIMED:
return "Claimed";
case NOT_RECEIVED:
return "Not received";
case UNKNOWN:
return "Unknown";
default:
return "[Unknown status]";
}
}
public String getDestination() {
return getDisplayText(cargo.getRouteSpecification().getDestination());
}
public String getOrigin() {
return getDisplayText(cargo.getOrigin());
}
public String getTrackingId() {
return cargo.getTrackingId().getIdString();
}
public String getEta() {
Date eta = cargo.getDelivery().getEstimatedTimeOfArrival();
if (eta == null) {
return "?";
} else {
return new SimpleDateFormat(FORMAT).format(eta);
}
}
public String getNextExpectedActivity() {
HandlingActivity activity = cargo.getDelivery().getNextExpectedActivity();
if ((activity == null) || (activity.isEmpty())) {
return "";
}
String text = "Next expected activity is to ";
HandlingEvent.Type type = activity.getType();
if (type.sameValueAs(HandlingEvent.Type.LOAD)) {
return text + type.name().toLowerCase() + " cargo onto voyage "
+ activity.getVoyage().getVoyageNumber() + " in "
+ activity.getLocation().getName();
} else if (type.sameValueAs(HandlingEvent.Type.UNLOAD)) {
return text + type.name().toLowerCase() + " cargo off of "
+ activity.getVoyage().getVoyageNumber() + " in "
+ activity.getLocation().getName();
} else {
return text + type.name().toLowerCase() + " cargo in "
+ activity.getLocation().getName();
}
}
public boolean isMisdirected() {
return cargo.getDelivery().isMisdirected();
}
/**
* Handling event view adapter component.
*/
public class HandlingEventViewAdapter {
private HandlingEvent handlingEvent;
public HandlingEventViewAdapter(HandlingEvent handlingEvent) {
this.handlingEvent = handlingEvent;
}
public String getLocation() {
return handlingEvent.getLocation().getName();
}
public String getTime() {
return new SimpleDateFormat(FORMAT).format(handlingEvent
.getCompletionTime());
}
public String getType() {
return handlingEvent.getType().toString();
}
public String getVoyageNumber() {
Voyage voyage = handlingEvent.getVoyage();
return voyage.getVoyageNumber().getIdString();
}
public boolean isExpected() {
return cargo.getItinerary().isExpected(handlingEvent);
}
public String getDescription() {
switch (handlingEvent.getType()) {
case LOAD:
return "Loaded onto voyage "
+ handlingEvent.getVoyage().getVoyageNumber().getIdString()
+ " in " + handlingEvent.getLocation().getName() + ", at "
+ handlingEvent.getCompletionTime() + ".";
case UNLOAD:
return "Unloaded off voyage "
+ handlingEvent.getVoyage().getVoyageNumber().getIdString()
+ " in " + handlingEvent.getLocation().getName() + ", at "
+ handlingEvent.getCompletionTime() + ".";
case RECEIVE:
return "Received in " + handlingEvent.getLocation().getName()
+ ", at " + handlingEvent.getCompletionTime() + ".";
case CLAIM:
return "Claimed in " + handlingEvent.getLocation().getName()
+ ", at " + handlingEvent.getCompletionTime() + ".";
case CUSTOMS:
return "Cleared customs in " + handlingEvent.getLocation().getName()
+ ", at " + handlingEvent.getCompletionTime() + ".";
default:
return "[Unknown]";
}
}
}
}