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 <tcere@cisco.com>
import java.util.Map;
import java.util.Set;
import javax.annotation.Nonnull;
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.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;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
return dataChildByName == null ? findSchemaForChild(schema, qname, schema.getChildNodes()) : dataChildByName;
}
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<DataSchemaNode> 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<DataSchemaNode> childNodes) {
Optional<DataSchemaNode> childSchema = findFirstSchema(qname, childNodes);
Preconditions.checkState(childSchema.isPresent(),
public static DataSchemaNode findSchemaForChild(final DataNodeContainer schema, final QName qname, final Iterable<DataSchemaNode> childNodes) {
Optional<DataSchemaNode> childSchema = findFirstSchema(qname, childNodes);
Preconditions.checkState(childSchema.isPresent(),
@Override
protected final DataSchemaNode getSchemaForChild(final AugmentationSchema schema, final QName childQName) {
@Override
protected final DataSchemaNode getSchemaForChild(final AugmentationSchema schema, final QName childQName) {
- return SchemaUtils.findSchemaForChild(schema, childQName);
+ return SchemaUtils.findSchemaForChild(schema, childQName, strictParsing());
// process Child nodes
for (QName childPartialQName : mappedChildElements.keySet()) {
DataSchemaNode childSchema = getSchemaForChild(schema, childPartialQName);
// 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<E> childrenForQName = mappedChildElements.get(childPartialQName);
// Augment
List<E> childrenForQName = mappedChildElements.get(childPartialQName);
// Augment
return Collections.emptyMap();
}
return Collections.emptyMap();
}
+ protected boolean strictParsing() {
+ return true;
+ }
+
private boolean isMarkedAs(final Map<QName, ?> mappedAugmentChildNodes, final QName qName) {
return mappedAugmentChildNodes.containsKey(qName);
}
private boolean isMarkedAs(final Map<QName, ?> mappedAugmentChildNodes, final QName qName) {
return mappedAugmentChildNodes.containsKey(qName);
}
@Override
protected final DataSchemaNode getSchemaForChild(final ContainerSchemaNode schema, final QName childQName) {
@Override
protected final DataSchemaNode getSchemaForChild(final ContainerSchemaNode schema, final QName childQName) {
- return SchemaUtils.findSchemaForChild(schema, childQName);
+ return SchemaUtils.findSchemaForChild(schema, childQName, strictParsing());
@Override
protected final DataSchemaNode getSchemaForChild(final ListSchemaNode schema, final QName childQName) {
@Override
protected final DataSchemaNode getSchemaForChild(final ListSchemaNode schema, final QName childQName) {
- return SchemaUtils.findSchemaForChild(schema, childQName);
+ return SchemaUtils.findSchemaForChild(schema, childQName, strictParsing());
final class AugmentationNodeDomParser extends AugmentationNodeBaseParser<Element> {
private final NodeParserDispatcher<Element> dispatcher;
final class AugmentationNodeDomParser extends AugmentationNodeBaseParser<Element> {
private final NodeParserDispatcher<Element> dispatcher;
+ private final boolean strictParsing;
AugmentationNodeDomParser(final NodeParserDispatcher<Element> dispatcher) {
this.dispatcher = Preconditions.checkNotNull(dispatcher);
AugmentationNodeDomParser(final NodeParserDispatcher<Element> dispatcher) {
this.dispatcher = Preconditions.checkNotNull(dispatcher);
+ this.strictParsing = super.strictParsing();
+ }
+
+ AugmentationNodeDomParser(final NodeParserDispatcher<Element> dispatcher, final boolean strictParsing) {
+ this.dispatcher = Preconditions.checkNotNull(dispatcher);
+ this.strictParsing = strictParsing;
+ @Override
+ protected boolean strictParsing() {
+ return strictParsing;
+ }
final class ContainerNodeDomParser extends ContainerNodeBaseParser<Element> {
private final NodeParserDispatcher<Element> dispatcher;
final class ContainerNodeDomParser extends ContainerNodeBaseParser<Element> {
private final NodeParserDispatcher<Element> dispatcher;
+ private final boolean strictParsing;
ContainerNodeDomParser(final NodeParserDispatcher<Element> dispatcher) {
this.dispatcher = Preconditions.checkNotNull(dispatcher);
ContainerNodeDomParser(final NodeParserDispatcher<Element> dispatcher) {
this.dispatcher = Preconditions.checkNotNull(dispatcher);
+ this.strictParsing = super.strictParsing();
+ }
+
+ ContainerNodeDomParser(final NodeParserDispatcher<Element> dispatcher, final boolean strictParsing) {
+ this.dispatcher = Preconditions.checkNotNull(dispatcher);
+ this.strictParsing = strictParsing;
protected LinkedListMultimap<QName, Element> mapChildElements(Iterable<Element> elements) {
return DomUtils.mapChildElementsForSingletonNode(elements.iterator().next());
}
protected LinkedListMultimap<QName, Element> mapChildElements(Iterable<Element> elements) {
return DomUtils.mapChildElementsForSingletonNode(elements.iterator().next());
}
+
+ @Override
+ protected boolean strictParsing() {
+ return this.strictParsing;
+ }
private final OrderedListNodeDomParser orderedListNodeParser;
private final AnyXmlDomParser anyXmlNodeParser;
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);
leafNodeParser = new LeafNodeDomParser(codecProvider, schema);
leafSetEntryNodeParser = new LeafSetEntryNodeDomParser(codecProvider, schema);
leafSetNodeParser = new LeafSetNodeDomParser(leafSetEntryNodeParser);
- 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);
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);
augmentationNodeParser = new AugmentationNodeDomParser(dispatcher);
}
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) {
public static DomToNormalizedNodeParserFactory getInstance(final XmlCodecProvider codecProvider, final SchemaContext schema) {
- return new DomToNormalizedNodeParserFactory(codecProvider, schema);
+ return new DomToNormalizedNodeParserFactory(codecProvider, schema, true);
final class MapEntryNodeDomParser extends ListEntryNodeDomParser<MapEntryNode> {
final class MapEntryNodeDomParser extends ListEntryNodeDomParser<MapEntryNode> {
+ private final boolean strictParsing;
+
MapEntryNodeDomParser(final NodeParserDispatcher<Element> dispatcher) {
super(dispatcher);
MapEntryNodeDomParser(final NodeParserDispatcher<Element> dispatcher) {
super(dispatcher);
+ this.strictParsing = super.strictParsing();
+ }
+
+ MapEntryNodeDomParser(final NodeParserDispatcher<Element> dispatcher, final boolean strictParsing) {
+ super(dispatcher);
+ this.strictParsing = strictParsing;
ListSchemaNode schema) {
return Builders.mapEntryBuilder(schema);
}
ListSchemaNode schema) {
return Builders.mapEntryBuilder(schema);
}
+
+ @Override
+ protected boolean strictParsing() {
+ return strictParsing;
+ }