From 46f480567dd36fa8e6348d3cece49985be5b3326 Mon Sep 17 00:00:00 2001 From: Tomas Cere Date: Wed, 22 Apr 2015 16:44:02 +0200 Subject: [PATCH] Add parser support for non-strict schema lookup. If parsers are in non-strict mode they will ignore parsing any node that fails schema lookup. Change-Id: I61fa05a2607477a7378952d8a88283f2ca98a13c Signed-off-by: Tomas Cere --- .../yang/data/impl/schema/SchemaUtils.java | 15 +++++++++++++++ .../base/parser/AugmentationNodeBaseParser.java | 2 +- .../base/parser/BaseDispatcherParser.java | 8 ++++++++ .../base/parser/ContainerNodeBaseParser.java | 2 +- .../base/parser/ListEntryNodeBaseParser.java | 2 +- .../dom/parser/AugmentationNodeDomParser.java | 11 +++++++++++ .../dom/parser/ContainerNodeDomParser.java | 12 ++++++++++++ .../parser/DomToNormalizedNodeParserFactory.java | 14 +++++++++----- .../dom/parser/MapEntryNodeDomParser.java | 13 +++++++++++++ 9 files changed, 71 insertions(+), 8 deletions(-) diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaUtils.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaUtils.java index 53bdbd84bc..a5c5148548 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaUtils.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaUtils.java @@ -18,10 +18,12 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.AugmentationTarget; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; @@ -80,6 +82,19 @@ public final class SchemaUtils { return dataChildByName == null ? findSchemaForChild(schema, qname, schema.getChildNodes()) : dataChildByName; } + @Nullable + public static DataSchemaNode findSchemaForChild(final DataNodeContainer schema, final QName qname, final boolean strictMode) { + if (strictMode) { + return findSchemaForChild(schema, qname); + } + + Optional childSchemaOptional = findFirstSchema(qname, schema.getChildNodes()); + if (!childSchemaOptional.isPresent()) { + return null; + } + return childSchemaOptional.get(); + } + public static DataSchemaNode findSchemaForChild(final DataNodeContainer schema, final QName qname, final Iterable childNodes) { Optional childSchema = findFirstSchema(qname, childNodes); Preconditions.checkState(childSchema.isPresent(), diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/AugmentationNodeBaseParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/AugmentationNodeBaseParser.java index 83fdc123cd..7c3938fe08 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/AugmentationNodeBaseParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/AugmentationNodeBaseParser.java @@ -41,7 +41,7 @@ public abstract class AugmentationNodeBaseParser extends @Override protected final DataSchemaNode getSchemaForChild(final AugmentationSchema schema, final QName childQName) { - return SchemaUtils.findSchemaForChild(schema, childQName); + return SchemaUtils.findSchemaForChild(schema, childQName, strictParsing()); } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/BaseDispatcherParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/BaseDispatcherParser.java index fba872d2f7..a594e5d763 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/BaseDispatcherParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/BaseDispatcherParser.java @@ -109,6 +109,10 @@ public abstract class BaseDispatcherParser, S> // process Child nodes for (QName childPartialQName : mappedChildElements.keySet()) { DataSchemaNode childSchema = getSchemaForChild(schema, childPartialQName); + //with strict parsing an exception would be already thrown, with nonstrict we want to ignore this node + if (childSchema == null) { + continue; + } List childrenForQName = mappedChildElements.get(childPartialQName); // Augment @@ -153,6 +157,10 @@ public abstract class BaseDispatcherParser, S> return Collections.emptyMap(); } + protected boolean strictParsing() { + return true; + } + private boolean isMarkedAs(final Map mappedAugmentChildNodes, final QName qName) { return mappedAugmentChildNodes.containsKey(qName); } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ContainerNodeBaseParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ContainerNodeBaseParser.java index 5fff36d549..f7cca88155 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ContainerNodeBaseParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ContainerNodeBaseParser.java @@ -48,7 +48,7 @@ public abstract class ContainerNodeBaseParser extends @Override protected final DataSchemaNode getSchemaForChild(final ContainerSchemaNode schema, final QName childQName) { - return SchemaUtils.findSchemaForChild(schema, childQName); + return SchemaUtils.findSchemaForChild(schema, childQName, strictParsing()); } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListEntryNodeBaseParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListEntryNodeBaseParser.java index c2ec9fc7e4..dfa34abcc7 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListEntryNodeBaseParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListEntryNodeBaseParser.java @@ -34,7 +34,7 @@ public abstract class ListEntryNodeBaseParser> @Override protected final DataSchemaNode getSchemaForChild(final ListSchemaNode schema, final QName childQName) { - return SchemaUtils.findSchemaForChild(schema, childQName); + return SchemaUtils.findSchemaForChild(schema, childQName, strictParsing()); } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/AugmentationNodeDomParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/AugmentationNodeDomParser.java index 7a5b551578..73167f407a 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/AugmentationNodeDomParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/AugmentationNodeDomParser.java @@ -19,9 +19,16 @@ import com.google.common.collect.LinkedListMultimap; final class AugmentationNodeDomParser extends AugmentationNodeBaseParser { private final NodeParserDispatcher dispatcher; + private final boolean strictParsing; AugmentationNodeDomParser(final NodeParserDispatcher dispatcher) { this.dispatcher = Preconditions.checkNotNull(dispatcher); + this.strictParsing = super.strictParsing(); + } + + AugmentationNodeDomParser(final NodeParserDispatcher dispatcher, final boolean strictParsing) { + this.dispatcher = Preconditions.checkNotNull(dispatcher); + this.strictParsing = strictParsing; } @Override @@ -34,4 +41,8 @@ final class AugmentationNodeDomParser extends AugmentationNodeBaseParser { private final NodeParserDispatcher dispatcher; + private final boolean strictParsing; ContainerNodeDomParser(final NodeParserDispatcher dispatcher) { this.dispatcher = Preconditions.checkNotNull(dispatcher); + this.strictParsing = super.strictParsing(); + } + + ContainerNodeDomParser(final NodeParserDispatcher dispatcher, final boolean strictParsing) { + this.dispatcher = Preconditions.checkNotNull(dispatcher); + this.strictParsing = strictParsing; } @Override @@ -40,4 +47,9 @@ final class ContainerNodeDomParser extends ContainerNodeBaseParser { protected LinkedListMultimap mapChildElements(Iterable elements) { return DomUtils.mapChildElementsForSingletonNode(elements.iterator().next()); } + + @Override + protected boolean strictParsing() { + return this.strictParsing; + } } 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 af58c48154..8e6381748e 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 @@ -47,7 +47,7 @@ public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeP private final OrderedListNodeDomParser orderedListNodeParser; private final AnyXmlDomParser anyXmlNodeParser; - private DomToNormalizedNodeParserFactory(final XmlCodecProvider codecProvider, final SchemaContext schema) { + 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); @@ -57,14 +57,14 @@ public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeP }; - containerNodeParser = new ContainerNodeDomParser(dispatcher); - mapEntryNodeParser = new MapEntryNodeDomParser(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); } @Deprecated @@ -88,8 +88,12 @@ public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeP augmentationNodeParser = new AugmentationNodeDomParser(dispatcher); } + 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); + return new DomToNormalizedNodeParserFactory(codecProvider, schema, true); } @Deprecated diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapEntryNodeDomParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapEntryNodeDomParser.java index 4d4d35aa7d..a6c467c222 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapEntryNodeDomParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapEntryNodeDomParser.java @@ -17,8 +17,16 @@ import org.w3c.dom.Element; final class MapEntryNodeDomParser extends ListEntryNodeDomParser { + private final boolean strictParsing; + MapEntryNodeDomParser(final NodeParserDispatcher dispatcher) { super(dispatcher); + this.strictParsing = super.strictParsing(); + } + + MapEntryNodeDomParser(final NodeParserDispatcher dispatcher, final boolean strictParsing) { + super(dispatcher); + this.strictParsing = strictParsing; } @Override @@ -26,4 +34,9 @@ final class MapEntryNodeDomParser extends ListEntryNodeDomParser { ListSchemaNode schema) { return Builders.mapEntryBuilder(schema); } + + @Override + protected boolean strictParsing() { + return strictParsing; + } } -- 2.36.6