Replace SchemaPath with SchemaNodeIdentifier.Absolute/QName
[mdsal.git] / dom / mdsal-dom-broker / src / main / java / org / opendaylight / mdsal / dom / broker / DOMRpcRoutingTable.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.dom.broker;
9
10 import com.google.common.collect.ImmutableMap;
11 import com.google.common.collect.LinkedListMultimap;
12 import com.google.common.collect.ListMultimap;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.Set;
16 import org.opendaylight.mdsal.dom.api.DOMRpcAvailabilityListener;
17 import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
18 import org.opendaylight.mdsal.dom.api.DOMRpcImplementation;
19 import org.opendaylight.mdsal.dom.spi.RpcRoutingStrategy;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
22 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
23 import org.opendaylight.yangtools.yang.model.api.Module;
24 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26
27 final class DOMRpcRoutingTable extends AbstractDOMRoutingTable<DOMRpcIdentifier, YangInstanceIdentifier,
28         DOMRpcImplementation, DOMRpcAvailabilityListener, QName, AbstractDOMRpcRoutingTableEntry> {
29     static final DOMRpcRoutingTable EMPTY = new DOMRpcRoutingTable(ImmutableMap.of(), null);
30
31     private DOMRpcRoutingTable(final Map<QName, AbstractDOMRpcRoutingTableEntry> rpcs,
32             final EffectiveModelContext schemaContext) {
33         super(rpcs, schemaContext);
34     }
35
36     boolean contains(final DOMRpcIdentifier input) {
37         final AbstractDOMRpcRoutingTableEntry contexts = (AbstractDOMRpcRoutingTableEntry) getEntry(input.getType());
38         return contexts != null && contexts.containsContext(input.getContextReference());
39     }
40
41     @Override
42     protected DOMRpcRoutingTable newInstance(final Map<QName, AbstractDOMRpcRoutingTableEntry> operations,
43             final EffectiveModelContext schemaContext) {
44         return new DOMRpcRoutingTable(operations, schemaContext);
45     }
46
47     @Override
48     protected ListMultimap<QName, YangInstanceIdentifier> decomposeIdentifiers(final Set<DOMRpcIdentifier> rpcs) {
49         final ListMultimap<QName, YangInstanceIdentifier> ret = LinkedListMultimap.create();
50         for (DOMRpcIdentifier i : rpcs) {
51             ret.put(i.getType(), i.getContextReference());
52         }
53         return ret;
54     }
55
56     @Override
57     AbstractDOMRpcRoutingTableEntry createOperationEntry(final EffectiveModelContext context, final QName key,
58             final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> implementations) {
59         final RpcDefinition rpcDef = findRpcDefinition(context, key);
60         if (rpcDef == null) {
61             return new UnknownDOMRpcRoutingTableEntry(key, implementations);
62         }
63
64         final RpcRoutingStrategy strategy = RpcRoutingStrategy.from(rpcDef);
65         if (strategy.isContextBasedRouted()) {
66             return new RoutedDOMRpcRoutingTableEntry(rpcDef, YangInstanceIdentifier.of(strategy.getLeaf()),
67                 implementations);
68         }
69
70         return new GlobalDOMRpcRoutingTableEntry(rpcDef, implementations);
71     }
72
73     private static RpcDefinition findRpcDefinition(final SchemaContext context, final QName qname) {
74         if (context != null) {
75             final Module module = context.findModule(qname.getModule()).orElse(null);
76             if (module != null && module.getRpcs() != null) {
77                 for (RpcDefinition rpc : module.getRpcs()) {
78                     if (qname.equals(rpc.getQName())) {
79                         return rpc;
80                     }
81                 }
82             }
83         }
84
85         return null;
86     }
87 }