From a3737302942580f13ca9988647873b83985895ed Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 27 Jan 2017 20:40:49 +0100 Subject: [PATCH 1/1] 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 --- .../md/sal/dom/broker/impl/DOMRpcRouter.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRouter.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRouter.java index daf0d065f8..3c28d30786 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRouter.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRouter.java @@ -7,6 +7,8 @@ */ package org.opendaylight.controller.md.sal.dom.broker.impl; +import com.google.common.base.Preconditions; +import com.google.common.base.Verify; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; @@ -119,13 +121,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; } @@ -148,9 +150,11 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP private Map> prevRpcs; - Registration(final DOMRpcRouter router, final T listener) { - super(listener); - this.router = router; + Registration(final DOMRpcRouter router, final T listener, + final Map> rpcs) { + super(Preconditions.checkNotNull(listener)); + this.router = Preconditions.checkNotNull(router); + this.prevRpcs = Preconditions.checkNotNull(rpcs); } @Override @@ -158,30 +162,25 @@ 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()) { + final T l = getInstance(); l.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 = Verify.verifyNotNull(newTable.getRpcs(l)); final MapDifference> diff = Maps.difference(prevRpcs, rpcs); final Collection added = new ArrayList<>(); @@ -202,11 +201,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 = Verify.verifyNotNull(newTable.getRpcs(l)); final MapDifference> diff = Maps.difference(prevRpcs, rpcs); final Collection removed = new ArrayList<>(); -- 2.36.6