AnyData feature changes
Change-Id: Iccba22d731321f38b8146bbfc85477d2252a3b10
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java
new file mode 100644
index 0000000..9a8ba06
--- /dev/null
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java
@@ -0,0 +1,375 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.datamodel;
+
+import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.datamodel.utils.YangConstructType;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.SchemaContext;
+import org.onosproject.yang.model.SchemaId;
+import org.onosproject.yang.model.SingleInstanceNodeContext;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.E_ID;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.FMT_NOT_EXIST;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.errorMsg;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getNodeIdFromSchemaId;
+
+/*-
+ * Reference RFC 7950.
+ *
+ * The "anydata" statement defines an interior node in the schema tree.
+ * It takes one argument, which is an identifier, followed by a block of
+ * substatements that holds detailed anydata information.
+ *
+ * The "anydata" statement is used to represent an unknown set of nodes
+ * that can be modeled with YANG, except anyxml, but for which the data
+ * model is not known at module design time. It is possible, though not
+ * required, for the data model for anydata content to become known
+ * through protocol signaling or other means that are outside the scope
+ * of this document.
+ *
+ * An example of where anydata can be useful is a list of received
+ * notifications where the specific notifications are not known at
+ * design time.
+ *
+ * An anydata node exists in zero or one instance in the data tree.
+ * An implementation may or may not know the data model used to model a
+ * specific instance of an anydata node.
+ *
+ * Since the use of anydata limits the manipulation of the content, the
+ * "anydata" statement SHOULD NOT be used to define configuration data.
+.*
+ * The anydata's Substatements
+ *
+ * +--------------+---------+-------------+
+ * | substatement | section | cardinality |
+ * +--------------+---------+-------------+
+ * | config | 7.21.1 | 0..1 |
+ * | description | 7.21.3 | 0..1 |
+ * | if-feature | 7.20.2 | 0..n |
+ * | mandatory | 7.6.5 | 0..1 |
+ * | must | 7.5.3 | 0..n |
+ * | reference | 7.21.4 | 0..1 |
+ * | status | 7.21.2 | 0..1 |
+ * | when | 7.21.5 | 0..1 |
+ * +--------------+---------+-------------+
+ */
+
+/**
+ * Represents data model node to maintain information defined in YANG anydata.
+ */
+public abstract class YangAnydata
+ extends YangNode
+ implements YangConfig, YangIfFeatureHolder, YangMandatory,
+ YangMustHolder, YangWhenHolder, YangCommonInfo, Parsable,
+ CollisionDetector, YangIsFilterContentNodes,
+ SingleInstanceNodeContext, SchemaDataNode {
+
+ private static final long serialVersionUID = -4962764560367658905L;
+
+ /**
+ * If anydata maintains config data.
+ */
+ private boolean isConfig;
+
+ /**
+ * Description of anydata.
+ */
+ private String description;
+
+ /**
+ * List of if-feature.
+ */
+ private List<YangIfFeature> ifFeatureList;
+
+ /**
+ * If anydata maintains mandatory data.
+ */
+ private boolean isMandatory;
+
+ /**
+ * List of must statement constraints.
+ */
+ private List<YangMust> mustConstraintList;
+
+ /**
+ * Reference of the module.
+ */
+ private String reference;
+
+ /**
+ * Status of the node.
+ */
+ private YangStatusType status = YangStatusType.CURRENT;
+
+ /**
+ * When data of the node.
+ */
+ private YangWhen when;
+
+ /**
+ * Create a anydata node.
+ */
+ public YangAnydata() {
+ super(YangNodeType.ANYDATA_NODE, new HashMap<>(),
+ DataNode.Type.SINGLE_INSTANCE_NODE);
+ mustConstraintList = new LinkedList<>();
+ ifFeatureList = new LinkedList<>();
+ }
+
+ @Override
+ public void addToChildSchemaMap(YangSchemaNodeIdentifier schemaNodeIdentifier,
+ YangSchemaNodeContextInfo yangSchemaNodeContextInfo) {
+ getYsnContextInfoMap().put(schemaNodeIdentifier, yangSchemaNodeContextInfo);
+ }
+
+ @Override
+ public void incrementMandatoryChildCount() {
+ // TODO
+ }
+
+ @Override
+ public void addToDefaultChildMap(YangSchemaNodeIdentifier yangSchemaNodeIdentifier, YangSchemaNode yangSchemaNode) {
+ // TODO
+ }
+
+ @Override
+ public YangSchemaNodeType getYangSchemaNodeType() {
+ return YangSchemaNodeType.YANG_SINGLE_INSTANCE_NODE;
+ }
+
+ /**
+ * Returns the when.
+ *
+ * @return the when
+ */
+ @Override
+ public YangWhen getWhen() {
+ return when;
+ }
+
+ /**
+ * Sets the when.
+ *
+ * @param when the when to set
+ */
+ @Override
+ public void setWhen(YangWhen when) {
+ this.when = when;
+ }
+
+ /**
+ * Returns the config flag.
+ *
+ * @return the isConfig
+ */
+ @Override
+ public boolean isConfig() {
+ return isConfig;
+ }
+
+ /**
+ * Sets the config flag.
+ *
+ * @param isConfig the config flag
+ */
+ @Override
+ public void setConfig(boolean isConfig) {
+ this.isConfig = isConfig;
+ }
+
+ /**
+ * Returns the description.
+ *
+ * @return the description
+ */
+ @Override
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Sets the description.
+ *
+ * @param description set the description
+ */
+ @Override
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * Returns the textual reference.
+ *
+ * @return the reference
+ */
+ @Override
+ public String getReference() {
+ return reference;
+ }
+
+ /**
+ * Sets the textual reference.
+ *
+ * @param reference the reference to set
+ */
+ @Override
+ public void setReference(String reference) {
+ this.reference = reference;
+ }
+
+ /**
+ * Returns the status.
+ *
+ * @return the status
+ */
+ @Override
+ public YangStatusType getStatus() {
+ return status;
+ }
+
+ /**
+ * Sets the status.
+ *
+ * @param status the status to set
+ */
+ @Override
+ public void setStatus(YangStatusType status) {
+ this.status = status;
+ }
+
+ /**
+ * Returns the type of the data.
+ *
+ * @return returns ANYDATA_DATA
+ */
+ @Override
+ public YangConstructType getYangConstructType() {
+ return YangConstructType.ANYDATA_DATA;
+ }
+
+ /**
+ * Validates the data on entering the corresponding parse tree node.
+ *
+ * @throws DataModelException a violation of data model rules
+ */
+ @Override
+ public void validateDataOnEntry()
+ throws DataModelException {
+ // TODO auto-generated method stub, to be implemented by parser
+ }
+
+ /**
+ * Validates the data on exiting the corresponding parse tree node.
+ *
+ * @throws DataModelException a violation of data model rules
+ */
+ @Override
+ public void validateDataOnExit()
+ throws DataModelException {
+ // TODO runtime validation is required.
+ }
+
+ @Override
+ public void detectCollidingChild(String identifierName,
+ YangConstructType dataType)
+ throws DataModelException {
+ // Asks helper to detect colliding child.
+ detectCollidingChildUtil(identifierName, dataType, this);
+ }
+
+ @Override
+ public void detectSelfCollision(String identifierName,
+ YangConstructType dataType)
+ throws DataModelException {
+ if (getName().equals(identifierName)) {
+ throw new DataModelException(
+ "YANG file error: Duplicate input identifier detected," +
+ " same as container \"" +
+ getName() + " in " +
+ getLineNumber() + " at " +
+ getCharPosition() +
+ " in " + getFileName() + "\"");
+ }
+ }
+
+ @Override
+ public List<YangIfFeature> getIfFeatureList() {
+ return ifFeatureList;
+ }
+
+ @Override
+ public void addIfFeatureList(YangIfFeature ifFeature) {
+ ifFeatureList.add(ifFeature);
+ }
+
+ @Override
+ public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
+ this.ifFeatureList = ifFeatureList;
+ }
+
+ @Override
+ public List<YangMust> getListOfMust() {
+ return mustConstraintList;
+ }
+
+ @Override
+ public void setListOfMust(List<YangMust> mustConstraintList) {
+ this.mustConstraintList = mustConstraintList;
+ }
+
+ @Override
+ public boolean isMandatory() {
+ return isMandatory;
+ }
+
+ @Override
+ public void setMandatory(boolean isReq) {
+ isMandatory = isReq;
+ }
+
+ @Override
+ public void addMust(YangMust must) {
+ mustConstraintList.add(must);
+ }
+
+ @Override
+ public SchemaContext getChildContext(SchemaId schemaId) {
+ checkNotNull(schemaId, E_ID);
+ YangSchemaNodeIdentifier id = getNodeIdFromSchemaId(
+ schemaId, getNameSpace().getModuleNamespace());
+ try {
+ YangSchemaNode node = getChildSchema(id).getSchemaNode();
+ if (node instanceof SchemaDataNode) {
+ return node;
+ } else {
+ throw new IllegalArgumentException(errorMsg(FMT_NOT_EXIST,
+ schemaId.name(),
+ getName()));
+ }
+ } catch (DataModelException e) {
+ throw new IllegalArgumentException(e.getMessage());
+ }
+ }
+}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
index 17ac363..937d9f7 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
@@ -92,7 +92,7 @@
implements YangLeavesHolder, YangDesc, YangReference, Parsable,
CollisionDetector, YangReferenceResolver, RpcNotificationContainer,
YangFeatureHolder, YangIsFilterContentNodes, YangNamespace,
- YangDeviationHolder {
+ YangDeviationHolder, YangVersionHolder {
private static final long serialVersionUID = 806201610L;
@@ -170,7 +170,7 @@
/**
* YANG version.
*/
- private byte version;
+ private String version;
/*-
* Reference RFC 6020.
@@ -639,7 +639,7 @@
*
* @return the version
*/
- public byte getVersion() {
+ public String getVersion() {
return version;
}
@@ -648,7 +648,7 @@
*
* @param version the version to set
*/
- public void setVersion(byte version) {
+ public void setVersion(String version) {
this.version = version;
}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
index a37d262..842bca1 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
@@ -29,6 +29,7 @@
import static org.onosproject.yang.compiler.datamodel.TraversalType.CHILD;
import static org.onosproject.yang.compiler.datamodel.TraversalType.PARENT;
import static org.onosproject.yang.compiler.datamodel.TraversalType.SIBLING;
+import static org.onosproject.yang.compiler.datamodel.YangNodeType.ANYDATA_NODE;
import static org.onosproject.yang.compiler.datamodel.YangNodeType.RPC_NODE;
import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.addUnresolvedAugment;
import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.cloneListOfLeaf;
@@ -1027,8 +1028,8 @@
if (this instanceof SchemaDataNode) {
parentContext = getParentSchemaContext(this.getParent());
- // As rpc node is not leaf holder
- if (this.nodeType != RPC_NODE) {
+ // As rpc and anydata node is not leaf holder
+ if (nodeType != RPC_NODE && nodeType != ANYDATA_NODE) {
((YangLeavesHolder) this).setLeafParentContext();
}
// setting the schema Id
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNodeType.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNodeType.java
index 190d85c..9bf0b88 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNodeType.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNodeType.java
@@ -117,5 +117,10 @@
/**
* Deviation node.
*/
- DEVIATION_NODE
+ DEVIATION_NODE,
+
+ /**
+ * Anydata node.
+ */
+ ANYDATA_NODE
}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
index 42173f4..5c80900 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
@@ -102,7 +102,7 @@
implements YangLeavesHolder, YangDesc, YangReference, Parsable,
CollisionDetector, YangReferenceResolver, RpcNotificationContainer,
YangFeatureHolder, YangIsFilterContentNodes, YangNamespace,
- YangDeviationHolder {
+ YangDeviationHolder, YangVersionHolder {
private static final long serialVersionUID = 806201614L;
@@ -170,7 +170,7 @@
/**
* YANG version.
*/
- private byte version;
+ private String version;
/**
* Prefix of parent module.
@@ -625,7 +625,7 @@
*
* @return the version
*/
- public byte getVersion() {
+ public String getVersion() {
return version;
}
@@ -634,7 +634,7 @@
*
* @param version the version to set
*/
- public void setVersion(byte version) {
+ public void setVersion(String version) {
this.version = version;
}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java
new file mode 100644
index 0000000..a6f7233
--- /dev/null
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.datamodel;
+
+/**
+ * Abstraction of YANG version entity. It is used categories the node which
+ * can hold the YANG version
+ */
+public interface YangVersionHolder {
+
+ /**
+ * Returns the version.
+ *
+ * @return the version
+ */
+ String getVersion();
+}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/javadatamodel/YangJavaAnydata.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/javadatamodel/YangJavaAnydata.java
new file mode 100644
index 0000000..3ff05d6
--- /dev/null
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/javadatamodel/YangJavaAnydata.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.datamodel.javadatamodel;
+
+import org.onosproject.yang.compiler.datamodel.YangAnydata;
+
+/**
+ * Represents YANG java anydata.
+ */
+public class YangJavaAnydata extends YangAnydata {
+
+ private static final long serialVersionUID = 208201434L;
+
+ protected JavaFileInfo javaFileInfo;
+
+ /**
+ * Returns java file info.
+ *
+ * @return java file info
+ */
+ public JavaFileInfo getJavaFileInfo() {
+ return javaFileInfo;
+ }
+
+ @Override
+ public String getJavaPackage() {
+ return getJavaFileInfo().getPackage();
+ }
+
+ @Override
+ public String getJavaClassNameOrBuiltInType() {
+ return getJavaFileInfo().getJavaName();
+ }
+
+ @Override
+ public String getJavaAttributeName() {
+ return getJavaFileInfo().getJavaAttributeName();
+ }
+}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/YangConstructType.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/YangConstructType.java
index 28e7707..a196c2b 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/YangConstructType.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/YangConstructType.java
@@ -437,7 +437,12 @@
/**
* Identifies unknown statement data.
*/
- UNKNOWN_STATEMENT;
+ UNKNOWN_STATEMENT,
+
+ /**
+ * Identifies the YANG anydata element parsed data.
+ */
+ ANYDATA_DATA;
/**
* Returns the YANG construct keyword corresponding to enum values.
@@ -616,6 +621,8 @@
return "deviate-replace";
case UNKNOWN_STATEMENT:
return "unknown-statement";
+ case ANYDATA_DATA:
+ return "anydata";
default:
return "yang";
}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/antlrgencode/GeneratedYangListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/antlrgencode/GeneratedYangListener.java
index cc7c0dc..432a122 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/antlrgencode/GeneratedYangListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/antlrgencode/GeneratedYangListener.java
@@ -1758,4 +1758,18 @@
* @param currentContext current context in the parsed tree
*/
void exitUnknown2(Unknown2Context currentContext);
+ /**
+ * Enters a parse tree produced by GeneratedYangParser for grammar rule
+ * anydataStatement.
+ *
+ * @param currentContext current context in the parsed tree
+ */
+ void enterAnydataStatement(AnydataStatementContext currentContext);
+ /**
+ * Exits a parse tree produced by GeneratedYangParser for grammar rule
+ * anydataStatement.
+ *
+ * @param currentContext current context in the parsed tree
+ */
+ void exitAnydataStatement(AnydataStatementContext currentContext);
}
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 dba4193..749843f 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
@@ -23,6 +23,8 @@
import org.onosproject.yang.compiler.datamodel.utils.Parsable;
import org.onosproject.yang.compiler.datamodel.utils.YangConstructType;
import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangListener;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.AnydataStatementContext;
+import org.onosproject.yang.compiler.parser.impl.listeners.AnydataListener;
import org.onosproject.yang.compiler.parser.impl.listeners.AppDataStructureListener;
import org.onosproject.yang.compiler.parser.impl.listeners.AppExtendedNameListener;
import org.onosproject.yang.compiler.parser.impl.listeners.ArgumentListener;
@@ -1952,4 +1954,14 @@
public void exitUnknown2(Unknown2Context currentContext) {
// do nothing
}
+
+ @Override
+ public void enterAnydataStatement(AnydataStatementContext ctx) {
+ AnydataListener.processAnydataEntry(this, ctx);
+ }
+
+ @Override
+ public void exitAnydataStatement(AnydataStatementContext ctx) {
+ AnydataListener.processAnydataExit(this, ctx);
+ }
}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListener.java
new file mode 100644
index 0000000..b75cdf2
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListener.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.YangAnydata;
+import org.onosproject.yang.compiler.datamodel.YangAugment;
+import org.onosproject.yang.compiler.datamodel.YangCase;
+import org.onosproject.yang.compiler.datamodel.YangContainer;
+import org.onosproject.yang.compiler.datamodel.YangGrouping;
+import org.onosproject.yang.compiler.datamodel.YangInput;
+import org.onosproject.yang.compiler.datamodel.YangList;
+import org.onosproject.yang.compiler.datamodel.YangModule;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangNotification;
+import org.onosproject.yang.compiler.datamodel.YangOutput;
+import org.onosproject.yang.compiler.datamodel.YangSubModule;
+import org.onosproject.yang.compiler.datamodel.YangVersionHolder;
+import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.AnydataStatementContext;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.ANYDATA_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.CONFIG_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.MANDATORY_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.STATUS_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.WHEN_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.getValidIdentifier;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.getParentNodeConfig;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne;
+import static org.onosproject.yang.compiler.translator.tojava.YangDataModelFactory.getYangAnydataNode;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE_DOT_ONE;
+
+/*
+ * Reference: RFC7950 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC7950
+ * anydata-stmt = anydata-keyword sep identifier-arg-str optsep
+ * (";" /
+ * "{" stmtsep
+ * ;; these stmts can appear in any order
+ * [when-stmt]
+ * *if-feature-stmt
+ * *must-stmt
+ * [config-stmt]
+ * [mandatory-stmt]
+ * [status-stmt]
+ * [description-stmt]
+ * [reference-stmt]
+ * "}") stmtsep
+ *
+ * ANTLR grammar rule
+ * anydataStatement : ANYDATA_KEYWORD identifier (STMTEND |
+ * LEFT_CURLY_BRACE stmtSep (whenStatement | ifFeatureStatement
+ * | mustStatement | configStatement | mandatoryStatement
+ * | statusStatement | descriptionStatement | referenceStatement)*
+ * RIGHT_CURLY_BRACE) stmtSep;
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "anydata"
+ * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 7950.
+ */
+public final class AnydataListener {
+
+ /**
+ * Creates a new anydata listener.
+ */
+ private AnydataListener() {
+ }
+
+ /**
+ * It is called when parser receives an input matching the grammar rule
+ * (anydata), performs validation and updates the data model tree.
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processAnydataEntry(TreeWalkListener listener,
+ AnydataStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, ANYDATA_DATA, ctx.identifier()
+ .getText(), ENTRY);
+
+ String identifier = getValidIdentifier(ctx.identifier().getText(), ANYDATA_DATA, ctx);
+
+ // Validate sub statement cardinality.
+ validateSubStatementsCardinality(ctx);
+
+ // Check for identifier collision
+ int line = ctx.getStart().getLine();
+ int charPositionInLine = ctx.getStart().getCharPositionInLine();
+ detectCollidingChildUtil(listener, line, charPositionInLine, identifier, ANYDATA_DATA);
+
+ YangAnydata anyData = getYangAnydataNode(JAVA_GENERATION);
+ anyData.setName(identifier);
+
+ anyData.setLineNumber(line);
+ anyData.setCharPosition(charPositionInLine);
+ anyData.setFileName(listener.getFileName());
+ /*
+ * If "config" is not specified, the default is the same as the parent
+ * schema node's "config" value.
+ */
+ if (ctx.configStatement().isEmpty()) {
+ boolean parentConfig = getParentNodeConfig(listener);
+ anyData.setConfig(parentConfig);
+ }
+
+ Parsable curData = listener.getParsedDataStack().peek();
+ // Module/Submodule yang version check to make sure anydata supported
+ // version
+ if (!((YangVersionHolder) listener.getParsedDataStack().get(0))
+ .getVersion().equals(ONE_DOT_ONE)) {
+ throw new ParserException("YANG file error : anydata with name " + ctx.identifier()
+ .getText() + " at line number " + line + " in " + listener
+ .getFileName() + " is feature of YANG version 1.1");
+ }
+ if (curData instanceof YangModule || curData instanceof YangSubModule
+ || curData instanceof YangContainer || curData instanceof YangList
+ || curData instanceof YangCase || curData instanceof YangNotification
+ || curData instanceof YangInput || curData instanceof YangOutput
+ || curData instanceof YangAugment || curData instanceof YangGrouping) {
+ YangNode curNode = (YangNode) curData;
+ try {
+ curNode.addChild(anyData);
+ } catch (DataModelException e) {
+ throw new ParserException(constructExtendedListenerErrorMessage(
+ UNHANDLED_PARSED_DATA, ANYDATA_DATA,
+ ctx.identifier().getText(), ENTRY, e.getMessage()));
+ }
+ listener.getParsedDataStack().push(anyData);
+ } else {
+ throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, ANYDATA_DATA,
+ ctx.identifier().getText(), ENTRY));
+ }
+ }
+
+ /**
+ * It is called when parser exits from grammar rule (anydata), it perform
+ * validations and updates the data model tree.
+ *
+ * @param listener listener's object
+ * @param ctx context object of the grammar rule
+ */
+ public static void processAnydataExit(TreeWalkListener listener,
+ AnydataStatementContext ctx) {
+
+ // Check for stack to be non empty.
+ checkStackIsNotEmpty(listener, MISSING_HOLDER, ANYDATA_DATA, ctx.identifier().getText(), EXIT);
+
+ if (listener.getParsedDataStack().peek() instanceof YangAnydata) {
+ listener.getParsedDataStack().pop();
+ } else {
+ throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, ANYDATA_DATA,
+ ctx.identifier().getText(), EXIT));
+ }
+ }
+
+ /**
+ * Validates the cardinality of anydata sub-statements as per grammar.
+ *
+ * @param ctx context object of the grammar rule
+ */
+ private static void validateSubStatementsCardinality(AnydataStatementContext ctx) {
+
+ String text = ctx.identifier().getText();
+ validateCardinalityMaxOne(ctx.whenStatement(), WHEN_DATA, ANYDATA_DATA, text);
+ validateCardinalityMaxOne(ctx.configStatement(), CONFIG_DATA, ANYDATA_DATA, text);
+ validateCardinalityMaxOne(ctx.mandatoryStatement(), MANDATORY_DATA, ANYDATA_DATA, text);
+ validateCardinalityMaxOne(ctx.statusStatement(), STATUS_DATA, ANYDATA_DATA, text);
+ validateCardinalityMaxOne(ctx.descriptionStatement(), DESCRIPTION_DATA, ANYDATA_DATA, text);
+ validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA, ANYDATA_DATA, text);
+ }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AugmentListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AugmentListener.java
index dbe46a8..5183cb0 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AugmentListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AugmentListener.java
@@ -197,21 +197,22 @@
*/
private static void valSubStatCardinality(AugmentStatementContext ctx) {
+ String text = ctx.augment().getText();
validateCardinalityMaxOne(ctx.statusStatement(), STATUS_DATA,
- AUGMENT_DATA, ctx.augment().getText());
+ AUGMENT_DATA, text);
validateCardinalityMaxOne(ctx.descriptionStatement(), DESCRIPTION_DATA,
- AUGMENT_DATA, ctx.augment().getText());
+ AUGMENT_DATA, text);
validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA,
- AUGMENT_DATA, ctx.augment().getText());
+ AUGMENT_DATA, text);
validateCardinalityMaxOne(ctx.whenStatement(), WHEN_DATA, AUGMENT_DATA,
- ctx.augment().getText());
+ text);
validateCardinalityEitherOne(ctx.dataDefStatement(), DATA_DEF_DATA,
ctx.caseStatement(), CASE_DATA,
- AUGMENT_DATA, ctx.augment().getText(),
+ AUGMENT_DATA, text,
ctx);
}
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 7185cb2..b182e12 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
@@ -50,6 +50,7 @@
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty;
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
import static org.onosproject.yang.compiler.translator.tojava.YangDataModelFactory.getYangModuleNode;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE;
/*
* Reference: RFC6020 and YANG ANTLR Grammar
@@ -103,7 +104,7 @@
yangModule.setFileName(listener.getFileName());
if (ctx.moduleBody().moduleHeaderStatement().yangVersionStatement() == null) {
- yangModule.setVersion((byte) 1);
+ yangModule.setVersion(ONE);
}
listener.getParsedDataStack().push(yangModule);
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 678aa64..cc45272 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
@@ -41,6 +41,7 @@
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty;
import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
import static org.onosproject.yang.compiler.translator.tojava.YangDataModelFactory.getYangSubModuleNode;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE;
/*
* Reference: RFC6020 and YANG ANTLR Grammar
@@ -96,7 +97,7 @@
yangSubModule.setCharPosition(ctx.getStart().getCharPositionInLine());
yangSubModule.setFileName(listener.getFileName());
if (ctx.submoduleBody().submoduleHeaderStatement().yangVersionStatement() == null) {
- yangSubModule.setVersion((byte) 1);
+ yangSubModule.setVersion(ONE);
}
listener.getParsedDataStack().push(yangSubModule);
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListener.java
index 69808e4..1110aae 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListener.java
@@ -89,7 +89,7 @@
// Check for stack to be non empty.
checkStackIsNotEmpty(listener, MISSING_HOLDER, VERSION_DATA, ctx.version().getText(), ENTRY);
- byte version = getValidVersion(ctx);
+ String version = getValidVersion(ctx);
// Obtain the node of the stack.
Parsable tmpNode = listener.getParsedDataStack().peek();
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 25ec87b..538e863 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
@@ -72,6 +72,8 @@
import static org.onosproject.yang.compiler.utils.UtilConstants.FALSE;
import static org.onosproject.yang.compiler.utils.UtilConstants.IN;
import static org.onosproject.yang.compiler.utils.UtilConstants.INVALID_TREE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE_DOT_ONE;
import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_SQUARE_BRACKET;
import static org.onosproject.yang.compiler.utils.UtilConstants.QUOTES;
import static org.onosproject.yang.compiler.utils.UtilConstants.SLASH;
@@ -100,7 +102,6 @@
private static final Pattern PREDICATE =
Pattern.compile("\\[(.*?)\\]");
private static final String XML = "xml";
- private static final String ONE = "1";
private static final int IDENTIFIER_LENGTH = 64;
private static final String DATE_FORMAT = "yyyy-MM-dd";
private static final String REGEX_EQUAL = "[=]";
@@ -201,17 +202,16 @@
* @param ctx version context object of the grammar rule
* @return valid version
*/
- public static byte getValidVersion(YangVersionStatementContext ctx) {
+ public static String getValidVersion(YangVersionStatementContext ctx) {
String value = removeQuotesAndHandleConcat(ctx.version().getText());
- if (!value.equals(ONE)) {
- ParserException parserException = new ParserException("YANG file error: Input version not supported");
- parserException.setLine(ctx.getStart().getLine());
- parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
- throw parserException;
+ if (value.equals(ONE) || value.equals(ONE_DOT_ONE)) {
+ return value;
}
-
- return Byte.valueOf(value);
+ ParserException parserException = new ParserException("YANG file error: Input version not supported");
+ 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 7167f7b..e30e150 100644
--- a/compiler/base/parser/src/main/resources/GeneratedYang.g4
+++ b/compiler/base/parser/src/main/resources/GeneratedYang.g4
@@ -370,7 +370,8 @@
* list-stmt /
* choice-stmt /
* anyxml-stmt /
- * uses-stmt
+ * uses-stmt /
+ * anydata-stmt
*/
dataDefStatement : containerStatement
| leafStatement
@@ -378,7 +379,8 @@
| listStatement
| choiceStatement
| anyxmlStatement
- | usesStatement;
+ | usesStatement
+ | anydataStatement;
/**
* if-feature-stmt = if-feature-keyword sep identifier-ref-arg-str
@@ -951,7 +953,7 @@
* anyxml-stmt
*/
shortCaseStatement : containerStatement | leafStatement | leafListStatement
- | listStatement | anyxmlStatement;
+ | listStatement | anyxmlStatement | anydataStatement;
/**
* case-stmt = case-keyword sep identifier-arg-str optsep
@@ -1357,6 +1359,28 @@
*/
defaultDenyAllStatement : DEFAULT_DENY_ALL STMTEND;
+
+ /**
+ * anydata-stmt = anydata-keyword sep identifier-arg-str optsep
+ * (";" /
+ * "{" stmtsep
+ * ;; these stmts can appear in any order
+ * [when-stmt]
+ * *if-feature-stmt
+ * *must-stmt
+ * [config-stmt]
+ * [mandatory-stmt]
+ * [status-stmt]
+ * [description-stmt]
+ * [reference-stmt]
+ * "}") stmtsep
+ */
+ anydataStatement : ANYDATA_KEYWORD identifier (STMTEND |
+ LEFT_CURLY_BRACE stmtSep (whenStatement | ifFeatureStatement
+ | mustStatement | configStatement | mandatoryStatement
+ | statusStatement | descriptionStatement | referenceStatement)*
+ RIGHT_CURLY_BRACE) stmtSep;
+
/**
* unknown-statement = prefix ":" identifier [sep string] optsep
* (";" / "{" *unknown-statement2 "}")
@@ -1456,4 +1480,5 @@
| FALSE_KEYWORD | MAX_KEYWORD | MIN_KEYWORD | NOT_SUPPORTED_KEYWORD | OBSOLETE_KEYWORD
| REPLACE_KEYWORD | SYSTEM_KEYWORD | TRUE_KEYWORD | UNBOUNDED_KEYWORD | USER_KEYWORD
| COMPILER_ANNOTATION_KEYWORD | APP_DATA_STRUCTURE_KEYWORD | DATA_STRUCTURE_KEYWORD
- | APP_EXTENDED_KEYWORD | DEFAULT_DENY_WRITE_KEYWORD | DEFAULT_DENY_ALL_KEYWORD;
+ | APP_EXTENDED_KEYWORD | DEFAULT_DENY_WRITE_KEYWORD | DEFAULT_DENY_ALL_KEYWORD
+ | ANYDATA_KEYWORD;
diff --git a/compiler/base/parser/src/main/resources/YangLexer.g4 b/compiler/base/parser/src/main/resources/YangLexer.g4
index 4f190b9..7a5e79c 100644
--- a/compiler/base/parser/src/main/resources/YangLexer.g4
+++ b/compiler/base/parser/src/main/resources/YangLexer.g4
@@ -118,6 +118,7 @@
DEFAULT_DENY_WRITE : IDENTIFIER COLON DEFAULT_DENY_WRITE_KEYWORD;
DEFAULT_DENY_ALL_KEYWORD : 'default-deny-all';
DEFAULT_DENY_ALL : IDENTIFIER COLON DEFAULT_DENY_ALL_KEYWORD;
+ ANYDATA_KEYWORD : 'anydata';
// Lexer tokens to be skipped
COMMENT
diff --git a/compiler/base/parser/src/main/resources/YangLexer.tokens b/compiler/base/parser/src/main/resources/YangLexer.tokens
deleted file mode 100644
index 3192512..0000000
--- a/compiler/base/parser/src/main/resources/YangLexer.tokens
+++ /dev/null
@@ -1,199 +0,0 @@
-ANYXML_KEYWORD=1
-ARGUMENT_KEYWORD=2
-AUGMENT_KEYWORD=3
-BASE_KEYWORD=4
-BELONGS_TO_KEYWORD=5
-BIT_KEYWORD=6
-CASE_KEYWORD=7
-CHOICE_KEYWORD=8
-CONFIG_KEYWORD=9
-CONTACT_KEYWORD=10
-CONTAINER_KEYWORD=11
-DEFAULT_KEYWORD=12
-DESCRIPTION_KEYWORD=13
-ENUM_KEYWORD=14
-ERROR_APP_TAG_KEYWORD=15
-ERROR_MESSAGE_KEYWORD=16
-EXTENSION_KEYWORD=17
-DEVIATION_KEYWORD=18
-DEVIATE_KEYWORD=19
-FEATURE_KEYWORD=20
-FRACTION_DIGITS_KEYWORD=21
-GROUPING_KEYWORD=22
-IDENTITY_KEYWORD=23
-IF_FEATURE_KEYWORD=24
-IMPORT_KEYWORD=25
-INCLUDE_KEYWORD=26
-INPUT_KEYWORD=27
-KEY_KEYWORD=28
-LEAF_KEYWORD=29
-LEAF_LIST_KEYWORD=30
-LENGTH_KEYWORD=31
-LIST_KEYWORD=32
-MANDATORY_KEYWORD=33
-MAX_ELEMENTS_KEYWORD=34
-MIN_ELEMENTS_KEYWORD=35
-MODULE_KEYWORD=36
-MUST_KEYWORD=37
-NAMESPACE_KEYWORD=38
-NOTIFICATION_KEYWORD=39
-ORDERED_BY_KEYWORD=40
-ORGANIZATION_KEYWORD=41
-OUTPUT_KEYWORD=42
-PATH_KEYWORD=43
-PATTERN_KEYWORD=44
-POSITION_KEYWORD=45
-PREFIX_KEYWORD=46
-PRESENCE_KEYWORD=47
-RANGE_KEYWORD=48
-REFERENCE_KEYWORD=49
-REFINE_KEYWORD=50
-REQUIRE_INSTANCE_KEYWORD=51
-REVISION_KEYWORD=52
-REVISION_DATE_KEYWORD=53
-RPC_KEYWORD=54
-STATUS_KEYWORD=55
-SUBMODULE_KEYWORD=56
-TYPE_KEYWORD=57
-TYPEDEF_KEYWORD=58
-UNIQUE_KEYWORD=59
-UNITS_KEYWORD=60
-USES_KEYWORD=61
-VALUE_KEYWORD=62
-WHEN_KEYWORD=63
-YANG_VERSION_KEYWORD=64
-YIN_ELEMENT_KEYWORD=65
-ADD_KEYWORD=66
-CURRENT_KEYWORD=67
-DELETE_KEYWORD=68
-DEPRECATED_KEYWORD=69
-FALSE_KEYWORD=70
-MAX_KEYWORD=71
-MIN_KEYWORD=72
-NOT_SUPPORTED_KEYWORD=73
-OBSOLETE_KEYWORD=74
-REPLACE_KEYWORD=75
-SYSTEM_KEYWORD=76
-TRUE_KEYWORD=77
-UNBOUNDED_KEYWORD=78
-USER_KEYWORD=79
-COMPILER_ANNOTATION_KEYWORD=80
-COMPILER_ANNOTATION=81
-APP_DATA_STRUCTURE_KEYWORD=82
-APP_DATA_STRUCTURE=83
-DATA_STRUCTURE_KEYWORD=84
-DATA_STRUCTURE=85
-DATA_STRUCTURE_KEY=86
-APP_EXTENDED_KEYWORD=87
-APP_EXTENDED=88
-DEFAULT_DENY_WRITE_KEYWORD=89
-DEFAULT_DENY_WRITE=90
-DEFAULT_DENY_ALL_KEYWORD=91
-DEFAULT_DENY_ALL=92
-COMMENT=93
-WS=94
-LINE_COMMENT=95
-INTEGER=96
-DATE_ARG=97
-LEFT_CURLY_BRACE=98
-RIGHT_CURLY_BRACE=99
-IDENTIFIER=100
-STMTEND=101
-DQUOTE=102
-COLON=103
-PLUS=104
-MINUS=105
-UNKNOWN_STATEMENT=106
-STRING=107
-'anyxml'=1
-'argument'=2
-'augment'=3
-'base'=4
-'belongs-to'=5
-'bit'=6
-'case'=7
-'choice'=8
-'config'=9
-'contact'=10
-'container'=11
-'default'=12
-'description'=13
-'enum'=14
-'error-app-tag'=15
-'error-message'=16
-'extension'=17
-'deviation'=18
-'deviate'=19
-'feature'=20
-'fraction-digits'=21
-'grouping'=22
-'identity'=23
-'if-feature'=24
-'import'=25
-'include'=26
-'input'=27
-'key'=28
-'leaf'=29
-'leaf-list'=30
-'length'=31
-'list'=32
-'mandatory'=33
-'max-elements'=34
-'min-elements'=35
-'module'=36
-'must'=37
-'namespace'=38
-'notification'=39
-'ordered-by'=40
-'organization'=41
-'output'=42
-'path'=43
-'pattern'=44
-'position'=45
-'prefix'=46
-'presence'=47
-'range'=48
-'reference'=49
-'refine'=50
-'require-instance'=51
-'revision'=52
-'revision-date'=53
-'rpc'=54
-'status'=55
-'submodule'=56
-'type'=57
-'typedef'=58
-'unique'=59
-'units'=60
-'uses'=61
-'value'=62
-'when'=63
-'yang-version'=64
-'yin-element'=65
-'add'=66
-'current'=67
-'delete'=68
-'deprecated'=69
-'false'=70
-'max'=71
-'min'=72
-'not-supported'=73
-'obsolete'=74
-'replace'=75
-'system'=76
-'true'=77
-'unbounded'=78
-'user'=79
-'compiler-annotation'=80
-'app-data-structure'=82
-'data-structure'=84
-'app-extended-name'=87
-'default-deny-write'=89
-'default-deny-all'=91
-'{'=98
-'}'=99
-';'=101
-'"'=102
-':'=103
-'+'=104
-'-'=105
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListenerTest.java
new file mode 100644
index 0000000..d3ed0eb
--- /dev/null
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListenerTest.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.YangAnydata;
+import org.onosproject.yang.compiler.datamodel.YangList;
+import org.onosproject.yang.compiler.datamodel.YangModule;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangNodeType;
+import org.onosproject.yang.compiler.datamodel.YangStatusType;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+
+/**
+ * Test cases for testing anydata listener.
+ */
+public class AnydataListenerTest {
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ private final YangUtilsParserManager manager = new YangUtilsParserManager();
+
+ /**
+ * Checks anydata statement as sub-statement of module.
+ */
+ @Test
+ public void processModuleSubStatementAnydata() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel(
+ "src/test/resources/ModuleSubStatementAnydata.yang");
+
+ assertThat((node instanceof YangModule), is(true));
+
+ // Check whether the node type is set properly to module.
+ assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
+
+ // Check whether the module name is set correctly.
+ YangModule yangNode = (YangModule) node;
+ assertThat(yangNode.getName(), is("Test"));
+
+ // Check whether the anydata is child of module
+ YangAnydata anyData = (YangAnydata) yangNode.getChild();
+ assertThat(anyData.getName(), is("valid"));
+ }
+
+ /**
+ * Checks if anydata identifier in module is duplicate.
+ */
+ @Test(expected = ParserException.class)
+ public void processModuleDuplicateAnydata() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel(
+ "src/test/resources/ModuleDuplicateAnydata.yang");
+ }
+
+ /**
+ * Checks if anydata identifier in list is duplicate.
+ */
+ @Test(expected = ParserException.class)
+ public void processListDuplicateAnydata() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel(
+ "src/test/resources/ListDuplicateAnydata.yang");
+ }
+
+ /**
+ * Checks if anydata identifier collides with list at same level.
+ */
+ @Test(expected = ParserException.class)
+ public void processDuplicateAnydataAndList() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel(
+ "src/test/resources/DuplicateAnydataAndList.yang");
+ }
+
+ /**
+ * Checks anydata statement as sub-statement of list.
+ */
+ @Test
+ public void processListSubStatementAnydata() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel(
+ "src/test/resources/ListSubStatementAnydata.yang");
+
+ assertThat((node instanceof YangModule), is(true));
+
+ // Check whether the node type is set properly to module.
+ assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
+
+ // Check whether the module name is set correctly.
+ YangModule yangNode = (YangModule) node;
+ assertThat(yangNode.getName(), is("Test"));
+
+ // Check whether the list is child of module
+ YangList yangList1 = (YangList) yangNode.getChild();
+ assertThat(yangList1.getName(), is("ospf"));
+
+ Iterator<String> keyList = yangList1.getKeyList().iterator();
+ assertThat(keyList.next(), is("process-id"));
+
+ // Check whether the list is child of list
+ YangAnydata yangAnydata = (YangAnydata) yangList1.getChild();
+ assertThat(yangAnydata.getName(), is("interface"));
+ }
+
+ /**
+ * Checks anydata with all its sub-statements.
+ */
+ @Test
+ public void processAnydataSubStatements() throws IOException,
+ ParserException {
+
+ YangNode node = manager.getDataModel(
+ "src/test/resources/AnydataSubStatements.yang");
+
+ assertThat((node instanceof YangModule), is(true));
+
+ // Check whether the node type is set properly to module.
+ assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
+
+ // Check whether the module name is set correctly.
+ YangModule yangNode = (YangModule) node;
+ assertThat(yangNode.getName(), is("Test"));
+
+ // Check whether the anydata is child of module
+ YangAnydata yangAnydata = (YangAnydata) yangNode.getChild();
+
+ // Check whether anydata properties as set correctly.
+ assertThat(yangAnydata.getName(), is("ospf"));
+
+ assertThat(yangAnydata.isConfig(), is(true));
+ assertThat(yangAnydata.getDescription(), is("\"anydata description\""));
+ assertThat(yangAnydata.getStatus(), is(YangStatusType.CURRENT));
+ assertThat(yangAnydata.getReference(), is("\"anydata reference\""));
+ }
+
+ /**
+ * Checks cardinality of sub-statements of anydata.
+ */
+ @Test
+ public void processAnydataSubStatementCardinality() throws IOException,
+ ParserException {
+ thrown.expect(ParserException.class);
+ thrown.expectMessage("YANG file error: \"reference\" is defined more" +
+ " than once in \"anydata valid\".");
+ YangNode node = manager.getDataModel(
+ "src/test/resources/AnydataSubStatementCardinality.yang");
+ }
+
+ /**
+ * Checks anydata as root node.
+ */
+ @Test
+ public void processAnydataRootNode() throws IOException, ParserException {
+ thrown.expect(ParserException.class);
+ thrown.expectMessage("no viable alternative at input 'anydata'");
+ YangNode node = manager.getDataModel(
+ "src/test/resources/AnydataRootNode.yang");
+ }
+
+ /**
+ * Checks invalid identifier for anydata statement.
+ */
+ @Test
+ public void processAnydataInvalidIdentifier() throws IOException,
+ ParserException {
+ thrown.expect(ParserException.class);
+ thrown.expectMessage(
+ "YANG file error : anydata name 1valid is not valid.");
+ YangNode node = manager.getDataModel(
+ "src/test/resources/AnydataInvalidIdentifier.yang");
+ }
+
+ /**
+ * Checks invalid identifier for anydata statement.
+ */
+ @Test
+ public void processAnydataInvalidVersionTest() throws IOException,
+ ParserException {
+ thrown.expect(ParserException.class);
+ thrown.expectMessage(
+ "YANG file error : anydata with name valid at line number 5 " +
+ "in src/test/resources/AnydataInvalidVersion.yang is feature of YANG version 1.1");
+ YangNode node = manager.getDataModel(
+ "src/test/resources/AnydataInvalidVersion.yang");
+ }
+}
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListenerTest.java
index 19fdd5f..8371e88 100644
--- a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListenerTest.java
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListenerTest.java
@@ -53,7 +53,7 @@
// Check whether the module name is set correctly.
assertThat(yangNode.getName(), is("Test"));
// Checks for the version value in data model tree.
- assertThat(yangNode.getVersion(), is((byte) 1));
+ assertThat(yangNode.getVersion(), is("1"));
// Checks identifier of belongsto in data model tree.
assertThat(yangNode.getBelongsTo().getBelongsToModuleName(), is("ONOS"));
// Checks for the version value in data model tree.
@@ -79,7 +79,7 @@
// Check whether the module name is set correctly.
assertThat(yangNode.getName(), is("Test"));
// Checks for the version value in data model tree.
- assertThat(yangNode.getVersion(), is((byte) 1));
+ assertThat(yangNode.getVersion(), is("1"));
// Checks identifier of belongsto in data model tree.
assertThat(yangNode.getBelongsTo().getBelongsToModuleName(), is("ONOS"));
// Checks for the version value in data model tree.
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListenerTest.java
index 21bd740..bd775c8 100644
--- a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListenerTest.java
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListenerTest.java
@@ -52,7 +52,7 @@
YangNode node = manager.getDataModel("src/test/resources/VersionValidEntry.yang");
// Checks for the version value in data model tree.
- assertThat(((YangModule) node).getVersion(), is((byte) 1));
+ assertThat(((YangModule) node).getVersion(), is("1"));
}
/**
@@ -64,7 +64,7 @@
YangNode node = manager.getDataModel("src/test/resources/ValidVersionWithDoubleQuotes.yang");
// Checks for the version value in data model tree.
- assertThat(((YangModule) node).getVersion(), is((byte) 1));
+ assertThat(((YangModule) node).getVersion(), is("1"));
}
/**
@@ -76,7 +76,7 @@
YangNode node = manager.getDataModel("src/test/resources/VersionNotPresent.yang");
// Checks for the version value in data model tree.
- assertThat(((YangModule) node).getVersion(), is((byte) 1));
+ assertThat(((YangModule) node).getVersion(), is("1"));
}
/**
@@ -97,7 +97,7 @@
YangNode node = manager.getDataModel("src/test/resources/VersionOrder.yang");
// Checks for the version value in data model tree.
- assertThat(((YangModule) node).getVersion(), is((byte) 1));
+ assertThat(((YangModule) node).getVersion(), is("1"));
}
/**
diff --git a/compiler/base/parser/src/test/resources/AnydataInvalidIdentifier.yang b/compiler/base/parser/src/test/resources/AnydataInvalidIdentifier.yang
new file mode 100644
index 0000000..83b7547
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataInvalidIdentifier.yang
@@ -0,0 +1,9 @@
+module Test {
+ yang-version 1.1;
+ namespace http://huawei.com;
+ prefix Ant;
+ anydata 1valid {
+ status current;
+ reference "RFC 7950";
+ }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/AnydataInvalidVersion.yang b/compiler/base/parser/src/test/resources/AnydataInvalidVersion.yang
new file mode 100644
index 0000000..74d1d3c
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataInvalidVersion.yang
@@ -0,0 +1,9 @@
+module Test {
+ yang-version 1;
+ namespace http://huawei.com;
+ prefix Ant;
+ anydata valid {
+ status current;
+ reference "RFC 7950";
+ }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/AnydataRootNode.yang b/compiler/base/parser/src/test/resources/AnydataRootNode.yang
new file mode 100644
index 0000000..393e8e3
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataRootNode.yang
@@ -0,0 +1,4 @@
+anydata valid {
+ status current;
+ reference "RFC 7950";
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/AnydataSubStatementCardinality.yang b/compiler/base/parser/src/test/resources/AnydataSubStatementCardinality.yang
new file mode 100644
index 0000000..84c8f06
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataSubStatementCardinality.yang
@@ -0,0 +1,10 @@
+module Test {
+ yang-version 1.1;
+ namespace http://huawei.com;
+ prefix Ant;
+ anydata valid {
+ reference "RFC 7950";
+ reference "RFC 7950";
+ status current;
+ }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/AnydataSubStatements.yang b/compiler/base/parser/src/test/resources/AnydataSubStatements.yang
new file mode 100644
index 0000000..fb075c4
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataSubStatements.yang
@@ -0,0 +1,11 @@
+module Test {
+ yang-version 1.1;
+ namespace http://huawei.com;
+ prefix Ant;
+ anydata ospf {
+ config true;
+ description "anydata description";
+ status current;
+ reference "anydata reference";
+ }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/DuplicateAnydataAndList.yang b/compiler/base/parser/src/test/resources/DuplicateAnydataAndList.yang
new file mode 100644
index 0000000..5574243
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/DuplicateAnydataAndList.yang
@@ -0,0 +1,25 @@
+module Test {
+ yang-version 1.1;
+ namespace http://huawei.com;
+ prefix Ant;
+ container ospf {
+ anydata valid {
+ status current;
+ reference "RFC 7950";
+ }
+ list valid {
+ key "process-id";
+ container interface {
+ leaf invalid-interval {
+ type "uint16";
+ units "seconds";
+ status current;
+ reference "RFC 6020";
+ }
+ }
+ leaf process-id {
+ type "string";
+ }
+ }
+ }
+}
diff --git a/compiler/base/parser/src/test/resources/ListDuplicateAnydata.yang b/compiler/base/parser/src/test/resources/ListDuplicateAnydata.yang
new file mode 100644
index 0000000..6313c69
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ListDuplicateAnydata.yang
@@ -0,0 +1,19 @@
+module Test {
+ yang-version 1.1;
+ namespace http://huawei.com;
+ prefix Ant;
+ list ospf {
+ key "process-id";
+ anydata interface {
+ status current;
+ reference "RFC 7950";
+ }
+ leaf process-id {
+ type "string";
+ }
+ anydata interface {
+ status current;
+ reference "RFC 7950";
+ }
+ }
+}
diff --git a/compiler/base/parser/src/test/resources/ListSubStatementAnydata.yang b/compiler/base/parser/src/test/resources/ListSubStatementAnydata.yang
new file mode 100644
index 0000000..375c42a
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ListSubStatementAnydata.yang
@@ -0,0 +1,15 @@
+module Test {
+ yang-version 1.1;
+ namespace http://huawei.com;
+ prefix Ant;
+ list ospf {
+ key "process-id";
+ anydata interface {
+ status current;
+ reference "RFC 7950";
+ }
+ leaf process-id {
+ type "string";
+ }
+ }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/ModuleDuplicateAnydata.yang b/compiler/base/parser/src/test/resources/ModuleDuplicateAnydata.yang
new file mode 100644
index 0000000..16fe694
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ModuleDuplicateAnydata.yang
@@ -0,0 +1,17 @@
+module Test {
+ yang-version 1.1;
+ namespace http://huawei.com;
+ prefix Ant;
+ anydata valid {
+ status current;
+ reference "RFC 7950";
+ }
+ anydata invalid {
+ status current;
+ reference "RFC 7950";
+ }
+ anydata valid {
+ status current;
+ reference "RFC 7950";
+ }
+}
diff --git a/compiler/base/parser/src/test/resources/ModuleSubStatementAnydata.yang b/compiler/base/parser/src/test/resources/ModuleSubStatementAnydata.yang
new file mode 100644
index 0000000..947f420
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ModuleSubStatementAnydata.yang
@@ -0,0 +1,9 @@
+module Test {
+ yang-version 1.1;
+ namespace http://huawei.com;
+ prefix Ant;
+ anydata valid {
+ status current;
+ reference "RFC 7950";
+ }
+}
\ No newline at end of file
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangDataModelFactory.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangDataModelFactory.java
index 87492b3..42ce3b5 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangDataModelFactory.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangDataModelFactory.java
@@ -15,6 +15,7 @@
*/
package org.onosproject.yang.compiler.translator.tojava;
+import org.onosproject.yang.compiler.datamodel.YangAnydata;
import org.onosproject.yang.compiler.datamodel.YangAugment;
import org.onosproject.yang.compiler.datamodel.YangCase;
import org.onosproject.yang.compiler.datamodel.YangChoice;
@@ -36,6 +37,7 @@
import org.onosproject.yang.compiler.datamodel.YangUses;
import org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage;
import org.onosproject.yang.compiler.translator.exception.TranslatorException;
+import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaAnydataTranslator;
import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaAugmentTranslator;
import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaCaseTranslator;
import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaChoiceTranslator;
@@ -165,6 +167,25 @@
* generated
* @return the corresponding inherited node based on the target language
*/
+ public static YangAnydata getYangAnydataNode(GeneratedLanguage
+ targetLanguage) {
+ switch (targetLanguage) {
+ case JAVA_GENERATION: {
+ return new YangJavaAnydataTranslator();
+ }
+ default: {
+ throw new TranslatorException("Only YANG to Java is supported.");
+ }
+ }
+ }
+
+ /**
+ * Returns based on the target language generate the inherited data model node.
+ *
+ * @param targetLanguage target language in which YANG mapping needs to be
+ * generated
+ * @return the corresponding inherited node based on the target language
+ */
public static YangIdentity getYangIdentityNode(GeneratedLanguage targetLanguage) {
switch (targetLanguage) {
case JAVA_GENERATION: {
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
index c99e0ff..563ef1a 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
@@ -16,6 +16,7 @@
package org.onosproject.yang.compiler.translator.tojava;
+import org.onosproject.yang.compiler.datamodel.ConflictResolveNode;
import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
import org.onosproject.yang.compiler.datamodel.YangAtomicPath;
import org.onosproject.yang.compiler.datamodel.YangAugment;
@@ -38,10 +39,10 @@
import org.onosproject.yang.compiler.datamodel.YangTranslatorOperatorNode;
import org.onosproject.yang.compiler.datamodel.YangType;
import org.onosproject.yang.compiler.datamodel.YangTypeHolder;
-import org.onosproject.yang.compiler.datamodel.ConflictResolveNode;
import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
import org.onosproject.yang.compiler.translator.exception.TranslatorException;
import org.onosproject.yang.compiler.translator.tojava.javamodel.JavaLeafInfoContainer;
+import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaAnydataTranslator;
import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaAugmentTranslator;
import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaEnumerationTranslator;
import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaInputTranslator;
@@ -289,6 +290,10 @@
*/
translator.getEnumTempFiles()
.addEnumAttributeToTempFiles((YangNode) info, config);
+ } else if (info instanceof YangJavaAnydataTranslator) {
+ // TODO remove this check if anydata code generation is not
+ // supported.
+ // Do nothing
} else if (!(info instanceof YangChoice) && !(info instanceof
YangRpc)) {
/*Do nothing, only the interface needs to be generated for choice*/
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java
new file mode 100644
index 0000000..9ac00e5
--- /dev/null
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.translator.tojava.javamodel;
+
+import org.onosproject.yang.compiler.datamodel.javadatamodel.YangJavaAnydata;
+import org.onosproject.yang.compiler.translator.exception.TranslatorException;
+import org.onosproject.yang.compiler.translator.tojava.JavaCodeGenerator;
+import org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorInfo;
+import org.onosproject.yang.compiler.translator.tojava.JavaFileInfoTranslator;
+import org.onosproject.yang.compiler.translator.tojava.TempJavaCodeFragmentFiles;
+import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
+
+import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
+
+/**
+ * Represents container information extended to support java code generation.
+ */
+public class YangJavaAnydataTranslator
+ extends YangJavaAnydata
+ implements JavaCodeGeneratorInfo, JavaCodeGenerator {
+
+ private static final long serialVersionUID = 806201630L;
+
+ /**
+ * File handle to maintain temporary java code fragments as per the code
+ * snippet types.
+ */
+ private transient TempJavaCodeFragmentFiles tempFileHandle;
+
+ /**
+ * Creates YANG java anydata object.
+ */
+ public YangJavaAnydataTranslator() {
+ super();
+ setJavaFileInfo(new JavaFileInfoTranslator());
+ getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
+ }
+
+ /**
+ * Returns the generated java file information.
+ *
+ * @return generated java file information
+ */
+ @Override
+ public JavaFileInfoTranslator getJavaFileInfo() {
+ if (javaFileInfo == null) {
+ throw new TranslatorException("Missing java info in java datamodel node " +
+ getName() + " in " +
+ getLineNumber() + " at " +
+ getCharPosition()
+ + " in " + getFileName());
+ }
+ return (JavaFileInfoTranslator) javaFileInfo;
+ }
+
+ /**
+ * Sets the java file info object.
+ *
+ * @param javaInfo java file info object
+ */
+ @Override
+ public void setJavaFileInfo(JavaFileInfoTranslator javaInfo) {
+ javaFileInfo = javaInfo;
+ }
+
+ /**
+ * Returns the temporary file handle.
+ *
+ * @return temporary file handle
+ */
+ @Override
+ public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
+ return tempFileHandle;
+ }
+
+ /**
+ * Sets temporary file handle.
+ *
+ * @param fileHandle temporary file handle
+ */
+ @Override
+ public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
+ tempFileHandle = fileHandle;
+ }
+
+ /**
+ * Prepare the information for java code generation corresponding to YANG
+ * anydata info.
+ *
+ * @param yangPlugin YANG plugin config
+ * @throws TranslatorException translator operation fail
+ */
+ @Override
+ public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
+ // TODO uncomment this part if code needs to be generated for anydata
+ // try {
+// generateCodeAndUpdateInParent(this, yangPlugin, false);
+// } catch (IOException e) {
+// throw new TranslatorException(
+// "Failed to prepare generate code entry for anydata node " +
+// getName() + " in " +
+// getLineNumber() + " at " +
+// getCharPosition()
+// + " in " + getFileName() + " " + e.getLocalizedMessage());
+// }
+ }
+
+ /**
+ * Create a java file using the YANG anydata info.
+ *
+ * @throws TranslatorException translator operation fail
+ */
+ @Override
+ public void generateCodeExit() throws TranslatorException {
+ // TODO uncomment this part if code needs to be generated for anydata
+// try {
+// generateJava(GENERATE_INTERFACE_WITH_BUILDER, this);
+// } catch (IOException e) {
+// throw new TranslatorException("Failed to generate code for " +
+// "anydata node " +
+// getName() + " in " +
+// getLineNumber() + " at " +
+// getCharPosition()
+// + " in " + getFileName() +
+// " " + e.getLocalizedMessage());
+// }
+ }
+}
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java
index 9c2dc06..8c530f1 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java
@@ -211,7 +211,7 @@
*/
public static String getDerivedPackage(YangIdentity id) {
String derPkg;
- byte version;
+ String version;
String moduleName;
YangRevision revision;
String nodeName;
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntax.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntax.java
index 2fed4fb..9e14b5b 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntax.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntax.java
@@ -36,6 +36,7 @@
import static org.onosproject.yang.compiler.utils.UtilConstants.COLON;
import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_BASE_PKG;
import static org.onosproject.yang.compiler.utils.UtilConstants.HYPHEN;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE_DOT_ONE;
import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
import static org.onosproject.yang.compiler.utils.UtilConstants.REGEX_WITH_ALL_SPECIAL_CHAR;
import static org.onosproject.yang.compiler.utils.UtilConstants.REVISION_PREFIX;
@@ -75,7 +76,7 @@
* @param resolver object of YANG to java naming conflict util
* @return the root package string
*/
- public static String getRootPackage(byte version, String name,
+ public static String getRootPackage(String version, String name,
YangRevision revision,
YangToJavaNamingConflictUtil resolver) {
@@ -97,7 +98,10 @@
* @param ver YANG version
* @return version
*/
- private static String getYangVersion(byte ver) {
+ private static String getYangVersion(String ver) {
+ if (ver.equals(ONE_DOT_ONE)) {
+ ver = "11";
+ }
return VERSION_PREFIX + ver;
}
diff --git a/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntaxTest.java b/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntaxTest.java
index a364a9d..6ef2d3a 100644
--- a/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntaxTest.java
+++ b/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntaxTest.java
@@ -147,7 +147,8 @@
public void getRootPackageTest()
throws ParseException {
conflictResolver.setPrefixForIdentifier(null);
- String rootPackage = getRootPackage((byte) 1, CHILD_PACKAGE, getYangRevision(DATE1), conflictResolver);
+ String rootPackage = getRootPackage("1", CHILD_PACKAGE,
+ getYangRevision(DATE1), conflictResolver);
assertThat(rootPackage.equals(UtilConstants.DEFAULT_BASE_PKG + UtilConstants.PERIOD + VERSION_NUMBER
+ UtilConstants.PERIOD + CHILD_WITH_PERIOD +
UtilConstants.PERIOD + DATE_WITH_REV1), is(true));
@@ -162,7 +163,8 @@
thrown.expect(ArrayIndexOutOfBoundsException.class);
thrown.expectMessage("The given prefix in pom.xml is invalid.");
conflictResolver.setPrefixForIdentifier(INVALID_PREFIX);
- String rootPackage1 = getRootPackage((byte) 1, INVALID_NAME_SPACE_FOR_INVALID_PREFIX, getYangRevision(DATE1),
+ String rootPackage1 = getRootPackage("1",
+ INVALID_NAME_SPACE_FOR_INVALID_PREFIX, getYangRevision(DATE1),
conflictResolver);
}
@@ -173,7 +175,8 @@
public void getRootPackageWithRevTest()
throws ParseException {
Date date = simpleDateFormat.parse(DATE2);
- String rootPkgWithRev = getRootPackage((byte) 1, CHILD_PACKAGE, getYangRevision(DATE2), null);
+ String rootPkgWithRev = getRootPackage("1", CHILD_PACKAGE,
+ getYangRevision(DATE2), null);
assertThat(rootPkgWithRev.equals(
UtilConstants.DEFAULT_BASE_PKG + UtilConstants.PERIOD + VERSION_NUMBER + UtilConstants.PERIOD +
CHILD_WITH_PERIOD + UtilConstants.PERIOD + DATE_WITH_REV2), is(true));
diff --git a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
index 5592395..b165204 100644
--- a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
+++ b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
@@ -1133,32 +1133,32 @@
*/
public static final Set<String> JAVA_KEY_WORDS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
- "abstract", "assert", "boolean", "break", "byte",
- "case", "catch", "char", "class", "const", "continue",
- "default", "do", "double", "else", "extends", "false",
- "final", "finally", "float", "for", "goto", "if",
- "implements", "import", "instanceof", "enum", "int",
- "interface", "long", "native", "new", "null",
- "package", "private", "protected", "public", "return",
- "short", "static", "strictfp", "super", "switch",
- "synchronized", "this", "throw", "throws", "transient",
- "true", "try", "void", "volatile", "while",
- "list", // Not a Java keyword
- "map", // Not a Java keyword
- "arrayList", // Not a Java keyword
- "hashMap", // Not a Java keyword
- "linkedList", // Not a Java keyword
- "notify", // method on Object
- "notifyAll", // method on Object
- "wait", // method on Object
- "getClass", // method on Object
- "hashCode", // method on Object
- "equals", // method on Object
- "toString", // method on Object
- "clone", // method on Object
- "finalize", // method on Object
- "Method", // Not a Java keyword
- "collections") // Not a Java keyword
+ "abstract", "assert", "boolean", "break", "byte",
+ "case", "catch", "char", "class", "const", "continue",
+ "default", "do", "double", "else", "extends", "false",
+ "final", "finally", "float", "for", "goto", "if",
+ "implements", "import", "instanceof", "enum", "int",
+ "interface", "long", "native", "new", "null",
+ "package", "private", "protected", "public", "return",
+ "short", "static", "strictfp", "super", "switch",
+ "synchronized", "this", "throw", "throws", "transient",
+ "true", "try", "void", "volatile", "while",
+ "list", // Not a Java keyword
+ "map", // Not a Java keyword
+ "arrayList", // Not a Java keyword
+ "hashMap", // Not a Java keyword
+ "linkedList", // Not a Java keyword
+ "notify", // method on Object
+ "notifyAll", // method on Object
+ "wait", // method on Object
+ "getClass", // method on Object
+ "hashCode", // method on Object
+ "equals", // method on Object
+ "toString", // method on Object
+ "clone", // method on Object
+ "finalize", // method on Object
+ "Method", // Not a Java keyword
+ "collections") // Not a Java keyword
));
/**
@@ -1633,6 +1633,11 @@
public static final String ONE = "1";
/**
+ * Static attribute for 1.1 keyword.
+ */
+ public static final String ONE_DOT_ONE = "1.1";
+
+ /**
* Static attribute for YANG node operation type attribute.
*/
public static final String OPERATION_TYPE_ATTRIBUTE =
@@ -1958,6 +1963,7 @@
public static final String IDENTITY = "_identity";
public static final String TYPEDEF = "_typedef";
+
// No instantiation.
private UtilConstants() {
}