YANG string restriction listener + YANG Range restriction listener review comment fix
Change-Id: I9e7af9c67f8fbf918d4e0d8ff147a560889ff264
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 d315d9b..51f3928 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/TreeWalkListener.java
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/TreeWalkListener.java
@@ -46,6 +46,7 @@
import org.onosproject.yangutils.parser.impl.listeners.KeyListener;
import org.onosproject.yangutils.parser.impl.listeners.LeafListListener;
import org.onosproject.yangutils.parser.impl.listeners.LeafListener;
+import org.onosproject.yangutils.parser.impl.listeners.LengthRestrictionListener;
import org.onosproject.yangutils.parser.impl.listeners.ListListener;
import org.onosproject.yangutils.parser.impl.listeners.MandatoryListener;
import org.onosproject.yangutils.parser.impl.listeners.MaxElementsListener;
@@ -55,6 +56,7 @@
import org.onosproject.yangutils.parser.impl.listeners.NamespaceListener;
import org.onosproject.yangutils.parser.impl.listeners.OrganizationListener;
import org.onosproject.yangutils.parser.impl.listeners.OutputListener;
+import org.onosproject.yangutils.parser.impl.listeners.PatternRestrictionListener;
import org.onosproject.yangutils.parser.impl.listeners.PositionListener;
import org.onosproject.yangutils.parser.impl.listeners.PrefixListener;
import org.onosproject.yangutils.parser.impl.listeners.PresenceListener;
@@ -586,7 +588,7 @@
@Override
public void enterLengthStatement(GeneratedYangParser.LengthStatementContext ctx) {
- // TODO: implement the method.
+ LengthRestrictionListener.processLengthRestrictionEntry(this, ctx);
}
@Override
@@ -596,7 +598,7 @@
@Override
public void enterPatternStatement(GeneratedYangParser.PatternStatementContext ctx) {
- // TODO: implement the method.
+ PatternRestrictionListener.processPatternRestrictionEntry(this, ctx);
}
@Override
diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LengthRestrictionListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LengthRestrictionListener.java
new file mode 100644
index 0000000..51a29d5
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LengthRestrictionListener.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2016 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.parser.impl.listeners;
+
+import java.util.regex.Pattern;
+
+import org.onosproject.yangutils.datamodel.YangRangeRestriction;
+import org.onosproject.yangutils.datamodel.YangRangeInterval;
+import org.onosproject.yangutils.datamodel.YangStringRestriction;
+import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.YangDataTypes;
+import org.onosproject.yangutils.datamodel.YangDerivedInfo;
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.parser.Parsable;
+import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yangutils.parser.exceptions.ParserException;
+import org.onosproject.yangutils.parser.impl.TreeWalkListener;
+import org.onosproject.yangutils.utils.YangConstructType;
+import org.onosproject.yangutils.utils.builtindatatype.DataTypeException;
+import org.onosproject.yangutils.utils.builtindatatype.YangBuiltInDataTypeInfo;
+
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
+import static org.onosproject.yangutils.utils.YangConstructType.LENGTH_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.utils.builtindatatype.BuiltInTypeObjectFactory.getDataObjectFromString;
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ * length-stmt = length-keyword sep length-arg-str optsep
+ * (";" /
+ * "{" stmtsep
+ * ;; these stmts can appear in any order
+ * [error-message-stmt stmtsep]
+ * [error-app-tag-stmt stmtsep]
+ * [description-stmt stmtsep]
+ * [reference-stmt stmtsep]
+ * "}")
+ *
+ *
+ * ANTLR grammar rule
+ * lengthStatement : LENGTH_KEYWORD length
+ * (STMTEND | LEFT_CURLY_BRACE commonStatements RIGHT_CURLY_BRACE);
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "length"
+ * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
+ */
+public final class LengthRestrictionListener {
+
+ private static final String PIPE = "|";
+ private static final String LENGTH_INTERVAL = "..";
+
+ /**
+ * Creates a new length restriction listener.
+ */
+ private LengthRestrictionListener() {
+ }
+
+ /**
+ * It is called when parser receives an input matching the grammar
+ * rule (length), performs validation and updates the data model
+ * tree.
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processLengthRestrictionEntry(TreeWalkListener listener,
+ GeneratedYangParser.LengthStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, LENGTH_DATA, ctx.length().getText(), ENTRY);
+
+ Parsable tmpData = listener.getParsedDataStack().peek();
+ if (tmpData.getYangConstructType() == TYPE_DATA) {
+ YangType type = (YangType) tmpData;
+ setLengthRestriction(type, ctx);
+ } else {
+ throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LENGTH_DATA,
+ ctx.length().getText(), ENTRY));
+ }
+ }
+
+ /**
+ * Sets the length restriction to type.
+ *
+ * @param type Yang type for which length restriction to be set
+ * @param ctx context object of the grammar rule
+ */
+ private static void setLengthRestriction(YangType type,
+ GeneratedYangParser.LengthStatementContext ctx) {
+
+ YangStringRestriction stringRestriction;
+ YangBuiltInDataTypeInfo<?> startValue, endValue;
+ YangRangeRestriction lengthRestriction = new YangRangeRestriction<>();
+
+ if (type.getDataType() != YangDataTypes.STRING && type.getDataType() != YangDataTypes.DERIVED) {
+
+ ParserException parserException = new ParserException("YANG file error : " +
+ YangConstructType.getYangConstructType(LENGTH_DATA) + " name " + ctx.length().getText() +
+ " can be used to restrict the built-in type string or types derived from string.");
+ parserException.setLine(ctx.getStart().getLine());
+ parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+ throw parserException;
+ }
+
+ if (type.getDataType() == YangDataTypes.STRING) {
+ stringRestriction = (YangStringRestriction) type.getDataTypeExtendedInfo();
+ } else {
+ stringRestriction = (YangStringRestriction) ((YangDerivedInfo<?>) type
+ .getDataTypeExtendedInfo()).getExtendedInfo();
+ }
+
+ if (stringRestriction == null) {
+ stringRestriction = new YangStringRestriction();
+ if (type.getDataType() == YangDataTypes.STRING) {
+ type.setDataTypeExtendedInfo(stringRestriction);
+ } else {
+ ((YangDerivedInfo<YangStringRestriction>) type.getDataTypeExtendedInfo())
+ .setExtendedInfo(stringRestriction);
+ }
+ }
+
+ String rangeArgument = removeQuotesAndHandleConcat(ctx.length().getText());
+ String[] rangeArguments = rangeArgument.trim().split(Pattern.quote(PIPE));
+
+ for (String rangePart : rangeArguments) {
+ String startInterval, endInterval;
+ YangRangeInterval rangeInterval = new YangRangeInterval<>();
+ String[] rangeBoundary = rangePart.trim().split(Pattern.quote(LENGTH_INTERVAL));
+
+ if (rangeBoundary.length > 2) {
+ ParserException parserException = new ParserException("YANG file error : " +
+ YangConstructType.getYangConstructType(LENGTH_DATA) + " " + rangeArgument +
+ " is not valid.");
+ parserException.setLine(ctx.getStart().getLine());
+ parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+ throw parserException;
+ }
+
+ if (rangeBoundary.length == 1) {
+ startInterval = rangeBoundary[0];
+ endInterval = rangeBoundary[0];
+ } else {
+ startInterval = rangeBoundary[0];
+ endInterval = rangeBoundary[1];
+ }
+
+ try {
+ startValue = getDataObjectFromString(startInterval, YangDataTypes.UINT64);
+ endValue = getDataObjectFromString(endInterval, YangDataTypes.UINT64);
+ } catch (DataTypeException e) {
+ ParserException parserException = new ParserException(e.getMessage());
+ parserException.setLine(ctx.getStart().getLine());
+ parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+ throw parserException;
+ }
+
+ rangeInterval.setStartValue(startValue);
+ rangeInterval.setEndValue(endValue);
+
+ try {
+ lengthRestriction.addRangeRestrictionInterval(rangeInterval);
+ } catch (DataModelException e) {
+ ParserException parserException = new ParserException(constructExtendedListenerErrorMessage(
+ UNHANDLED_PARSED_DATA, LENGTH_DATA, rangeArgument, ENTRY, e.getMessage()));
+ parserException.setLine(ctx.getStart().getLine());
+ parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+ throw parserException;
+ }
+ }
+
+ stringRestriction.setLengthRestriction(lengthRestriction);
+ }
+}
diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListener.java
new file mode 100644
index 0000000..b06ecb5
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListener.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2016 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.parser.impl.listeners;
+
+import org.onosproject.yangutils.datamodel.YangDerivedInfo;
+import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.YangStringRestriction;
+import org.onosproject.yangutils.datamodel.YangDataTypes;
+import org.onosproject.yangutils.parser.Parsable;
+import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yangutils.parser.exceptions.ParserException;
+import org.onosproject.yangutils.parser.impl.TreeWalkListener;
+import org.onosproject.yangutils.utils.YangConstructType;
+
+import static org.onosproject.yangutils.utils.YangConstructType.PATTERN_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ * pattern-stmt = pattern-keyword sep string optsep
+ * (";" /
+ * "{" stmtsep
+ * ;; these stmts can appear in any order
+ * [error-message-stmt stmtsep]
+ * [error-app-tag-stmt stmtsep]
+ * [description-stmt stmtsep]
+ * [reference-stmt stmtsep]
+ * "}")
+ *
+ * ANTLR grammar rule
+ * patternStatement : PATTERN_KEYWORD string (STMTEND | LEFT_CURLY_BRACE commonStatements RIGHT_CURLY_BRACE);
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "pattern"
+ * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
+ */
+public final class PatternRestrictionListener {
+
+ private static final String EMPTY_STRING = "";
+
+ /**
+ * Creates a new pattern restriction listener.
+ */
+ private PatternRestrictionListener() {
+ }
+
+ /**
+ * It is called when parser receives an input matching the grammar
+ * rule (pattern), performs validation and updates the data model
+ * tree.
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processPatternRestrictionEntry(TreeWalkListener listener,
+ GeneratedYangParser.PatternStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, PATTERN_DATA, ctx.string().getText(), ENTRY);
+
+ Parsable tmpData = listener.getParsedDataStack().peek();
+ if (tmpData.getYangConstructType() == TYPE_DATA) {
+ YangType type = (YangType) tmpData;
+ setPatternRestriction(type, ctx);
+ } else {
+ throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, PATTERN_DATA,
+ ctx.string().getText(), ENTRY));
+ }
+ }
+
+ /**
+ * Sets the pattern restriction to type.
+ *
+ * @param type Yang type for which pattern restriction to be set
+ * @param ctx context object of the grammar rule
+ */
+ private static void setPatternRestriction(YangType type,
+ GeneratedYangParser.PatternStatementContext ctx) {
+
+ YangStringRestriction stringRestriction;
+
+ if (type.getDataType() != YangDataTypes.STRING && type.getDataType() != YangDataTypes.DERIVED) {
+
+ ParserException parserException = new ParserException("YANG file error : " +
+ YangConstructType.getYangConstructType(PATTERN_DATA) + " name " + ctx.string().getText() +
+ " can be used to restrict the built-in type string or types derived from string.");
+ parserException.setLine(ctx.getStart().getLine());
+ parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+ throw parserException;
+ }
+
+ if (type.getDataType() == YangDataTypes.STRING) {
+ stringRestriction = (YangStringRestriction) type.getDataTypeExtendedInfo();
+ } else {
+ stringRestriction = (YangStringRestriction) ((YangDerivedInfo<?>) type
+ .getDataTypeExtendedInfo()).getExtendedInfo();
+ }
+
+ if (stringRestriction == null) {
+ stringRestriction = new YangStringRestriction();
+ if (type.getDataType() == YangDataTypes.STRING) {
+ type.setDataTypeExtendedInfo(stringRestriction);
+ } else {
+ ((YangDerivedInfo<YangStringRestriction>) type.getDataTypeExtendedInfo())
+ .setExtendedInfo(stringRestriction);
+ }
+ }
+
+ String patternArgument = ctx.string().getText().replace("\"", EMPTY_STRING);
+ stringRestriction.addPattern(patternArgument);
+ }
+}
diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RangeRestrictionListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RangeRestrictionListener.java
index dfb9458..46bc67a 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RangeRestrictionListener.java
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RangeRestrictionListener.java
@@ -16,29 +16,33 @@
package org.onosproject.yangutils.parser.impl.listeners;
-import java.math.BigInteger;
import java.util.regex.Pattern;
-import org.onosproject.yangutils.datamodel.YangType;
-import org.onosproject.yangutils.datamodel.YangRangeRestriction;
import org.onosproject.yangutils.datamodel.YangRangeInterval;
-import org.onosproject.yangutils.datamodel.YangDataTypes;
+import org.onosproject.yangutils.datamodel.YangRangeRestriction;
+import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.YangDerivedInfo;
import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.datamodel.YangDataTypes;
import org.onosproject.yangutils.parser.Parsable;
import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
import org.onosproject.yangutils.parser.exceptions.ParserException;
import org.onosproject.yangutils.parser.impl.TreeWalkListener;
+import org.onosproject.yangutils.utils.YangConstructType;
+import org.onosproject.yangutils.utils.builtindatatype.DataTypeException;
+import org.onosproject.yangutils.utils.builtindatatype.YangBuiltInDataTypeInfo;
-import static org.onosproject.yangutils.utils.YangConstructType.RANGE_DATA;
-import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.RANGE_DATA;
+import static org.onosproject.yangutils.utils.builtindatatype.BuiltInTypeObjectFactory.getDataObjectFromString;
/*
* Reference: RFC6020 and YANG ANTLR Grammar
@@ -78,8 +82,8 @@
* rule (range), performs validation and updates the data model
* tree.
*
- * @param listener listener's object.
- * @param ctx context object of the grammar rule.
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
*/
public static void processRangeRestrictionEntry(TreeWalkListener listener,
GeneratedYangParser.RangeStatementContext ctx) {
@@ -100,68 +104,71 @@
/**
* Sets the range restriction to type.
*
- * @param type YANG type for which range restriction to be added.
- * @param ctx context object of the grammar rule.
+ * @param type YANG type for which range restriction to be added
+ * @param ctx context object of the grammar rule
*/
private static void setRangeRestriction(YangType type,
- GeneratedYangParser.RangeStatementContext ctx) {
- YangRangeRestriction<?> rangeRestriction = null;
- YangRangeInterval rangeInterval;
+ GeneratedYangParser.RangeStatementContext ctx) {
+
+ YangBuiltInDataTypeInfo<?> startValue, endValue;
+ YangRangeRestriction rangeRestriction = new YangRangeRestriction();
String rangeArgument = removeQuotesAndHandleConcat(ctx.range().getText());
String[] rangeArguments = rangeArgument.trim().split(Pattern.quote(PIPE));
for (String rangePart : rangeArguments) {
+ String startInterval, endInterval;
+ YangRangeInterval rangeInterval = new YangRangeInterval();
String[] rangeBoundary = rangePart.trim().split(Pattern.quote(RANGE_INTERVAL));
- if (rangeBoundary.length == 1) {
- rangeBoundary[1] = rangeBoundary[0];
+ if (rangeBoundary.length > 2) {
+ ParserException parserException = new ParserException("YANG file error : " +
+ YangConstructType.getYangConstructType(RANGE_DATA) + " " + rangeArgument +
+ " is not valid.");
+ parserException.setLine(ctx.getStart().getLine());
+ parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+ throw parserException;
}
- if (type.getDataType() == YangDataTypes.INT8) {
- rangeRestriction = new YangRangeRestriction<Byte>();
- rangeInterval = new YangRangeInterval<Byte>();
- rangeInterval.setStartValue(Byte.parseByte(rangeBoundary[0]));
- rangeInterval.setEndValue(Byte.parseByte(rangeBoundary[1]));
- } else if ((type.getDataType() == YangDataTypes.INT16)
- || (type.getDataType() == YangDataTypes.UINT8)) {
- rangeRestriction = new YangRangeRestriction<Short>();
- rangeInterval = new YangRangeInterval<Short>();
- rangeInterval.setStartValue(Short.parseShort(rangeBoundary[0]));
- rangeInterval.setEndValue(Short.parseShort(rangeBoundary[1]));
- } else if ((type.getDataType() == YangDataTypes.INT32)
- || (type.getDataType() == YangDataTypes.UINT16)) {
- rangeRestriction = new YangRangeRestriction<Integer>();
- rangeInterval = new YangRangeInterval<Integer>();
- rangeInterval.setStartValue(Integer.parseInt(rangeBoundary[0]));
- rangeInterval.setEndValue(Integer.parseInt(rangeBoundary[1]));
- } else if ((type.getDataType() == YangDataTypes.INT64)
- || (type.getDataType() == YangDataTypes.UINT32)) {
- rangeRestriction = new YangRangeRestriction<Long>();
- rangeInterval = new YangRangeInterval<Long>();
- rangeInterval.setStartValue(Long.parseLong(rangeBoundary[0]));
- rangeInterval.setEndValue(Long.parseLong(rangeBoundary[1]));
- } else if (type.getDataType() == YangDataTypes.UINT64) {
- rangeRestriction = new YangRangeRestriction<BigInteger>();
- rangeInterval = new YangRangeInterval<BigInteger>();
- rangeInterval.setStartValue(new BigInteger(rangeBoundary[0]));
- rangeInterval.setEndValue(new BigInteger(rangeBoundary[0]));
+ if (rangeBoundary.length == 1) {
+ startInterval = rangeBoundary[0];
+ endInterval = rangeBoundary[0];
} else {
- //TODO: support derived for base built in type of string
- throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, RANGE_DATA,
- rangeArgument, ENTRY));
+ startInterval = rangeBoundary[0];
+ endInterval = rangeBoundary[1];
}
try {
+ startValue = getDataObjectFromString(startInterval, type.getDataType());
+ endValue = getDataObjectFromString(endInterval, type.getDataType());
+ } catch (DataTypeException e) {
+ ParserException parserException = new ParserException(e.getMessage());
+ parserException.setLine(ctx.getStart().getLine());
+ parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+ throw parserException;
+ }
+
+ rangeInterval.setStartValue(startValue);
+ rangeInterval.setEndValue(endValue);
+
+ try {
rangeRestriction.addRangeRestrictionInterval(rangeInterval);
} catch (DataModelException e) {
- throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA, RANGE_DATA,
- rangeArgument, ENTRY, e.getMessage()));
+ ParserException parserException = new ParserException(constructExtendedListenerErrorMessage(
+ UNHANDLED_PARSED_DATA, RANGE_DATA, rangeArgument, ENTRY, e.getMessage()));
+ parserException.setLine(ctx.getStart().getLine());
+ parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+ throw parserException;
}
}
if (rangeRestriction != null) {
- type.setDataTypeExtendedInfo(rangeRestriction);
+ if (type.getDataType() == YangDataTypes.DERIVED) {
+ ((YangDerivedInfo<YangRangeRestriction>) type.getDataTypeExtendedInfo())
+ .setExtendedInfo(rangeRestriction);
+ } else {
+ type.setDataTypeExtendedInfo(rangeRestriction);
+ }
}
}
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 67f2299..b611d6e 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
@@ -98,36 +98,6 @@
type.setNodeIdentifier(nodeIdentifier);
type.setDataType(yangDataTypes);
- // Push the type to the stack.
- listener.getParsedDataStack().push(type);
- }
-
- /**
- * It is called when parser exits from grammar rule (type), it perform
- * validations and update the data model tree.
- *
- * @param listener Listener's object
- * @param ctx context object of the grammar rule
- */
- public static void processTypeExit(TreeWalkListener listener,
- GeneratedYangParser.TypeStatementContext ctx) {
-
- // Check for stack to be non empty.
- checkStackIsNotEmpty(listener, MISSING_CURRENT_HOLDER, TYPE_DATA, ctx.string().getText(), EXIT);
-
- Parsable parsableType = listener.getParsedDataStack().pop();
- if (!(parsableType instanceof YangType)) {
- throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA,
- ctx.string().getText(), EXIT));
- }
-
- YangType<?> type = (YangType<?>) parsableType;
-
- // Check for stack to be non empty.
- checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPE_DATA, ctx.string().getText(), EXIT);
-
- YangDataTypes yangDataTypes = YangDataTypes.getType(ctx.string().getText());
-
int errorLine = ctx.getStart().getLine();
int errorPosition = ctx.getStart().getCharPositionInLine();
@@ -242,12 +212,35 @@
throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA,
ctx.string().getText(), EXIT));
}
+
+ // Push the type to the stack.
+ listener.getParsedDataStack().push(type);
}
/**
- * Add to resolution list.
+ * It is called when parser exits from grammar rule (type), it perform
+ * validations and update the data model tree.
*
- * @param resolutionInfo resolution information.
+ * @param listener Listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processTypeExit(TreeWalkListener listener,
+ GeneratedYangParser.TypeStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_CURRENT_HOLDER, TYPE_DATA, ctx.string().getText(), EXIT);
+
+ Parsable parsableType = listener.getParsedDataStack().pop();
+ if (!(parsableType instanceof YangType)) {
+ throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA,
+ ctx.string().getText(), EXIT));
+ }
+ }
+
+ /**
+ * Adds to resolution list.
+ *
+ * @param resolutionInfo resolution information
* @param ctx context object of the grammar rule
*/
private static void addToResolutionList(YangResolutionInfo<YangType> resolutionInfo,