1 package org.opendaylight.controller.sal.dom.broker.impl
3 import org.opendaylight.controller.md.sal.common.impl.routing.AbstractDataReadRouter
4 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier
5 import org.opendaylight.yangtools.yang.data.api.CompositeNode
6 import org.opendaylight.controller.md.sal.common.api.data.DataReader
7 import org.opendaylight.yangtools.yang.common.QName
10 import org.opendaylight.yangtools.yang.data.api.Node
11 import java.util.ArrayList
12 import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl
14 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument
15 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier
16 import org.opendaylight.yangtools.yang.data.api.SimpleNode
17 import java.util.Collections
18 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates
19 import java.util.HashMap
20 import static com.google.common.base.Preconditions.*;
21 import java.util.Collection
23 import java.util.Map.Entry
24 import org.slf4j.LoggerFactory
25 import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl
27 class DataReaderRouter extends AbstractDataReadRouter<InstanceIdentifier, CompositeNode> {
28 private static val LOG = LoggerFactory.getLogger(DataReaderRouter);
29 private static val NETCONF_NAMESPACE = URI.create("urn:ietf:params:xml:ns:netconf:base:1.0")
30 private static val NETCONF_DATA = new QName(NETCONF_NAMESPACE,"data");
32 override protected merge(InstanceIdentifier path, Iterable<CompositeNode> data) {
33 val pathArgument = path.path.last;
35 var name = pathArgument?.nodeType;
36 val nodes = new ArrayList<Node<?>>();
37 val keyNodes = new HashMap<QName, SimpleNode<?>>();
38 val iterator = data.iterator;
41 if(pathArgument != null && dataBit != null) {
43 val keyNodesLocal = getKeyNodes(pathArgument,dataBit);
44 nodes.addAll(dataBit.childrenWithout(keyNodesLocal.entrySet));
45 } else if (dataBit != null) {
47 nodes.addAll(dataBit.children)
49 } catch (IllegalStateException e) {
50 LOG.error("BUG: Readed data for path {} was invalid",path,e);
60 if(pathArgument == null) {
61 return new CompositeNodeTOImpl(NETCONF_DATA,null,nodes);
63 val finalNodes = new ArrayList<Node<?>>();
64 finalNodes.addAll(keyNodes.values);
65 finalNodes.addAll(nodes);
66 return new CompositeNodeTOImpl(name,null,finalNodes);
71 dispatch def Map<QName, SimpleNode<?>> getKeyNodes(PathArgument argument, CompositeNode node) {
72 return Collections.emptyMap();
75 dispatch def getKeyNodes(NodeIdentifierWithPredicates argument, CompositeNode node) {
76 val ret = new HashMap<QName, SimpleNode<?>>();
77 for (keyValue : argument.keyValues.entrySet) {
78 val simpleNode = node.getSimpleNodesByName(keyValue.key);
79 if(simpleNode !== null && !simpleNode.empty) {
80 checkState(simpleNode.size <= 1,"Only one simple node for key $s is allowed in node $s",keyValue.key,node);
81 checkState(simpleNode.get(0).value == keyValue.value,"Key node must equals to instance identifier value");
82 ret.put(keyValue.key,simpleNode.get(0));
84 val compositeNode = node.getCompositesByName(keyValue.key);
85 checkState(compositeNode === null || compositeNode.empty,"Key node must be Simple Node, not composite node.");
90 def Collection<? extends Node<?>> childrenWithout(CompositeNode node, Set<Entry<QName, SimpleNode<?>>> entries) {
94 val filteredNodes = new ArrayList<Node<?>>();
95 for(scannedNode : node.children) {
96 if(!entries.contains(scannedNode.nodeType)) {
97 filteredNodes.add(scannedNode);
100 return filteredNodes;