package net.java.cargotracker.interfaces.tracking.web;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import net.java.cargotracker.domain.model.cargo.Cargo;
import net.java.cargotracker.domain.model.cargo.CargoRepository;
import net.java.cargotracker.domain.model.cargo.TrackingId;
import net.java.cargotracker.domain.model.handling.HandlingEvent;
import net.java.cargotracker.domain.model.handling.HandlingEventRepository;
/**
* Controller for tracking cargo. This interface sits immediately on top of the
* domain layer, unlike the booking interface which has a facade and supporting
* DTOs in between.
* <p/>
* An adapter class, designed for the tracking use case, is used to wrap the
* domain model to make it easier to work with in a web page rendering context.
* We do not want to apply view rendering constraints to the design of our
* domain model, and the adapter helps us shield the domain model classes.
*/
@Named
@ViewScoped
public class CargoTracker implements Serializable {
private static final long serialVersionUID = 1L;
private String trackingId;
private CargoTrackingViewAdapter cargo;
@Inject
private CargoRepository cargoRepository;
@Inject
private HandlingEventRepository handlingEventRepository;
public String getTrackingId() {
return trackingId;
}
public void setTrackingId(String trackingId) {
this.trackingId = trackingId;
}
public CargoTrackingViewAdapter getCargo() {
return cargo;
}
public void setCargo(CargoTrackingViewAdapter cargo) {
this.cargo = cargo;
}
public void trackCargo() {
Cargo cargo = cargoRepository.find(new TrackingId(trackingId));
if (cargo != null) {
List<HandlingEvent> handlingEvents = handlingEventRepository
.lookupHandlingHistoryOfCargo(new TrackingId(trackingId))
.getDistinctEventsByCompletionTime();
this.cargo = new CargoTrackingViewAdapter(cargo, handlingEvents);
} else {
// TODO Generate a Faces error messsage.
FacesContext context = FacesContext.getCurrentInstance();
FacesMessage message = new FacesMessage(
"Cargo with tracking ID: " + trackingId + " not found.");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
context.addMessage(null, message);
}
}
}