private void FetchFromFile(Element eElement) {
    PrintConsole.print("App fetchs gatways from a different file.");
    fileAddress = eElement.getAttribute(ATTFILE);

    try {
      BufferedReader reader = null;
      int Id = 0;
      InputStream in = getClass().getResourceAsStream(fileAddress);
      reader = new BufferedReader(new InputStreamReader(in));
      String var = "";
      String[] Pos;
      gatways = new TreeMap<>();
      Vertex newGateway;
      while ((var = reader.readLine()) != null) {
        Pos = var.split("[ ]");
        newGateway = new Vertex(Id, new Point(Integer.valueOf(Pos[0]), Integer.valueOf(Pos[1])));
        gatways.put(newGateway.getId(), newGateway);
        Id++;
      }
      reader.close();

    } catch (Exception ex) {
      PrintConsole.printErr("GatewayConfig/FetchFromFile message:" + ex.getMessage());
    }
  }
  private void FetchStatic(Element eElement) {
    PrintConsole.print("App fetchs gatways from cofiguration file <config.xml>.");
    gatways = new TreeMap<Integer, Vertex>();
    int Id = 0;
    NodeList childNodes = eElement.getElementsByTagName(CHILD);
    Vertex newGateway;
    for (int counter = 0; counter < childNodes.getLength() && counter < num; counter++) {
      Node childNode = childNodes.item(counter);
      if (childNode.getNodeType() == Node.ELEMENT_NODE) {
        Element childElem = (Element) childNode;
        newGateway =
            new Vertex(
                Id,
                new Point(
                    Integer.valueOf(childElem.getAttribute("x")),
                    Integer.valueOf(childElem.getAttribute("y"))));

        gatways.put(newGateway.getId(), newGateway);
        Id++;
      }
    }
  }
  public List<Arc> chooseArcs(Solution solution, Vertex current) {

    List<Arc> nextArcs;

    List<Arc> currentOutgoing = current.getOutgoingArcs();
    List<Arc> currentOutgoingStillInAreaNotVisited = new LinkedList<Arc>();

    for (Arc arc : currentOutgoing) {
      Vertex endVertex = arc.getEnd();
      if (GeographicDistances.distance(
              endVertex, new Vertex(solution.getLatStart(), solution.getLngStart(), -1))
          < maxDistanceFromStart) {
        if (!arc.isVisited()) {
          currentOutgoingStillInAreaNotVisited.add(arc);
        }
      }
    }

    // The set of outgoing arcs contains arcs that are not visited
    // Choose the best arc among the set
    if (!currentOutgoingStillInAreaNotVisited.isEmpty()) {
      Collections.sort(currentOutgoingStillInAreaNotVisited, comparator);
      nextArcs = Collections.singletonList(currentOutgoingStillInAreaNotVisited.get(0));
    }

    // Else all the arcs are visited
    // Go to the nearest unvisited arc in the area
    // TODO - is there a better choice?
    else {
      nextArcs = pathToNearestUnvisitedArcInArea(current, solution);
    }

    int newTotal = solution.getTotalTime();
    for (Arc arc : nextArcs) newTotal += arc.getDuration();

    if (newTotal > maxTime || nextArcs.isEmpty()) return null;
    else return nextArcs;
  }