package vroom.common.modeling.visualization;
import java.util.ListIterator;
import vroom.common.modeling.dataModel.Arc;
import vroom.common.modeling.dataModel.IArc;
import vroom.common.modeling.dataModel.INodeVisit;
import vroom.common.modeling.dataModel.IRoute;
import vroom.common.modeling.dataModel.IVRPInstance;
import vroom.common.modeling.dataModel.IVRPSolution;
import vroom.common.utilities.IObservable;
import vroom.common.utilities.IObserver;
import vroom.common.utilities.ObserverManager;
import vroom.common.utilities.Update;
import edu.uci.ics.jung.graph.DirectedSparseGraph;
/**
* The Class <code>DefaultInstanceGraph</code> is a specialization of {@link DirectedSparseGraph} which can be used to
* represent an {@link IVRPInstance} graphically by using the Jung library.
* <p>
* Creation date: Sep 29, 2010 - 10:34:52 AM.
*
* @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 class DefaultInstanceGraph extends DirectedSparseGraph<INodeVisit, IArc> implements
IObserver, IObservable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The Obs handler. */
private final ObserverManager mObsHandler;
/** The Instance. */
private IVRPInstance mInstance;
/**
* Creates a new <code>DefaultInstanceGraph</code>.
*
* @param instance
* the instance to be represented
*/
public DefaultInstanceGraph(IVRPInstance instance) {
super();
mInstance = instance;
mObsHandler = new ObserverManager(this);
// Add all nodes and depots
for (INodeVisit n : getInstance().getNodeVisits()) {
addVertex(n);
}
for (INodeVisit n : getInstance().getDepotsVisits()) {
addVertex(n);
}
}
/**
* Add the arcs from a solution to this graph.
*
* @param solution
* the solution which arcs will be added
*/
public void addSolution(IVRPSolution<?> solution) {
for (IRoute<?> r : solution) {
ListIterator<? extends INodeVisit> it = r.iterator();
INodeVisit pred = it.next(), succ = null;
while (it.hasNext()) {
succ = it.next();
addEdge(new Arc(pred, succ, getInstance().getCost(pred, succ), true), pred, succ);
pred = succ;
}
}
}
/**
* Gets the single instance of DynamicInstanceGraph.
*
* @return single instance of DynamicInstanceGraph
*/
public IVRPInstance getInstance() {
return mInstance;
}
/*
* (non-Javadoc)
* @see
* vroom.common.utilities.IObserver#update(vroom.common.utilities.IObservable
* , vroom.common.utilities.Update)
*/
@Override
public void update(IObservable source, Update update) {
notifyObservers(null);
}
/*
* (non-Javadoc)
* @see
* vroom.common.utilities.IObservable#addObserver(vroom.common.utilities
* .IObserver)
*/
@Override
public void addObserver(IObserver o) {
mObsHandler.addObserver(o);
}
/*
* (non-Javadoc)
* @see
* vroom.common.utilities.IObservable#removeObserver(vroom.common.utilities
* .IObserver)
*/
@Override
public void removeObserver(IObserver o) {
mObsHandler.removeObserver(o);
}
/*
* (non-Javadoc)
* @see vroom.common.utilities.IObservable#removeAllObservers()
*/
@Override
public void removeAllObservers() {
mObsHandler.removeAllObservers();
}
/**
* Notify observers.
*
* @param update
* the update
*/
protected void notifyObservers(Update update) {
mObsHandler.notifyObservers(update);
}
public void detach() {
mInstance = null;
}
}