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