Bug 2766: Fixed parsing and serializing XPath Instance Identifiers
[yangtools.git] / yang / yang-data-codec-gson / src / test / java / org / opendaylight / yangtools / yang / data / codec / gson / TestingNormalizedNodeStructuresCreator.java
1 /*
2  * Copyright (c) 2014 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.yangtools.yang.data.codec.gson;
9
10 import com.google.common.collect.Lists;
11 import com.google.common.collect.Sets;
12 import java.util.HashMap;
13 import java.util.Map;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
16 import org.opendaylight.yangtools.yang.data.api.SimpleNode;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
23 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
25 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
27 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
28 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
29 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
30 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
31 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
34 import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
35 import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
36 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
37 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
38 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
39 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
40 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
41
42 public class TestingNormalizedNodeStructuresCreator {
43
44     static NormalizedNode<?, ?> cont1Node(
45             DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?>... children) {
46         DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> cont1 = Builders.containerBuilder();
47         cont1.withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "cont1")));
48
49         cont1.withValue(Lists.newArrayList(children));
50         return cont1.build();
51     }
52
53     private static DataContainerChild<? extends PathArgument, ?> lst12Node() {
54         CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> lst12Builder = Builders.unkeyedListBuilder()
55                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lst12")));
56         lst12Builder.withChild(lst12Entry1Node());
57         return lst12Builder.build();
58     }
59
60     private static UnkeyedListEntryNode lst12Entry1Node() {
61         DataContainerNodeAttrBuilder<NodeIdentifier, UnkeyedListEntryNode> lst12Entry1Builder = Builders
62                 .unkeyedListEntryBuilder();
63         lst12Entry1Builder
64                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lst12")));
65         lst12Entry1Builder.withChild(Builders.leafBuilder()
66                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf121")))
67                 .withValue("lf121 value").build());
68         return lst12Entry1Builder.build();
69     }
70
71     private static DataContainerChild<? extends PathArgument, ?> choc12Node() {
72         DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> choc12Builder = Builders.choiceBuilder()
73                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "choc12")));
74
75 //        DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> choc12Augmentation = Builders
76 //                .augmentationBuilder();
77 //        choc12Augmentation.withNodeIdentifier(new AugmentationIdentifier(Sets.newHashSet(QName.create(
78 //                "ns:complex:json", "2014-08-11", "c12B"))));
79 //        choc12Augmentation.withChild(lf17Node());
80
81         choc12Builder.withChild(lf17Node());
82         return choc12Builder.build();
83     }
84
85     protected static LeafNode<Object> lf17Node() {
86         return Builders.leafBuilder()
87                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf17")))
88                 .withValue("lf17 value").build();
89     }
90
91     private static DataContainerChild<? extends PathArgument, ?> externalAugmentC11AWithLf15_11AndLf15_12Node() {
92         DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> augmentationBuilder = Builders
93                 .augmentationBuilder();
94         augmentationBuilder.withNodeIdentifier(new AugmentationIdentifier(Sets.newHashSet(
95                 QName.create("ns:complex:json:augmentation", "2014-08-14", "lf15_11"),
96                 QName.create("ns:complex:json:augmentation", "2014-08-14", "lf15_12"))));
97         augmentationBuilder.withChild(lf15_11NodeExternal());
98         augmentationBuilder.withChild(lf15_12NodeExternal());
99         return augmentationBuilder.build();
100     }
101
102     private static LeafNode<Object> lf15_12NodeExternal() {
103         return Builders
104                 .leafBuilder()
105                 .withNodeIdentifier(
106                         new NodeIdentifier(QName.create("ns:complex:json:augmentation", "2014-08-14", "lf15_12")))
107                 .withValue("lf15_12 value from augmentation").build();
108     }
109
110     private static LeafNode<Object> lf15_11NodeExternal() {
111         return Builders
112                 .leafBuilder()
113                 .withNodeIdentifier(
114                         new NodeIdentifier(QName.create("ns:complex:json:augmentation", "2014-08-14", "lf15_11")))
115                 .withValue("lf15_11 value from augmentation").build();
116     }
117
118     private static DataContainerChild<? extends PathArgument, ?> choc11Node(
119             DataContainerChild<? extends PathArgument, ?>... children) {
120         DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> choc11Builder = Builders.choiceBuilder()
121                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "choc11")));
122         choc11Builder.withValue(Lists.newArrayList(children));
123         // choc11Builder.addChild(lf13Node());
124         // choc11Builder.addChild(augmentChoc11_c11A_lf1511AndLf1512Children());
125         // choc11Builder.addChild(augmentChoc11_c11_lf1521Children());
126         return choc11Builder.build();
127     }
128
129     private static LeafNode<Object> lf13Node() {
130         return Builders.leafBuilder()
131                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf13")))
132                 .withValue("lf13 value").build();
133     }
134
135     private static DataContainerChild<? extends PathArgument, ?> augmentC11AWithLf15_21Node() {
136         DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> choc11_c11AugmentBuilder = Builders
137                 .augmentationBuilder();
138         choc11_c11AugmentBuilder.withNodeIdentifier(new AugmentationIdentifier(Sets.newHashSet(QName.create(
139                 "ns:complex:json", "2014-08-11", "lf15_21"))));
140
141         choc11_c11AugmentBuilder.withChild(lf15_21Node());
142         return choc11_c11AugmentBuilder.build();
143     }
144
145     private static LeafNode<Object> lf15_21Node() {
146         return Builders.leafBuilder()
147                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf15_21")))
148                 .withValue("lf15_21 value").build();
149     }
150
151     private static DataContainerChild<? extends PathArgument, ?> augmentC11AWithLf15_11AndLf15_12Node() {
152         DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> choc11_c11AugmentBuilder = Builders
153                 .augmentationBuilder();
154         choc11_c11AugmentBuilder.withNodeIdentifier(new AugmentationIdentifier(Sets.newHashSet(
155                 QName.create("ns:complex:json", "2014-08-11", "lf15_11"),
156                 QName.create("ns:complex:json", "2014-08-11", "lf15_12"))));
157         choc11_c11AugmentBuilder.withChild(lf15_11Node());
158         choc11_c11AugmentBuilder.withChild(lf15_12Node());
159         return choc11_c11AugmentBuilder.build();
160     }
161
162     private static LeafNode<Object> lf15_12Node() {
163         return Builders.leafBuilder()
164                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf15_12")))
165                 .withValue(QName.create("ns:complex:json", "2014-08-11", "lf11")).build();
166     }
167
168     private static LeafNode<Object> lf15_11Node() {
169         return Builders.leafBuilder()
170                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf15_11")))
171                 .withValue(Sets.newHashSet("one", "two")).build();
172     }
173
174     private static DataContainerChild<? extends PathArgument, ?> lf12_1Node() {
175         DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> augmentBuilder = Builders
176                 .augmentationBuilder().withNodeIdentifier(
177                         new AugmentationIdentifier(Sets.newHashSet(
178                                 QName.create("ns:complex:json", "2014-08-11", "lf12_1"),
179                                 QName.create("ns:complex:json", "2014-08-11", "lf12_2"))));
180         augmentBuilder.withChild(Builders.leafBuilder()
181                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf12_1")))
182                 .withValue("lf12 value").build());
183         return augmentBuilder.build();
184     }
185
186     private static DataContainerChild<? extends PathArgument, ?> childLst11() {
187         CollectionNodeBuilder<MapEntryNode, MapNode> lst11 = Builders.mapBuilder().withNodeIdentifier(
188                 new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lst11")));
189
190         DataContainerNodeAttrBuilder<NodeIdentifierWithPredicates, MapEntryNode> lst11Entry1Builder = Builders
191                 .mapEntryBuilder();
192
193         Map<QName, Object> key = new HashMap<>();
194         key.put(QName.create("ns:complex:json", "2014-08-11", "key111"), "key111 value");
195         key.put(QName.create("ns:complex:json", "2014-08-11", "lf111"), "lf111 value");
196
197         lst11Entry1Builder.withNodeIdentifier(new NodeIdentifierWithPredicates(QName.create("ns:complex:json",
198                 "2014-08-11", "lst11"), key));
199         lst11Entry1Builder.withChild(Builders.leafBuilder()
200                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "key111")))
201                 .withValue("key111 value").build());
202         lst11Entry1Builder.withChild(Builders.leafBuilder()
203                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf112")))
204                 .withValue(lf112Value()).build());
205         lst11Entry1Builder.withChild(Builders.leafBuilder()
206                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf113")))
207                 .withValue("lf113 value").build());
208         lst11Entry1Builder.withChild(Builders.leafBuilder()
209                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf111")))
210                 .withValue("lf111 value").build());
211         lst11.withChild(lst11Entry1Builder.build());
212         return lst11.build();
213     }
214
215     private static Object lf112Value() {
216         return YangInstanceIdentifier.create(
217                 new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "cont1")),
218                 new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lflst11")),
219                 new NodeWithValue(QName.create("ns:complex:json", "2014-08-11", "lflst11"),"foo")
220         );
221     }
222
223     private static DataContainerChild<? extends PathArgument, ?> childLflst11() {
224         ListNodeBuilder<Object, LeafSetEntryNode<Object>> lflst11 = Builders.leafSetBuilder().withNodeIdentifier(
225                 new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lflst11")));
226         lflst11.withChild(Builders
227                 .leafSetEntryBuilder()
228                 .withNodeIdentifier(
229                         new NodeWithValue(QName.create("ns:complex:json", "2014-08-11", "lflst11"), "lflst11 value1"))
230                 .withValue("lflst11 value1").build());
231         lflst11.withChild(Builders
232                 .leafSetEntryBuilder()
233                 .withNodeIdentifier(
234                         new NodeWithValue(QName.create("ns:complex:json", "2014-08-11", "lflst11"), "lflst11 value2"))
235                 .withValue("lflst11 value2").build());
236         return lflst11.build();
237     }
238
239     private static DataContainerChild<? extends PathArgument, ?> childLflst11Multiline() {
240         ListNodeBuilder<Object, LeafSetEntryNode<Object>> lflst11 = Builders.leafSetBuilder().withNodeIdentifier(
241                 new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lflst11")));
242         lflst11.withChild(Builders
243                 .leafSetEntryBuilder()
244                 .withNodeIdentifier(
245                         new NodeWithValue(QName.create("ns:complex:json", "2014-08-11", "lflst11"), "lflst11 value1\nanother line 1"))
246                 .withValue("lflst11 value1\nanother line 1").build());
247         lflst11.withChild(Builders
248                 .leafSetEntryBuilder()
249                 .withNodeIdentifier(
250                         new NodeWithValue(QName.create("ns:complex:json", "2014-08-11", "lflst11"), "lflst11 value2\r\nanother line 2"))
251                 .withValue("lflst11 value2\r\nanother line 2").build());
252         return lflst11.build();
253     }
254
255     private static CompositeNode prepareLf12Value() {
256         SimpleNode<?> anyxmlInData = NodeFactory.createImmutableSimpleNode(
257                 QName.create("ns:complex:json", "2014-08-11", "anyxml-in-data"), null, "foo");
258         return ImmutableCompositeNode.builder().add(anyxmlInData)
259                 .setQName(QName.create("ns:complex:json", "2014-08-11", "lf12-any")).build();
260     }
261
262     private static CompositeNode prepareLf13Value() {
263         SimpleNode<?> anyxmlInData = NodeFactory.createImmutableSimpleNode(
264                 QName.create("ns:complex:json", "2014-08-11", "anyxml-in-data"), null, "foo");
265         return ImmutableCompositeNode.builder().add(anyxmlInData)
266                 .setQName(QName.create("ns:complex:json", "2014-08-11", "lf13-any")).build();
267     }
268
269     public static NormalizedNode<?, ?> leafNodeInContainer() {
270         LeafNode<Object> lf11 = Builders.leafBuilder()
271                 .withNodeIdentifier(new NodeIdentifier(QName.create("ns:complex:json", "2014-08-11", "lf11")))
272                 .withValue(453).build();
273         return cont1Node(lf11);
274     }
275
276     public static NormalizedNode<?, ?> leafListNodeInContainer() {
277         return cont1Node(childLflst11());
278     }
279     public static NormalizedNode<?, ?> leafListNodeInContainerMultiline() {
280         return cont1Node(childLflst11Multiline());
281     }
282
283     public static NormalizedNode<?, ?> keyedListNodeInContainer() {
284         return cont1Node(childLst11());
285     }
286
287     public static NormalizedNode<?, ?> leafNodeViaAugmentationInContainer() {
288         return cont1Node(lf12_1Node());
289     }
290
291     public static NormalizedNode<?, ?> choiceNodeInContainer() {
292         return cont1Node(choc11Node(lf13Node()));
293     }
294
295     /**
296      * choc11 contains lf13, lf15_11 and lf15_12 are added via external augmentation
297      *
298      * @return
299      */
300     public static NormalizedNode<?, ?> caseNodeAugmentationInChoiceInContainer() {
301         return cont1Node(choc11Node(lf13Node(), lf15_11Node(), lf15_12Node(), lf15_21Node()));
302     }
303
304     public static NormalizedNode<?, ?> caseNodeExternalAugmentationInChoiceInContainer() {
305         return cont1Node(choc11Node(lf13Node(), lf15_11Node(), lf15_12Node(), lf15_11NodeExternal(), lf15_12NodeExternal()));
306     }
307
308     public static NormalizedNode<?, ?> choiceNodeAugmentationInContainer() {
309         return cont1Node(choc12Node());
310     }
311
312     public static NormalizedNode<?, ?> unkeyedNodeInContainer() {
313         return cont1Node(lst12Node());
314     }
315
316 }