From b21ea6dcf21e5f0d474e5702fc8bba5f6fd00005 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 3 Jul 2018 09:37:41 +0200 Subject: [PATCH] BUG-7697: add defences against nulls Null listener is invalid, also make sure we do not ever set prevRpcs to null. Change-Id: If8cd16e93a2a07c77a26569c8ecacdc35696cea1 Signed-off-by: Robert Varga --- .../mdsal/dom/broker/DOMRpcRouter.java | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java index 9dce3e9291..a3a0cfac5c 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java @@ -7,6 +7,9 @@ */ package org.opendaylight.mdsal.dom.broker; +import static com.google.common.base.Verify.verifyNotNull; +import static java.util.Objects.requireNonNull; + import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; @@ -122,13 +125,13 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP @Override public synchronized ListenerRegistration registerRpcListener( final T listener) { - final Registration ret = new Registration<>(this, listener); + final Registration ret = new Registration<>(this, listener, routingTable.getRpcs(listener)); final Builder> b = ImmutableList.builder(); b.addAll(listeners); b.add(ret); listeners = b.build(); - listenerNotifier.execute(() -> ret.initialTable(routingTable)); + listenerNotifier.execute(() -> ret.initialTable()); return ret; } @@ -165,9 +168,11 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP private Map> prevRpcs; - Registration(final DOMRpcRouter router, final T listener) { + Registration(final DOMRpcRouter router, final T listener, + final Map> rpcs) { super(listener); - this.router = router; + this.router = requireNonNull(router); + this.prevRpcs = requireNonNull(rpcs); } @Override @@ -175,30 +180,23 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP router.removeListener(this); } - void initialTable(final DOMRpcRoutingTable newTable) { - final T l = getInstance(); - if (l == null) { - return; - } - - final Map> rpcs = newTable.getRpcs(l); + void initialTable() { final Collection added = new ArrayList<>(); - for (Entry> e : rpcs.entrySet()) { + for (Entry> e : prevRpcs.entrySet()) { added.addAll(Collections2.transform(e.getValue(), i -> DOMRpcIdentifier.create(e.getKey(), i))); } - prevRpcs = rpcs; if (!added.isEmpty()) { - l.onRpcAvailable(added); + getInstance().onRpcAvailable(added); } } void addRpc(final DOMRpcRoutingTable newTable, final DOMRpcImplementation impl) { final T l = getInstance(); - if (l == null || !l.acceptsImplementation(impl)) { + if (!l.acceptsImplementation(impl)) { return; } - final Map> rpcs = newTable.getRpcs(l); + final Map> rpcs = verifyNotNull(newTable.getRpcs(l)); final MapDifference> diff = Maps.difference(prevRpcs, rpcs); final Collection added = new ArrayList<>(); @@ -220,11 +218,11 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP void removeRpc(final DOMRpcRoutingTable newTable, final DOMRpcImplementation impl) { final T l = getInstance(); - if (l == null || !l.acceptsImplementation(impl)) { + if (!l.acceptsImplementation(impl)) { return; } - final Map> rpcs = newTable.getRpcs(l); + final Map> rpcs = verifyNotNull(newTable.getRpcs(l)); final MapDifference> diff = Maps.difference(prevRpcs, rpcs); final Collection removed = new ArrayList<>(); -- 2.36.6