ONOS-6730: Topo View i18n:
- Deprecate non-localized PropertyPanel.addProp() methods.
- Add modify*LinkDetails() methods to UiTopoOverlay class.
- Augment TVMH.RequestDetails to handle link details requests.
- Refactor deviceDetails() to allow piecemeal construction of the Properties Panel.
    This allows us to include (or not) the location properties (geo/grid).
- Refactor hostDetails() for piecemeal construction of Properties Panel.
- Add edgeLinkDetails() and infraLinkDetails() methods.
- No lat/long suppression now done server-side. Check for trailing separator.
- Augment requestDetails() to format link details requests.
- Added lion.getSafe(Enum<?>) method.
- Added DeviceEnums and LinkEnums resource bundles.

Change-Id: Ibbd113a7d5ef73765cd10aed0fb7ea8efbaa16c5
diff --git a/core/api/src/main/java/org/onosproject/ui/UiTopoOverlay.java b/core/api/src/main/java/org/onosproject/ui/UiTopoOverlay.java
index 5e0b439..c373bd3 100644
--- a/core/api/src/main/java/org/onosproject/ui/UiTopoOverlay.java
+++ b/core/api/src/main/java/org/onosproject/ui/UiTopoOverlay.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.ui;
 
+import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.HostId;
 import org.onosproject.net.link.LinkEvent;
@@ -114,7 +115,7 @@
      * a selected device.
      * This default implementation does nothing.
      *
-     * @param pp       property panel model of summary data
+     * @param pp       property panel model of device data
      * @param deviceId device id
      */
     public void modifyDeviceDetails(PropertyPanel pp, DeviceId deviceId) {
@@ -125,13 +126,48 @@
      * a selected host.
      * This default implementation does nothing.
      *
-     * @param pp     property panel model of summary data
+     * @param pp     property panel model of host data
      * @param hostId host id
      */
     public void modifyHostDetails(PropertyPanel pp, HostId hostId) {
     }
 
     /**
+     * Callback to modify the contents of the details panel for a selected
+     * edge link. The parameters include identifiers for the host and the
+     * connect point (device and port) to which the host is connected.
+     * <p>
+     * This default implementation does nothing.
+     *
+     * @param pp     property panel model of edge link data
+     * @param hostId host ID
+     * @param cp     connect point
+     */
+    public void modifyEdgeLinkDetails(PropertyPanel pp,
+                                      HostId hostId, ConnectPoint cp) {
+    }
+
+    /**
+     * Callback to modify the contents of the details panel for a selected
+     * infrastructure link. The parameters include the two connect points
+     * at either end of the link.
+     * <p>
+     * Note that links in the topology view are (usually) "bi-directional",
+     * meaning that both {@literal A-->B} and {@literal B-->A} backing links
+     * exist. If, however, there is only one backing link, it is guaranteed
+     * to be {@literal A-->B}.
+     * <p>
+     * This default implementation does nothing.
+     *
+     * @param pp  property panel model of infrastructure link data
+     * @param cpA connect point A
+     * @param cpB connect point B
+     */
+    public void modifyInfraLinkDetails(PropertyPanel pp,
+                                       ConnectPoint cpA, ConnectPoint cpB) {
+    }
+
+    /**
      * Callback invoked when a link event is processed (e.g.&nbsp;link added).
      * A subclass may override this method to return a map of property
      * key/value pairs to be included in the JSON event back to the client,
@@ -144,7 +180,8 @@
      * @param event the link event
      * @return map of additional key/value pairs to be added to the JSON event
      * @deprecated this is a temporary addition for Goldeneye (1.6) release,
-     * and expected to be replaced in the Ibis (1.8) release
+     * and is superceded by use of {@link #modifyEdgeLinkDetails} and
+     * {@link #modifyInfraLinkDetails}.
      */
     @Deprecated
     public Map<String, String> additionalLinkData(LinkEvent event) {