// License: GPL. For details, see LICENSE file. package com.innovant.josm.plugin.routing; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import com.innovant.josm.jrt.core.RoutingGraph; import com.innovant.josm.jrt.core.RoutingGraph.Algorithm; import com.innovant.josm.jrt.osm.OsmEdge; /** * This class holds all the routing data and operations * @author juangui * @author Jose Vidal * */ public class RoutingModel { /** * Logger */ static Logger logger = Logger.getLogger(RoutingModel.class); /** * Graph to calculate route */ public RoutingGraph routingGraph = null; /** * List of nodes that the route has to traverse */ private List<Node> nodes = null; private List<OsmEdge> path = null; /** * Flag to advise about changes in the selected nodes. */ private boolean changeNodes = false; /** * Flag to advise about changes in ways. */ private boolean changeOneway = false; /** * Default Constructor. */ public RoutingModel(DataSet data) { nodes = new ArrayList<>(); System.out.println("gr " + data); routingGraph = new RoutingGraph(data); } /** * Method that returns the selected nodes to calculate route. * @return the selectedNodes */ public List<Node> getSelectedNodes() { return nodes; } /** * Adds a node to the route node list. * @param node the node to add. */ public void addNode(Node node) { nodes.add(node); this.changeNodes = true; } /** * Removes a node from the route node list. * @param index the index of the node to remove. */ public void removeNode(int index) { if (nodes.size() > index) { nodes.remove(index); this.changeNodes = true; } } /** * Inserts a node in the route node list. * @param index the index where the node will be inserted * @param node the node to be inserted */ public void insertNode(int index, Node node) { if (nodes.size() >= index) { nodes.add(index, node); this.changeNodes = true; } } /** * Reverse list of nodes */ public void reverseNodes() { List<Node> aux = new ArrayList<>(); for (Node n : nodes) { aux.add(0, n); } nodes = aux; this.changeNodes = true; } /** * Get the edges of the route. * @return A list of edges forming the shortest path */ public List<OsmEdge> getRouteEdges() { if (this.changeNodes || path == null) { path = this.routingGraph.applyAlgorithm(nodes, Algorithm.ROUTING_ALG_DIJKSTRA); this.changeNodes = false; this.changeOneway = false; } return path; } /** * Marks that some node or the node order has changed so the path should be computed again */ public void setNodesChanged() { this.changeNodes = true; } /** * Marks that "Ignore oneway" option has changed so the path should be computed again */ public void setOnewayChanged() { this.changeOneway = true; } /** * Marks that "Ignore oneway" option has changed so the path should be computed again */ public boolean getOnewayChanged() { return this.changeOneway; } /** * Resets all data. */ public void reset() { nodes.clear(); this.changeNodes = true; } }