+
+ @VisibleForTesting
+ DeviceConnectionStatusProvider getDeviceConnectionStatusProvider() {
+ return deviceConnectionStatusProvider;
+ }
+
+ @Override
+ public void close() throws Exception {
+ if (deviceConnectionStatusProvider != null) {
+ deviceConnectionStatusProvider.close();
+ deviceConnectionStatusProvider = null;
+ }
+ if (executorsService != null) {
+ executorsService.shutdownNow();
+ }
+ }
+
+ class DeviceConnectionStatusProviderImpl implements DeviceConnectionStatusProvider,
+ ClusteredDataTreeChangeListener<Node> {
+ private final Map<BigInteger, LocalDateTime> deviceConnectionMap = new ConcurrentHashMap<>();
+
+ private ListenerRegistration<DeviceConnectionStatusProviderImpl> listenerRegistration;
+
+ @Override
+ @SuppressWarnings({"checkstyle:IllegalCatch"})
+ public void init() {
+ DataTreeIdentifier<Node> treeId = DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
+ getWildCardPath());
+ try {
+ listenerRegistration = dataBroker.registerDataTreeChangeListener(treeId, this);
+ } catch (Exception e) {
+ LOG.error("DeviceConnectionStatusProvider listener registration failed", e);
+ }
+ }
+
+ @Override
+ public LocalDateTime getDeviceLastConnectionTime(final BigInteger nodeId) {
+ return deviceConnectionMap.get(nodeId);
+ }
+
+ @Override
+ public void addDeviceLastConnectionTime(final BigInteger nodeId, final LocalDateTime time) {
+ deviceConnectionMap.put(nodeId, time);
+ }
+
+ @Override
+ public void removeDeviceLastConnectionTime(final BigInteger nodeId) {
+ deviceConnectionMap.remove(nodeId);
+ }
+
+ @Override
+ public void onDataTreeChanged(@NonNull final Collection<DataTreeModification<Node>> changes) {
+ Preconditions.checkNotNull(changes, "Changes must not be null!");
+ for (DataTreeModification<Node> change : changes) {
+ final DataObjectModification<Node> mod = change.getRootNode();
+ switch (mod.getModificationType()) {
+ case DELETE:
+ break;
+ case SUBTREE_MODIFIED:
+ break;
+ case WRITE:
+ processNodeModification(change);
+ break;
+ default:
+ throw new IllegalArgumentException("Unhandled modification type " + mod.getModificationType());
+ }
+ }
+ }
+
+ private InstanceIdentifier<Node> getWildCardPath() {
+ return InstanceIdentifier.create(Nodes.class).child(Node.class);
+ }
+
+ private void processNodeModification(final DataTreeModification<Node> change) {
+ final InstanceIdentifier<Node> key = change.getRootPath().getRootIdentifier();
+ final InstanceIdentifier<Node> nodeIdent = key.firstIdentifierOf(Node.class);
+ String[] nodeIdentity = nodeIdent.firstKeyOf(Node.class).getId().getValue().split(":");
+ String nodeId = nodeIdentity[1];
+ LOG.info("Clearing the device connection timer for the device {}", nodeId);
+ removeDeviceLastConnectionTime(new BigInteger(nodeId));
+ }
+
+ @Override
+ public void close() {
+ if (listenerRegistration != null) {
+ listenerRegistration.close();
+ listenerRegistration = null;
+ }
+ }
+ }