protected String getEdgeTooltipText(DataLinkInterface link, Vertex source, Vertex target) {
    StringBuffer tooltipText = new StringBuffer();

    OnmsSnmpInterface sourceInterface =
        getSnmpInterfaceDao()
            .findByNodeIdAndIfIndex(Integer.parseInt(source.getId()), link.getIfIndex());
    OnmsSnmpInterface targetInterface =
        getSnmpInterfaceDao()
            .findByNodeIdAndIfIndex(Integer.parseInt(target.getId()), link.getParentIfIndex());

    tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
    if (sourceInterface != null
        && targetInterface != null
        && sourceInterface.getNetMask() != null
        && !sourceInterface.getNetMask().isLoopbackAddress()
        && targetInterface.getNetMask() != null
        && !targetInterface.getNetMask().isLoopbackAddress()) {
      tooltipText.append("Type of Link: Layer3/Layer2");
    } else {
      tooltipText.append("Type of Link: Layer2");
    }
    tooltipText.append(HTML_TOOLTIP_TAG_END);

    tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
    tooltipText.append("Name: <endpoint1 " + source.getLabel());
    if (sourceInterface != null) tooltipText.append(":" + sourceInterface.getIfName());
    tooltipText.append(" ---- endpoint2 " + target.getLabel());
    if (targetInterface != null) tooltipText.append(":" + targetInterface.getIfName());
    tooltipText.append(">");
    tooltipText.append(HTML_TOOLTIP_TAG_END);

    LinkStateMachine stateMachine = new LinkStateMachine();
    stateMachine.setParentInterfaces(sourceInterface, targetInterface);
    tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
    tooltipText.append("Link status: " + stateMachine.getLinkStatus());
    tooltipText.append(HTML_TOOLTIP_TAG_END);

    if (targetInterface != null) {
      if (targetInterface.getIfSpeed() != null) {
        tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
        tooltipText.append("Bandwidth: " + getHumanReadableIfSpeed(targetInterface.getIfSpeed()));
        tooltipText.append(HTML_TOOLTIP_TAG_END);
      }
    } else if (sourceInterface != null) {
      if (sourceInterface.getIfSpeed() != null) {
        tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
        tooltipText.append("Bandwidth: " + getHumanReadableIfSpeed(sourceInterface.getIfSpeed()));
        tooltipText.append(HTML_TOOLTIP_TAG_END);
      }
    }

    tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
    tooltipText.append("End Point 1: " + source.getLabel() + ", " + source.getIpAddress());
    tooltipText.append(HTML_TOOLTIP_TAG_END);

    tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
    tooltipText.append("End Point 2: " + target.getLabel() + ", " + target.getIpAddress());
    tooltipText.append(HTML_TOOLTIP_TAG_END);

    return tooltipText.toString();
  }
  protected static String getNodeTooltipText(
      OnmsNode node, AbstractVertex vertex, OnmsIpInterface ip) {
    StringBuffer tooltipText = new StringBuffer();

    /*
    if (node.getSysDescription() != null && node.getSysDescription().length() >0) {
        tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
        tooltipText.append("Description: " + node.getSysDescription());
        tooltipText.append(HTML_TOOLTIP_TAG_END);
    }
    */

    tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
    tooltipText.append(
        "Management IP and Name: " + vertex.getIpAddress() + " (" + vertex.getLabel() + ")");
    tooltipText.append(HTML_TOOLTIP_TAG_END);

    if (node.getSysLocation() != null && node.getSysLocation().length() > 0) {
      tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
      tooltipText.append("Location: " + node.getSysLocation());
      tooltipText.append(HTML_TOOLTIP_TAG_END);
    }

    tooltipText.append(HTML_TOOLTIP_TAG_OPEN);
    tooltipText.append("Status: " + getNodeStatusString(node.getType()));
    if (ip != null && ip.isManaged()) {
      tooltipText.append(" / Managed");
    } else {
      tooltipText.append(" / Unmanaged");
    }
    tooltipText.append(HTML_TOOLTIP_TAG_END);

    return tooltipText.toString();
  }