Refactored YANG types resolving.
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / yang / model / parser / impl / YangModelParserListenerImpl.java
index 6ff69eee516986dce0b02b26c9ef56c43c65f566..6d51868d98be3e025976c2f46366a1a882a8d5c4 100644 (file)
@@ -13,15 +13,14 @@ import java.net.URI;
 import java.text.DateFormat;\r
 import java.text.ParseException;\r
 import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
 import java.util.Collections;\r
 import java.util.Date;\r
 import java.util.List;\r
 import java.util.Stack;\r
-import java.util.TreeMap;\r
 \r
 import org.antlr.v4.runtime.tree.ParseTree;\r
 import org.opendaylight.controller.antlrv4.code.gen.YangParser;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Argument_stmtContext;\r
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Base_stmtContext;\r
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Contact_stmtContext;\r
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Container_stmtContext;\r
@@ -47,7 +46,6 @@ import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_stmtCont
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_stmtsContext;\r
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Status_stmtContext;\r
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Type_body_stmtsContext;\r
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Union_specificationContext;\r
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Yang_version_stmtContext;\r
 import org.opendaylight.controller.antlrv4.code.gen.YangParserBaseListener;\r
 import org.opendaylight.controller.yang.common.QName;\r
@@ -88,7 +86,6 @@ final class YangModelParserListenerImpl extends YangParserBaseListener {
             "yyyy-mm-dd");\r
     private final Stack<String> actualPath = new Stack<String>();\r
 \r
-\r
     @Override\r
     public void enterModule_stmt(YangParser.Module_stmtContext ctx) {\r
         moduleName = stringFromNode(ctx);\r
@@ -123,7 +120,7 @@ final class YangModelParserListenerImpl extends YangParserBaseListener {
     @Override\r
     public void enterModule_header_stmts(final Module_header_stmtsContext ctx) {\r
         super.enterModule_header_stmts(ctx);\r
-        \r
+\r
         String yangVersion = null;\r
         for (int i = 0; i < ctx.getChildCount(); ++i) {\r
             final ParseTree treeNode = ctx.getChild(i);\r
@@ -138,7 +135,7 @@ final class YangModelParserListenerImpl extends YangParserBaseListener {
                 yangVersion = stringFromNode(treeNode);\r
             }\r
         }\r
-        \r
+\r
         if (yangVersion == null) {\r
             yangVersion = "1";\r
         }\r
@@ -204,7 +201,7 @@ final class YangModelParserListenerImpl extends YangParserBaseListener {
             logger.warn(message);\r
         }\r
     }\r
-    \r
+\r
     @Override\r
     public void enterImport_stmt(Import_stmtContext ctx) {\r
         super.enterImport_stmt(ctx);\r
@@ -260,10 +257,23 @@ final class YangModelParserListenerImpl extends YangParserBaseListener {
 \r
     @Override\r
     public void enterExtension_stmt(YangParser.Extension_stmtContext ctx) {\r
-        String argument = stringFromNode(ctx);\r
-        QName qname = new QName(namespace, revision, yangModelPrefix, argument);\r
+        String extName = stringFromNode(ctx);\r
+        QName qname = new QName(namespace, revision, yangModelPrefix, extName);\r
         ExtensionBuilder builder = moduleBuilder.addExtension(qname);\r
         parseSchemaNodeArgs(ctx, builder);\r
+\r
+        String argument = null;\r
+        boolean yin = false;\r
+        for (int i = 0; i < ctx.getChildCount(); i++) {\r
+            ParseTree child = ctx.getChild(i);\r
+            if (child instanceof Argument_stmtContext) {\r
+                argument = stringFromNode(child);\r
+                yin = parseYinValue((Argument_stmtContext) child);\r
+                break;\r
+            }\r
+        }\r
+        builder.setArgument(argument);\r
+        builder.setYinElement(yin);\r
     }\r
 \r
     @Override\r
@@ -290,20 +300,7 @@ final class YangModelParserListenerImpl extends YangParserBaseListener {
     @Override\r
     public void enterType_stmt(YangParser.Type_stmtContext ctx) {\r
         String typeName = stringFromNode(ctx);\r
-        QName typeQName;\r
-        if (typeName.contains(":")) {\r
-            String[] splittedName = typeName.split(":");\r
-            String prefix = splittedName[0];\r
-            String name = splittedName[1];\r
-            if (prefix.equals(yangModelPrefix)) {\r
-                typeQName = new QName(namespace, revision, prefix, name);\r
-            } else {\r
-                typeQName = new QName(null, null, prefix, name);\r
-            }\r
-        } else {\r
-            typeQName = new QName(namespace, revision, yangModelPrefix,\r
-                    typeName);\r
-        }\r
+        QName typeQName = parseQName(typeName);\r
 \r
         TypeDefinition<?> type = null;\r
         Type_body_stmtsContext typeBody = null;\r
@@ -315,38 +312,46 @@ final class YangModelParserListenerImpl extends YangParserBaseListener {
         }\r
 \r
         // if this is base yang type...\r
-        if(YangTypesConverter.isBaseYangType(typeName)) {\r
+        if (YangTypesConverter.isBaseYangType(typeName)) {\r
             if (typeBody == null) {\r
                 // if there are no constraints, just grab default base yang type\r
                 type = YangTypesConverter.javaTypeForBaseYangType(typeName);\r
-                moduleBuilder.setType(type, actualPath);\r
+                moduleBuilder.setType(type, getActualPath());\r
             } else {\r
-                if(typeName.equals("union")) {\r
-                    List<String> types = new ArrayList<String>();\r
-                    for(int i = 0; i < typeBody.getChildCount(); i++) {\r
-                        ParseTree unionSpec = typeBody.getChild(i);\r
-                        if(unionSpec instanceof Union_specificationContext) {\r
-                            for(int j = 0; j < unionSpec.getChildCount(); j++) {\r
-                                ParseTree typeSpec = unionSpec.getChild(j);\r
-                                types.add(stringFromNode(typeSpec));\r
-                            }\r
-                        }\r
-                    }\r
-                    moduleBuilder.addUnionType(actualPath);\r
+                if ("union".equals(typeName)) {\r
+                    moduleBuilder.addUnionType(getActualPath());\r
                 } else {\r
-                    type = parseTypeBody(typeName, typeBody, actualPath, namespace, revision, yangModelPrefix);\r
-                    moduleBuilder.setType(type, actualPath);\r
+                    type = parseTypeBody(typeName, typeBody, getActualPath(),\r
+                            namespace, revision, yangModelPrefix);\r
+                    moduleBuilder.setType(type, getActualPath());\r
                 }\r
             }\r
         } else {\r
             type = parseUnknownTypeBody(typeQName, typeBody);\r
             // mark parent node of this type statement as dirty\r
-            moduleBuilder.addDirtyNode(actualPath);\r
-            moduleBuilder.setType(type, actualPath);\r
+            moduleBuilder.addDirtyNode(getActualPath());\r
+            moduleBuilder.setType(type, getActualPath());\r
         }\r
 \r
         updatePath(typeName);\r
+    }\r
 \r
+    private QName parseQName(String typeName) {\r
+        QName typeQName;\r
+        if (typeName.contains(":")) {\r
+            String[] splittedName = typeName.split(":");\r
+            String prefix = splittedName[0];\r
+            String name = splittedName[1];\r
+            if (prefix.equals(yangModelPrefix)) {\r
+                typeQName = new QName(namespace, revision, prefix, name);\r
+            } else {\r
+                typeQName = new QName(null, null, prefix, name);\r
+            }\r
+        } else {\r
+            typeQName = new QName(namespace, revision, yangModelPrefix,\r
+                    typeName);\r
+        }\r
+        return typeQName;\r
     }\r
 \r
     @Override\r