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