bug 1957 StackOverFlowError in YangParserImpl 54/12154/1
authorMartin Ciglan <mciglan@cisco.com>
Thu, 18 Sep 2014 13:24:56 +0000 (15:24 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Wed, 22 Oct 2014 12:24:39 +0000 (14:24 +0200)
StackOverFlowError exception was replaced by YangParseException

Change-Id: I7dd47d671581e07d26da9a12a7db25b7bcdac8a1
Signed-off-by: Martin Ciglan <mciglan@cisco.com>
(cherry picked from commit 6217fa73d6980ab2528f53438b064b9e337905a2)

yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserIdentityTest.java [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/identity/identitytest.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/identity/import/dummy.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/identity/import/prefiximportidentitytest.yang [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/identity/prefixidentitytest.yang [new file with mode: 0644]

index d47ba8c837e341e95ecd0af7dcd4fdad8b93bfe0..9f59cfd19a7b156619e3bf808cdda35237b7afc3 100644 (file)
@@ -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 (file)
index 0000000..7888026
--- /dev/null
@@ -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<Module> modules = TestUtils.loadModules(getClass().getResource(
+                "/identity/import").toURI());
+        Module module = TestUtils.findModule(modules,
+                "prefiximportidentitytest");
+        Set<ModuleImport> 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 (file)
index 0000000..141256f
--- /dev/null
@@ -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 (file)
index 0000000..31f7705
--- /dev/null
@@ -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 (file)
index 0000000..401aab2
--- /dev/null
@@ -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 (file)
index 0000000..08f0e08
--- /dev/null
@@ -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;
+    }
+}