[ONOS-6958] Register policon for openflow

Change-Id: Ie54b14f331d0b7affc962a70d93c5da6d7960d13
diff --git a/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalDriversLoader.java b/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalDriversLoader.java
index e9d6b30..af6edf9 100644
--- a/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalDriversLoader.java
+++ b/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalDriversLoader.java
@@ -34,6 +34,9 @@
 import org.onosproject.net.config.NetworkConfigRegistryAdapter;
 import org.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.optical.OpticalDevice;
+import org.onosproject.ui.UiGlyph;
+import org.onosproject.ui.UiGlyphFactory;
+import org.onosproject.ui.UiExtensionService;
 
 import com.google.common.collect.ImmutableList;
 
@@ -50,7 +53,34 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected NetworkConfigRegistry registry = new NetworkConfigRegistryAdapter();
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected UiExtensionService uiExtensionService;
 
+    private UiGlyphFactory glyphFactory =
+        () -> ImmutableList.of(
+            new UiGlyph("policon", "0 0 64 64",
+                "M 32.024746,2 30.163615,19.069136 24.258784,3.015638 "
+                + "26.879599,19.985033 17.021343,6.007051 23.943688,21.71947 "
+                + "10.8045,10.769161 21.557349,24.15439 6.031794,16.978659 "
+                + "19.883076,27.1245 3.027943,24.21114 19.033986,30.42674 "
+                + "2,31.97526 19.069136,33.83639 3.015638,39.74122 "
+                + "19.985033,37.12041 6.007051,46.97866 21.719466,40.05632 "
+                + "10.769161,53.19551 24.154391,42.44265 16.978659,57.96822 "
+                + "27.124504,44.11693 24.21114,60.97206 30.426738,44.96602 "
+                + "31.975259,62 33.83639,44.93086 39.74122,60.98437 "
+                + "37.120405,44.01497 46.978663,57.99296 40.056317,42.28054 "
+                + "53.195507,53.23084 42.442656,39.84561 57.968215,47.02135 "
+                + "44.116927,36.8755 60.972063,39.78886 44.966018,33.57327 "
+                + "62,32.02475 44.930865,30.16362 60.984369,24.25878 "
+                + "44.014972,26.8796 57.992959,17.021342 42.280539,23.94369 "
+                + "53.23084,10.8045 39.845614,21.55735 47.021349,6.031794 "
+                + "36.875501,19.883076 39.788865,3.027943 33.573267,19.033986 Z "
+                + "m -0.05497,19.23081 A 10.768943,10.768943 0 0 1 "
+                + "42.769201,31.96977 10.768943,10.768943 0 0 1 "
+                + "32.030235,42.7692 10.768943,10.768943 0 0 1 "
+                + "21.230812,32.03023 10.768943,10.768943 0 0 1 "
+                + "31.969778,21.23081 Z")
+            );
 
     private final List<ConfigFactory> factories = ImmutableList.of(
          new ConfigFactory<DeviceId, FlowTableConfig>(DEVICE_SUBJECT_FACTORY,
@@ -79,6 +109,7 @@
     @Override
     protected void activate() {
         factories.forEach(registry::registerConfigFactory);
+        uiExtensionService.register(glyphFactory);
 
         super.activate();
     }
@@ -87,6 +118,7 @@
     @Override
     protected void deactivate() {
         factories.forEach(registry::unregisterConfigFactory);
+        uiExtensionService.unregister(glyphFactory);
         super.deactivate();
     }
 
diff --git a/drivers/optical/src/main/resources/optical-drivers.xml b/drivers/optical/src/main/resources/optical-drivers.xml
index 1c2c418..55b4d17 100644
--- a/drivers/optical/src/main/resources/optical-drivers.xml
+++ b/drivers/optical/src/main/resources/optical-drivers.xml
@@ -104,6 +104,7 @@
         <behaviour api="org.onosproject.net.behaviour.LambdaQuery"
                    impl="org.onosproject.driver.optical.query.OpenFlowLambdaQuery"/>
         <property name="meterCapable">false</property>
+        <property name="uiType">policon</property>
     </driver>
 
     <driver name="optical-config" manufacturer="config" hwVersion="config" swVersion="config">
diff --git a/drivers/optical/src/test/java/org/onosproject/drivers/optical/OpticalDriversLoaderTest.java b/drivers/optical/src/test/java/org/onosproject/drivers/optical/OpticalDriversLoaderTest.java
index 2fb2a38..70664e6 100644
--- a/drivers/optical/src/test/java/org/onosproject/drivers/optical/OpticalDriversLoaderTest.java
+++ b/drivers/optical/src/test/java/org/onosproject/drivers/optical/OpticalDriversLoaderTest.java
@@ -17,6 +17,7 @@
 
 import org.junit.Before;
 import org.onosproject.net.driver.AbstractDriverLoaderTest;
+import org.onosproject.ui.UiExtensionServiceAdapter;
 
 /**
  * Optical drivers loader test.
@@ -26,5 +27,6 @@
     @Before
     public void setUp() {
         loader = new OpticalDriversLoader();
+        ((OpticalDriversLoader) loader).uiExtensionService = new UiExtensionServiceAdapter();
     }
 }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
index 8b70c43..7027fc2 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
@@ -295,7 +295,10 @@
         Device device = event.subject();
         String uiType = device.annotations().value(AnnotationKeys.UI_TYPE);
         String devType = uiType != null ? uiType :
-                device.type().toString().toLowerCase();
+            services.driver().getDriver(device.id()).getProperty(AnnotationKeys.UI_TYPE);
+        if (devType == null) {
+            devType = device.type().toString().toLowerCase();
+        }
         String name = device.annotations().value(AnnotationKeys.NAME);
         name = isNullOrEmpty(name) ? device.id().toString() : name;
 
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/util/ServicesBundle.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/util/ServicesBundle.java
index ed86612..76c72f3 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/util/ServicesBundle.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/util/ServicesBundle.java
@@ -23,6 +23,7 @@
 import org.onosproject.mastership.MastershipAdminService;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.flow.FlowRuleService;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.intent.IntentService;
@@ -41,6 +42,7 @@
 
     private TopologyService topologyService;
     private DeviceService deviceService;
+    private DriverService driverService;
     private HostService hostService;
     private LinkService linkService;
     private TunnelService tunnelService;
@@ -105,6 +107,15 @@
     }
 
     /**
+     * Returns a reference to the driver service.
+     *
+     * @return driver service reference
+     */
+    public DriverService driver() {
+        return driverService;
+    }
+
+    /**
      * Returns a reference to the host service.
      *
      * @return host service reference