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%2FAbstractDOMRpcRoutingTableEntry.java;h=0cce2f1d80bbc5389306f5f956353c3197efd35c;hp=08c43845fc57bfdf7d72ad795f7c1054ecd45956;hb=dc76c5f86830b541fe9c4f2a011e199486558779;hpb=aead44997ca7c9bf31be83ebcdd6b01aed23b8f3 diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMRpcRoutingTableEntry.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMRpcRoutingTableEntry.java index 08c43845fc..0cce2f1d80 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMRpcRoutingTableEntry.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMRpcRoutingTableEntry.java @@ -10,12 +10,14 @@ package org.opendaylight.controller.md.sal.dom.broker.impl; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; +import com.google.common.collect.Maps; import com.google.common.util.concurrent.CheckedFuture; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcAvailabilityListener; import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementation; import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; @@ -27,16 +29,17 @@ abstract class AbstractDOMRpcRoutingTableEntry { private final Map> impls; private final SchemaPath schemaPath; - protected AbstractDOMRpcRoutingTableEntry(final SchemaPath schemaPath, final Map> impls) { + AbstractDOMRpcRoutingTableEntry(final SchemaPath schemaPath, + final Map> impls) { this.schemaPath = Preconditions.checkNotNull(schemaPath); this.impls = Preconditions.checkNotNull(impls); } - protected final SchemaPath getSchemaPath() { + final SchemaPath getSchemaPath() { return schemaPath; } - protected final List getImplementations(final YangInstanceIdentifier context) { + final List getImplementations(final YangInstanceIdentifier context) { return impls.get(context); } @@ -44,12 +47,12 @@ abstract class AbstractDOMRpcRoutingTableEntry { return impls; } - public boolean containsContext(final YangInstanceIdentifier contextReference) { + final boolean containsContext(final YangInstanceIdentifier contextReference) { return impls.containsKey(contextReference); } - final Set registeredIdentifiers() { - return impls.keySet(); + final Set registeredIdentifiers(final DOMRpcAvailabilityListener l) { + return Maps.filterValues(impls, list -> list.stream().anyMatch(l::acceptsImplementation)).keySet(); } /** @@ -58,32 +61,38 @@ abstract class AbstractDOMRpcRoutingTableEntry { * @param newRpcs List of new RPCs, must be mutable * @return */ - final AbstractDOMRpcRoutingTableEntry add(final DOMRpcImplementation implementation, final List newRpcs) { + final AbstractDOMRpcRoutingTableEntry add(final DOMRpcImplementation implementation, + final List newRpcs) { final Builder> vb = ImmutableMap.builder(); for (final Entry> ve : impls.entrySet()) { if (newRpcs.remove(ve.getKey())) { - final ArrayList i = new ArrayList<>(ve.getValue().size() + 1); + final List i = new ArrayList<>(ve.getValue().size() + 1); i.addAll(ve.getValue()); i.add(implementation); + + // New implementation is at the end, this will move it to be the last among implementations + // with equal cost -- relying on sort() being stable. + i.sort((a, b) -> Long.compare(a.invocationCost(), b.invocationCost())); vb.put(ve.getKey(), i); } else { vb.put(ve); } } for(final YangInstanceIdentifier ii : newRpcs) { - final ArrayList impl = new ArrayList<>(1); + final List impl = new ArrayList<>(1); impl.add(implementation); - vb.put(ii,impl); + vb.put(ii, impl); } return newInstance(vb.build()); } - final AbstractDOMRpcRoutingTableEntry remove(final DOMRpcImplementation implementation, final List removed) { + final AbstractDOMRpcRoutingTableEntry remove(final DOMRpcImplementation implementation, + final List removed) { final Builder> vb = ImmutableMap.builder(); for (final Entry> ve : impls.entrySet()) { if (removed.remove(ve.getKey())) { - final ArrayList i = new ArrayList<>(ve.getValue()); + final List i = new ArrayList<>(ve.getValue()); i.remove(implementation); // We could trimToSize(), but that may perform another copy just to get rid // of a single element. That is probably not worth the trouble.