From 7c539d1fe97b7caedfac7312e0ca57d33546ceb5 Mon Sep 17 00:00:00 2001 From: Martin Vitez Date: Mon, 16 Sep 2013 10:17:23 +0200 Subject: [PATCH] Added check for mandatory nodes if augment target is in another module. Signed-off-by: Martin Vitez --- .../yang/parser/impl/YangParserImpl.java | 31 +++++++++++++++++++ .../parser/impl/YangParserNegativeTest.java | 16 ++++++++++ .../negative-scenario/testfile7.yang | 26 ++++++++++++++++ .../negative-scenario/testfile8.yang | 27 ++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 yang/yang-parser-impl/src/test/resources/negative-scenario/testfile7.yang create mode 100644 yang/yang-parser-impl/src/test/resources/negative-scenario/testfile8.yang diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java index 8f5028432f..0f554c6206 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java @@ -16,6 +16,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; @@ -47,6 +48,7 @@ import org.opendaylight.yangtools.yang.model.util.IdentityrefType; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.Builder; import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder; @@ -449,6 +451,8 @@ public final class YangParserImpl implements YangModelParser { } } + checkAugmentMandatoryNodes(allAugments); + for (int i = 0; i < allAugments.size(); i++) { // pick one augment final AugmentationSchemaBuilder augment = allAugments.get(i); @@ -476,6 +480,33 @@ public final class YangParserImpl implements YangModelParser { } } + /** + * Check augments for mandatory nodes. If the target node is in another + * module, then nodes added by the augmentation MUST NOT be mandatory nodes. + * If mandatory node is found, throw an exception. + * + * @param augments + * augments to check + */ + private void checkAugmentMandatoryNodes(Collection augments) { + for (AugmentationSchemaBuilder augment : augments) { + String augmentPrefix = augment.getTargetPath().getPath().get(0).getPrefix(); + ModuleBuilder module = ParserUtils.getParentModule(augment); + String modulePrefix = module.getPrefix(); + + if (augmentPrefix == null || augmentPrefix.isEmpty() || augmentPrefix.equals(modulePrefix)) { + continue; + } + + for (DataSchemaNodeBuilder childNode : augment.getChildNodeBuilders()) { + if (childNode.getConstraints().isMandatory()) { + throw new YangParseException(augment.getModuleName(), augment.getLine(), + "Error in augment parsing: cannot augment mandatory node"); + } + } + } + } + /** * Search for augment target and perform augmentation. * diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserNegativeTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserNegativeTest.java index b66fb83e92..e05e0224a4 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserNegativeTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserNegativeTest.java @@ -196,4 +196,20 @@ public class YangParserNegativeTest { } } + @Test + public void testMandatoryInAugment() throws IOException { + try { + try (InputStream stream1 = new FileInputStream(getClass().getResource("/negative-scenario/testfile8.yang") + .getPath()); + InputStream stream2 = new FileInputStream(getClass().getResource( + "/negative-scenario/testfile7.yang").getPath())) { + TestUtils.loadModules(Arrays.asList(stream1, stream2)); + fail("YangParseException should by thrown"); + } + } catch (YangParseException e) { + String expected = "Error in module 'testfile7' at line 18: Error in augment parsing: cannot augment mandatory node"; + assertEquals(expected, e.getMessage()); + } + } + } diff --git a/yang/yang-parser-impl/src/test/resources/negative-scenario/testfile7.yang b/yang/yang-parser-impl/src/test/resources/negative-scenario/testfile7.yang new file mode 100644 index 0000000000..17dddeba0d --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/negative-scenario/testfile7.yang @@ -0,0 +1,26 @@ +module testfile7 { + yang-version 1; + namespace "urn:simple.test7.demo"; + prefix "t7"; + + import testfile8 { + prefix "t8"; + revision-date 2013-08-03; + } + + organization "opendaylight"; + contact "http://www.opendaylight.org/"; + + revision "2013-08-03" { + reference " WILL BE DEFINED LATER"; + } + + augment "/t8:interfaces/t8:ifEntry" { + when "if:leafType='ds1'"; + leaf linkleaf { + mandatory true; + type binary; + } + } + +} diff --git a/yang/yang-parser-impl/src/test/resources/negative-scenario/testfile8.yang b/yang/yang-parser-impl/src/test/resources/negative-scenario/testfile8.yang new file mode 100644 index 0000000000..baf3557cb9 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/negative-scenario/testfile8.yang @@ -0,0 +1,27 @@ +module testfile8 { + yang-version 1; + namespace "urn:simple.test8.demo"; + prefix "t8"; + + organization "opendaylight"; + contact "http://www.opendaylight.org/"; + description "This is types-data test description"; + + revision "2013-08-03" { + reference " WILL BE DEFINED LATER"; + } + + container interfaces { + grouping ifEntry { + container augment-holder; + } + list ifEntry { + key "ifIndex"; + leaf ifIndex { + type uint32; + units minutes; + } + } + } + +} -- 2.36.6