[ONOS-3904] Derived data type and formatting fixes
Change-Id: I1d68899e0056fa0db6322e83f7e9d3ff9b3b1ee0
diff --git a/src/main/java/org/onosproject/yangutils/parser/ParsableDataType.java b/src/main/java/org/onosproject/yangutils/parser/ParsableDataType.java
index 0e2366b..9d2cfb0 100644
--- a/src/main/java/org/onosproject/yangutils/parser/ParsableDataType.java
+++ b/src/main/java/org/onosproject/yangutils/parser/ParsableDataType.java
@@ -222,7 +222,12 @@
/**
* Identifies the YANG organization parsed data.
*/
- ORGANIZATION_DATA;
+ ORGANIZATION_DATA,
+
+ /**
+ * Identifies the derived data type.
+ */
+ DERIVED;
/**
* Returns the YANG construct keyword corresponding to enum values.
@@ -315,6 +320,8 @@
return "value";
case DEFAULT_DATA:
return "default";
+ case DERIVED:
+ return "derived";
default:
return "yang";
}
diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/TreeWalkListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/TreeWalkListener.java
index 08b1da7..20e086f 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/TreeWalkListener.java
+++ b/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/src/main/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManager.java b/src/main/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManager.java
index 1fcf0b8..b0b5edc 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManager.java
+++ b/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/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
index d2f90ce..5373232 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
+++ b/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/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
index de595f5..891a982 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
+++ b/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/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerErrorLocation.java b/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerErrorLocation.java
index b989407..4c3efd6 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerErrorLocation.java
+++ b/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/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ParseTreeErrorListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ParseTreeErrorListener.java
index a507e3a..71f99fe 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ParseTreeErrorListener.java
+++ b/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);