/* * National ICT Australia - http://www.nicta.com.au - All Rights Reserved */ /** * */ package vroom.common.modeling.dataModel; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.ListIterator; /** * The class <code>ImmutableRoute</code> is a minimalist implementation of {@link IRoute} that stores an array of * {@link INodeVisit} * <p> * Creation date: May 2, 2013 - 5:19:47 PM * * @author vpillac, <a href="http://www.nicta.com.au">National ICT Australia</a> * @version 1.0 */ public class ImmutableRoute<V extends INodeVisit> implements IRoute<V> { private final Vehicle mVehicle; private final double mCost; private final double[] mLoads; private final List<V> mNodes; private final int mHash; /** * Creates a new <code>ImmutableRoute</code> * * @param route * @param hash * @author vpillac */ public ImmutableRoute(IRoute<V> route, int hash) { mHash = hash; mVehicle = route.getVehicle(); mCost = route.getCost(); double[] l = route.getLoads(); mLoads = Arrays.copyOf(l, l.length); ArrayList<V> nodes = new ArrayList<>(route.length()); for (V n : route) nodes.add(n); mNodes = Collections.unmodifiableList(nodes); } @Override public IVRPSolution<?> getParentSolution() { throw new UnsupportedOperationException(); } @Override public Vehicle getVehicle() { return mVehicle; } @Override public double getCost() { return mCost; } @Override public void calculateCost(boolean force) { throw new UnsupportedOperationException(); } @Override public void updateCost(double delta) { throw new UnsupportedOperationException(); } @Override public void updateLoad(int product, double delta) { throw new UnsupportedOperationException(); } @Override public synchronized final double getLoad() { return mLoads[0]; } @Override public synchronized final double getLoad(int product) { return mLoads[product]; } @Override public synchronized final double[] getLoads() { return Arrays.copyOf(mLoads, mLoads.length); } @Override public void calculateLoad(boolean force) { throw new UnsupportedOperationException(); } @Override public boolean canAccommodateRequest(IVRPRequest request) { return false; } @Override public V getNodeAt(int index) { return mNodes.get(index); } @Override public int getNodePosition(INodeVisit node) { return mNodes.indexOf(node); } @Override public V getFirstNode() { return mNodes.get(0); } @Override public V getLastNode() { return mNodes.get(mNodes.size() - 1); } @Override public List<V> subroute(int start, int end) { throw new UnsupportedOperationException(); } @Override public boolean appendNode(V node) { throw new UnsupportedOperationException(); } @Override public boolean appendRoute(IRoute<? extends V> appendedRoute) { throw new UnsupportedOperationException(); } @Override public boolean appendNodes(List<? extends V> node) { throw new UnsupportedOperationException(); } @Override public V setNodeAt(int index, V node) { throw new UnsupportedOperationException(); } @Override public V extractNode(int index) { throw new UnsupportedOperationException(); } @Override public IRoute<V> extractSubroute(int start, int end) { throw new UnsupportedOperationException(); } @Override public List<V> extractNodes(int start, int end) { throw new UnsupportedOperationException(); } @Override public NodeInsertion getBestNodeInsertion(INodeVisit node) { throw new UnsupportedOperationException(); } @Override public NodeInsertion getBestNodeInsertion(INodeVisit node, int min, int max) { throw new UnsupportedOperationException(); } @Override public boolean bestInsertion(V node) { throw new UnsupportedOperationException(); } @Override public boolean insertNode(int index, V node) { throw new UnsupportedOperationException(); } @Override public boolean insertNode(NodeInsertion ins, V node) { throw new UnsupportedOperationException(); } @Override public boolean insertSubroute(int index, IRoute<? extends V> subroute) { throw new UnsupportedOperationException(); } @Override public boolean insertNodes(int index, List<? extends V> nodes) { throw new UnsupportedOperationException(); } @Override public boolean swapNodes(int node1, int node2) { throw new UnsupportedOperationException(); } @Override public void reverseSubRoute(int start, int end) { throw new UnsupportedOperationException(); } @Override public void reverseRoute() { throw new UnsupportedOperationException(); } @Override public int length() { return mNodes.size(); } @Override public List<V> getNodeSequence() { return mNodes; } @Override public boolean contains(INodeVisit node) { return mNodes.contains(node); } @Override public boolean remove(INodeVisit node) { throw new UnsupportedOperationException(); } @Override public ListIterator<V> iterator() { return mNodes.listIterator(); } @Override public String getNodeSeqString() { StringBuilder sb = new StringBuilder(length() * 3); sb.append("<"); for (INodeVisit v : this) { sb.append(v.getID()); sb.append(','); } if (length() > 0) { sb.setCharAt(sb.length() - 1, '>'); } else { sb.append('>'); } return sb.toString(); } @Override public synchronized String toString() { StringBuilder b = new StringBuilder(length() * 5); b.append(String.format("cost:%.2f", getCost())); b.append(" length:"); b.append(length()); b.append(" load:"); b.append(Arrays.toString(getLoads())); b.append(" "); b.append(getNodeSeqString()); return b.toString(); } @Override public ImmutableRoute<V> clone() { return new ImmutableRoute<>(this, mHash); } @Override public int hashCode() { return mHash; } @Override public boolean equals(Object obj) { return obj instanceof ImmutableRoute<?> && ((ImmutableRoute<?>) obj).mHash == this.mHash; } }