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=724276f6b8a954f0457486f54297f04ca9064308;hp=0e5ce271e48c755ea1d9f6795ce8d2d85a496ead;hb=3859df9beca8f13f1ff2b2744ed3470a1715bec3;hpb=bbaba878c38f381b0b924f89b29a1d0fcf6e2a2f 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..724276f6b8 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,62 +7,52 @@ */ package org.opendaylight.controller.md.sal.dom.broker.impl; -import com.google.common.base.Function; -import com.google.common.base.Preconditions; +import static java.util.Objects.requireNonNull; + 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; import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementationNotAvailableException; import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; +import org.opendaylight.controller.md.sal.dom.broker.spi.rpc.RpcRoutingStrategy; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +@Deprecated 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(); - } - }; + + 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); + private DOMRpcRoutingTable(final Map rpcs, + final SchemaContext schemaContext) { + this.rpcs = requireNonNull(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()); @@ -70,18 +60,18 @@ final class DOMRpcRoutingTable { return ret; } - DOMRpcRoutingTable add(final DOMRpcImplementation implementation, final Set rpcs) { - if (rpcs.isEmpty()) { + DOMRpcRoutingTable add(final DOMRpcImplementation implementation, final Set rpcsToAdd) { + if (rpcsToAdd.isEmpty()) { return this; } // First decompose the identifiers to a multimap - final ListMultimap toAdd = decomposeIdentifiers(rpcs); + final ListMultimap toAdd = decomposeIdentifiers(rpcsToAdd); // 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); @@ -104,18 +94,18 @@ final class DOMRpcRoutingTable { return new DOMRpcRoutingTable(mb.build(), schemaContext); } - DOMRpcRoutingTable remove(final DOMRpcImplementation implementation, final Set rpcs) { - if (rpcs.isEmpty()) { + DOMRpcRoutingTable remove(final DOMRpcImplementation implementation, final Set rpcIds) { + if (rpcIds.isEmpty()) { return this; } // First decompose the identifiers to a multimap - final ListMultimap toRemove = decomposeIdentifiers(rpcs); + final ListMultimap toRemove = decomposeIdentifiers(rpcIds); // 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,14 +125,22 @@ final class DOMRpcRoutingTable { return contexts != null && contexts.containsContext(input.getContextReference()); } - Map> getRpcs() { - return Maps.transformValues(rpcs, EXTRACT_IDENTIFIERS); + Map> getRpcs(final DOMRpcAvailabilityListener listener) { + final Map> ret = new HashMap<>(rpcs.size()); + for (Entry e : rpcs.entrySet()) { + final Set ids = e.getValue().registeredIdentifiers(listener); + if (!ids.isEmpty()) { + ret.put(e.getKey(), ids); + } + } + + return ret; } private static RpcDefinition findRpcDefinition(final SchemaContext context, final SchemaPath schemaPath) { if (context != null) { final QName qname = schemaPath.getPathFromRoot().iterator().next(); - final Module module = context.findModuleByNamespaceAndRevision(qname.getNamespace(), qname.getRevision()); + final Module module = context.findModule(qname.getModule()).orElse(null); if (module != null && module.getRpcs() != null) { for (RpcDefinition rpc : module.getRpcs()) { if (qname.equals(rpc.getQName())) { @@ -155,31 +153,28 @@ 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); - } - } - } - } - - return new GlobalDOMRpcRoutingTableEntry(rpcDef, implementations); - } else { + if (rpcDef == null) { return new UnknownDOMRpcRoutingTableEntry(key, implementations); } + + final RpcRoutingStrategy strategy = RpcRoutingStrategy.from(rpcDef); + if (strategy.isContextBasedRouted()) { + return new RoutedDOMRpcRoutingTableEntry(rpcDef, YangInstanceIdentifier.of(strategy.getLeaf()), + 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 +189,4 @@ final class DOMRpcRoutingTable { return new DOMRpcRoutingTable(b.build(), context); } - }