Implement BGP Prefix Listener for BGP Controler

Change-Id: I8cbb43df45104e5cfd7dc7aa7225e5bf99a8ee37
diff --git a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
index 804fb80..e23b838 100644
--- a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
+++ b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
@@ -24,6 +24,7 @@
 import org.onosproject.bgp.controller.BgpNodeListener;
 import org.onosproject.bgp.controller.BgpPeer;
 import org.onosproject.bgp.controller.BgpPeerManager;
+import org.onosproject.bgp.controller.BgpPrefixListener;
 import org.onosproject.bgp.controller.BgpRouteListener;
 import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.protocol.BgpMessage;
@@ -62,6 +63,7 @@
 
     protected Set<BgpNodeListener> bgpNodeListener = new CopyOnWriteArraySet<>();
     protected Set<BgpLinkListener> bgpLinkListener = new CopyOnWriteArraySet<>();
+    protected Set<BgpPrefixListener> bgpPrefixListener = new CopyOnWriteArraySet<>();
     protected BgpController bgpController;
     private BgpConfig bgpconfig = new BgpConfig(this);
     private List<String> activeExceptionList = new LinkedList();
@@ -366,4 +368,19 @@
     public Set<BgpLinkListener> linkListener() {
         return bgpLinkListener;
     }
+
+    @Override
+    public void addPrefixListener(BgpPrefixListener listener) {
+        bgpPrefixListener.add(listener);
+    }
+
+    @Override
+    public void removePrefixListener(BgpPrefixListener listener) {
+        bgpPrefixListener.remove(listener);
+    }
+
+    @Override
+    public Set<BgpPrefixListener> prefixListener() {
+        return bgpPrefixListener;
+    }
 }
diff --git a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpLocalRibImpl.java b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpLocalRibImpl.java
index ece0933..c66b6e4 100644
--- a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpLocalRibImpl.java
+++ b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpLocalRibImpl.java
@@ -14,12 +14,12 @@
 package org.onosproject.bgp.controller.impl;
 
 import com.google.common.base.MoreObjects;
-
 import org.onosproject.bgp.controller.BgpController;
 import org.onosproject.bgp.controller.BgpId;
 import org.onosproject.bgp.controller.BgpLinkListener;
 import org.onosproject.bgp.controller.BgpLocalRib;
 import org.onosproject.bgp.controller.BgpNodeListener;
+import org.onosproject.bgp.controller.BgpPrefixListener;
 import org.onosproject.bgp.controller.BgpSessionInfo;
 import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.protocol.BgpLSNlri;
@@ -183,10 +183,16 @@
                 decisionResult = selectionAlgo.compare(prefixTree.get(prefixIdentifier), detailsLocRib);
                 if (decisionResult <= 0) {
                     prefixTree.replace(prefixIdentifier, detailsLocRib);
+                    for (BgpPrefixListener l : bgpController.prefixListener()) {
+                        l.addPrefix((BgpPrefixIPv4LSNlriVer4) nlri, details);
+                    }
                     log.debug("Local RIB update prefix: {}", detailsLocRib.toString());
                 }
             } else {
                 prefixTree.put(prefixIdentifier, detailsLocRib);
+                for (BgpPrefixListener l : bgpController.prefixListener()) {
+                    l.addPrefix((BgpPrefixIPv4LSNlriVer4) nlri, details);
+                }
                 log.debug("Local RIB add prefix: {}", detailsLocRib.toString());
             }
         }
@@ -397,6 +403,9 @@
         BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
         if (prefixTree.containsKey(prefixIdentifier)) {
             log.debug("Local RIB remove prefix: {}", prefixIdentifier.toString());
+            for (BgpPrefixListener l : bgpController.prefixListener()) {
+                l.deletePrefix((BgpPrefixIPv4LSNlriVer4) nlri);
+            }
             prefixTree.remove(prefixIdentifier);
         }