package vroom.optimization.online.jmsa.vrp; import java.util.LinkedList; import java.util.List; import vroom.common.modeling.dataModel.INodeVisit; import vroom.common.modeling.dataModel.IVRPRequest; import vroom.common.modeling.dataModel.Node; import vroom.common.modeling.dataModel.attributes.ITimeWindow; import vroom.common.utilities.IObservable; import vroom.common.utilities.IObserver; import vroom.common.utilities.ObserverManager; import vroom.common.utilities.Update; import vroom.common.utilities.Wrapper; import vroom.optimization.online.jmsa.IActualRequest; import vroom.optimization.online.jmsa.IMSARequest; import vroom.optimization.online.jmsa.ISampledRequest; /** * Creation date: Apr 29, 2010 - 10:22:36 AM<br/> * <code>VRPRequest</code> * * @author Victor Pillac, <a href="http://uniandes.edu.co">Universidad de Los * Andes</a>-<a href="http://copa.uniandes.edu.co">Copa</a> <a * href="http://www.emn.fr">Ecole des Mines de Nantes</a>-<a * href="http://www.irccyn.ec-nantes.fr/irccyn/d/en/equipes/Slp">SLP</a> * @version 1.0 */ public abstract class VRPRequest implements IMSARequest, Wrapper<IVRPRequest>, INodeVisit, IObservable { public static final String PROP_DEMANDS = "Demands"; /** the corresponding node visit **/ private final INodeVisit mINodeVisit; /** * Getter for the node visit * * @return the corresponding node visit */ protected INodeVisit getNodeVisit() { return mINodeVisit; } /** * Creates a new <code>MSAVRPRequest</code> * * @param nodeVisit */ protected VRPRequest(INodeVisit nodeVisit) { mINodeVisit = nodeVisit; mObservers = new ObserverManager(this); } /** * Getter for the demand of the default product * * @return the demand of the wrapped request */ @Override public double getDemand() { return getNodeVisit() == null ? 0 : getNodeVisit().getDemand(); } /** * Getter for the demand of a specific product * * @param product * @return the demand of the wrapped request for the specified product */ @Override public double getDemand(int product) { return getNodeVisit() == null ? 0 : getNodeVisit().getDemand(product); } @Override public double getServiceTime() { return getNodeVisit() == null ? 0 : getNodeVisit().getServiceTime(); } @Override public ITimeWindow getTimeWindow() { return getNodeVisit() == null ? null : getNodeVisit().getTimeWindow(); } @Override public IVRPRequest getWrappedObject() { return getParentRequest(); } @Override public Node getNode() { return getNodeVisit() == null ? null : getNodeVisit().getNode(); } @Override public IVRPRequest getParentRequest() { return getNodeVisit() == null ? null : getNodeVisit() .getParentRequest(); } @Override public List<INodeVisit> getPredecesors() { return getNodeVisit() == null ? new LinkedList<INodeVisit>() : getNodeVisit().getPredecesors(); } @Override public List<INodeVisit> getSuccessors() { return getNodeVisit().getSuccessors(); } @Override public boolean isDepot() { return getNodeVisit() == null ? false : getNodeVisit().isDepot(); } @Override public boolean isFixed() { return getNodeVisit() == null ? false : getNodeVisit().isFixed(); } @Override public void fix() { if (getNodeVisit() != null) { getNodeVisit().fix(); } } @Override public void free() { if (getNodeVisit() != null) { getNodeVisit().free(); } } @Override public boolean isPickup() { return getNodeVisit() == null ? false : getNodeVisit().isPickup(); } @Override public int compareTo(INodeVisit o) { return getNodeVisit() == null ? 0 : getNodeVisit().compareTo(o); } @Override public int getID() { return getNodeVisit() == null ? 0 : getNodeVisit().getID(); } @Override public String toString() { return String .format("%s:%s", this instanceof IActualRequest ? "AR" : this instanceof ISampledRequest ? "SR" : "AG", getNodeVisit()); } @Override public int hashCode() { if (!isDepot()) { return getNodeVisit() == null ? super.hashCode() : getNodeVisit() .hashCode(); } else { return superHashCode(); } } /** * @return the hashcode of this object as defined in * {@link Object#hashCode()} */ protected int superHashCode() { return super.hashCode(); } @Override public boolean equals(Object obj) { if (!isDepot()) { return this == obj || getNodeVisit().equals(obj); } else { return super.equals(obj); } } /** * Short string description for this request * * @return the underlying request id as a string */ public String toShortString() { return getNode() != null ? "" + getNode().getID() : ""; } // ----------------------------------------------- // Observable interface implementation // ----------------------------------------------- private final ObserverManager mObservers; @Override public final void addObserver(IObserver o) { mObservers.addObserver(o); } @Override public final void removeAllObservers() { mObservers.removeAllObservers(); } @Override public final void removeObserver(IObserver o) { mObservers.removeObserver(o); } protected final void notifyObservers(Update update) { mObservers.notifyObservers(update); } @Override public abstract INodeVisit clone(); }