+ @Override
+ public void close() throws Exception {
+ deviceState.setValid(false);
+
+ LOG.trace("Removing node {} from operational DS.", getDeviceState().getNodeId());
+ addDeleteToTxChain(LogicalDatastoreType.OPERATIONAL, getDeviceState().getNodeInstanceIdentifier());
+
+ deviceGroupRegistry.close();
+ deviceFlowRegistry.close();
+ deviceMeterRegistry.close();
+
+ if (primaryConnectionContext.getConnectionAdapter().isAlive()) {
+ primaryConnectionContext.setConnectionState(ConnectionContext.CONNECTION_STATE.RIP);
+ primaryConnectionContext.getConnectionAdapter().disconnect();
+ }
+ for (final Map.Entry<Long, RequestContext> entry : requests.entrySet()) {
+ RequestContextUtil.closeRequestContextWithRpcError(entry.getValue(), DEVICE_DISCONNECTED);
+ }
+ for (final ConnectionContext connectionContext : auxiliaryConnectionContexts.values()) {
+ if (connectionContext.getConnectionAdapter().isAlive()) {
+ connectionContext.getConnectionAdapter().disconnect();
+ }
+ }
+ for (final DeviceContextClosedHandler deviceContextClosedHandler : closeHandlers) {
+ deviceContextClosedHandler.onDeviceContextClosed(this);
+ }
+
+ }
+
+ @Override
+ public void onDeviceDisconnected(final ConnectionContext connectionContext) {
+ if (this.getPrimaryConnectionContext().equals(connectionContext)) {
+ try {
+ close();
+ } catch (final Exception e) {
+ LOG.trace("Error closing device context.");
+ }
+ if (null != deviceDisconnectedHandler) {
+ deviceDisconnectedHandler.onDeviceDisconnected(connectionContext);
+ }
+ } else {
+ final SwitchConnectionDistinguisher connectionDistinguisher = createConnectionDistinguisher(connectionContext);
+ auxiliaryConnectionContexts.remove(connectionDistinguisher);
+ }
+ }
+