X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fdom%2Fbroker%2Fimpl%2FDOMRpcRouter.java;h=f8e47bb4d90358a156930943ed87eb16fcdc2226;hp=daf0d065f8b5435ed025465d4e3a5918d38c844a;hb=4ef15f7a7e3fb5bcaa6a3202d268a5c945e0aa71;hpb=dc76c5f86830b541fe9c4f2a011e199486558779 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..f8e47bb4d9 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; @@ -68,15 +70,6 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP return registerRpcImplementation(implementation, ImmutableSet.copyOf(rpcs)); } - private synchronized void removeRpcImplementation(final DOMRpcImplementation implementation, - final Set rpcs) { - final DOMRpcRoutingTable oldTable = routingTable; - final DOMRpcRoutingTable newTable = oldTable.remove(implementation, rpcs); - routingTable = newTable; - - listenerNotifier.execute(() -> notifyRemoved(newTable, implementation)); - } - @Override public synchronized DOMRpcImplementationRegistration registerRpcImplementation( final T implementation, final Set rpcs) { @@ -94,9 +87,18 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP }; } + private synchronized void removeRpcImplementation(final DOMRpcImplementation implementation, + final Set rpcs) { + final DOMRpcRoutingTable oldTable = routingTable; + final DOMRpcRoutingTable newTable = oldTable.remove(implementation, rpcs); + routingTable = newTable; + + listenerNotifier.execute(() -> notifyRemoved(newTable, implementation)); + } + @Override public CheckedFuture invokeRpc(final SchemaPath type, - final NormalizedNode input) { + final NormalizedNode input) { return routingTable.invokeRpc(type, input); } @@ -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; } @@ -141,16 +143,18 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP listenerNotifier.shutdown(); } - private static final class Registration - extends AbstractListenerRegistration { + private static final class Registration extends + AbstractListenerRegistration { private final DOMRpcRouter router; 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,37 +162,33 @@ 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<>(); for (Entry> e : diff.entriesOnlyOnRight().entrySet()) { added.addAll(Collections2.transform(e.getValue(), i -> DOMRpcIdentifier.create(e.getKey(), i))); } - for (Entry>> e : diff.entriesDiffering().entrySet()) { + for (Entry>> e : diff.entriesDiffering() + .entrySet()) { for (YangInstanceIdentifier i : Sets.difference(e.getValue().rightValue(), e.getValue().leftValue())) { added.add(DOMRpcIdentifier.create(e.getKey(), i)); } @@ -202,18 +202,19 @@ 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<>(); for (Entry> e : diff.entriesOnlyOnLeft().entrySet()) { removed.addAll(Collections2.transform(e.getValue(), i -> DOMRpcIdentifier.create(e.getKey(), i))); } - for (Entry>> e : diff.entriesDiffering().entrySet()) { + for (Entry>> e : diff.entriesDiffering() + .entrySet()) { for (YangInstanceIdentifier i : Sets.difference(e.getValue().leftValue(), e.getValue().rightValue())) { removed.add(DOMRpcIdentifier.create(e.getKey(), i)); }