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%2FDOMRpcRoutingTable.java;h=22e33054954073e2457d9c140bd8520a6bd981fb;hp=0e5ce271e48c755ea1d9f6795ce8d2d85a496ead;hb=dc76c5f86830b541fe9c4f2a011e199486558779;hpb=3e5bfba47ae5fe04360343073273a141730daefd diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRoutingTable.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRoutingTable.java index 0e5ce271e4..22e3305495 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRoutingTable.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRoutingTable.java @@ -7,21 +7,22 @@ */ package org.opendaylight.controller.md.sal.dom.broker.impl; -import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.ListMultimap; -import com.google.common.collect.Maps; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; 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.DOMRpcIdentifier; import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementation; @@ -39,30 +40,20 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; final class DOMRpcRoutingTable { - private static final QName CONTEXT_REFERENCE = QName.cachedReference(QName.create("urn:opendaylight:yang:extension:yang-ext", "2013-07-09", "context-reference")); - - static final DOMRpcRoutingTable EMPTY = new DOMRpcRoutingTable(); - private static final Function> EXTRACT_IDENTIFIERS = - new Function>() { - @Override - public Set apply(final AbstractDOMRpcRoutingTableEntry input) { - return input.registeredIdentifiers(); - } - }; + private static final QName CONTEXT_REFERENCE = QName.create("urn:opendaylight:yang:extension:yang-ext", + "2013-07-09", "context-reference").intern(); + + static final DOMRpcRoutingTable EMPTY = new DOMRpcRoutingTable(ImmutableMap.of(), null); + private final Map rpcs; private final SchemaContext schemaContext; - private DOMRpcRoutingTable() { - rpcs = Collections.emptyMap(); - schemaContext = null; - } - private DOMRpcRoutingTable(final Map rpcs, final SchemaContext schemaContext) { this.rpcs = Preconditions.checkNotNull(rpcs); this.schemaContext = schemaContext; } - private static ListMultimap decomposeIdentifiers(final Set rpcs) { + static ListMultimap decomposeIdentifiers(final Set rpcs) { final ListMultimap ret = LinkedListMultimap.create(); for (DOMRpcIdentifier i : rpcs) { ret.put(i.getType(), i.getContextReference()); @@ -81,7 +72,7 @@ final class DOMRpcRoutingTable { // Now iterate over existing entries, modifying them as appropriate... final Builder mb = ImmutableMap.builder(); for (Entry re : this.rpcs.entrySet()) { - List newRpcs = toAdd.removeAll(re.getKey()); + List newRpcs = new ArrayList<>(toAdd.removeAll(re.getKey())); if (!newRpcs.isEmpty()) { final AbstractDOMRpcRoutingTableEntry ne = re.getValue().add(implementation, newRpcs); mb.put(re.getKey(), ne); @@ -115,7 +106,7 @@ final class DOMRpcRoutingTable { // Now iterate over existing entries, modifying them as appropriate... final Builder b = ImmutableMap.builder(); for (Entry e : this.rpcs.entrySet()) { - final List removed = toRemove.removeAll(e.getKey()); + final List removed = new ArrayList<>(toRemove.removeAll(e.getKey())); if (!removed.isEmpty()) { final AbstractDOMRpcRoutingTableEntry ne = e.getValue().remove(implementation, removed); if (ne != null) { @@ -135,8 +126,16 @@ final class DOMRpcRoutingTable { return contexts != null && contexts.containsContext(input.getContextReference()); } - Map> getRpcs() { - return Maps.transformValues(rpcs, EXTRACT_IDENTIFIERS); + Map> getRpcs(final DOMRpcAvailabilityListener l) { + final Map> ret = new HashMap<>(rpcs.size()); + for (Entry e : rpcs.entrySet()) { + final Set ids = e.getValue().registeredIdentifiers(l); + if (!ids.isEmpty()) { + ret.put(e.getKey(), ids); + } + } + + return ret; } private static RpcDefinition findRpcDefinition(final SchemaContext context, final SchemaPath schemaPath) { @@ -155,31 +154,33 @@ final class DOMRpcRoutingTable { return null; } - private static AbstractDOMRpcRoutingTableEntry createRpcEntry(final SchemaContext context, final SchemaPath key, final Map> implementations) { + private static AbstractDOMRpcRoutingTableEntry createRpcEntry(final SchemaContext context, final SchemaPath key, + final Map> implementations) { final RpcDefinition rpcDef = findRpcDefinition(context, key); - if (rpcDef != null) { - final ContainerSchemaNode input = rpcDef.getInput(); - if (input != null) { - for (DataSchemaNode c : input.getChildNodes()) { - for (UnknownSchemaNode extension : c.getUnknownSchemaNodes()) { - if (CONTEXT_REFERENCE.equals(extension.getNodeType())) { - final YangInstanceIdentifier keyId = YangInstanceIdentifier.builder().node(input.getQName()).node(c.getQName()).build(); - return new RoutedDOMRpcRoutingTableEntry(rpcDef, keyId, implementations); - } + if (rpcDef == null) { + return new UnknownDOMRpcRoutingTableEntry(key, implementations); + } + + final ContainerSchemaNode input = rpcDef.getInput(); + if (input != null) { + for (DataSchemaNode c : input.getChildNodes()) { + for (UnknownSchemaNode extension : c.getUnknownSchemaNodes()) { + if (CONTEXT_REFERENCE.equals(extension.getNodeType())) { + final YangInstanceIdentifier keyId = YangInstanceIdentifier.of(c.getQName()); + return new RoutedDOMRpcRoutingTableEntry(rpcDef, keyId, implementations); } } } - - return new GlobalDOMRpcRoutingTableEntry(rpcDef, implementations); - } else { - return new UnknownDOMRpcRoutingTableEntry(key, implementations); } + + return new GlobalDOMRpcRoutingTableEntry(rpcDef, implementations); } CheckedFuture invokeRpc(final SchemaPath type, final NormalizedNode input) { final AbstractDOMRpcRoutingTableEntry entry = rpcs.get(type); if (entry == null) { - return Futures.immediateFailedCheckedFuture(new DOMRpcImplementationNotAvailableException("No implementation of RPC %s available", type)); + return Futures.immediateFailedCheckedFuture( + new DOMRpcImplementationNotAvailableException("No implementation of RPC %s available", type)); } return entry.invokeRpc(input); @@ -194,5 +195,4 @@ final class DOMRpcRoutingTable { return new DOMRpcRoutingTable(b.build(), context); } - }