Port Annotation bug fix

1. Handled the case when InternalNetworkConfigListener in DeviceManager recieves an event associated with PortAnotationConfig class.
2. Added CONFIG_REMOVED event type in InternalNetworkConfigListener in DeviceManager.
3. Changed comine function in PortAnnotationOperator to take care of removing old annotations from PortDescription which are not in current
PortAnnotationConfig.

Tested using 'annotate-ports' command and 'ports' command

Change-Id: Ie4d2b529c2f559a40a296d916193318e0ccc7b93
diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/PortAnnotationOperator.java b/core/net/src/main/java/org/onosproject/net/device/impl/PortAnnotationOperator.java
index ac9ea84..700325f 100644
--- a/core/net/src/main/java/org/onosproject/net/device/impl/PortAnnotationOperator.java
+++ b/core/net/src/main/java/org/onosproject/net/device/impl/PortAnnotationOperator.java
@@ -15,11 +15,14 @@
  */
 package org.onosproject.net.device.impl;
 
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultAnnotations.Builder;
+import org.onosproject.net.config.Config;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.PortConfigOperator;
 import org.onosproject.net.config.basics.PortAnnotationConfig;
@@ -72,8 +75,33 @@
         builder.putAll(annotations);
 
         return DefaultPortDescription.builder(descr)
-                    .annotations(builder.build())
-                    .build();
+                .annotations(builder.build())
+                .build();
+    }
+
+    @Override
+    public PortDescription combine(ConnectPoint cp, PortDescription descr,
+                                   Optional<Config> prevConfig) {
+        PortAnnotationConfig cfg = lookupConfig(cp);
+        Map<String, String> annotations = new HashMap<>();
+        if (cfg != null) {
+            annotations.putAll(cfg.annotations());
+        }
+
+        Builder builder = DefaultAnnotations.builder();
+        builder.putAll(descr.annotations());
+        if (prevConfig.isPresent()) {
+            PortAnnotationConfig prevDeviceAnnotationConfig = (PortAnnotationConfig) prevConfig.get();
+            for (String key : prevDeviceAnnotationConfig.annotations().keySet()) {
+                if (!annotations.containsKey(key)) {
+                    builder.remove(key);
+                }
+            }
+        }
+        builder.putAll(annotations);
+        return DefaultPortDescription.builder(descr)
+                .annotations(builder.build())
+                .build();
     }
 
 }