Deviation parser and data model
Change-Id: I3cb3da5748057d0c2c9c99d7c3495643bc1ea243
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/TreeWalkListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/TreeWalkListener.java
index 42fe6ca..babe61e 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/TreeWalkListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/TreeWalkListener.java
@@ -42,6 +42,10 @@
import org.onosproject.yang.compiler.parser.impl.listeners.Decimal64Listener;
import org.onosproject.yang.compiler.parser.impl.listeners.DefaultListener;
import org.onosproject.yang.compiler.parser.impl.listeners.DescriptionListener;
+import org.onosproject.yang.compiler.parser.impl.listeners.DeviateAddListener;
+import org.onosproject.yang.compiler.parser.impl.listeners.DeviateDeleteListener;
+import org.onosproject.yang.compiler.parser.impl.listeners.DeviateReplaceListener;
+import org.onosproject.yang.compiler.parser.impl.listeners.DeviationListener;
import org.onosproject.yang.compiler.parser.impl.listeners.EnumListener;
import org.onosproject.yang.compiler.parser.impl.listeners.EnumerationListener;
import org.onosproject.yang.compiler.parser.impl.listeners.ErrorAppTagListener;
@@ -1473,14 +1477,12 @@
@Override
public void enterDeviationStatement(DeviationStatementContext ctx) {
- increaseUnsupportedYangConstructDepth();
- ListenerUtil.handleUnsupportedYangConstruct(YangConstructType.DEVIATION_DATA, ctx, UtilConstants.UNSUPPORTED_YANG_CONSTRUCT,
- getFileName());
+ DeviationListener.processDeviationEntry(this, ctx);
}
@Override
public void exitDeviationStatement(DeviationStatementContext ctx) {
- decreaseUnsupportedYangConstructDepth();
+ DeviationListener.processDeviationExit(this, ctx);
}
@Override
@@ -1495,32 +1497,32 @@
@Override
public void enterDeviateAddStatement(DeviateAddStatementContext ctx) {
- // do nothing.
+ DeviateAddListener.processDeviateAddEntry(this, ctx);
}
@Override
public void exitDeviateAddStatement(DeviateAddStatementContext ctx) {
- // do nothing.
+ DeviateAddListener.processDeviateAddExit(this, ctx);
}
@Override
public void enterDeviateDeleteStatement(DeviateDeleteStatementContext ctx) {
- // do nothing.
+ DeviateDeleteListener.processDeviateDeleteEntry(this, ctx);
}
@Override
public void exitDeviateDeleteStatement(DeviateDeleteStatementContext ctx) {
- // do nothing.
+ DeviateDeleteListener.processDeviateDeleteExit(this, ctx);
}
@Override
public void enterDeviateReplaceStatement(DeviateReplaceStatementContext ctx) {
- // do nothing.
+ DeviateReplaceListener.processDeviateReplaceEntry(this, ctx);
}
@Override
public void exitDeviateReplaceStatement(DeviateReplaceStatementContext ctx) {
- // do nothing.
+ DeviateReplaceListener.processDeviateReplaceExit(this, ctx);
}
@Override
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ConfigListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ConfigListener.java
index 186e1c8..6c6b8da 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ConfigListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ConfigListener.java
@@ -16,28 +16,6 @@
package org.onosproject.yang.compiler.parser.impl.listeners;
-import org.onosproject.yang.compiler.datamodel.YangContainer;
-import org.onosproject.yang.compiler.datamodel.YangLeaf;
-import org.onosproject.yang.compiler.datamodel.YangLeafList;
-import org.onosproject.yang.compiler.datamodel.YangList;
-import org.onosproject.yang.compiler.datamodel.utils.Parsable;
-import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
-import org.onosproject.yang.compiler.parser.exceptions.ParserException;
-import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation;
-
-import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.CONFIG_DATA;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.getValidBooleanValue;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
-
/*
* Reference: RFC6020 and YANG ANTLR Grammar
*
@@ -53,6 +31,20 @@
* config : string;
*/
+import org.onosproject.yang.compiler.datamodel.YangConfig;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.CONFIG_DATA;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.getValidBooleanValue;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+
/**
* Represents listener based call back function corresponding to the "config"
* rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
@@ -78,30 +70,17 @@
// Check for stack to be non empty.
checkStackIsNotEmpty(listener, MISSING_HOLDER, CONFIG_DATA, "", ENTRY);
- boolean isConfig = getValidBooleanValue(ctx.config().getText(), CONFIG_DATA, ctx);
+ boolean isConfig = getValidBooleanValue(ctx.config().getText(),
+ CONFIG_DATA, ctx);
Parsable tmpData = listener.getParsedDataStack().peek();
- switch (tmpData.getYangConstructType()) {
- case LEAF_DATA:
- YangLeaf leaf = (YangLeaf) tmpData;
- leaf.setConfig(isConfig);
- break;
- case CONTAINER_DATA:
- YangContainer container = (YangContainer) tmpData;
- container.setConfig(isConfig);
- break;
- case LEAF_LIST_DATA:
- YangLeafList leafList = (YangLeafList) tmpData;
- leafList.setConfig(isConfig);
- break;
- case LIST_DATA:
- YangList yangList = (YangList) tmpData;
- yangList.setConfig(isConfig);
- break;
- case CHOICE_DATA: // TODO
- break;
- default:
- throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, CONFIG_DATA, "", ENTRY));
+ if (tmpData instanceof YangConfig) {
+ YangConfig config = ((YangConfig) tmpData);
+ config.setConfig(isConfig);
+ } else {
+ throw new ParserException(
+ constructListenerErrorMessage(INVALID_HOLDER,
+ CONFIG_DATA, "", ENTRY));
}
}
}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DefaultListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DefaultListener.java
index 0000aff..043cacd 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DefaultListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DefaultListener.java
@@ -39,9 +39,7 @@
* defaultStatement : DEFAULT_KEYWORD string STMTEND;
*/
-import org.onosproject.yang.compiler.datamodel.YangChoice;
-import org.onosproject.yang.compiler.datamodel.YangLeaf;
-import org.onosproject.yang.compiler.datamodel.YangTypeDef;
+import org.onosproject.yang.compiler.datamodel.YangDefault;
import org.onosproject.yang.compiler.datamodel.utils.Parsable;
import org.onosproject.yang.compiler.parser.exceptions.ParserException;
import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
@@ -77,28 +75,20 @@
DefaultStatementContext ctx) {
// Check for stack to be non empty.
- checkStackIsNotEmpty(listener, MISSING_HOLDER, DEFAULT_DATA, ctx.string().getText(), ENTRY);
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, DEFAULT_DATA,
+ ctx.string().getText(), ENTRY);
+ String value = removeQuotesAndHandleConcat(ctx.string().getText());
Parsable tmpNode = listener.getParsedDataStack().peek();
- switch (tmpNode.getYangConstructType()) {
- case TYPEDEF_DATA: {
- YangTypeDef typeDef = (YangTypeDef) tmpNode;
- typeDef.setDefaultValueInString(removeQuotesAndHandleConcat(ctx.string().getText()));
- break;
- }
- case LEAF_DATA: {
- YangLeaf leaf = (YangLeaf) tmpNode;
- leaf.setDefaultValueInString(removeQuotesAndHandleConcat(ctx.string().getText()));
- break;
- }
- case CHOICE_DATA: {
- YangChoice choice = (YangChoice) tmpNode;
- choice.setDefaultValueInString(removeQuotesAndHandleConcat(ctx.string().getText()));
- break;
- }
- default:
- throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
- DEFAULT_DATA, ctx.string().getText(), ENTRY));
+ if (tmpNode instanceof YangDefault) {
+ YangDefault defaultHolder = ((YangDefault) tmpNode);
+ defaultHolder.setDefaultValueInString(value);
+ } else {
+ throw new ParserException(
+ constructListenerErrorMessage(INVALID_HOLDER,
+ DEFAULT_DATA,
+ ctx.string().getText(),
+ ENTRY));
}
}
}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateAddListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateAddListener.java
new file mode 100644
index 0000000..1e78332
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateAddListener.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016-present 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.yang.compiler.parser.impl.listeners;
+
+
+import org.onosproject.yang.compiler.datamodel.YangDeviateAdd;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_ADD;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.EXIT;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ *
+ * deviate-add-stmt = deviate-keyword sep add-keyword optsep
+ * (";" /
+ * "{" stmtsep
+ * [units-stmt stmtsep]
+ * *(must-stmt stmtsep)
+ * *(unique-stmt stmtsep)
+ * [default-stmt stmtsep]
+ * [config-stmt stmtsep]
+ * [mandatory-stmt stmtsep]
+ * [min-elements-stmt stmtsep]
+ * [max-elements-stmt stmtsep]
+ * "}")
+ *
+ * ANTLR grammar rule
+ * deviateAddStatement: DEVIATE_KEYWORD ADD_KEYWORD (STMTEND
+ * | LEFT_CURLY_BRACE (unitsStatement | mustStatement
+ * | uniqueStatement| defaultStatement| configStatement
+ * | mandatoryStatement | minElementsStatement
+ * | maxElementsStatement)*
+ * RIGHT_CURLY_BRACE);
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "deviate
+ * add" rule defined in ANTLR grammar file for corresponding ABNF rule in RFC
+ * 6020.
+ */
+public final class DeviateAddListener {
+
+ //No instantiation
+ private DeviateAddListener() {
+ }
+
+ /**
+ * Performs validation and updates the data model tree. It is called when
+ * parser receives an input matching the grammar rule(deviate add).
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processDeviateAddEntry(TreeWalkListener listener,
+ GeneratedYangParser.DeviateAddStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_ADD, null, ENTRY);
+
+ // TODO : Validate sub-statements cardinality
+
+ Parsable curData = listener.getParsedDataStack().peek();
+ if (curData instanceof YangDeviation) {
+ YangDeviation curNode = (YangDeviation) curData;
+ YangDeviateAdd deviationAdd = new YangDeviateAdd();
+ curNode.addDeviateAdd(deviationAdd);
+ listener.getParsedDataStack().push(deviationAdd);
+ } else {
+ throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
+ DEVIATE_ADD,
+ null,
+ ENTRY));
+ }
+ }
+
+ /**
+ * Performs validation and updates the data model tree. It is called when
+ * parser exits from grammar rule (deviate add).
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processDeviateAddExit(TreeWalkListener listener,
+ GeneratedYangParser.DeviateAddStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_ADD, null,
+ EXIT);
+
+ if (listener.getParsedDataStack().peek() instanceof YangDeviateAdd) {
+ listener.getParsedDataStack().pop();
+ } else {
+ throw new ParserException(constructListenerErrorMessage
+ (MISSING_CURRENT_HOLDER, DEVIATE_ADD,
+ null, EXIT));
+ }
+ }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateDeleteListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateDeleteListener.java
new file mode 100644
index 0000000..2c84791
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateDeleteListener.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2016-present 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.yang.compiler.parser.impl.listeners;
+
+
+import org.onosproject.yang.compiler.datamodel.YangDeviateDelete;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_DELETE;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.EXIT;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ *
+ * deviate-delete-stmt = deviate-keyword sep delete-keyword optsep
+ * (";" /
+ * "{" stmtsep
+ * [units-stmt stmtsep]
+ * *(must-stmt stmtsep)
+ * *(unique-stmt stmtsep)
+ * [default-stmt stmtsep]
+ * "}")
+ *
+ * ANTLR grammar rule
+ * deviateDeleteStatement: DEVIATE_KEYWORD DELETE_KEYWORD (STMTEND
+ * | LEFT_CURLY_BRACE (unitsStatement | mustStatement |
+ * uniqueStatement | defaultStatement)* RIGHT_CURLY_BRACE);
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "deviate
+ * delete" rule defined in ANTLR grammar file for corresponding ABNF rule in RFC
+ * 6020.
+ */
+public final class DeviateDeleteListener {
+
+ // No instantiation
+ private DeviateDeleteListener() {
+ }
+
+ /**
+ * Performs validation and updates the data model tree. It is called when
+ * parser receives an input matching the grammar rule(deviate delete).
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processDeviateDeleteEntry(TreeWalkListener listener,
+ GeneratedYangParser
+ .DeviateDeleteStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_DELETE,
+ null, ENTRY);
+
+ // TODO : Validate sub-statements cardinality
+
+ Parsable curData = listener.getParsedDataStack().peek();
+ if (curData instanceof YangDeviation) {
+ YangDeviation curNode = (YangDeviation) curData;
+ YangDeviateDelete deviateDelete = new YangDeviateDelete();
+ curNode.addDeviatedelete(deviateDelete);
+ listener.getParsedDataStack().push(deviateDelete);
+ } else {
+ throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
+ DEVIATE_DELETE,
+ null,
+ ENTRY));
+ }
+ }
+
+ /**
+ * Performs validation and updates the data model tree. It is called when
+ * parser exits from grammar rule (deviate delete).
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processDeviateDeleteExit(TreeWalkListener listener,
+ GeneratedYangParser
+ .DeviateDeleteStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_DELETE, null,
+ EXIT);
+
+ if (listener.getParsedDataStack().peek() instanceof YangDeviateDelete) {
+ listener.getParsedDataStack().pop();
+ } else {
+ throw new ParserException(constructListenerErrorMessage
+ (MISSING_CURRENT_HOLDER, DEVIATE_DELETE,
+ null, EXIT));
+ }
+ }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateReplaceListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateReplaceListener.java
new file mode 100644
index 0000000..962aa60
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateReplaceListener.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2016-present 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.yang.compiler.parser.impl.listeners;
+
+import org.onosproject.yang.compiler.datamodel.YangDeviateReplace;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_REPLACE;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.EXIT;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ *
+ * deviate-replace-stmt = deviate-keyword sep replace-keyword optsep
+ * (";" /
+ * "{" stmtsep
+ * [type-stmt stmtsep]
+ * [units-stmt stmtsep]
+ * [default-stmt stmtsep]
+ * [config-stmt stmtsep]
+ * [mandatory-stmt stmtsep]
+ * [min-elements-stmt stmtsep]
+ * [max-elements-stmt stmtsep]
+ * "}")
+ *
+ * ANTLR grammar rule
+ * deviateReplaceStatement: DEVIATE_KEYWORD REPLACE_KEYWORD (STMTEND
+ * | LEFT_CURLY_BRACE (typeStatement | unitsStatement
+ * | defaultStatement | configStatement
+ * | mandatoryStatement | minElementsStatement
+ * | maxElementsStatement)* RIGHT_CURLY_BRACE);
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "deviate
+ * replace" rule defined in ANTLR grammar file for corresponding ABNF rule in
+ * RFC 6020.
+ */
+public final class DeviateReplaceListener {
+
+ //No instantiation
+ private DeviateReplaceListener() {
+ }
+
+ /**
+ * Performs validation and updates the data model tree. It is called when
+ * parser receives an input matching the grammar rule(deviate replace).
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processDeviateReplaceEntry(TreeWalkListener listener,
+ GeneratedYangParser
+ .DeviateReplaceStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_REPLACE,
+ null, ENTRY);
+
+ // TODO : Validate sub-statements cardinality
+
+ Parsable curData = listener.getParsedDataStack().peek();
+ if (curData instanceof YangDeviation) {
+ YangDeviation curNode = (YangDeviation) curData;
+ YangDeviateReplace deviationReplace = new YangDeviateReplace();
+ curNode.addDeviateReplace(deviationReplace);
+ listener.getParsedDataStack().push(deviationReplace);
+ } else {
+ throw new ParserException(constructListenerErrorMessage
+ (INVALID_HOLDER,
+ DEVIATE_REPLACE,
+ null,
+ ENTRY));
+ }
+ }
+
+ /**
+ * Performs validation and updates the data model tree. It is called when
+ * parser exits from grammar rule (deviate replace).
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processDeviateReplaceExit(TreeWalkListener listener,
+ GeneratedYangParser.DeviateReplaceStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_REPLACE, null,
+ EXIT);
+
+ if (listener.getParsedDataStack().peek() instanceof YangDeviateReplace) {
+ listener.getParsedDataStack().pop();
+ } else {
+ throw new ParserException(constructListenerErrorMessage
+ (MISSING_CURRENT_HOLDER, DEVIATE_REPLACE,
+ null, EXIT));
+ }
+ }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListener.java
new file mode 100644
index 0000000..97f9be2
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListener.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2016-present 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.yang.compiler.parser.impl.listeners;
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ *
+ * deviation-stmt = deviation-keyword sep
+ * deviation-arg-str optsep
+ * "{" stmtsep
+ * ;; these stmts can appear in any order
+ * [description-stmt stmtsep]
+ * [reference-stmt stmtsep]
+ * (deviate-not-supported-stmt /
+ * 1*(deviate-add-stmt /
+ * deviate-replace-stmt /
+ * deviate-delete-stmt))
+ * "}"
+ *
+ * ANTLR grammar rule
+ * deviationStatement: DEVIATION_KEYWORD deviation LEFT_CURLY_BRACE (
+ * descriptionStatement | referenceStatement | deviateNotSupportedStatement
+ * | deviateAddStatement | deviateReplaceStatement
+ * | deviateDeleteStatement)* RIGHT_CURLY_BRACE;
+ */
+
+import org.onosproject.yang.compiler.datamodel.YangAtomicPath;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.YangDeviationHolder;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.linker.impl.YangResolutionInfoImpl;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import java.util.List;
+
+import static org.onosproject.yang.compiler.datamodel.YangNodeType.DEVIATION_NODE;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.addResolutionInfo;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_ADD;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_DELETE;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_NOT_SUPPORTED;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_REPLACE;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATION_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.EXIT;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.getValidAbsoluteSchemaNodeId;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.validateCardinalityMutuallyExclusive;
+
+/**
+ * Represents listener based call back function corresponding to the "deviation"
+ * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
+ */
+public final class DeviationListener {
+
+ /**
+ * Creates a new deviation listener.
+ */
+ private DeviationListener() {
+ }
+
+ /**
+ * Performs validation and updates the data model tree. It is called when
+ * parser receives an input matching the grammar rule(deviation).
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processDeviationEntry(TreeWalkListener listener,
+ GeneratedYangParser.DeviationStatementContext ctx) {
+
+ String deviationArg = removeQuotesAndHandleConcat(ctx.deviation().getText());
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATION_DATA,
+ deviationArg, ENTRY);
+
+ // Validates deviation argument string
+ List<YangAtomicPath> targetNode = getValidAbsoluteSchemaNodeId(deviationArg,
+ DEVIATION_DATA, ctx);
+
+ validateSubStatementsCardinality(ctx);
+
+ // Check for identifier collision
+ int line = ctx.getStart().getLine();
+ int charPositionInLine = ctx.getStart().getCharPositionInLine();
+ detectCollidingChildUtil(listener, line, charPositionInLine,
+ deviationArg, DEVIATION_DATA);
+
+ Parsable curData = listener.getParsedDataStack().peek();
+ if (curData instanceof YangDeviationHolder) {
+ YangDeviation deviation = new YangDeviation(DEVIATION_NODE, null);
+ deviation.setName(deviationArg);
+ deviation.setLineNumber(line);
+ deviation.setCharPosition(charPositionInLine);
+ deviation.setFileName(listener.getFileName());
+ deviation.setTargetNode(targetNode);
+ if (!ctx.deviateNotSupportedStatement().isEmpty()) {
+ deviation.setDeviateNotSupported(true);
+ }
+ YangNode curNode = (YangNode) curData;
+ try {
+ curNode.addChild(deviation);
+ ((YangDeviationHolder) curNode).setModuleForDeviation(true);
+ } catch (DataModelException e) {
+ throw new ParserException(
+ constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
+ DEVIATION_DATA,
+ deviationArg,
+ ENTRY, e.getMessage()));
+ }
+ listener.getParsedDataStack().push(deviation);
+
+ // Adds resolution info to the list
+ YangResolutionInfoImpl<YangDeviation> info =
+ new YangResolutionInfoImpl<>(deviation, deviation.getParent(),
+ line, charPositionInLine);
+ addToResolution(info, ctx);
+ } else {
+ throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
+ DEVIATION_DATA,
+ deviationArg,
+ ENTRY));
+ }
+ }
+
+ /**
+ * Performs validation and updates the data model tree. It is called when
+ * parser exits from grammar rule (deviation).
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processDeviationExit(TreeWalkListener listener,
+ GeneratedYangParser.DeviationStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATION_DATA, ctx
+ .deviation().getText(), EXIT);
+
+ if (listener.getParsedDataStack().peek() instanceof YangDeviation) {
+ listener.getParsedDataStack().pop();
+ } else {
+ throw new ParserException(constructListenerErrorMessage
+ (MISSING_CURRENT_HOLDER, DEVIATION_DATA,
+ ctx.deviation().getText(), EXIT));
+ }
+ }
+
+ /**
+ * Validates the cardinality of deviation sub-statements as per grammar.
+ *
+ * @param ctx context object of the grammar rule
+ */
+ private static void validateSubStatementsCardinality(GeneratedYangParser
+ .DeviationStatementContext ctx) {
+ validateCardinalityMaxOne(ctx.descriptionStatement(),
+ DESCRIPTION_DATA, DEVIATION_DATA,
+ ctx.deviation().getText());
+ validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA,
+ DEVIATION_DATA, ctx.deviation().getText());
+ validateCardinalityMaxOne(ctx.deviateNotSupportedStatement(),
+ DEVIATE_NOT_SUPPORTED,
+ DEVIATION_DATA, ctx.deviation().getText());
+ validateCardinalityMutuallyExclusive(ctx.deviateNotSupportedStatement(),
+ DEVIATE_NOT_SUPPORTED,
+ ctx.deviateAddStatement(),
+ DEVIATE_ADD,
+ DEVIATION_DATA,
+ ctx.deviation().getText(),
+ ctx);
+ validateCardinalityMutuallyExclusive(ctx.deviateNotSupportedStatement(),
+ DEVIATE_NOT_SUPPORTED,
+ ctx.deviateReplaceStatement(),
+ DEVIATE_REPLACE,
+ DEVIATION_DATA,
+ ctx.deviation().getText(),
+ ctx);
+ validateCardinalityMutuallyExclusive(ctx.deviateNotSupportedStatement(),
+ DEVIATE_NOT_SUPPORTED,
+ ctx.deviateDeleteStatement(),
+ DEVIATE_DELETE,
+ DEVIATION_DATA,
+ ctx.deviation().getText(),
+ ctx);
+ }
+
+ /**
+ * Add to resolution list.
+ *
+ * @param info resolution info
+ * @param ctx context object
+ */
+ private static void addToResolution(YangResolutionInfoImpl<YangDeviation> info,
+ GeneratedYangParser.DeviationStatementContext ctx) {
+ try {
+ addResolutionInfo(info);
+ } catch (DataModelException e) {
+ throw new ParserException(constructExtendedListenerErrorMessage(
+ UNHANDLED_PARSED_DATA, DEVIATION_DATA,
+ ctx.deviation().getText(), EXIT, e.getMessage()));
+ }
+ }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MandatoryListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MandatoryListener.java
index b711592..5f21154 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MandatoryListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MandatoryListener.java
@@ -16,7 +16,7 @@
package org.onosproject.yang.compiler.parser.impl.listeners;
-import org.onosproject.yang.compiler.datamodel.YangLeaf;
+import org.onosproject.yang.compiler.datamodel.YangMandatory;
import org.onosproject.yang.compiler.datamodel.utils.Parsable;
import org.onosproject.yang.compiler.parser.exceptions.ParserException;
import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
@@ -73,18 +73,16 @@
// Check for stack to be non empty.
checkStackIsNotEmpty(listener, MISSING_HOLDER, MANDATORY_DATA, "", ENTRY);
- boolean isMandatory = getValidBooleanValue(ctx.mandatory().getText(), MANDATORY_DATA, ctx);
+ boolean isMandatory = getValidBooleanValue(ctx.mandatory().getText(),
+ MANDATORY_DATA, ctx);
Parsable tmpNode = listener.getParsedDataStack().peek();
- switch (tmpNode.getYangConstructType()) {
- case LEAF_DATA:
- YangLeaf leaf = (YangLeaf) tmpNode;
- leaf.setMandatory(isMandatory);
- break;
- case CHOICE_DATA: // TODO
- break;
- default:
- throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, MANDATORY_DATA, "", ENTRY));
+ if (tmpNode instanceof YangMandatory) {
+ YangMandatory yangMandatory = ((YangMandatory) tmpNode);
+ yangMandatory.setMandatory(isMandatory);
+ } else {
+ throw new ParserException(constructListenerErrorMessage(
+ INVALID_HOLDER, MANDATORY_DATA, "", ENTRY));
}
}
}
\ No newline at end of file
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MaxElementsListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MaxElementsListener.java
index ee7f1ef..f46b606 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MaxElementsListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MaxElementsListener.java
@@ -16,9 +16,8 @@
package org.onosproject.yang.compiler.parser.impl.listeners;
-import org.onosproject.yang.compiler.datamodel.YangLeafList;
-import org.onosproject.yang.compiler.datamodel.YangList;
import org.onosproject.yang.compiler.datamodel.YangMaxElement;
+import org.onosproject.yang.compiler.datamodel.YangMaxElementHolder;
import org.onosproject.yang.compiler.datamodel.utils.Parsable;
import org.onosproject.yang.compiler.datamodel.utils.YangConstructType;
import org.onosproject.yang.compiler.parser.exceptions.ParserException;
@@ -85,17 +84,12 @@
maxElement.setCharPosition(ctx.getStart().getCharPositionInLine());
maxElement.setFileName(listener.getFileName());
Parsable tmpData = listener.getParsedDataStack().peek();
- switch (tmpData.getYangConstructType()) {
- case LEAF_LIST_DATA:
- YangLeafList leafList = (YangLeafList) tmpData;
- leafList.setMaxElements(maxElement);
- break;
- case LIST_DATA:
- YangList yangList = (YangList) tmpData;
- yangList.setMaxElements(maxElement);
- break;
- default:
- throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, MAX_ELEMENT_DATA, "", ENTRY));
+ if (tmpData instanceof YangMaxElementHolder) {
+ YangMaxElementHolder holder = ((YangMaxElementHolder) tmpData);
+ holder.setMaxElements(maxElement);
+ } else {
+ throw new ParserException(constructListenerErrorMessage(
+ INVALID_HOLDER, MAX_ELEMENT_DATA, "", ENTRY));
}
}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MinElementsListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MinElementsListener.java
index ed80c4c..ed07598 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MinElementsListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MinElementsListener.java
@@ -16,15 +16,11 @@
package org.onosproject.yang.compiler.parser.impl.listeners;
-import org.onosproject.yang.compiler.datamodel.YangLeafList;
-import org.onosproject.yang.compiler.datamodel.YangList;
+import org.onosproject.yang.compiler.datamodel.YangMinElementHolder;
import org.onosproject.yang.compiler.datamodel.YangMinElement;
import org.onosproject.yang.compiler.datamodel.utils.Parsable;
import org.onosproject.yang.compiler.parser.exceptions.ParserException;
import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.MIN_ELEMENT_DATA;
import static org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.MinElementsStatementContext;
@@ -74,9 +70,11 @@
MinElementsStatementContext ctx) {
// Check for stack to be non empty.
- checkStackIsNotEmpty(listener, MISSING_HOLDER, MIN_ELEMENT_DATA, ctx.minValue().getText(), ENTRY);
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, MIN_ELEMENT_DATA,
+ ctx.minValue().getText(), ENTRY);
- int minElementValue = getValidNonNegativeIntegerValue(ctx.minValue().getText(), MIN_ELEMENT_DATA, ctx);
+ int minElementValue = getValidNonNegativeIntegerValue(
+ ctx.minValue().getText(), MIN_ELEMENT_DATA, ctx);
YangMinElement minElement = new YangMinElement();
@@ -84,19 +82,15 @@
minElement.setLineNumber(ctx.getStart().getLine());
minElement.setCharPosition(ctx.getStart().getCharPositionInLine());
minElement.setFileName(listener.getFileName());
+
Parsable tmpData = listener.getParsedDataStack().peek();
- switch (tmpData.getYangConstructType()) {
- case LEAF_LIST_DATA:
- YangLeafList leafList = (YangLeafList) tmpData;
- leafList.setMinElements(minElement);
- break;
- case LIST_DATA:
- YangList yangList = (YangList) tmpData;
- yangList.setMinElements(minElement);
- break;
- default:
- throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, MIN_ELEMENT_DATA,
- ctx.minValue().getText(), ENTRY));
+ if (tmpData instanceof YangMinElementHolder) {
+ YangMinElementHolder holder = ((YangMinElementHolder) tmpData);
+ holder.setMinElements(minElement);
+ } else {
+ throw new ParserException(constructListenerErrorMessage(
+ INVALID_HOLDER, MIN_ELEMENT_DATA, ctx.minValue().getText(),
+ ENTRY));
}
}
}
\ No newline at end of file
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ModuleListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ModuleListener.java
index 346e35c..fa3a6f9 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ModuleListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ModuleListener.java
@@ -35,6 +35,7 @@
import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_IF_FEATURE;
import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_LEAFREF;
import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_USES;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.validateMultipleDeviationStatement;
import static org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.MODULE_DATA;
import static org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.ModuleStatementContext;
@@ -148,6 +149,16 @@
linkerException.setFileName(listener.getFileName());
throw linkerException;
}
+
+ /*
+ * Validate whether all deviation statement xpath is referring to same
+ * module
+ */
+ try {
+ validateMultipleDeviationStatement(module);
+ } catch (DataModelException e) {
+ throw new ParserException(e.getMessage());
+ }
}
private static void throwError(ListenerErrorType type,
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListener.java
index 7b18d5b..f1dbf66 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListener.java
@@ -25,12 +25,8 @@
import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
import org.onosproject.yang.compiler.parser.exceptions.ParserException;
import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.validateMultipleDeviationStatement;
import static org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.MODULE_DATA;
import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.SUB_MODULE_DATA;
@@ -154,5 +150,15 @@
linkerException.setFileName(listener.getFileName());
throw linkerException;
}
+
+ /*
+ * Validate whether all deviation statement xpath is referring to same
+ * module
+ */
+ try {
+ validateMultipleDeviationStatement(subModule);
+ } catch (DataModelException e) {
+ throw new ParserException(e.getMessage());
+ }
}
}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/TypeListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/TypeListener.java
index 0b16af7..7a23e7a 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/TypeListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/TypeListener.java
@@ -17,6 +17,7 @@
package org.onosproject.yang.compiler.parser.impl.listeners;
import org.onosproject.yang.compiler.datamodel.YangDerivedInfo;
+import org.onosproject.yang.compiler.datamodel.YangDeviateReplace;
import org.onosproject.yang.compiler.datamodel.YangLeaf;
import org.onosproject.yang.compiler.datamodel.YangLeafList;
import org.onosproject.yang.compiler.datamodel.YangNode;
@@ -32,7 +33,6 @@
import org.onosproject.yang.compiler.parser.exceptions.ParserException;
import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
import static org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
import static org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus.UNRESOLVED;
@@ -247,8 +247,10 @@
addToResolutionList(resolutionInfo, ctx);
}
break;
- //TODO: deviate replacement statement.
-
+ case DEVIATE_REPLACE:
+ YangDeviateReplace replace = (YangDeviateReplace) tmpData;
+ replace.setDataType(type);
+ break;
default:
throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA,
ctx.string().getText(), EXIT));
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UniqueListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UniqueListener.java
index e222422..c97d272 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UniqueListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UniqueListener.java
@@ -16,15 +16,12 @@
package org.onosproject.yang.compiler.parser.impl.listeners;
-import org.onosproject.yang.compiler.datamodel.YangList;
+import org.onosproject.yang.compiler.datamodel.YangUniqueHolder;
import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
import org.onosproject.yang.compiler.datamodel.utils.Parsable;
import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
import org.onosproject.yang.compiler.parser.exceptions.ParserException;
import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.UNIQUE_DATA;
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
@@ -33,6 +30,7 @@
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.SPACE;
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
@@ -70,35 +68,43 @@
GeneratedYangParser.UniqueStatementContext ctx) {
// Check for stack to be non empty.
- checkStackIsNotEmpty(listener, MISSING_HOLDER, UNIQUE_DATA, ctx.unique().getText(), ENTRY);
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, UNIQUE_DATA, ctx.unique()
+ .getText(), ENTRY);
Parsable tmpData = listener.getParsedDataStack().peek();
- if (listener.getParsedDataStack().peek() instanceof YangList) {
- YangList yangList = (YangList) tmpData;
- String tmpUniqueValue = removeQuotesAndHandleConcat(ctx.unique().getText());
+ if (listener.getParsedDataStack().peek() instanceof YangUniqueHolder) {
+ YangUniqueHolder uniqueHolder = (YangUniqueHolder) tmpData;
+ String tmpUniqueValue = removeQuotesAndHandleConcat(
+ ctx.unique().getText());
- if (tmpUniqueValue.contains(" ")) {
- String[] uniqueValues = tmpUniqueValue.split(" ");
+ if (tmpUniqueValue.contains(SPACE)) {
+ String[] uniqueValues = tmpUniqueValue.split(SPACE);
for (String uniqueValue : uniqueValues) {
try {
- yangList.addUnique(uniqueValue);
+ uniqueHolder.addUnique(uniqueValue);
} catch (DataModelException e) {
- throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
- UNIQUE_DATA,
- ctx.unique().getText(), ENTRY, e.getMessage()));
+ throw new ParserException(
+ constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
+ UNIQUE_DATA,
+ ctx.unique().getText(),
+ ENTRY, e.getMessage()));
}
}
} else {
try {
- yangList.addUnique(tmpUniqueValue);
+ uniqueHolder.addUnique(tmpUniqueValue);
} catch (DataModelException e) {
- throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA, UNIQUE_DATA,
- ctx.unique().getText(), ENTRY, e.getMessage()));
+ throw new ParserException(
+ constructExtendedListenerErrorMessage(
+ UNHANDLED_PARSED_DATA, UNIQUE_DATA,
+ ctx.unique().getText(), ENTRY, e.getMessage()));
}
}
} else {
- throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, UNIQUE_DATA, ctx.unique().getText(),
- ENTRY));
+ throw new ParserException(
+ constructListenerErrorMessage(INVALID_HOLDER, UNIQUE_DATA,
+ ctx.unique().getText(),
+ ENTRY));
}
}
}
\ No newline at end of file
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UnitsListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UnitsListener.java
index f8db2cf..b5eb1f7 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UnitsListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UnitsListener.java
@@ -16,12 +16,15 @@
package org.onosproject.yang.compiler.parser.impl.listeners;
+import org.onosproject.yang.compiler.datamodel.YangDeviateAdd;
+import org.onosproject.yang.compiler.datamodel.YangDeviateDelete;
+import org.onosproject.yang.compiler.datamodel.YangDeviateReplace;
import org.onosproject.yang.compiler.datamodel.YangLeaf;
import org.onosproject.yang.compiler.datamodel.YangLeafList;
+import org.onosproject.yang.compiler.datamodel.YangTypeDef;
import org.onosproject.yang.compiler.datamodel.utils.Parsable;
import org.onosproject.yang.compiler.parser.exceptions.ParserException;
import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.UNITS_DATA;
import static org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.UnitsStatementContext;
@@ -78,11 +81,27 @@
leafList.setUnits(ctx.string().getText());
break;
case TYPEDEF_DATA:
- // TODO
+ YangTypeDef typeDef = (YangTypeDef) tmpData;
+ typeDef.setUnits(ctx.string().getText());
+ break;
+ case DEVIATE_ADD:
+ YangDeviateAdd deviateAdd = (YangDeviateAdd) tmpData;
+ deviateAdd.setUnits(ctx.string().getText());
+ break;
+ case DEVIATE_DELETE:
+ YangDeviateDelete deviateDelete = (YangDeviateDelete) tmpData;
+ deviateDelete.setUnits(ctx.string().getText());
+ break;
+ case DEVIATE_REPLACE:
+ YangDeviateReplace replace = (YangDeviateReplace) tmpData;
+ replace.setUnits(ctx.string().getText());
break;
default:
- throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, UNITS_DATA,
- ctx.string().getText(), ENTRY));
+ throw new ParserException(
+ constructListenerErrorMessage(INVALID_HOLDER,
+ UNITS_DATA,
+ ctx.string().getText(),
+ ENTRY));
}
}
}
\ No newline at end of file
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerUtil.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerUtil.java
index e71eb98..328b6bc 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerUtil.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerUtil.java
@@ -90,6 +90,7 @@
private static final String DATE_FORMAT = "yyyy-MM-dd";
private static final String REGEX_EQUAL = "[=]";
private static final String REGEX_OPEN_BRACE = "[(]";
+ public static final String SPACE = " ";
// No instantiation.
private ListenerUtil() {
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerValidation.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerValidation.java
index eeb1dc9..4b45fcd 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerValidation.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerValidation.java
@@ -240,4 +240,38 @@
throw parserException;
}
}
+
+ /**
+ * Checks if a either of one construct occurrence.
+ *
+ * @param ctx1 first optional child's context
+ * @param type1 first child construct for whom cardinality is
+ * to be validated
+ * @param ctx2 second optional child's context
+ * @param type2 second child construct for whom cardinality is
+ * to be validated
+ * @param type parent construct
+ * @param parentName parent name
+ * @param ctx parents's context
+ * @throws ParserException exception if cardinality check fails
+ */
+ public static void validateCardinalityMutuallyExclusive(List<?> ctx1,
+ YangConstructType type1,
+ List<?> ctx2,
+ YangConstructType type2,
+ YangConstructType type,
+ String parentName,
+ ParserRuleContext ctx)
+ throws ParserException {
+
+ if (!ctx1.isEmpty() && !ctx2.isEmpty()) {
+ String error = "YANG file error: Either " + getYangConstructType(type1)
+ + " or " + getYangConstructType(type2) + " should be present in "
+ + getYangConstructType(type) + " " + parentName + ".";
+ ParserException parserException = new ParserException(error);
+ parserException.setLine(ctx.getStart().getLine());
+ parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+ throw parserException;
+ }
+ }
}
diff --git a/compiler/base/parser/src/main/resources/GeneratedYang.g4 b/compiler/base/parser/src/main/resources/GeneratedYang.g4
index 3ba1201..af16c05 100644
--- a/compiler/base/parser/src/main/resources/GeneratedYang.g4
+++ b/compiler/base/parser/src/main/resources/GeneratedYang.g4
@@ -1207,9 +1207,12 @@
* [max-elements-stmt stmtsep]
* "}")
*/
- deviateAddStatement: DEVIATE_KEYWORD ADD_KEYWORD (STMTEND | (LEFT_CURLY_BRACE unitsStatement? mustStatement* uniqueStatement*
- defaultStatement? configStatement? mandatoryStatement? minElementsStatement? maxElementsStatement?
- RIGHT_CURLY_BRACE));
+ deviateAddStatement: DEVIATE_KEYWORD ADD_KEYWORD (STMTEND
+ | LEFT_CURLY_BRACE (unitsStatement | mustStatement
+ | uniqueStatement| defaultStatement| configStatement
+ | mandatoryStatement | minElementsStatement
+ | maxElementsStatement)*
+ RIGHT_CURLY_BRACE);
/**
* deviate-delete-stmt = deviate-keyword sep delete-keyword optsep
@@ -1222,7 +1225,8 @@
* "}")
*/
deviateDeleteStatement: DEVIATE_KEYWORD DELETE_KEYWORD (STMTEND
- | (LEFT_CURLY_BRACE unitsStatement? mustStatement* uniqueStatement* defaultStatement? RIGHT_CURLY_BRACE));
+ | LEFT_CURLY_BRACE (unitsStatement | mustStatement |
+ uniqueStatement | defaultStatement)* RIGHT_CURLY_BRACE);
/**
* deviate-replace-stmt = deviate-keyword sep replace-keyword optsep
@@ -1237,9 +1241,11 @@
* [max-elements-stmt stmtsep]
* "}")
*/
- deviateReplaceStatement: DEVIATE_KEYWORD REPLACE_KEYWORD (STMTEND | (LEFT_CURLY_BRACE typeStatement? unitsStatement?
- defaultStatement? configStatement? mandatoryStatement? minElementsStatement?
- maxElementsStatement? RIGHT_CURLY_BRACE));
+ deviateReplaceStatement: DEVIATE_KEYWORD REPLACE_KEYWORD (STMTEND
+ | LEFT_CURLY_BRACE (typeStatement | unitsStatement
+ | defaultStatement | configStatement
+ | mandatoryStatement | minElementsStatement
+ | maxElementsStatement)* RIGHT_CURLY_BRACE);
/**
* compiler-annotation-stmt = prefix:compiler-annotation-keyword string
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListenerTest.java
new file mode 100644
index 0000000..cca24d1
--- /dev/null
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListenerTest.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2016-present 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.yang.compiler.parser.impl.listeners;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onosproject.yang.compiler.datamodel.YangAtomicPath;
+import org.onosproject.yang.compiler.datamodel.YangDeviateAdd;
+import org.onosproject.yang.compiler.datamodel.YangDeviateDelete;
+import org.onosproject.yang.compiler.datamodel.YangDeviateReplace;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.YangModule;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
+
+import java.io.IOException;
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.onosproject.yang.compiler.datamodel.YangNodeType.MODULE_NODE;
+import static org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus.UNRESOLVED;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.INT8;
+
+/**
+ * Test cases for testing deviation listener.
+ */
+public class DeviationListenerTest {
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ private final YangUtilsParserManager manager = new YangUtilsParserManager();
+
+ /**
+ * Checks deviation statement as sub-statement of module.
+ */
+ @Test
+ public void processDeviationNotSupported() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel("src/test/resources/" +
+ "ValidDeviationNotSupported.yang");
+
+ assertThat((node instanceof YangModule), is(true));
+
+ // Check whether the node type is set properly to module.
+ assertThat(node.getNodeType(), is(MODULE_NODE));
+
+ // Check whether the module name is set correctly.
+ YangModule yangNode = (YangModule) node;
+ assertThat(yangNode.getName(), is("Test"));
+
+ // Check whether the container is child of module
+ YangDeviation deviation = (YangDeviation) yangNode.getChild();
+ assertThat(deviation.getName(), is("/base:system/base:daytime"));
+ assertThat(deviation.getDescription(), is("\"desc\""));
+ assertThat(deviation.getReference(), is("\"ref\""));
+ assertThat(deviation.isDeviateNotSupported(), is(true));
+ List<YangAtomicPath> targetNode = deviation.getTargetNode();
+ assertThat(targetNode.get(0).getNodeIdentifier().getName(),
+ is("system"));
+ assertThat(targetNode.get(1).getNodeIdentifier().getName(),
+ is("daytime"));
+ assertThat(targetNode.get(0).getNodeIdentifier().getPrefix(),
+ is("base"));
+ assertThat(deviation.getResolvableStatus(), is(UNRESOLVED));
+ }
+
+ /**
+ * Checks deviation add statement as sub-statement of module.
+ */
+ @Test
+ public void processDeviationAddStatement() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel("src/test/resources/" +
+ "ValidDeviateAdd.yang");
+
+ assertThat((node instanceof YangModule), is(true));
+ assertThat(node.getNodeType(), is(MODULE_NODE));
+ YangModule yangNode = (YangModule) node;
+ assertThat(yangNode.getName(), is("Test"));
+
+ YangDeviation deviation = (YangDeviation) yangNode.getChild();
+ assertThat(deviation.getName(), is("/base:system/base:user/base:type"));
+ assertThat(deviation.isDeviateNotSupported(), is(false));
+ List<YangAtomicPath> targetNode = deviation.getTargetNode();
+ assertThat(targetNode.get(0).getNodeIdentifier().getName(),
+ is("system"));
+ assertThat(targetNode.get(0).getNodeIdentifier().getPrefix(),
+ is("base"));
+ assertThat(targetNode.get(1).getNodeIdentifier().getName(),
+ is("user"));
+ assertThat(targetNode.get(2).getNodeIdentifier().getName(),
+ is("type"));
+
+ YangDeviateAdd deviateAdd = deviation.getDeviateAdd().get(0);
+ assertThat(deviateAdd.getUnits(), is("\"units\""));
+ assertThat(deviateAdd.getListOfMust().get(0).getConstraint(),
+ is("/base:system"));
+ assertThat(deviateAdd.getUniqueList().get(0), is("id"));
+ assertThat(deviateAdd.getDefaultValueInString(), is("admin"));
+ assertThat(deviateAdd.isConfig(), is(true));
+ assertThat(deviateAdd.isMandatory(), is(true));
+ assertThat(deviateAdd.getMinElements().getMinElement(), is(0));
+ assertThat(deviateAdd.getMaxElements().getMaxElement(), is(12343));
+ assertThat(deviation.getResolvableStatus(), is(UNRESOLVED));
+ }
+
+ /**
+ * Checks deviation delete statement as sub-statement of module.
+ */
+ @Test
+ public void processDeviationDeleteStatement() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel("src/test/resources/" +
+ "ValidDeviateDelete.yang");
+
+ assertThat((node instanceof YangModule), is(true));
+ assertThat(node.getNodeType(), is(MODULE_NODE));
+ YangModule yangNode = (YangModule) node;
+ assertThat(yangNode.getName(), is("Test"));
+
+ YangDeviation deviation = (YangDeviation) yangNode.getChild();
+ assertThat(deviation.getName(), is("/base:system"));
+ assertThat(deviation.isDeviateNotSupported(), is(false));
+ List<YangAtomicPath> targetNode = deviation.getTargetNode();
+ assertThat(targetNode.get(0).getNodeIdentifier().getName(),
+ is("system"));
+ assertThat(targetNode.get(0).getNodeIdentifier().getPrefix(),
+ is("base"));
+
+ YangDeviateDelete deviateDelete = deviation.getDeviateDelete().get(0);
+ assertThat(deviateDelete.getUnits(), is("\"units\""));
+ assertThat(deviateDelete.getListOfMust().get(0).getConstraint(),
+ is("daytime or time"));
+ assertThat(deviateDelete.getUniqueList().get(0), is("id"));
+ assertThat(deviateDelete.getDefaultValueInString(), is("defaultValue"));
+ assertThat(deviation.getResolvableStatus(), is(UNRESOLVED));
+ }
+
+ /**
+ * Checks deviation replace statement as sub-statement of module.
+ */
+ @Test
+ public void processDeviationReplaceStatement() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel("src/test/resources/" +
+ "ValidDeviateReplace.yang");
+
+ assertThat((node instanceof YangModule), is(true));
+ assertThat(node.getNodeType(), is(MODULE_NODE));
+ YangModule yangNode = (YangModule) node;
+ assertThat(yangNode.getName(), is("Test"));
+
+ YangDeviation deviation = (YangDeviation) yangNode.getChild();
+ assertThat(deviation.getName(), is("/base:system/base:name-server"));
+ assertThat(deviation.isDeviateNotSupported(), is(false));
+ List<YangAtomicPath> targetNode = deviation.getTargetNode();
+ assertThat(targetNode.get(0).getNodeIdentifier().getName(),
+ is("system"));
+ assertThat(targetNode.get(0).getNodeIdentifier().getPrefix(),
+ is("base"));
+ assertThat(targetNode.get(1).getNodeIdentifier().getName(),
+ is("name-server"));
+
+ YangDeviateReplace replace = deviation.getDeviateReplace().get(0);
+ assertThat(replace.getDataType().getDataType(), is(INT8));
+ assertThat(replace.getUnits(), is("\"units\""));
+ assertThat(replace.getDefaultValueInString(), is("0"));
+ assertThat(replace.isConfig(), is(true));
+ assertThat(replace.isMandatory(), is(true));
+ assertThat(replace.getMinElements().getMinElement(), is(0));
+ assertThat(replace.getMaxElements().getMaxElement(), is(3));
+ assertThat(deviation.getResolvableStatus(), is(UNRESOLVED));
+ }
+
+ /**
+ * Checks deviation unsupported statement and deviate add as
+ * sub-statement of module.
+ */
+ @Test
+ public void processInvalidDeviateStatement() throws
+ IOException, ParserException {
+ String error = "YANG file error: Either deviate-not-supported-stmt or" +
+ " deviate-replace should be present in deviation" +
+ " /base:system/base:daytime";
+ thrown.expect(ParserException.class);
+ thrown.expectMessage(error);
+ YangNode node = manager.getDataModel("src/test/resources/InvalidDeviateStatement.yang");
+ }
+}
+
diff --git a/compiler/base/parser/src/test/resources/InvalidDeviateStatement.yang b/compiler/base/parser/src/test/resources/InvalidDeviateStatement.yang
new file mode 100644
index 0000000..9068050
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/InvalidDeviateStatement.yang
@@ -0,0 +1,19 @@
+module Test {
+ yang-version 1;
+ namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+ prefix On;
+ deviation /base:system/base:daytime {
+ description "desc";
+ reference "ref";
+ deviate not-supported;
+ deviate replace {
+ type int8;
+ units "units";
+ default "0";
+ config "true";
+ mandatory "true";
+ min-elements 0;
+ max-elements 3;
+ }
+ }
+}
diff --git a/compiler/base/parser/src/test/resources/ValidDeviateAdd.yang b/compiler/base/parser/src/test/resources/ValidDeviateAdd.yang
new file mode 100644
index 0000000..7915d54
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ValidDeviateAdd.yang
@@ -0,0 +1,17 @@
+module Test {
+ yang-version 1;
+ namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+ prefix On;
+ deviation /base:system/base:user/base:type {
+ deviate add {
+ units "units";
+ must "/base:system";
+ unique "id";
+ default "admin";
+ config "true";
+ mandatory "true";
+ min-elements "0";
+ max-elements "12343";
+ }
+ }
+}
diff --git a/compiler/base/parser/src/test/resources/ValidDeviateDelete.yang b/compiler/base/parser/src/test/resources/ValidDeviateDelete.yang
new file mode 100644
index 0000000..767f3de
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ValidDeviateDelete.yang
@@ -0,0 +1,13 @@
+module Test {
+ yang-version 1;
+ namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+ prefix On;
+ deviation "/base:system" {
+ deviate delete {
+ units "units";
+ must "daytime or time";
+ unique "id";
+ default "defaultValue";
+ }
+ }
+}
diff --git a/compiler/base/parser/src/test/resources/ValidDeviateReplace.yang b/compiler/base/parser/src/test/resources/ValidDeviateReplace.yang
new file mode 100644
index 0000000..dc7f0fb
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ValidDeviateReplace.yang
@@ -0,0 +1,16 @@
+module Test {
+ yang-version 1;
+ namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+ prefix On;
+ deviation /base:system/base:name-server {
+ deviate replace {
+ type int8;
+ units "units";
+ default "0";
+ config "true";
+ mandatory "true";
+ min-elements 0;
+ max-elements 3;
+ }
+ }
+}
diff --git a/compiler/base/parser/src/test/resources/ValidDeviationNotSupported.yang b/compiler/base/parser/src/test/resources/ValidDeviationNotSupported.yang
new file mode 100644
index 0000000..979f29f
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ValidDeviationNotSupported.yang
@@ -0,0 +1,10 @@
+module Test {
+ yang-version 1;
+ namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+ prefix On;
+ deviation /base:system/base:daytime {
+ description "desc";
+ reference "ref";
+ deviate not-supported;
+ }
+}