A race condition occurs between ARPHandler and HostTracker if the ARP
[controller.git] / opendaylight / sal / yang-prototype / yang / yang-data-impl / src / test / java / org / opendaylight / controller / yang / data / impl / MyNodeBuilder.java
1 /*\r
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.controller.yang.data.impl;\r
9 \r
10 import groovy.util.BuilderSupport;\r
11 \r
12 import java.net.URI;\r
13 import java.net.URISyntaxException;\r
14 import java.util.Date;\r
15 import java.util.Map;\r
16 import java.util.Map.Entry;\r
17 \r
18 import org.opendaylight.controller.yang.common.QName;\r
19 import org.opendaylight.controller.yang.data.api.CompositeNode;\r
20 import org.opendaylight.controller.yang.data.api.ModifyAction;\r
21 import org.opendaylight.controller.yang.data.api.MutableCompositeNode;\r
22 import org.opendaylight.controller.yang.data.api.Node;\r
23 import org.opendaylight.controller.yang.data.api.SimpleNode;\r
24 import org.slf4j.Logger;\r
25 import org.slf4j.LoggerFactory;\r
26 \r
27 /**\r
28  * @author michal.rehak\r
29  *\r
30  */\r
31 public class MyNodeBuilder extends BuilderSupport {\r
32     \r
33     private static final Logger LOG = LoggerFactory\r
34             .getLogger(MyNodeBuilder.class);\r
35 \r
36     private URI qnNamespace;\r
37     private String qnPrefix;\r
38     private Date qnRevision;\r
39     \r
40     private CompositeNode rootNode;\r
41 \r
42         /**\r
43          * @param baseQName\r
44          */\r
45         private MyNodeBuilder(QName baseQName) {\r
46                 qnNamespace = baseQName.getNamespace();\r
47                 qnPrefix = baseQName.getPrefix();\r
48                 qnRevision = baseQName.getRevision();\r
49     }\r
50 \r
51         /**\r
52          * @return initialized singleton instance\r
53          */\r
54         public static MyNodeBuilder newInstance() {\r
55         QName qName = null;\r
56         try {\r
57                         qName = new QName(\r
58                         new URI("urn:opendaylight:controller:network"), \r
59                         new Date(42), "yang-data-impl-groovyTest_", null);\r
60         } catch (URISyntaxException e) {\r
61                 LOG.error(e.getMessage(), e);\r
62         }\r
63         return new MyNodeBuilder(qName);\r
64     }\r
65 \r
66     @Override\r
67     protected void setParent(Object parent, Object child) {\r
68         // do nothing\r
69         if (child instanceof AbstractNodeTO<?>) {\r
70             ((AbstractNodeTO<?>) child).setParent((CompositeNode) parent);\r
71         } else {\r
72             LOG.error("PARENTING FAILED: "+parent + " -> " + child);\r
73         }\r
74     }\r
75 \r
76     @Override\r
77     protected Object createNode(Object name) {\r
78         MutableCompositeNode newNode = NodeFactory.createMutableCompositeNode(\r
79                 createQName(name), getCurrentNode(), null, null, null);\r
80         NodeUtils.fixParentRelation(newNode);\r
81         return newNode;\r
82     }\r
83 \r
84     @Override\r
85     protected Object createNode(Object name, @SuppressWarnings("rawtypes") Map attributes) {\r
86         ModifyAction modifyAction = processAttributes(attributes);\r
87         MutableCompositeNode newNode = NodeFactory.createMutableCompositeNode(\r
88                 createQName(name), getCurrentNode(), null, modifyAction, null);\r
89         NodeUtils.fixParentRelation(newNode);\r
90         return newNode;\r
91     }\r
92 \r
93 \r
94     @Override\r
95     protected Object createNode(Object name, @SuppressWarnings("rawtypes") Map attributes, Object value) {\r
96         ModifyAction modifyAction = processAttributes(attributes);\r
97         SimpleNode<Object> newNode = NodeFactory.createImmutableSimpleNode(\r
98                 createQName(name), (CompositeNode) getCurrent(), value, modifyAction);\r
99         NodeUtils.fixParentRelation(newNode);\r
100         return newNode;\r
101     }\r
102     \r
103     /**\r
104      * @param attributes\r
105      * @return \r
106      */\r
107     private ModifyAction processAttributes(@SuppressWarnings("rawtypes") Map attributes) {\r
108         LOG.debug("attributes:" + attributes);\r
109         ModifyAction modAction = null;\r
110         \r
111         @SuppressWarnings("unchecked")\r
112         Map<String, String> attributesSane = attributes;\r
113         for (Entry<String, String> attr : attributesSane.entrySet()) {\r
114             switch (attr.getKey()) {\r
115             case "xmlns":\r
116                 try {\r
117                     qnNamespace = new URI(attr.getValue());\r
118                 } catch (URISyntaxException e) {\r
119                     LOG.error(e.getMessage(), e);\r
120                 }\r
121                 break;\r
122             case "modifyAction":\r
123                 modAction = ModifyAction.valueOf(attr.getValue());\r
124                 break;\r
125                 \r
126             default:\r
127                 throw new IllegalArgumentException("Attribute not supported: "+attr.getKey());\r
128             }\r
129         }\r
130         return modAction;\r
131     }\r
132 \r
133     @Override\r
134     protected Object createNode(Object name, Object value) {\r
135         SimpleNode<Object> newNode = NodeFactory.createImmutableSimpleNode(createQName(name), (CompositeNode) getCurrent(), value);\r
136         NodeUtils.fixParentRelation(newNode);\r
137         return newNode;\r
138     }\r
139 \r
140     private QName createQName(Object localName) {\r
141         LOG.debug("qname for: "+localName);\r
142             return new QName(qnNamespace, qnRevision, qnPrefix, (String) localName);\r
143     }\r
144 \r
145         protected CompositeNode getCurrentNode() {\r
146             if (getCurrent() != null) {\r
147                 if (getCurrent() instanceof CompositeNode) {\r
148                     return (CompositeNode) getCurrent();\r
149                     \r
150                 } else {\r
151                     throw new IllegalAccessError("current node is not of type CompositeNode, but: "\r
152                         +getCurrent().getClass().getSimpleName());\r
153                 }\r
154             }\r
155             \r
156             return null;\r
157     }\r
158         \r
159         @Override\r
160         protected Object postNodeCompletion(Object parent, Object node) {\r
161             Node<?> nodeRevisited = (Node<?>) node;\r
162             LOG.debug("postNodeCompletion at: \n  "+ nodeRevisited+"\n  "+parent);\r
163             if (nodeRevisited instanceof MutableCompositeNode) {\r
164                 MutableCompositeNode mutant = (MutableCompositeNode) nodeRevisited;\r
165                 if (mutant.getValue().isEmpty()) {\r
166                     LOG.error("why is it having empty value? -- " + mutant);\r
167                 }\r
168                 nodeRevisited = NodeFactory.createImmutableCompositeNode(\r
169                         mutant.getNodeType(), mutant.getParent(), mutant.getValue(), mutant.getModificationAction());\r
170                 NodeUtils.fixChildrenRelation((CompositeNode) nodeRevisited);\r
171 \r
172                 if (parent == null) {\r
173                     rootNode = (CompositeNode) nodeRevisited;\r
174                 } else {\r
175                     NodeUtils.fixParentRelation(nodeRevisited);\r
176                     nodeRevisited.getParent().getChildren().remove(mutant);\r
177                 }\r
178             }\r
179             \r
180             \r
181             return nodeRevisited;\r
182         }\r
183         \r
184         /**\r
185          * @return tree root\r
186          */\r
187         public CompositeNode getRootNode() {\r
188         return rootNode;\r
189     }\r
190 }