Bug 3874: Support of yang modeled AnyXML - XML deserialization
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / transform / dom / parser / DomToNormalizedNodeParserFactory.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.impl.schema.transform.dom.parser;
9
10 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
11 import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
12 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
13 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
14 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
15 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
16 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
17 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
18 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
20 import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
24 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider;
25 import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
26 import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParserFactory;
27 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.BaseDispatcherParser;
28 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.ExtensibleParser;
29 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.LeafNodeBaseParser;
30 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.LeafSetEntryNodeBaseParser;
31 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.ListNodeBaseParser;
32 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher;
33 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
34 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
35 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
36 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
37 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
38 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
39 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
40 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
41 import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode;
42 import org.w3c.dom.Element;
43
44 public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeParserFactory<Element> {
45
46     private final AugmentationNodeDomParser augmentationNodeParser;
47     private final ChoiceNodeDomParser choiceNodeParser;
48     private final ContainerNodeDomParser containerNodeParser;
49     private final LeafNodeDomParser leafNodeParser;
50     private final LeafSetEntryNodeDomParser leafSetEntryNodeParser;
51     private final LeafSetNodeDomParser leafSetNodeParser;
52     private final MapNodeDomParser mapNodeParser;
53     private final MapEntryNodeDomParser mapEntryNodeParser;
54     private final UnkeyedListEntryNodeDomParser unkeyedListEntryNodeParser;
55     private final UnkeyedListNodeDomParser unkeyedListNodeParser;
56     private final OrderedListNodeDomParser orderedListNodeParser;
57     private final YangModeledAnyXmlDomParser yangModeledAnyXmlNodeParser;
58     private final AnyXmlDomParser anyXmlNodeParser;
59
60     private DomToNormalizedNodeParserFactory(final XmlCodecProvider codecProvider, final SchemaContext schema, final boolean strictParsing) {
61         leafNodeParser = new LeafNodeDomParser(codecProvider, schema);
62         leafSetEntryNodeParser = new LeafSetEntryNodeDomParser(codecProvider, schema);
63         leafSetNodeParser = new LeafSetNodeDomParser(leafSetEntryNodeParser);
64         anyXmlNodeParser = new AnyXmlDomParser();
65
66         final NodeParserDispatcher<Element> dispatcher = new NodeParserDispatcher.BaseNodeParserDispatcher<Element>(this) {
67
68         };
69
70         yangModeledAnyXmlNodeParser = new YangModeledAnyXmlDomParser(dispatcher);
71         containerNodeParser = new ContainerNodeDomParser(dispatcher, strictParsing);
72         mapEntryNodeParser = new MapEntryNodeDomParser(dispatcher, strictParsing);
73         mapNodeParser = new MapNodeDomParser(mapEntryNodeParser);
74         orderedListNodeParser = new OrderedListNodeDomParser(mapEntryNodeParser);
75         unkeyedListEntryNodeParser = new UnkeyedListEntryNodeDomParser(dispatcher);
76         unkeyedListNodeParser = new UnkeyedListNodeDomParser(unkeyedListEntryNodeParser);
77         choiceNodeParser = new ChoiceNodeDomParser(dispatcher);
78         augmentationNodeParser = new AugmentationNodeDomParser(dispatcher, strictParsing);
79     }
80
81     private DomToNormalizedNodeParserFactory(final XmlCodecProvider codecProvider, final SchemaContext schema,
82                                              final BuildingStrategyProvider buildingStratProvider, final boolean strictParsing) {
83         leafNodeParser = new LeafNodeDomParser(codecProvider, schema, buildingStratProvider.forLeaf());
84         leafSetEntryNodeParser = new LeafSetEntryNodeDomParser(codecProvider, schema, buildingStratProvider.forLeafSetEntry());
85
86         // no buildingStrategy for Augment (no use case for now)
87         leafSetNodeParser = new LeafSetNodeDomParser(leafSetEntryNodeParser);
88         // no buildingStrategy for anyXml (probably not necessary)
89         anyXmlNodeParser = new AnyXmlDomParser();
90
91         final NodeParserDispatcher<Element> dispatcher = new NodeParserDispatcher.BaseNodeParserDispatcher<Element>(this) {
92
93         };
94
95         yangModeledAnyXmlNodeParser = new YangModeledAnyXmlDomParser(dispatcher);
96         containerNodeParser = new ContainerNodeDomParser(dispatcher, buildingStratProvider.forContainer(), strictParsing);
97         mapEntryNodeParser = new MapEntryNodeDomParser(dispatcher, buildingStratProvider.forMapEntry(), strictParsing);
98         mapNodeParser = new MapNodeDomParser(mapEntryNodeParser, buildingStratProvider.forMap());
99         orderedListNodeParser = new OrderedListNodeDomParser(mapEntryNodeParser, buildingStratProvider.forOrderedList());
100         unkeyedListEntryNodeParser = new UnkeyedListEntryNodeDomParser(buildingStratProvider.forUnkeyedListEntry(), dispatcher);
101         unkeyedListNodeParser = new UnkeyedListNodeDomParser(buildingStratProvider.forUnkeyedList(), unkeyedListEntryNodeParser);
102         choiceNodeParser = new ChoiceNodeDomParser(dispatcher, buildingStratProvider.forChoice());
103         // no buildingStrategy for Augment (no use case for now)
104         augmentationNodeParser = new AugmentationNodeDomParser(buildingStratProvider.forAugmentation(), dispatcher, strictParsing);
105     }
106
107     public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider, final SchemaContext schema, final boolean strictParsing) {
108         return new DomToNormalizedNodeParserFactory(codecProvider, schema, strictParsing);
109     }
110
111     public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider, final SchemaContext schema) {
112         return new DomToNormalizedNodeParserFactory(codecProvider, schema, true);
113     }
114
115     public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider, final SchemaContext schema,
116                                                                final BuildingStrategyProvider buildingStratProvider) {
117         return new DomToNormalizedNodeParserFactory(codecProvider, schema, buildingStratProvider, true);
118     }
119
120     public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider, final SchemaContext schema,
121                                                                final BuildingStrategyProvider buildingStratProvider,
122                                                                final boolean strictParsing) {
123         return new DomToNormalizedNodeParserFactory(codecProvider, schema, buildingStratProvider, strictParsing);
124     }
125
126     @Override
127     public ToNormalizedNodeParser<Element, AugmentationNode, AugmentationSchema> getAugmentationNodeParser() {
128         return augmentationNodeParser;
129     }
130
131     @Override
132     public ToNormalizedNodeParser<Element, ChoiceNode, ChoiceSchemaNode> getChoiceNodeParser() {
133         return choiceNodeParser;
134     }
135
136     @Override
137     public ToNormalizedNodeParser<Element, ContainerNode, ContainerSchemaNode> getContainerNodeParser() {
138         return containerNodeParser;
139     }
140
141     @Override
142     public ToNormalizedNodeParser<Element, LeafNode<?>, LeafSchemaNode> getLeafNodeParser() {
143         return leafNodeParser;
144     }
145
146     @Override
147     public ToNormalizedNodeParser<Element, LeafSetEntryNode<?>, LeafListSchemaNode> getLeafSetEntryNodeParser() {
148         return leafSetEntryNodeParser;
149     }
150
151     @Override
152     public ToNormalizedNodeParser<Element, LeafSetNode<?>, LeafListSchemaNode> getLeafSetNodeParser() {
153         return leafSetNodeParser;
154     }
155
156     @Override
157     public ToNormalizedNodeParser<Element, MapEntryNode, ListSchemaNode> getMapEntryNodeParser() {
158         return mapEntryNodeParser;
159     }
160
161     @Override
162     public ToNormalizedNodeParser<Element, MapNode, ListSchemaNode> getMapNodeParser() {
163         return mapNodeParser;
164     }
165
166     @Override
167     public ToNormalizedNodeParser<Element, UnkeyedListNode, ListSchemaNode> getUnkeyedListNodeParser() {
168         return unkeyedListNodeParser;
169     }
170
171     @Override
172     public ToNormalizedNodeParser<Element, UnkeyedListEntryNode, ListSchemaNode> getUnkeyedListEntryNodeParser() {
173         return unkeyedListEntryNodeParser;
174     }
175
176     @Override
177     public ToNormalizedNodeParser<Element, OrderedMapNode, ListSchemaNode> getOrderedListNodeParser() {
178         return orderedListNodeParser;
179     }
180
181     @Override
182     public ToNormalizedNodeParser<Element, YangModeledAnyXmlNode, YangModeledAnyXmlSchemaNode> getYangModeledAnyXmlNodeParser() {
183         return yangModeledAnyXmlNodeParser;
184     }
185
186     @Override
187     public ToNormalizedNodeParser<Element, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeParser() {
188         return anyXmlNodeParser;
189     }
190
191     /**
192      * Base provider of building strategies used for customizing parsing process
193      */
194     public static abstract class BuildingStrategyProvider {
195
196         protected ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.NodeIdentifier,LeafNode<?>> forLeaf() {
197             return new LeafNodeBaseParser.SimpleLeafBuildingStrategy();
198         }
199
200         protected ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.NodeWithValue,LeafSetEntryNode<?>> forLeafSetEntry() {
201             return new LeafSetEntryNodeBaseParser.SimpleLeafSetEntryBuildingStrategy();
202         }
203
204         protected ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.NodeIdentifier,ContainerNode> forContainer() {
205             return new BaseDispatcherParser.SimpleBuildingStrategy<>();
206         }
207
208         protected ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.NodeIdentifierWithPredicates,MapEntryNode> forMapEntry() {
209             return new BaseDispatcherParser.SimpleBuildingStrategy<>();
210         }
211
212         protected ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.NodeIdentifier,MapNode> forMap() {
213             return new ListNodeBaseParser.SimpleListNodeBuildingStrategy<>();
214         }
215
216         protected ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.NodeIdentifier,OrderedMapNode> forOrderedList() {
217             return new ListNodeBaseParser.SimpleListNodeBuildingStrategy<>();
218         }
219
220         protected ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.NodeIdentifier,UnkeyedListEntryNode> forUnkeyedListEntry() {
221             return new BaseDispatcherParser.SimpleBuildingStrategy<>();
222         }
223
224         protected ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.NodeIdentifier,UnkeyedListNode> forUnkeyedList() {
225             return new ListNodeBaseParser.SimpleListNodeBuildingStrategy<>();
226         }
227
228         protected ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.NodeIdentifier,ChoiceNode> forChoice() {
229             return new BaseDispatcherParser.SimpleBuildingStrategy<>();
230         }
231
232         public ExtensibleParser.BuildingStrategy<YangInstanceIdentifier.AugmentationIdentifier, AugmentationNode> forAugmentation() {
233             return new BaseDispatcherParser.SimpleBuildingStrategy<>();
234         }
235     }
236
237 }