X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2Ftransform%2Fdom%2Fparser%2FDomToNormalizedNodeParserFactory.java;h=fc4cae62e2e6a8d9009385ca0c8199ff14370089;hb=f3a3253eb4a5033515898723fcee5a9819135729;hp=a02b60b2fd24b6443596e3dd4fe4e508433b0518;hpb=c5e58b6841e2f9d9bcd7808d4f3073b1c4792d26;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/DomToNormalizedNodeParserFactory.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/DomToNormalizedNodeParserFactory.java index a02b60b2fd..fc4cae62e2 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/DomToNormalizedNodeParserFactory.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/DomToNormalizedNodeParserFactory.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.parser; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode; import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; @@ -16,19 +17,32 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; +import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; +import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode; import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider; import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser; import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParserFactory; +import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.BaseDispatcherParser; +import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.ExtensibleParser; +import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.LeafNodeBaseParser; +import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.LeafSetEntryNodeBaseParser; +import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.ListNodeBaseParser; import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher; import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; +import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode; import org.w3c.dom.Element; public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeParserFactory { + private final AugmentationNodeDomParser augmentationNodeParser; private final ChoiceNodeDomParser choiceNodeParser; private final ContainerNodeDomParser containerNodeParser; @@ -37,25 +51,76 @@ public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeP private final LeafSetNodeDomParser leafSetNodeParser; private final MapNodeDomParser mapNodeParser; private final MapEntryNodeDomParser mapEntryNodeParser; - - private DomToNormalizedNodeParserFactory(final XmlCodecProvider codecProvider) { - leafNodeParser = new LeafNodeDomParser(codecProvider); - leafSetEntryNodeParser = new LeafSetEntryNodeDomParser(codecProvider); + private final UnkeyedListEntryNodeDomParser unkeyedListEntryNodeParser; + private final UnkeyedListNodeDomParser unkeyedListNodeParser; + private final OrderedListNodeDomParser orderedListNodeParser; + private final YangModeledAnyXmlDomParser yangModeledAnyXmlNodeParser; + private final AnyXmlDomParser anyXmlNodeParser; + + private DomToNormalizedNodeParserFactory(final XmlCodecProvider codecProvider, final SchemaContext schema, final boolean strictParsing) { + leafNodeParser = new LeafNodeDomParser(codecProvider, schema); + leafSetEntryNodeParser = new LeafSetEntryNodeDomParser(codecProvider, schema); leafSetNodeParser = new LeafSetNodeDomParser(leafSetEntryNodeParser); + anyXmlNodeParser = new AnyXmlDomParser(); final NodeParserDispatcher dispatcher = new NodeParserDispatcher.BaseNodeParserDispatcher(this) { }; - containerNodeParser = new ContainerNodeDomParser(dispatcher); - mapEntryNodeParser = new MapEntryNodeDomParser(dispatcher); + yangModeledAnyXmlNodeParser = new YangModeledAnyXmlDomParser(dispatcher); + containerNodeParser = new ContainerNodeDomParser(dispatcher, strictParsing); + mapEntryNodeParser = new MapEntryNodeDomParser(dispatcher, strictParsing); mapNodeParser = new MapNodeDomParser(mapEntryNodeParser); + orderedListNodeParser = new OrderedListNodeDomParser(mapEntryNodeParser); + unkeyedListEntryNodeParser = new UnkeyedListEntryNodeDomParser(dispatcher); + unkeyedListNodeParser = new UnkeyedListNodeDomParser(unkeyedListEntryNodeParser); choiceNodeParser = new ChoiceNodeDomParser(dispatcher); - augmentationNodeParser = new AugmentationNodeDomParser(dispatcher); + augmentationNodeParser = new AugmentationNodeDomParser(dispatcher, strictParsing); + } + + private DomToNormalizedNodeParserFactory(final XmlCodecProvider codecProvider, final SchemaContext schema, + final BuildingStrategyProvider buildingStratProvider, final boolean strictParsing) { + leafNodeParser = new LeafNodeDomParser(codecProvider, schema, buildingStratProvider.forLeaf()); + leafSetEntryNodeParser = new LeafSetEntryNodeDomParser(codecProvider, schema, buildingStratProvider.forLeafSetEntry()); + + // no buildingStrategy for Augment (no use case for now) + leafSetNodeParser = new LeafSetNodeDomParser(leafSetEntryNodeParser); + // no buildingStrategy for anyXml (probably not necessary) + anyXmlNodeParser = new AnyXmlDomParser(); + + final NodeParserDispatcher dispatcher = new NodeParserDispatcher.BaseNodeParserDispatcher(this) { + + }; + + yangModeledAnyXmlNodeParser = new YangModeledAnyXmlDomParser(dispatcher); + containerNodeParser = new ContainerNodeDomParser(dispatcher, buildingStratProvider.forContainer(), strictParsing); + mapEntryNodeParser = new MapEntryNodeDomParser(dispatcher, buildingStratProvider.forMapEntry(), strictParsing); + mapNodeParser = new MapNodeDomParser(mapEntryNodeParser, buildingStratProvider.forMap()); + orderedListNodeParser = new OrderedListNodeDomParser(mapEntryNodeParser, buildingStratProvider.forOrderedList()); + unkeyedListEntryNodeParser = new UnkeyedListEntryNodeDomParser(buildingStratProvider.forUnkeyedListEntry(), dispatcher); + unkeyedListNodeParser = new UnkeyedListNodeDomParser(buildingStratProvider.forUnkeyedList(), unkeyedListEntryNodeParser); + choiceNodeParser = new ChoiceNodeDomParser(dispatcher, buildingStratProvider.forChoice()); + // no buildingStrategy for Augment (no use case for now) + augmentationNodeParser = new AugmentationNodeDomParser(buildingStratProvider.forAugmentation(), dispatcher, strictParsing); } - public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider) { - return new DomToNormalizedNodeParserFactory(codecProvider); + public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider, final SchemaContext schema, final boolean strictParsing) { + return new DomToNormalizedNodeParserFactory(codecProvider, schema, strictParsing); + } + + public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider, final SchemaContext schema) { + return new DomToNormalizedNodeParserFactory(codecProvider, schema, true); + } + + public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider, final SchemaContext schema, + final BuildingStrategyProvider buildingStratProvider) { + return new DomToNormalizedNodeParserFactory(codecProvider, schema, buildingStratProvider, true); + } + + public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider, final SchemaContext schema, + final BuildingStrategyProvider buildingStratProvider, + final boolean strictParsing) { + return new DomToNormalizedNodeParserFactory(codecProvider, schema, buildingStratProvider, strictParsing); } @Override @@ -64,7 +129,7 @@ public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeP } @Override - public ToNormalizedNodeParser getChoiceNodeParser() { + public ToNormalizedNodeParser getChoiceNodeParser() { return choiceNodeParser; } @@ -98,8 +163,75 @@ public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeP return mapNodeParser; } + @Override + public ToNormalizedNodeParser getUnkeyedListNodeParser() { + return unkeyedListNodeParser; + } + + @Override + public ToNormalizedNodeParser getUnkeyedListEntryNodeParser() { + return unkeyedListEntryNodeParser; + } + + @Override + public ToNormalizedNodeParser getOrderedListNodeParser() { + return orderedListNodeParser; + } + + @Override + public ToNormalizedNodeParser getYangModeledAnyXmlNodeParser() { + return yangModeledAnyXmlNodeParser; + } + @Override public ToNormalizedNodeParser getAnyXmlNodeParser() { - throw new UnsupportedOperationException(); + return anyXmlNodeParser; } + + /** + * Base provider of building strategies used for customizing parsing process + */ + public static abstract class BuildingStrategyProvider { + + protected ExtensibleParser.BuildingStrategy> forLeaf() { + return new LeafNodeBaseParser.SimpleLeafBuildingStrategy(); + } + + protected ExtensibleParser.BuildingStrategy> forLeafSetEntry() { + return new LeafSetEntryNodeBaseParser.SimpleLeafSetEntryBuildingStrategy(); + } + + protected ExtensibleParser.BuildingStrategy forContainer() { + return new BaseDispatcherParser.SimpleBuildingStrategy<>(); + } + + protected ExtensibleParser.BuildingStrategy forMapEntry() { + return new BaseDispatcherParser.SimpleBuildingStrategy<>(); + } + + protected ExtensibleParser.BuildingStrategy forMap() { + return new ListNodeBaseParser.SimpleListNodeBuildingStrategy<>(); + } + + protected ExtensibleParser.BuildingStrategy forOrderedList() { + return new ListNodeBaseParser.SimpleListNodeBuildingStrategy<>(); + } + + protected ExtensibleParser.BuildingStrategy forUnkeyedListEntry() { + return new BaseDispatcherParser.SimpleBuildingStrategy<>(); + } + + protected ExtensibleParser.BuildingStrategy forUnkeyedList() { + return new ListNodeBaseParser.SimpleListNodeBuildingStrategy<>(); + } + + protected ExtensibleParser.BuildingStrategy forChoice() { + return new BaseDispatcherParser.SimpleBuildingStrategy<>(); + } + + public ExtensibleParser.BuildingStrategy forAugmentation() { + return new BaseDispatcherParser.SimpleBuildingStrategy<>(); + } + } + }