From b38a159fbe94b2b6cdb66c2d002ddef6c3e7d3bf Mon Sep 17 00:00:00 2001 From: Martin Ciglan Date: Thu, 18 Sep 2014 15:24:56 +0200 Subject: [PATCH] bug 1957 StackOverFlowError in YangParserImpl StackOverFlowError exception was replaced by YangParseException Change-Id: I7dd47d671581e07d26da9a12a7db25b7bcdac8a1 Signed-off-by: Martin Ciglan (cherry picked from commit 6217fa73d6980ab2528f53438b064b9e337905a2) --- .../yang/parser/impl/YangParserImpl.java | 32 ++++++++--- .../parser/impl/YangParserIdentityTest.java | 54 +++++++++++++++++++ .../test/resources/identity/identitytest.yang | 16 ++++++ .../test/resources/identity/import/dummy.yang | 15 ++++++ .../import/prefiximportidentitytest.yang | 18 +++++++ .../identity/prefixidentitytest.yang | 16 ++++++ 6 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserIdentityTest.java create mode 100644 yang/yang-parser-impl/src/test/resources/identity/identitytest.yang create mode 100644 yang/yang-parser-impl/src/test/resources/identity/import/dummy.yang create mode 100644 yang/yang-parser-impl/src/test/resources/identity/import/prefiximportidentitytest.yang create mode 100644 yang/yang-parser-impl/src/test/resources/identity/prefixidentitytest.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 d47ba8c837..9f59cfd19a 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 @@ -1029,7 +1029,8 @@ public final class YangParserImpl implements YangContextParser { } } - private void resolveIdentity(final ModuleBuilder module, final IdentitySchemaNodeBuilder identity) { + private void resolveIdentity(final ModuleBuilder module, + final IdentitySchemaNodeBuilder identity) { final String baseIdentityName = identity.getBaseIdentityName(); if (baseIdentityName != null) { IdentitySchemaNodeBuilder result = null; @@ -1037,15 +1038,34 @@ public final class YangParserImpl implements YangContextParser { final int line = identity.getLine(); String[] splittedBase = baseIdentityName.split(":"); if (splittedBase.length > 2) { - throw new YangParseException(module.getName(), line, "Failed to parse identityref base: " - + baseIdentityName); + throw new YangParseException(module.getName(), line, + "Failed to parse identityref base: " + + baseIdentityName); } String prefix = splittedBase[0]; String name = splittedBase[1]; - ModuleBuilder dependentModule = BuilderUtils.getModuleByPrefix(module, prefix); - result = BuilderUtils.findIdentity(dependentModule.getAddedIdentities(), name); + + if (prefix.equals(module.getPrefix()) + && name.equals(identity.getQName().getLocalName())) { + throw new YangParseException(module.getName(), + identity.getLine(), + "Failed to parse base, identity name equals base identity name: " + + baseIdentityName); + } + + ModuleBuilder dependentModule = BuilderUtils.getModuleByPrefix( + module, prefix); + result = BuilderUtils.findIdentity( + dependentModule.getAddedIdentities(), name); } else { - result = BuilderUtils.findIdentity(module.getAddedIdentities(), baseIdentityName); + if (baseIdentityName.equals(identity.getQName().getLocalName())) { + throw new YangParseException(module.getName(), + identity.getLine(), + "Failed to parse base, identity name equals base identity name: " + + baseIdentityName); + } + result = BuilderUtils.findIdentity(module.getAddedIdentities(), + baseIdentityName); } identity.setBaseIdentity(result); } diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserIdentityTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserIdentityTest.java new file mode 100644 index 0000000000..788802622c --- /dev/null +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserIdentityTest.java @@ -0,0 +1,54 @@ +package org.opendaylight.yangtools.yang.parser.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URISyntaxException; +import java.util.Set; +import org.junit.Test; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.ModuleImport; +import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException; +import org.opendaylight.yangtools.yang.parser.util.YangParseException; + +public class YangParserIdentityTest { + + // base identity name equals identity name + @Test(expected = YangParseException.class) + public void testParsingIdentityTestModuleShouldThrowYangParseException() + throws IOException, URISyntaxException, YangSyntaxErrorException { + File yang = new File(getClass().getResource( + "/identity/identitytest.yang").toURI()); + InputStream stream = new FileInputStream(yang); + TestUtils.loadModule(stream); + } + + // same module prefixed base identity name equals identity name + @Test(expected = YangParseException.class) + public void testParsingPrefixIdentityTestModuleShouldThrowYangParseException() + throws URISyntaxException, IOException, YangSyntaxErrorException { + File yang = new File(getClass().getResource( + "/identity/prefixidentitytest.yang").toURI()); + InputStream stream = new FileInputStream(yang); + TestUtils.loadModule(stream); + } + + // imported module prefixed base identity name equals identity name, but + // prefix differs + @Test + public void testParsingImportPrefixIdentityTestModuleShouldThrowYangParseException() + throws URISyntaxException, IOException, YangSyntaxErrorException { + Set modules = TestUtils.loadModules(getClass().getResource( + "/identity/import").toURI()); + Module module = TestUtils.findModule(modules, + "prefiximportidentitytest"); + Set imports = module.getImports(); + assertEquals(imports.size(), 1); + ModuleImport dummy = TestUtils.findImport(imports, "dummy"); + assertNotEquals(dummy.getPrefix(), module.getPrefix()); + } +} diff --git a/yang/yang-parser-impl/src/test/resources/identity/identitytest.yang b/yang/yang-parser-impl/src/test/resources/identity/identitytest.yang new file mode 100644 index 0000000000..141256f886 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/identity/identitytest.yang @@ -0,0 +1,16 @@ +module identitytest { + yang-version 1; + namespace "urn:test.identitytest"; + prefix "idtest"; + + organization "opendaylight"; + contact "http://www.opendaylight.org"; + + revision "2014-09-17" { + description "Initial import"; + } + + identity test { + base test; + } +} diff --git a/yang/yang-parser-impl/src/test/resources/identity/import/dummy.yang b/yang/yang-parser-impl/src/test/resources/identity/import/dummy.yang new file mode 100644 index 0000000000..31f7705404 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/identity/import/dummy.yang @@ -0,0 +1,15 @@ +module dummy { + yang-version 1; + namespace "urn:test.dummy"; + prefix "dummy"; + + organization "opendaylight"; + contact "http://www.opendaylight.org"; + + revision "2014-09-24" { + description "Initial import"; + } + + identity prefiximportidentitytest { + } +} diff --git a/yang/yang-parser-impl/src/test/resources/identity/import/prefiximportidentitytest.yang b/yang/yang-parser-impl/src/test/resources/identity/import/prefiximportidentitytest.yang new file mode 100644 index 0000000000..401aab2ce4 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/identity/import/prefiximportidentitytest.yang @@ -0,0 +1,18 @@ +module prefiximportidentitytest { + yang-version 1; + namespace "urn:test.prefiximportidentitytest"; + prefix "prefiximportidentitytest"; + + import dummy { prefix dummy; revision-date 2014-09-24; } + + organization "opendaylight"; + contact "http://www.opendaylight.org"; + + revision "2014-09-24" { + description "Initial import"; + } + + identity prefiximportidentitytest { + base dummy:prefiximportidentitytest; + } +} diff --git a/yang/yang-parser-impl/src/test/resources/identity/prefixidentitytest.yang b/yang/yang-parser-impl/src/test/resources/identity/prefixidentitytest.yang new file mode 100644 index 0000000000..08f0e08f19 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/identity/prefixidentitytest.yang @@ -0,0 +1,16 @@ +module prefixidentitytest { + yang-version 1; + namespace "urn:test.prefixidentitytest"; + prefix prefixtest; + + organization "opendaylight"; + contact "http://www.opendaylight.org"; + + revision "2014-09-24" { + description "Initial import"; + } + + identity prefixtest { + base prefixtest:prefixtest; + } +} -- 2.36.6