+ if (idIntsListener == null || dtclReg == null) {
+ return RpcResultBuilder.<UnsubscribeDtclOutput>failed()
+ .withError(ErrorType.RPC, ErrorTag.DATA_MISSING, "No prior listener was registered")
+ .buildFuture();
+ }
+
+ long timeout = 120L;
+ try {
+ idIntsListener.tryFinishProcessing().get(timeout, TimeUnit.SECONDS);
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ LOG.error("Unable to finish notification processing", e);
+ return RpcResultBuilder.<UnsubscribeDtclOutput>failed().withError(ErrorType.APPLICATION,
+ "Unable to finish notification processing in " + timeout + " seconds", e).buildFuture();
+ }
+
+ dtclReg.close();
+ dtclReg = null;
+
+ if (!idIntsListener.hasTriggered()) {
+ return RpcResultBuilder.<UnsubscribeDtclOutput>failed()
+ .withError(ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED,
+ "id-ints listener has not received any notifications.")
+ .buildFuture();
+ }
+
+ try (DOMDataTreeReadTransaction rTx = domDataBroker.newReadOnlyTransaction()) {
+ final Optional<NormalizedNode> readResult = rTx.read(LogicalDatastoreType.CONFIGURATION,
+ WriteTransactionsHandler.ID_INT_YID).get();
+
+ if (!readResult.isPresent()) {
+ return RpcResultBuilder.<UnsubscribeDtclOutput>failed()
+ .withError(ErrorType.APPLICATION, ErrorTag.DATA_MISSING, "No data read from id-ints list")
+ .buildFuture();
+ }
+
+ final boolean nodesEqual = idIntsListener.checkEqual(readResult.orElseThrow());
+ if (!nodesEqual) {
+ LOG.error("Final read of id-int does not match IdIntsListener's copy. {}",
+ idIntsListener.diffWithLocalCopy(readResult.orElseThrow()));
+ }
+
+ return RpcResultBuilder.success(new UnsubscribeDtclOutputBuilder().setCopyMatches(nodesEqual).build())
+ .buildFuture();
+
+ } catch (final InterruptedException | ExecutionException e) {
+ LOG.error("Final read of id-ints failed", e);
+ return RpcResultBuilder.<UnsubscribeDtclOutput>failed().withError(ErrorType.APPLICATION,
+ "Final read of id-ints failed", e).buildFuture();
+ }