CompleteRoute.java

package org.opentrafficsim.core.network.route;

import java.util.List;

import org.opentrafficsim.core.gtu.GTUType;
import org.opentrafficsim.core.network.Link;
import org.opentrafficsim.core.network.Network;
import org.opentrafficsim.core.network.NetworkException;
import org.opentrafficsim.core.network.Node;

import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;

/**
 * A CompleteRoute is a Route with directly connected Nodes.
 * <p>
 * Copyright (c) 2013-2018 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
 * <p>
 * $LastChangedDate: 2015-07-16 10:20:53 +0200 (Thu, 16 Jul 2015) $, @version $Revision: 1124 $, by $Author: pknoppers $,
 * initial version Jul 22, 2015 <br>
 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
 * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
 */
public class CompleteRoute extends Route
{
    /** */
    private static final long serialVersionUID = 20150722L;

    /** The GTUType for which this is a route. */
    private final GTUType gtuType;

    /**
     * Create an empty route for the given GTUType.
     * @param id the name of the route
     * @param gtuType the GTUType for which this is a route
     */
    public CompleteRoute(final String id, final GTUType gtuType)
    {
        super(id);
        this.gtuType = gtuType;
    }

    /**
     * Create a route based on an initial list of nodes. <br>
     * This constructor makes a defensive copy of the provided List.
     * @param id the name of the route.
     * @param gtuType the GTUType for which this is a route
     * @param nodes the initial list of nodes.
     * @throws NetworkException if intermediate nodes are missing in the route.
     */
    public CompleteRoute(final String id, final GTUType gtuType, final List<Node> nodes) throws NetworkException
    {
        super(id, nodes);
        this.gtuType = gtuType;
        Node fromNode = null;
        for (Node toNode : getNodes())
        {
            if (null != fromNode)
            {
                if (!fromNode.isDirectionallyConnectedTo(this.gtuType, toNode))
                {
                    throw new NetworkException("CompleteRoute: node " + fromNode
                            + " not directly or not directionally connected to node " + toNode);
                }
            }
            fromNode = toNode;
        }
    }

    /** {@inheritDoc} */
    @Override
    public final CompleteRoute addNode(final Node node) throws NetworkException
    {
        if (getNodes().size() > 0)
        {
            Node lastNode = getNodes().get(getNodes().size() - 1);
            if (!lastNode.isDirectionallyConnectedTo(this.gtuType, node))
            {
                throw new NetworkException("CompleteRoute: last node " + lastNode
                        + " not directly or not directionally connected to node " + node);
            }
        }
        super.addNode(node);
        return this;
    }

    /**
     * Determine if this Route contains the specified Link.
     * @param link the link to check in the route.
     * @return whether the link is part of the route or not.
     */
    public final boolean containsLink(final Link link)
    {
        int index1 = getNodes().indexOf(link.getStartNode());
        int index2 = getNodes().indexOf(link.getEndNode());
        return index1 >= 0 && index2 >= 0 && Math.abs(index2 - index1) == 1;
    }

    /** {@inheritDoc} */
    @Override
    public final String toString()
    {
        return "CompleteRoute [gtuType=" + this.gtuType + ", nodes=" + super.getNodes() + "]";
    }

    /** {@inheritDoc} */
    @Override
    @SuppressWarnings("checkstyle:designforextension")
    public CompleteRoute clone(final Network newNetwork, final SimulatorInterface.TimeDoubleUnit newSimulator,
            final boolean animation) throws NetworkException
    {
        CompleteRoute newRoute = new CompleteRoute(getId(), this.gtuType);
        for (Node node : getNodes())
        {
            newRoute.addNode(newNetwork.getNode(node.getId()));
        }
        return newRoute;
    }

}