[ONOS-5003][ONOS-5004][ONOS-5005]Generated Code modification for YangUtils+added interface for augmentation method and other api changes.

Change-Id: I954b9c99e182f21d01fcc5cd76fbac7d61a6c3aa
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
index afcb61a..77ff157 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
@@ -17,11 +17,18 @@
 package org.onosproject.yangutils.translator.tojava;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.onosproject.yangutils.datamodel.TraversalType;
+import org.onosproject.yangutils.datamodel.YangAugment;
+import org.onosproject.yangutils.datamodel.YangCase;
+import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangInput;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNodeType;
 import org.onosproject.yangutils.datamodel.YangOutput;
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
 import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.InvalidNodeForTranslatorException;
@@ -31,6 +38,11 @@
 import static org.onosproject.yangutils.datamodel.TraversalType.PARENT;
 import static org.onosproject.yangutils.datamodel.TraversalType.ROOT;
 import static org.onosproject.yangutils.datamodel.TraversalType.SIBILING;
+import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
+import static org.onosproject.yangutils.translator.tojava.YangDataModelFactory.getYangCaseNode;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getAugmentClassName;
+import static org.onosproject.yangutils.utils.UtilConstants.CASE;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.searchAndDeleteTempDir;
 
 /**
@@ -88,6 +100,11 @@
         TraversalType curTraversal = ROOT;
 
         while (codeGenNode != null) {
+            if (codeGenNode instanceof YangAugment) {
+                if (((YangAugment) codeGenNode).getAugmentedNode() instanceof YangChoice) {
+                    addCaseNodeToChoiceTarget((YangAugment) codeGenNode);
+                }
+            }
             if (curTraversal != PARENT) {
                 if (!(codeGenNode instanceof JavaCodeGenerator)) {
                     throw new TranslatorException("Unsupported node to generate code");
@@ -126,8 +143,8 @@
                 try {
                     generateCodeExit(codeGenNode, yangPlugin);
                 } catch (Exception e) {
-                    close(codeGenNode, yangPlugin);
-                    throw new TranslatorException(e.getMessage());
+                  close(codeGenNode, yangPlugin);
+                  throw new TranslatorException(e.getMessage());
                 }
                 curTraversal = PARENT;
                 codeGenNode = codeGenNode.getParent();
@@ -285,7 +302,7 @@
                     searchAndDeleteTempDir(javaFileInfo.getBaseCodeGenPath() +
                             javaFileInfo.getPackageFilePath());
                 } else {
-                    searchAndDeleteTempDir(yangPlugin.getManagerCodeGenDir());
+                    searchAndDeleteTempDir(yangPlugin.getCodeGenDir());
                 }
             }
         }
@@ -347,4 +364,43 @@
         }
         return null;
     }
+
+    /**
+     * Adds a case node in augment when augmenting a choice node.
+     *
+     * @param augment augment node
+     */
+    private static void addCaseNodeToChoiceTarget(YangAugment augment) {
+        YangCase javaCase = getYangCaseNode(JAVA_GENERATION);
+
+        YangPluginConfig pluginConfig = new YangPluginConfig();
+        javaCase.setName(getAugmentClassName(augment, pluginConfig) + getCapitalCase(CASE));
+
+        if (augment.getListOfLeaf() != null) {
+            augment.getListOfLeaf().forEach(javaCase::addLeaf);
+            augment.getListOfLeaf().clear();
+        }
+        if (augment.getListOfLeafList() != null) {
+            augment.getListOfLeafList().forEach(javaCase::addLeafList);
+            augment.getListOfLeafList().clear();
+        }
+        YangNode child = augment.getChild();
+        List<YangNode> childNodes = new ArrayList<>();
+        while (child != null) {
+            child.setParent(javaCase);
+            childNodes.add(child);
+            child = child.getNextSibling();
+        }
+        augment.setChild(null);
+        try {
+            augment.addChild(javaCase);
+            for (YangNode node : childNodes) {
+                node.setNextSibling(null);
+                node.setPreviousSibling(null);
+                javaCase.addChild(node);
+            }
+        } catch (DataModelException e) {
+            System.out.print("failed to add child node due to " + javaCase.getName() + " " + e.getLocalizedMessage());
+        }
+    }
 }