Add DOMActionRoutingTable and DOMActionRoutingTableEntry
[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.Module;
23 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
24 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
25 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
26
27 final class DOMRpcRoutingTable extends AbstractDOMRoutingTable<DOMRpcIdentifier, YangInstanceIdentifier,
28         DOMRpcImplementation, DOMRpcAvailabilityListener, AbstractDOMRpcRoutingTableEntry> {
29     static final DOMRpcRoutingTable EMPTY = new DOMRpcRoutingTable(ImmutableMap.of(), null);
30
31     private DOMRpcRoutingTable(final Map<SchemaPath, AbstractDOMRpcRoutingTableEntry> rpcs,
32             final SchemaContext 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 AbstractDOMRoutingTable newInstance(final Map<SchemaPath, AbstractDOMRpcRoutingTableEntry> operations,
43             final SchemaContext schemaContext) {
44         return new DOMRpcRoutingTable(operations, schemaContext);
45     }
46
47     @Override
48     protected ListMultimap<SchemaPath, YangInstanceIdentifier> decomposeIdentifiers(
49             final Set<DOMRpcIdentifier> rpcs) {
50         final ListMultimap<SchemaPath, YangInstanceIdentifier> ret = LinkedListMultimap.create();
51         for (DOMRpcIdentifier i : rpcs) {
52             ret.put(i.getType(), i.getContextReference());
53         }
54         return ret;
55     }
56
57     @Override
58     AbstractDOMRpcRoutingTableEntry createOperationEntry(final SchemaContext context, final SchemaPath key,
59             final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> implementations) {
60         final RpcDefinition rpcDef = findRpcDefinition(context, key);
61         if (rpcDef == null) {
62             return new UnknownDOMRpcRoutingTableEntry(key, implementations);
63         }
64
65         final RpcRoutingStrategy strategy = RpcRoutingStrategy.from(rpcDef);
66         if (strategy.isContextBasedRouted()) {
67             return new RoutedDOMRpcRoutingTableEntry(rpcDef, YangInstanceIdentifier.of(strategy.getLeaf()),
68                 implementations);
69         }
70
71         return new GlobalDOMRpcRoutingTableEntry(rpcDef, implementations);
72     }
73
74     private static RpcDefinition findRpcDefinition(final SchemaContext context, final SchemaPath schemaPath) {
75         if (context != null) {
76             final QName qname = schemaPath.getPathFromRoot().iterator().next();
77             final Module module = context.findModule(qname.getModule()).orElse(null);
78             if (module != null && module.getRpcs() != null) {
79                 for (RpcDefinition rpc : module.getRpcs()) {
80                     if (qname.equals(rpc.getQName())) {
81                         return rpc;
82                     }
83                 }
84             }
85         }
86
87         return null;
88     }
89 }