VOL-458: NPE when executing ONOS aaa-users command after an disable ONU

Change-Id: I81720d2de540aee392b1038b443d8ed6c8fadc75
diff --git a/src/main/java/org/opencord/aaa/AaaManager.java b/src/main/java/org/opencord/aaa/AaaManager.java
index 1df4574..b821d79 100755
--- a/src/main/java/org/opencord/aaa/AaaManager.java
+++ b/src/main/java/org/opencord/aaa/AaaManager.java
@@ -41,6 +41,8 @@
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficTreatment;
@@ -63,6 +65,7 @@
 
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
+import java.util.Map;
 
 /**
  * AAA application for ONOS.
@@ -98,6 +101,8 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected AccessDeviceService accessDeviceService;
 
+    private final DeviceListener deviceListener = new InternalDeviceListener();
+
     // NAS IP address
     protected InetAddress nasIpAddress;
 
@@ -228,6 +233,8 @@
 
         impl.requestIntercepts();
 
+        deviceService.addListener(deviceListener);
+
         log.info("Started");
     }
 
@@ -240,6 +247,7 @@
         StateMachine.destroyMaps();
 
         impl.deactivate();
+        deviceService.removeListener(deviceListener);
 
         log.info("Stopped");
     }
@@ -586,4 +594,27 @@
             }
         }
     }
+
+    private class InternalDeviceListener implements DeviceListener {
+        @Override
+        public void event(DeviceEvent event) {
+
+            switch (event.type()) {
+                case PORT_REMOVED:
+                    DeviceId devId = event.subject().id();
+                    PortNumber portNumber = event.port().number();
+                    String sessionId = devId.toString() + portNumber.toString();
+
+                    Map<String, StateMachine> sessionIdMap = StateMachine.sessionIdMap();
+                    StateMachine removed = sessionIdMap.remove(sessionId);
+                    if (removed != null) {
+                        StateMachine.deleteStateMachineMapping(removed);
+                    }
+
+                    break;
+                default:
+                    return;
+            }
+        }
+    }
 }