[ONOS-4070] Translator of YANG union.
Change-Id: I5216687b6ea7cb6baeb3ef8e905719468370a1f4
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/HasType.java b/src/main/java/org/onosproject/yangutils/datamodel/HasType.java
new file mode 100644
index 0000000..e7a5c73
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/datamodel/HasType.java
@@ -0,0 +1,32 @@
+/*
+ * 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.yangutils.datamodel;
+
+import java.util.List;
+
+/**
+ * Represents the holder with type(s).
+ */
+public interface HasType {
+
+ /**
+ * Returns type list.
+ *
+ * @return type list
+ */
+ List<YangType<?>> getTypeList();
+}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java b/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java
index 35998d4..49eafff 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java
@@ -15,6 +15,8 @@
*/
package org.onosproject.yangutils.datamodel;
+import java.util.LinkedList;
+import java.util.List;
import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
import org.onosproject.yangutils.parser.Parsable;
import org.onosproject.yangutils.utils.YangConstructType;
@@ -48,10 +50,11 @@
* | units | 7.3.3 | 0..1 |-string |
* +--------------+---------+-------------+------------------+
*/
+
/**
* Represents data model node to maintain information defined in YANG typedef.
*/
-public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
+public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable, HasType {
/**
* Default value in string, needs to be converted to the target object,
@@ -90,10 +93,17 @@
private String units;
/**
+ * List of YANG type, for typedef it will have single type.
+ * This is done to unify the code with union.
+ */
+ private List<YangType<?>> typeList;
+
+ /**
* Creates a typedef node.
*/
public YangTypeDef() {
super(YangNodeType.TYPEDEF_NODE);
+ typeList = new LinkedList<>();
}
/**
@@ -180,7 +190,10 @@
* @return the data type
*/
public YangType<?> getTypeDefBaseType() {
- return dataType;
+ if (!(getTypeList().isEmpty())) {
+ return getTypeList().get(0);
+ }
+ return null;
}
/**
@@ -189,7 +202,7 @@
* @param dataType the data type
*/
public void setDataType(YangType<?> dataType) {
- this.dataType = dataType;
+ getTypeList().add(0, dataType);
}
/**
@@ -259,4 +272,9 @@
public void setName(String name) {
this.name = name;
}
+
+ @Override
+ public List<YangType<?>> getTypeList() {
+ return typeList;
+ }
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangUnion.java b/src/main/java/org/onosproject/yangutils/datamodel/YangUnion.java
index c75068c..eb0e34d 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangUnion.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangUnion.java
@@ -18,7 +18,6 @@
import java.util.LinkedList;
import java.util.List;
-
import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
import org.onosproject.yangutils.parser.Parsable;
import org.onosproject.yangutils.utils.YangConstructType;
@@ -48,7 +47,7 @@
/**
* Represents data model node to maintain information defined in YANG union.
*/
-public class YangUnion extends YangNode implements Parsable {
+public class YangUnion extends YangNode implements Parsable, HasType {
// List of YANG type.
private List<YangType<?>> typeList;
@@ -68,11 +67,7 @@
childUnionNumber = 1;
}
- /**
- * Returns list of YANG type.
- *
- * @return the list of YANG type
- */
+ @Override
public List<YangType<?>> getTypeList() {
return typeList;
}
@@ -105,11 +100,11 @@
}
/**
- * Add YANG type to type list.
+ * Adds YANG type to type list.
*
* @param yangType YANG type to be added to list
* @throws DataModelException union member type must not be one of the
- * built-in types "empty" or "leafref"
+ * built-in types "empty" or "leafref"
*/
public void addType(YangType<?> yangType) throws DataModelException {
if (yangType.getDataType() == YangDataTypes.EMPTY || yangType.getDataType() == YangDataTypes.LEAFREF) {
@@ -144,11 +139,21 @@
return YangConstructType.UNION_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: implement the method.
}
+ /**
+ * 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: implement the method.
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java b/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java
index 03d82d1..110bd11 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java
@@ -25,6 +25,7 @@
import org.onosproject.yangutils.datamodel.YangModule;
import org.onosproject.yangutils.datamodel.YangSubModule;
import org.onosproject.yangutils.datamodel.YangTypeDef;
+import org.onosproject.yangutils.datamodel.YangUnion;
import org.onosproject.yangutils.datamodel.YangUses;
import org.onosproject.yangutils.datamodel.YangNotification;
import org.onosproject.yangutils.datamodel.YangRpc;
@@ -40,6 +41,7 @@
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaTypeDef;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaUnion;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaUses;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaNotification;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaRpc;
@@ -53,7 +55,7 @@
public final class YangDataModelFactory {
/**
- * Utility class, hence private to prevent creating objects.
+ * Creates a YANG data model factory object.
*/
private YangDataModelFactory() {
}
@@ -224,7 +226,25 @@
* Returns based on the target language generate the inherited data model node.
*
* @param targetLanguage target language in which YANG mapping needs to be
- * generated
+ * generated
+ * @return the corresponding inherited node based on the target language
+ */
+ public static YangUnion getYangUnionNode(GeneratedLanguage targetLanguage) {
+ switch (targetLanguage) {
+ case JAVA_GENERATION: {
+ return new YangJavaUnion();
+ }
+ 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 YangUses getYangUsesNode(GeneratedLanguage targetLanguage) {