protected void updatePredecessorsFor(Host host) {
    NetID pre = getOverlayPredecessor(host);
    EdgeHandle old_pre = predecessors.get(host);
    // log.debug("PREDECESSORS: " + pre + "|" + ((old_pre !=
    // null)?old_pre.getTo():"null"));

    if (pre == null) {
      if (old_pre != null) {
        old_pre.remove();
      }
    } else if (old_pre == null || !pre.equals(old_pre.getTo())) {
      if (old_pre != null) {
        old_pre.remove();
      }
      EdgeHandle newEdge = this.addEdge(netID(host), pre, Color.CYAN, "predecessor");
      predecessors.put(host, newEdge);
    }
  }
  private void refreshRingEdgesForNetId(NetID netid, AbstractChordRoutingTable crt) {
    if (crt == null) {
      return;
    }
    AbstractChordContact[] ue = ((ChordRoutingTable) crt).getRingEdgesAsArray();
    LinkedHashSet<AbstractChordContact> ue_set =
        new LinkedHashSet<AbstractChordContact>(Arrays.asList(ue));
    if (ue_set.contains(null)) {
      ue_set.remove(null);
    }

    if (ue != null) {

      Set<EdgeHandle> vis_ue = ringEdges.get(netid);
      if (vis_ue == null) {
        vis_ue = new LinkedHashSet<EdgeHandle>();
        ringEdges.put(netid, vis_ue);
      }

      // delete all edges that do not exist nomore.
      for (EdgeHandle h : vis_ue) {
        if (h == null) {
          continue;
        }

        boolean stillInUse = false;

        for (AbstractChordContact con : ue_set) {
          NetID newNetID;
          if (((ChordContact) con).isRealNode()) {
            newNetID = con.getTransInfo().getNetId();
          } else {
            newNetID = virtualNodes.get(con.getOverlayID());
          }

          if (h.getTo() == newNetID) {
            stillInUse = true;
          }
        }

        if (!stillInUse) {
          h.remove();
        }
      }

      // add all edges that are new
      for (AbstractChordContact con : ue_set) {
        NetID newNetID;
        if (((ChordContact) con).isRealNode()) {
          newNetID = con.getTransInfo().getNetId();
        } else {
          newNetID = virtualNodes.get(con.getOverlayID());
        }

        boolean inSet = false;
        for (EdgeHandle h : vis_ue) {
          if (h == null) {
            continue;
          }
          if (newNetID == h.getTo()) {
            inSet = true;
          }
        }

        if (!inSet) {
          EdgeHandle e = this.addEdge(netid, newNetID, Color.MAGENTA, "ringEdges");
          vis_ue.add(e);
        }
      }
    }
  }