[ONOS-3898/4069] Yang Utils Extension to support RPC/Notification/Choice/Case/Union

Change-Id: I405852caff3464719e8e586fa8e9ae9b6ed043ff
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java
new file mode 100644
index 0000000..94ec601
--- /dev/null
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.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;
+
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
+
+/*
+ * Reference RFC 6020.
+ *
+ * The "output" statement, which is optional, is used to define output
+ * parameters to the RPC operation.  It does not take an argument.  The
+ * substatements to "output" define nodes under the RPC's output node.
+ *
+ * If a leaf in the output tree has a "mandatory" statement with the
+ * value "true", the leaf MUST be present in a NETCONF RPC reply.
+ *
+ * If a leaf in the output tree has a default value, the NETCONF client
+ * MUST use this value in the same cases as described in Section 7.6.1.
+ * In these cases, the client MUST operationally behave as if the leaf
+ * was present in the NETCONF RPC reply with the default value as its
+ * value.
+ *
+ * If a "config" statement is present for any node in the output tree,
+ * the "config" statement is ignored.
+ *
+ * If any node has a "when" statement that would evaluate to false, then
+ * this node MUST NOT be present in the output tree.
+ *
+ * The output substatements
+ *
+ *    +--------------+---------+-------------+------------------+
+ *    | substatement | section | cardinality |data model mapping|
+ *    +--------------+---------+-------------+------------------+
+ *    | anyxml       | 7.10    | 0..n        | -not supported   |
+ *    | choice       | 7.9     | 0..n        | -child nodes     |
+ *    | container    | 7.5     | 0..n        | -child nodes     |
+ *    | grouping     | 7.11    | 0..n        | -child nodes     |
+ *    | leaf         | 7.6     | 0..n        | -YangLeaf        |
+ *    | leaf-list    | 7.7     | 0..n        | -YangLeafList    |
+ *    | list         | 7.8     | 0..n        | -child nodes     |
+ *    | typedef      | 7.3     | 0..n        | -child nodes     |
+ *    | uses         | 7.12    | 0..n        | -child nodes     |
+ *    +--------------+---------+-------------+------------------+
+ */
+
+/**
+ * Data model node to maintain information defined in YANG output.
+ */
+public class YangOutput extends YangNode implements YangLeavesHolder, Parsable, CollisionDetector {
+
+    /**
+     * Name of the output.
+     */
+    private String name;
+
+    /**
+     * List of leaves contained.
+     */
+    private List<YangLeaf> listOfLeaf;
+
+    /**
+     * List of leaf-lists contained.
+     */
+    private List<YangLeafList> listOfLeafList;
+
+    /**
+     * Create a rpc output node.
+     */
+    public YangOutput() {
+        super(YangNodeType.OUTPUT_NODE);
+        listOfLeaf = new LinkedList<YangLeaf>();
+        listOfLeafList = new LinkedList<YangLeafList>();
+    }
+
+    @Override
+    public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException {
+        // Detect colliding child.
+        detectCollidingChildUtil(identifierName, dataType, this);
+    }
+
+    @Override
+    public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException {
+        if (this.getName().equals(identifierName)) {
+            throw new DataModelException("YANG file error: Duplicate identifier detected, same as output \""
+                    + this.getName() + "\"");
+        }
+    }
+
+    @Override
+    public YangConstructType getYangConstructType() {
+        return YangConstructType.OUTPUT_DATA;
+    }
+
+    @Override
+    public void validateDataOnEntry() throws DataModelException {
+        //TODO: implement the method.
+    }
+
+    @Override
+    public void validateDataOnExit() throws DataModelException {
+        //TODO: implement the method.
+    }
+
+    @Override
+    public List<YangLeaf> getListOfLeaf() {
+        return listOfLeaf;
+    }
+
+    @Override
+    public void addLeaf(YangLeaf leaf) {
+        getListOfLeaf().add(leaf);
+    }
+
+    @Override
+    public List<YangLeafList> getListOfLeafList() {
+        return listOfLeafList;
+    }
+
+    @Override
+    public void addLeafList(YangLeafList leafList) {
+        getListOfLeafList().add(leafList);
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+}