[ONOS-3904] Derived data type and formatting fixes

Change-Id: I1d68899e0056fa0db6322e83f7e9d3ff9b3b1ee0
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/TreeWalkListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/TreeWalkListener.java
index 08b1da7..20e086f 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/TreeWalkListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/TreeWalkListener.java
@@ -16,6 +16,8 @@
 
 package org.onosproject.yangutils.parser.impl;
 
+import java.util.Stack;
+
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.tree.ErrorNode;
 import org.antlr.v4.runtime.tree.TerminalNode;
@@ -57,8 +59,6 @@
 import org.onosproject.yangutils.parser.impl.listeners.ValueListener;
 import org.onosproject.yangutils.parser.impl.listeners.VersionListener;
 
-import java.util.Stack;
-
 /**
  * ANTLR generates a parse-tree listener interface that responds to events
  * triggered by the built-in tree walker. The methods in listener are just
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManager.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManager.java
index 1fcf0b8..b0b5edc 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManager.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManager.java
@@ -16,6 +16,8 @@
 
 package org.onosproject.yangutils.parser.impl;
 
+import java.io.IOException;
+
 import org.antlr.v4.runtime.ANTLRFileStream;
 import org.antlr.v4.runtime.ANTLRInputStream;
 import org.antlr.v4.runtime.CommonTokenStream;
@@ -28,8 +30,6 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.parserutils.ParseTreeErrorListener;
 
-import java.io.IOException;
-
 /**
  * Manages file parsing, parse tree creation and data model tree creation
  * corresponding to an input YANG file.
@@ -42,9 +42,9 @@
     public YangNode getDataModel(String yangFile) throws IOException, ParserException {
 
         /**
-          * Create a char stream that reads from YANG file. Throws an exception
-          * in case input YANG file is either null or non existent.
-          */
+         * Create a char stream that reads from YANG file. Throws an exception
+         * in case input YANG file is either null or non existent.
+         */
         ANTLRInputStream input = null;
         try {
             input = new ANTLRFileStream(yangFile);
@@ -88,9 +88,9 @@
         TreeWalkListener treeWalker = new TreeWalkListener();
 
         /**
-          * Walk parse tree, provide call backs to methods in listener and
-          * build data model tree.
-          */
+         * Walk parse tree, provide call backs to methods in listener and build
+         * data model tree.
+         */
         try {
             walker.walk(treeWalker, tree);
         } catch (ParserException listenerException) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
index d2f90ce..5373232 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
@@ -48,10 +48,13 @@
  */
 
 import org.onosproject.yangutils.datamodel.YangContainer;
+import org.onosproject.yangutils.datamodel.YangDataTypes;
+import org.onosproject.yangutils.datamodel.YangDerivedType;
 import org.onosproject.yangutils.datamodel.YangList;
 import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangSubModule;
+import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.Parsable;
@@ -111,8 +114,16 @@
             throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY));
         }
 
+        /*
+         * Create a derived type information, the base type must be set in type
+         * listener.
+         */
+        YangType<YangDerivedType> derivedType = new YangType<YangDerivedType>();
+        derivedType.setDataType(YangDataTypes.DERIVED);
+        derivedType.setDataTypeName(ctx.IDENTIFIER().getText());
+
         YangTypeDef typeDefNode = new YangTypeDef();
-        typeDefNode.setDerivedName(ctx.IDENTIFIER().getText());
+        typeDefNode.setDerivedType(derivedType);
 
         Parsable curData = listener.getParsedDataStack().peek();
 
@@ -149,6 +160,14 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPEDEF_DATA, ctx.IDENTIFIER().getText(), EXIT);
 
         if (listener.getParsedDataStack().peek() instanceof YangTypeDef) {
+            YangTypeDef typeDefNode = (YangTypeDef) listener.getParsedDataStack().peek();
+            try {
+                typeDefNode.validateDataOnExit();
+            } catch (DataModelException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+
             listener.getParsedDataStack().pop();
         } else {
             throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, TYPEDEF_DATA,
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
index de595f5..891a982 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
@@ -17,14 +17,17 @@
 package org.onosproject.yangutils.parser.impl.listeners;
 
 import org.onosproject.yangutils.datamodel.YangDataTypes;
+import org.onosproject.yangutils.datamodel.YangDerivedType;
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.parser.Parsable;
-import static org.onosproject.yangutils.parser.ParsableDataType.TYPE_DATA;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yangutils.parser.ParsableDataType.TYPE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
@@ -72,8 +75,9 @@
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPE_DATA, ctx.string().getText(), ENTRY);
 
-        YangType type = new YangType();
         YangDataTypes yangDataTypes = YangDataTypes.getType(ctx.string().getText());
+        YangType<?> type = new YangType();
+
         type.setDataTypeName(ctx.string().getText());
         type.setDataType(yangDataTypes);
 
@@ -112,8 +116,32 @@
                 YangLeafList leafList = (YangLeafList) tmpData;
                 leafList.setDataType((YangType) type);
                 break;
-            case TYPEDEF_DATA: //TODO
+            case TYPEDEF_DATA:
+
+                /* Prepare the base type info and set in derived type */
+                YangTypeDef typeDef = (YangTypeDef) tmpData;
+                YangType<YangDerivedType> derivedType = typeDef.getDerivedType();
+                if (derivedType == null) {
+                    //TODO: set the error info correctly, to depict missing info
+                    throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA,
+                            ctx.string().getText(), ENTRY));
+                }
+
+                YangDerivedType derivedTypeInfo = new YangDerivedType();
+                if (((YangType) type).getDataType() != YangDataTypes.DERIVED) {
+                    derivedTypeInfo.setEffectiveYangBuiltInType(((YangType) type).getDataType());
+                } else {
+                    /*
+                     * It will be resolved in the validate data model at exit.
+                     * Nothing needs to be done.
+                     */
+                }
+                derivedTypeInfo.setBaseType((YangType) type);
+                derivedType.setDataTypeExtendedInfo(derivedTypeInfo);
+
                 break;
+            //TODO: union, deviate replacement statement.case TYPEDEF_DATA: //TODO
+
             default:
                 throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA,
                         ctx.string().getText(), EXIT));
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerErrorLocation.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerErrorLocation.java
index b989407..4c3efd6 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerErrorLocation.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerErrorLocation.java
@@ -39,12 +39,12 @@
     public static String getErrorLocationMessage(ListenerErrorLocation errorLocation) {
 
         switch (errorLocation) {
-        case ENTRY:
-            return "before";
-        case EXIT:
-            return "after";
-        default:
-            return "during";
+            case ENTRY:
+                return "before";
+            case EXIT:
+                return "after";
+            default:
+                return "during";
         }
     }
 }
\ No newline at end of file
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ParseTreeErrorListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ParseTreeErrorListener.java
index a507e3a..71f99fe 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ParseTreeErrorListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ParseTreeErrorListener.java
@@ -24,14 +24,13 @@
 /**
  * By default, ANTLR sends all errors to standard error, this is changed by
  * providing this new implementation of interface ANTLRErrorListener. The
- * interface has a syntaxError() method that applies to both lexer and
- * parser.
+ * interface has a syntaxError() method that applies to both lexer and parser.
  */
 public class ParseTreeErrorListener extends BaseErrorListener {
 
     @Override
     public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine,
-                            String msg, RecognitionException e) {
+            String msg, RecognitionException e) {
 
         ParserException parserException = new ParserException(msg);
         parserException.setLine(line);