Implement BGP Prefix Listener for BGP Controler

Change-Id: I8cbb43df45104e5cfd7dc7aa7225e5bf99a8ee37
diff --git a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpController.java b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpController.java
index a8520ce..4620d18 100644
--- a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpController.java
+++ b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpController.java
@@ -151,6 +151,27 @@
     Set<BgpLinkListener> linkListener();
 
     /**
+     * Register a listener for BGP Prefix message events.
+     *
+     * @param listener the listener to notify
+     */
+    void addPrefixListener(BgpPrefixListener listener);
+
+    /**
+     * Unregister a listener for BGP Prefix message events.
+     *
+     * @param listener the listener to unregister
+     */
+    void removePrefixListener(BgpPrefixListener listener);
+
+    /**
+     * Returns set of BGP prefix listeners.
+     *
+     * @return set of BGP prefix listeners
+     */
+    Set<BgpPrefixListener> prefixListener();
+
+    /**
      * Stores the exceptions occurred during an active session.
      *
      * @param peerId BGP peer id
diff --git a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPrefixListener.java b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPrefixListener.java
new file mode 100644
index 0000000..c047921
--- /dev/null
+++ b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPrefixListener.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.onosproject.bgp.controller;
+
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixIPv4LSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails;
+
+/**
+ * Allows for providers interested in bgp prefix events to be notified.
+ */
+public interface BgpPrefixListener {
+
+    /**
+     * Notify that prefix was added or updated.
+     *
+     * @param prefixNlri BGP prefix NLRI
+     * @param details path attributes and NLRI information
+     * @throws BgpParseException BGP parse exception
+     */
+    void addPrefix(BgpPrefixIPv4LSNlriVer4 prefixNlri, PathAttrNlriDetails details) throws BgpParseException;
+
+    /**
+     * Notify that prefix was removed.
+     *
+     * @param prefixNlri BGP prefix NLRI
+     * @throws BgpParseException BGP parse exception
+     */
+    void deletePrefix(BgpPrefixIPv4LSNlriVer4 prefixNlri) throws BgpParseException;
+}
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);
         }
 
diff --git a/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpControllerAdapter.java b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpControllerAdapter.java
index 8102f17..c1b53ed 100644
--- a/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpControllerAdapter.java
+++ b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpControllerAdapter.java
@@ -23,6 +23,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;
@@ -111,6 +112,12 @@
     }
 
     @Override
+    public Set<BgpPrefixListener> prefixListener() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
     public void activeSessionExceptionAdd(String peerId, String exception) {
         return;
     }
@@ -164,4 +171,14 @@
     public void removeLinkListener(BgpLinkListener listener) {
         // TODO Auto-generated method stub
     }
+
+    @Override
+    public void addPrefixListener(BgpPrefixListener listener) {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    public void removePrefixListener(BgpPrefixListener listener) {
+        // TODO Auto-generated method stub
+    }
 }