YANG construct collision detection framework added
Change-Id: I1458f9e3192641f3f90c444798c31a64536ffa5d
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java
index 1ada6dd..896e8ec 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java
@@ -19,21 +19,28 @@
import org.onosproject.yangutils.datamodel.YangLeafList;
import org.onosproject.yangutils.datamodel.YangLeavesHolder;
import org.onosproject.yangutils.parser.Parsable;
-import org.onosproject.yangutils.parser.ParsableDataType;
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.parser.impl.YangUtilsParserManager;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.LEAF_LIST_DATA;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
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;
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.INVALID_CARDINALITY;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinality;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityEqualsOne;
+import static org.onosproject.yangutils.utils.YangConstructType.CONFIG_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.LEAF_LIST_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MAX_ELEMENT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MIN_ELEMENT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.UNITS_DATA;
/*
* Reference: RFC6020 and YANG ANTLR Grammar
@@ -68,8 +75,6 @@
*/
public final class LeafListListener {
- private static ParsableDataType yangConstruct;
-
/**
* Creates a new leaf list listener.
*/
@@ -77,23 +82,26 @@
}
/**
- * It is called when parser receives an input matching the grammar
- * rule (leaf-list), performs validation and updates the data model
- * tree.
+ * It is called when parser receives an input matching the grammar rule
+ * (leaf-list), 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 processLeafListEntry(TreeWalkListener listener,
- GeneratedYangParser.LeafListStatementContext ctx) {
+ GeneratedYangParser.LeafListStatementContext ctx) {
// Check for stack to be non empty.
checkStackIsNotEmpty(listener, MISSING_HOLDER, LEAF_LIST_DATA, ctx.IDENTIFIER().getText(), ENTRY);
- boolean result = validateSubStatementsCardinality(ctx);
- if (!result) {
- throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY));
- }
+ // Validate sub statement cardinality.
+ validateSubStatementsCardinality(ctx);
+
+ // Check for identifier collision
+ int line = ctx.IDENTIFIER().getSymbol().getLine();
+ int charPositionInLine = ctx.IDENTIFIER().getSymbol().getCharPositionInLine();
+ String identifierName = ctx.IDENTIFIER().getText();
+ detectCollidingChildUtil(listener, line, charPositionInLine, identifierName, LEAF_LIST_DATA);
YangLeafList leafList = new YangLeafList();
leafList.setLeafName(ctx.IDENTIFIER().getText());
@@ -106,7 +114,7 @@
leaves.addLeafList(leafList);
} else {
throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LEAF_LIST_DATA,
- ctx.IDENTIFIER().getText(), ENTRY));
+ ctx.IDENTIFIER().getText(), ENTRY));
}
listener.getParsedDataStack().push(leafList);
}
@@ -115,11 +123,11 @@
* It is called when parser exits from grammar rule (leaf-list), it 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 processLeafListExit(TreeWalkListener listener,
- GeneratedYangParser.LeafListStatementContext ctx) {
+ GeneratedYangParser.LeafListStatementContext ctx) {
// Check for stack to be non empty.
checkStackIsNotEmpty(listener, MISSING_HOLDER, LEAF_LIST_DATA, ctx.IDENTIFIER().getText(), EXIT);
@@ -136,59 +144,17 @@
* Validates the cardinality of leaf-list sub-statements as per grammar.
*
* @param ctx context object of the grammar rule.
- * @return true/false validation success or failure.
*/
- private static boolean validateSubStatementsCardinality(GeneratedYangParser
- .LeafListStatementContext ctx) {
+ private static void validateSubStatementsCardinality(GeneratedYangParser.LeafListStatementContext ctx) {
- if (ctx.typeStatement().isEmpty()
- || (ctx.typeStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
- yangConstruct = ParsableDataType.TYPE_DATA;
- return false;
- }
-
- if ((!ctx.unitsStatement().isEmpty())
- && (ctx.unitsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
- yangConstruct = ParsableDataType.UNITS_DATA;
- return false;
- }
-
- if ((!ctx.configStatement().isEmpty())
- && (ctx.configStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
- yangConstruct = ParsableDataType.CONFIG_DATA;
- return false;
- }
-
- if ((!ctx.maxElementsStatement().isEmpty())
- && (ctx.maxElementsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
- yangConstruct = ParsableDataType.MAX_ELEMENT_DATA;
- return false;
- }
-
- if ((!ctx.minElementsStatement().isEmpty())
- && (ctx.minElementsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
- yangConstruct = ParsableDataType.MIN_ELEMENT_DATA;
- return false;
- }
-
- if ((!ctx.descriptionStatement().isEmpty())
- && (ctx.descriptionStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
- yangConstruct = ParsableDataType.DESCRIPTION_DATA;
- return false;
- }
-
- if ((!ctx.referenceStatement().isEmpty())
- && (ctx.referenceStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
- yangConstruct = ParsableDataType.REFERENCE_DATA;
- return false;
- }
-
- if ((!ctx.statusStatement().isEmpty())
- && (ctx.statusStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
- yangConstruct = ParsableDataType.STATUS_DATA;
- return false;
- }
-
- return true;
+ validateCardinalityEqualsOne(ctx.typeStatement(), TYPE_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+ validateCardinality(ctx.unitsStatement(), UNITS_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+ validateCardinality(ctx.configStatement(), CONFIG_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+ validateCardinality(ctx.maxElementsStatement(), MAX_ELEMENT_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+ validateCardinality(ctx.minElementsStatement(), MIN_ELEMENT_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+ validateCardinality(ctx.descriptionStatement(), DESCRIPTION_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+ validateCardinality(ctx.referenceStatement(), REFERENCE_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+ validateCardinality(ctx.statusStatement(), STATUS_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+ //TODO ordered by
}
-}
\ No newline at end of file
+}