Vinod Kumar S
Committed by Gerrit Code Review

[ONOS-3904] Derived data type and formatting fixes

Change-Id: I1d68899e0056fa0db6322e83f7e9d3ff9b3b1ee0
Showing 19 changed files with 441 additions and 133 deletions
......@@ -215,7 +215,7 @@ public enum YangDataTypes {
INSTANCE_IDENTIFIER,
/**
* Derived Data type.
* Derived data type.
*/
DERIVED;
......
/*Copyright 2016.year Open Networking Laboratory
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*/
package org.onosproject.yangutils.datamodel;
import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
import org.onosproject.yangutils.parser.Parsable;
import org.onosproject.yangutils.parser.ParsableDataType;
/*-
* The typedef Statement
*
* The "typedef" statement defines a new type that may be used locally
* in the module, in modules or submodules which include it, and by
* other modules that import from it. The new type is called the
* "derived type", and the type from which it was derived is called
* the "base type". All derived types can be traced back to a YANG
* built-in type.
*
* The "typedef" statement's argument is an identifier that is the name
* of the type to be defined, and MUST be followed by a block of
* sub-statements that holds detailed typedef information.
*
* The name of the type MUST NOT be one of the YANG built-in types. If
* the typedef is defined at the top level of a YANG module or
* submodule, the name of the type to be defined MUST be unique within
* the module.
*/
/**
* Derived type information.
*/
public class YangDerivedType implements Parsable {
/**
* All derived types can be traced back to a YANG built-in type.
*/
private YangDataTypes effectiveYangBuiltInType;
/**
* Base type from which the current type is derived.
*/
private YangType<?> baseType;
/**
* Default constructor.
*/
public YangDerivedType() {
}
/**
* Get the effective YANG built-in type of the derived data type.
*
* @return effective YANG built-in type of the derived data type.
*/
public YangDataTypes getEffectiveYangBuiltInType() {
return effectiveYangBuiltInType;
}
/**
* Set the effective YANG built-in type of the derived data type.
*
* @param builtInType effective YANG built-in type of the derived data type.
*/
public void setEffectiveYangBuiltInType(YangDataTypes builtInType) {
effectiveYangBuiltInType = builtInType;
}
/**
* Get the base type information.
*
* @return base type information.
*/
public YangType<?> getBaseType() {
return baseType;
}
/**
* Get the base type information.
*
* @param baseType base type information.
*/
public void setBaseType(YangType<?> baseType) {
this.baseType = baseType;
}
/**
* Get the parsable type.
*/
@Override
public ParsableDataType getParsableDataType() {
return ParsableDataType.DERIVED;
}
/**
* TODO.
*/
@Override
public void validateDataOnEntry() throws DataModelException {
// TODO Auto-generated method stub
}
/**
* TODO.
*/
@Override
public void validateDataOnExit() throws DataModelException {
// TODO Auto-generated method stub
}
}
......@@ -16,13 +16,13 @@
package org.onosproject.yangutils.datamodel;
import java.util.HashSet;
import java.util.Set;
import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
import org.onosproject.yangutils.parser.Parsable;
import org.onosproject.yangutils.parser.ParsableDataType;
import java.util.HashSet;
import java.util.Set;
/*
* The enumeration built-in type represents values from a set of
* assigned names.
......
......@@ -438,7 +438,7 @@ public class YangList extends YangNode
*/
@Override
public void validateDataOnExit() throws DataModelException {
List<String> keyList = getKeyList();
List<String> keys = getKeyList();
List<YangLeaf> leaves = getListOfLeaf();
List<YangLeafList> leafLists = getListOfLeafList();
......@@ -447,29 +447,32 @@ public class YangList extends YangNode
/* A list must have atleast one key leaf if config is true */
if ((isConfig)
&& ((keyList == null) || (leaves == null && leafLists == null))) {
throw new DataModelException("A list must have atleast one key leaf if config is true;");
} else if (keyList != null) {
&& ((keys == null) || ((leaves == null) && (leafLists == null)))) {
throw new DataModelException("A list must have atleast one key leaf if config is true;");
} else if (keys != null) {
if (leaves != null) {
validateLeafKey(leaves, keyList);
validateLeafKey(leaves, keys);
}
if (leafLists != null) {
validateLeafListKey(leafLists, keyList);
validateLeafListKey(leafLists, keys);
}
}
}
/**
* Sets the config's value to all leaf if leaf's config statement is not specified.
* Sets the config's value to all leaf if leaf's config statement is not
* specified.
*
* @param leaves list of leaf attributes of YANG list.
* @param leafLists list of leaf-list attributes of YANG list.
*/
private void setDefaultConfigValueToChild(List<YangLeaf> leaves, List<YangLeafList> leafLists) {
/* If "config" is not specified, the default is the same as the parent
schema node's "config" value.*/
/*
* If "config" is not specified, the default is the same as the parent
* schema node's "config" value.
*/
if (leaves != null) {
for (YangLeaf leaf : leaves) {
if (leaf.isConfig() == null) {
......@@ -478,8 +481,10 @@ public class YangList extends YangNode
}
}
/* If "config" is not specified, the default is the same as the parent
schema node's "config" value.*/
/*
* If "config" is not specified, the default is the same as the parent
* schema node's "config" value.
*/
if (leafLists != null) {
for (YangLeafList leafList : leafLists) {
if (leafList.isConfig() == null) {
......@@ -498,8 +503,10 @@ public class YangList extends YangNode
*/
private void validateConfig(List<YangLeaf> leaves, List<YangLeafList> leafLists) throws DataModelException {
/* If a node has "config" set to "false", no node underneath it can have
"config" set to "true".*/
/*
* If a node has "config" set to "false", no node underneath it can have
* "config" set to "true".
*/
if ((!isConfig) && (leaves != null)) {
for (YangLeaf leaf : leaves) {
if (leaf.isConfig()) {
......@@ -523,19 +530,21 @@ public class YangList extends YangNode
* Validates key statement of list.
*
* @param leaves list of leaf attributes of list.
* @param keyList list of key attributes of list.
* @param keys list of key attributes of list.
* @throws DataModelException a violation of data model rules.
*/
private void validateLeafKey(List<YangLeaf> leaves, List<String> keyList) throws DataModelException {
private void validateLeafKey(List<YangLeaf> leaves, List<String> keys) throws DataModelException {
boolean leafFound = false;
List<YangLeaf> keyLeaves = new LinkedList<>();
/* 1. Leaf identifier must refer to a child leaf of the list
2. A leaf that is part of the key must not be the built-in type "empty". */
for (String key : keyList) {
/*
* 1. Leaf identifier must refer to a child leaf of the list 2. A leaf
* that is part of the key must not be the built-in type "empty".
*/
for (String key : keys) {
for (YangLeaf leaf : leaves) {
if (key.equals(leaf.getLeafName())) {
if (leaf.getDataType().getDataTypeName().replace("\"", "").equals("empty")) {
if (leaf.getDataType().getDataType() == YangDataTypes.EMPTY) {
throw new DataModelException(" A leaf that is part of the key must not be the built-in " +
"type \"empty\".");
}
......@@ -550,8 +559,10 @@ public class YangList extends YangNode
leafFound = false;
}
/* All key leafs in a list MUST have the same value for their "config"
as the list itself. */
/*
* All key leafs in a list MUST have the same value for their "config"
* as the list itself.
*/
for (YangLeaf keyLeaf : keyLeaves) {
if (isConfig != keyLeaf.isConfig()) {
throw new DataModelException("All key leafs in a list must have the same value for their" +
......@@ -564,19 +575,21 @@ public class YangList extends YangNode
* Validates key statement of list.
*
* @param leafLists list of leaf-list attributes of list.
* @param keyList list of key attributes of list.
* @param keys list of key attributes of list.
* @throws DataModelException a violation of data model rules.
*/
private void validateLeafListKey(List<YangLeafList> leafLists, List<String> keyList) throws DataModelException {
private void validateLeafListKey(List<YangLeafList> leafLists, List<String> keys) throws DataModelException {
boolean leafFound = false;
List<YangLeafList> keyLeafLists = new LinkedList<>();
/* 1. Leaf identifier must refer to a child leaf of the list
2. A leaf that is part of the key must not be the built-in type "empty". */
for (String key : keyList) {
/*
* 1. Leaf identifier must refer to a child leaf of the list 2. A leaf
* that is part of the key must not be the built-in type "empty".
*/
for (String key : keys) {
for (YangLeafList leafList : leafLists) {
if (key.equals(leafList.getLeafName())) {
if (leafList.getDataType().getDataTypeName().replace("\"", "").equals("empty")) {
if (leafList.getDataType().getDataType() == YangDataTypes.EMPTY) {
throw new DataModelException(" A leaf-list that is part of the key must not be the built-in " +
"type \"empty\".");
}
......@@ -591,8 +604,10 @@ public class YangList extends YangNode
leafFound = false;
}
/* All key leafs in a list MUST have the same value for their "config"
as the list itself. */
/*
* All key leafs in a list MUST have the same value for their "config"
* as the list itself.
*/
for (YangLeafList keyLeafList : keyLeafLists) {
if (isConfig() != keyLeafList.isConfig()) {
throw new DataModelException("All key leaf-lists in a list must have the same value for their" +
......@@ -601,8 +616,9 @@ public class YangList extends YangNode
}
}
/* (non-Javadoc)
* @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeEntry()
/**
* Populate the cached handle with information about the list attributes to
* generate java code.
*/
@Override
public void generateJavaCodeEntry() {
......
......@@ -166,6 +166,43 @@ public class YangModule extends YangNode
*/
private CachedFileHandle fileHandle;
/*-
* Nested typedefs and groupings.
* Typedefs and groupings may appear nested under many YANG statements,
* allowing these to be lexically scoped by the hierarchy under which
* they appear. This allows types and groupings to be defined near
* where they are used, rather than placing them at the top level of the
* hierarchy. The close proximity increases readability.
*
* Scoping also allows types to be defined without concern for naming
* conflicts between types in different submodules. Type names can be
* specified without adding leading strings designed to prevent name
* collisions within large modules.
*
* Finally, scoping allows the module author to keep types and groupings
* private to their module or submodule, preventing their reuse. Since
* only top-level types and groupings (i.e., those appearing as
* sub-statements to a module or submodule statement) can be used outside
* the module or submodule, the developer has more control over what
* pieces of their module are presented to the outside world, supporting
* the need to hide internal information and maintaining a boundary
* between what is shared with the outside world and what is kept
* private.
*
* Scoped definitions MUST NOT shadow definitions at a higher scope. A
* type or grouping cannot be defined if a higher level in the schema
* hierarchy has a definition with a matching identifier.
*
* A reference to an unprefixed type or grouping, or one which uses the
* prefix of the current module, is resolved by locating the closest
* matching "typedef" or "grouping" statement among the immediate
* sub-statements of each ancestor statement.
*/
/**
* List of nodes which require nested reference resolution.
*/
private List<YangNode> nestedReferenceResoulutionList;
/**
* Create a YANG node of module type.
*/
......@@ -173,16 +210,20 @@ public class YangModule extends YangNode
super(YangNodeType.MODULE_NODE);
}
/* (non-Javadoc)
* @see org.onosproject.yangutils.datamodel.YangNode#getName()
/**
* Get name of the module.
*
* @return module name.
*/
@Override
public String getName() {
return name;
}
/* (non-Javadoc)
* @see org.onosproject.yangutils.datamodel.YangNode#setName(java.lang.String)
/**
* Set module name.
*
* @param moduleName module name.
*/
@Override
public void setName(String moduleName) {
......@@ -511,6 +552,37 @@ public class YangModule extends YangNode
}
/**
* Get the list of nested reference's which required resolution.
*
* @return list of nested reference's which required resolution.
*/
public List<YangNode> getNestedReferenceResoulutionList() {
return nestedReferenceResoulutionList;
}
/**
* Set list of nested reference's which requires resolution.
*
* @param nestedReferenceResoulutionList list of nested reference's which
* requires resolution.
*/
private void setNestedReferenceResoulutionList(List<YangNode> nestedReferenceResoulutionList) {
this.nestedReferenceResoulutionList = nestedReferenceResoulutionList;
}
/**
* Set list of nested reference's which requires resolution.
*
* @param nestedReference nested reference which requires resolution.
*/
public void addToNestedReferenceResoulutionList(YangNode nestedReference) {
if (getNestedReferenceResoulutionList() == null) {
setNestedReferenceResoulutionList(new LinkedList<YangNode>());
}
getNestedReferenceResoulutionList().add(nestedReference);
}
/**
* Returns the type of the parsed data.
*
* @return returns MODULE_DATA.
......@@ -601,4 +673,28 @@ public class YangModule extends YangNode
}
}
/**
* Add a type to resolve the nested references.
*
* @param node grouping or typedef node which needs to be resolved.
* @throws DataModelException data model exception.
*/
public static void addToResolveList(YangNode node) throws DataModelException {
/* get the module node to add maintain the list of nested reference */
YangModule module;
YangNode curNode = node;
while (curNode.getNodeType() != YangNodeType.MODULE_NODE) {
curNode = curNode.getParent();
if (curNode == null) {
break;
}
}
if (curNode == null) {
throw new DataModelException("Datamodel tree is not correct");
}
module = (YangModule) curNode;
module.addToNestedReferenceResoulutionList(node);
return;
}
}
......
......@@ -13,6 +13,7 @@ See the License for the specific language governing permissions and
limitations under the License.*/
package org.onosproject.yangutils.datamodel;
import java.util.LinkedList;
import java.util.List;
/*-
......@@ -51,7 +52,7 @@ public class YangPatternRestriction {
/**
* Pattern restriction defined for the current type.
*/
private List<String> pattern;
private List<String> patternList;
/**
* Effective pattern restriction that needs inherited from base type.
......@@ -62,6 +63,7 @@ public class YangPatternRestriction {
* Default constructor.
*/
public YangPatternRestriction() {
setPatternList(new LinkedList<String>());
}
/**
......@@ -69,8 +71,8 @@ public class YangPatternRestriction {
*
* @return pattern restriction defined for the current type.
*/
public List<String> getPattern() {
return pattern;
public List<String> getPatternList() {
return patternList;
}
/**
......@@ -78,8 +80,17 @@ public class YangPatternRestriction {
*
* @param pattern pattern restriction defined for the current type..
*/
public void setPattern(List<String> pattern) {
this.pattern = pattern;
private void setPatternList(List<String> pattern) {
patternList = pattern;
}
/**
* Add a new pattern to the list of pattern restriction.
*
* @param newPattern pattern restriction.
*/
public void addPattern(String newPattern) {
getPatternList().add(newPattern);
}
/**
......
......@@ -143,7 +143,7 @@ public class YangRangeRestriction<T extends Comparable<T>> implements YangDesc,
* @param newInterval restricted length interval.
* @throws DataModelException data model exception for range restriction.
*/
public void addLenghtRestrictionInterval(YangRangeInterval<T> newInterval) throws DataModelException {
public void addRangeRestrictionInterval(YangRangeInterval<T> newInterval) throws DataModelException {
checkNotNull(newInterval);
checkNotNull(newInterval.getStartValue());
......
......@@ -109,7 +109,19 @@ public class YangStringRestriction {
*
* @param patternRestriction pattern restriction for the type.
*/
public void setPatternRestriction(YangPatternRestriction patternRestriction) {
private void setPatternRestriction(YangPatternRestriction patternRestriction) {
this.patternRestriction = patternRestriction;
}
/**
* Add a new pattern restriction for the type.
*
* @param newPattern new pattern restriction for the type.
*/
public void addPattern(String newPattern) {
if (getPatternRestriction() == null) {
setPatternRestriction(new YangPatternRestriction());
}
getPatternRestriction().addPattern(newPattern);
}
}
......
......@@ -54,10 +54,6 @@ import org.onosproject.yangutils.translator.CachedFileHandle;
*/
public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
/**
* Name of derived data type.
*/
private String derivedName;
/**
* Default value in string, needs to be converted to the target object,
......@@ -81,14 +77,9 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
private YangStatusType status;
/**
* Derived data type. The type will be set when the parser detects the type
* parsing. Hence it is of raw type and it not know at the time of creation
* of the object. i.e. in entry parse, it will not be know, in the exit
* parse we may know the type implicitly based on the restriction. We must
* know and validate the base built in type, by the linking phase. It is a
* RAW type and it usage needs to be validate in linking phase.
* Maintain the derived type information.
*/
private YangType<?> derivedType;
private YangType<YangDerivedType> derivedType;
/**
* Units of the data type.
......@@ -96,11 +87,6 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
private String units;
/**
* YANG base built in data type.
*/
private YangDataTypes baseBuiltInType;
/**
* package of the generated java code.
*/
private String pkg;
......@@ -112,23 +98,7 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
super(YangNodeType.TYPEDEF_NODE);
}
/**
* Get the data type name.
*
* @return the data type name.
*/
public String getDerivedName() {
return derivedName;
}
/**
* Set the data type name.
*
* @param derrivedName data type name.
*/
public void setDerivedName(String derrivedName) {
derivedName = derrivedName;
}
/**
* Get the default value.
......@@ -209,20 +179,20 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
}
/**
* Get the referenced type.
* Get the derived type.
*
* @return the referenced type.
* @return the derived type.
*/
public YangType<?> getDerivedType() {
public YangType<YangDerivedType> getDerivedType() {
return derivedType;
}
/**
* Get the referenced type.
* Set the derived type.
*
* @param derivedType the referenced type.
* @param derivedType the derived type.
*/
public void setDerivedType(YangType<?> derivedType) {
public void setDerivedType(YangType<YangDerivedType> derivedType) {
this.derivedType = derivedType;
}
......@@ -245,24 +215,6 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
}
/**
* Get the base built in YANG data type.
*
* @return base built in YANG data type.
*/
public YangDataTypes getBaseBuiltInType() {
return baseBuiltInType;
}
/**
* Set the base built in YANG data type.
*
* @param baseBuiltInType base built in YANG data type.
*/
public void setBaseBuiltInType(YangDataTypes baseBuiltInType) {
this.baseBuiltInType = baseBuiltInType;
}
/**
* Returns the type of the data.
*
* @return returns TYPEDEF_DATA
......@@ -289,7 +241,34 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
*/
@Override
public void validateDataOnExit() throws DataModelException {
// TODO auto-generated method stub, to be implemented by parser
YangType<YangDerivedType> type = getDerivedType();
if (type == null) {
throw new DataModelException("Typedef does not have type info.");
}
if ((type.getDataType() != YangDataTypes.DERIVED)
|| (type.getDataTypeName() == null)) {
throw new DataModelException("Typedef type is not derived.");
}
YangDerivedType derivedTypeInfo = type.getDataTypeExtendedInfo();
if (derivedTypeInfo == null) {
throw new DataModelException("derrived type does not have derived info.");
}
YangType<?> baseType = derivedTypeInfo.getBaseType();
if (baseType == null) {
throw new DataModelException("Base type of a derived type is missing.");
}
if (derivedTypeInfo.getEffectiveYangBuiltInType() == null) {
/* resolve the effective type from the data tree. */
/*
* TODO: try to resolve the nested reference, if possible in the
* partial tree, otherwise we need to resolve finally when the
* complete module is created.
*/
YangModule.addToResolveList(this);
}
}
/**
......@@ -299,7 +278,10 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
*/
@Override
public String getName() {
return derivedName;
if (getDerivedType() != null) {
return getDerivedType().getDataTypeName();
}
return null;
}
/**
......@@ -309,8 +291,12 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
*/
@Override
public void setName(String name) {
// TODO Auto-generated method stub
if (getDerivedType() == null) {
throw new RuntimeException(
"Derrived Type info needs to be set in parser when the typedef listner is processed");
}
getDerivedType().setDataTypeName(name);
getDerivedType().setDataType(YangDataTypes.DERIVED);
}
/**
......
......@@ -222,7 +222,12 @@ public enum ParsableDataType {
/**
* 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 @@ public enum ParsableDataType {
return "value";
case DEFAULT_DATA:
return "default";
case DERIVED:
return "derived";
default:
return "yang";
}
......
......@@ -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.UnitsListener;
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
......
......@@ -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.antlrgencode.GeneratedYangParser;
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 class YangUtilsParserManager implements YangUtilsParser {
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 @@ public class YangUtilsParserManager implements YangUtilsParser {
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) {
......
......@@ -48,10 +48,13 @@ package org.onosproject.yangutils.parser.impl.listeners;
*/
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 @@ public final class TypeDefListener {
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 @@ public final class TypeDefListener {
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,
......
......@@ -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 @@ public final class TypeListener {
// 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 @@ public final class TypeListener {
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));
......
......@@ -39,12 +39,12 @@ public enum ListenerErrorLocation {
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
......
......@@ -24,14 +24,13 @@ import org.onosproject.yangutils.parser.exceptions.ParserException;
/**
* 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);
......
......@@ -53,11 +53,10 @@ public final class JavaCodeGenerator {
curTraversal = TraversalType.SIBILING;
curNode = curNode.getNextSibling();
} else {
curTraversal = TraversalType.PARENT;
curNode.generateJavaCodeExit();
curTraversal = TraversalType.PARENT;
curNode = curNode.getParent();
}
}
}
}
......
......@@ -16,6 +16,9 @@
package org.onosproject.yangutils.translator.tojava.utils;
import java.util.List;
import java.util.SortedSet;
import org.onosproject.yangutils.datamodel.YangType;
import org.onosproject.yangutils.translator.GeneratedFileType;
import org.onosproject.yangutils.translator.tojava.GeneratedMethodTypes;
......@@ -47,6 +50,17 @@ public final class JavaCodeSnippetGen {
}
/**
* reorder the import list based on the ONOS import rules.
*
* @param importInfo the set of classes/interfaces to be imported.
* @return string of import info.
*/
public List<ImportInfo> sortImportOrder(SortedSet<ImportInfo> importInfo) {
/* TODO: reorder the import list based on the ONOS import rules. */
return null;
}
/**
* Get the textual java code information corresponding to the import list.
*
* @param importInfo import info.
......
......@@ -109,7 +109,6 @@ public final class MethodsGenerator {
* @param returnType return type of method
* @return constructed method impl
*/
@SuppressWarnings("rawtypes")
public static String constructMethodInfo(GeneratedFileType genFileTypes, String yangName,
GeneratedMethodTypes methodTypes, YangType<?> returnType) {
......