[ONOS-5751] Initial implementation of LISP mapping provider

Change-Id: Ibddfc9f92e4d385c9995e7baa3613a2562499fbf
diff --git a/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java b/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java
index 7c6d016..09bf3e6 100644
--- a/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java
+++ b/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java
@@ -24,9 +24,17 @@
 import org.onosproject.lisp.ctl.LispMessageListener;
 import org.onosproject.lisp.ctl.LispRouterId;
 import org.onosproject.lisp.ctl.LispRouterListener;
+import org.onosproject.lisp.msg.protocols.LispMapNotify;
+import org.onosproject.lisp.msg.protocols.LispMapReply;
 import org.onosproject.lisp.msg.protocols.LispMessage;
+import org.onosproject.mapping.MappingEntry;
+import org.onosproject.mapping.MappingProvider;
+import org.onosproject.mapping.MappingProviderRegistry;
+import org.onosproject.mapping.MappingProviderService;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.provider.lisp.mapping.util.MappingEntryBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,13 +42,18 @@
  * Provider which uses a LISP controller to manage EID-RLOC mapping.
  */
 @Component(immediate = true)
-public class LispMappingProvider extends AbstractProvider {
+public class LispMappingProvider extends AbstractProvider implements MappingProvider {
 
     private static final Logger log = LoggerFactory.getLogger(LispMappingProvider.class);
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected LispController controller;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MappingProviderRegistry providerRegistry;
+
+    protected MappingProviderService providerService;
+
     private static final String SCHEME_NAME = "lisp";
     private static final String MAPPING_PROVIDER_PACKAGE =
                                 "org.onosproject.lisp.provider.mapping";
@@ -57,6 +70,8 @@
     @Activate
     public void activate() {
 
+        providerService = providerRegistry.register(this);
+
         // listens all LISP router related events
         controller.addRouterListener(listener);
 
@@ -69,12 +84,16 @@
     @Deactivate
     public void deactivate() {
 
+        providerRegistry.unregister(this);
+
         // stops listening all LISP router related events
         controller.removeRouterListener(listener);
 
         // stops listening all LISP control messages
         controller.removeMessageListener(listener);
 
+        providerService = null;
+
         log.info("Stopped");
     }
 
@@ -106,7 +125,31 @@
 
         @Override
         public void handleOutgoingMessage(LispRouterId routerId, LispMessage msg) {
+            if (providerService == null) {
+                // We are shutting down, nothing to be done
+                return;
+            }
 
+            DeviceId deviceId = DeviceId.deviceId(routerId.toString());
+            switch (msg.getType()) {
+
+                case LISP_MAP_REPLY:
+                    LispMapReply reply = (LispMapReply) msg;
+
+                    MappingEntry replyMe = new MappingEntryBuilder(deviceId, reply).build();
+                    providerService.mappingAdded(replyMe, false);
+                    break;
+
+                case LISP_MAP_NOTIFY:
+                    LispMapNotify notify = (LispMapNotify) msg;
+
+                    MappingEntry notifyMe = new MappingEntryBuilder(deviceId, notify).build();
+                    providerService.mappingAdded(notifyMe, true);
+                    break;
+
+                default:
+                    log.warn("Unhandled message type: {}", msg.getType());
+            }
         }
     }
 }