[ONOS-3113] Flow Classifier Manager test case fixed

Change-Id: Ie4a35ec65f85ebf5ce5c20849d471fd3f947c405
diff --git a/apps/vtn/vtnrsc/pom.xml b/apps/vtn/vtnrsc/pom.xml
index 816624c..c6414a8 100644
--- a/apps/vtn/vtnrsc/pom.xml
+++ b/apps/vtn/vtnrsc/pom.xml
@@ -52,5 +52,12 @@
             <artifactId>onos-core-serializers</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-core-common</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java
index 18f63b3..c5b0dcf 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java
@@ -28,6 +28,8 @@
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.EventuallyConsistentMap;
+import org.onosproject.store.service.EventuallyConsistentMapEvent;
+import org.onosproject.store.service.EventuallyConsistentMapListener;
 import org.onosproject.store.service.MultiValuedTimestamp;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
@@ -51,16 +53,21 @@
     private static final String FLOW_CLASSIFIER_NOT_NULL = "Flow Classifier cannot be null";
     private static final String FLOW_CLASSIFIER_ID_NOT_NULL = "Flow Classifier Id cannot be null";
     private static final String LISTENER_NOT_NULL = "Listener cannot be null";
+    private static final String EVENT_NOT_NULL = "event cannot be null";
 
     private final Logger log = getLogger(FlowClassifierManager.class);
 
     private EventuallyConsistentMap<FlowClassifierId, FlowClassifier> flowClassifierStore;
 
+    private EventuallyConsistentMapListener<FlowClassifierId, FlowClassifier> flowClassifierListener =
+            new InnerFlowClassifierStoreListener();
+
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected StorageService storageService;
 
     @Activate
     protected void activate() {
+        eventDispatcher.addSink(FlowClassifierEvent.class, listenerRegistry);
         KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
                 .register(KryoNamespaces.API)
                 .register(MultiValuedTimestamp.class)
@@ -69,11 +76,13 @@
                 .<FlowClassifierId, FlowClassifier>eventuallyConsistentMapBuilder()
                 .withName("flowclassifierstore").withSerializer(serializer)
                 .withTimestampProvider((k, v) -> new WallClockTimestamp()).build();
+        flowClassifierStore.addListener(flowClassifierListener);
         log.info("Flow Classifier service activated");
     }
 
     @Deactivate
     protected void deactivate() {
+        eventDispatcher.removeSink(FlowClassifierEvent.class);
         flowClassifierStore.destroy();
         log.info("Flow Classifier service deactivated");
     }
@@ -144,4 +153,35 @@
         }
         return true;
     }
+
+    private class InnerFlowClassifierStoreListener
+            implements
+            EventuallyConsistentMapListener<FlowClassifierId, FlowClassifier> {
+
+        @Override
+        public void event(EventuallyConsistentMapEvent<FlowClassifierId, FlowClassifier> event) {
+            checkNotNull(event, EVENT_NOT_NULL);
+            FlowClassifier flowClassifier = event.value();
+            if (EventuallyConsistentMapEvent.Type.PUT == event.type()) {
+                notifyListeners(new FlowClassifierEvent(
+                        FlowClassifierEvent.Type.FLOW_CLASSIFIER_PUT,
+                        flowClassifier));
+            }
+            if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) {
+                notifyListeners(new FlowClassifierEvent(
+                        FlowClassifierEvent.Type.FLOW_CLASSIFIER_DELETE,
+                        flowClassifier));
+            }
+        }
+    }
+
+    /**
+     * Notifies specify event to all listeners.
+     *
+     * @param event flow classifier event
+     */
+    private void notifyListeners(FlowClassifierEvent event) {
+        checkNotNull(event, EVENT_NOT_NULL);
+        post(event);
+    }
 }
diff --git a/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManagerTest.java b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManagerTest.java
index 8283a52..ceebec8 100644
--- a/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManagerTest.java
+++ b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManagerTest.java
@@ -29,6 +29,9 @@
 import org.onosproject.vtnrsc.VirtualPortId;
 import org.onosproject.vtnrsc.FlowClassifier;
 import org.onosproject.vtnrsc.util.VtnStorageServiceTest;
+import org.onosproject.common.event.impl.TestEventDispatcher;
+
+import static org.onosproject.net.NetTestTools.injectEventDispatcher;
 
 /**
  * Unit tests for FlowClassifierManager class.
@@ -61,6 +64,7 @@
     public void testCreateFlowClassifier() {
         // initialize flow classifier manager
         flowClassifierMgr.storageService = storageService;
+        injectEventDispatcher(flowClassifierMgr, new TestEventDispatcher());
         flowClassifierMgr.activate();
 
         // create flow classifier