[ONOS-4616] YANG grouping linker issues fixed.

Change-Id: I741aa9ad1008c02c9a9f90cc117cd43729132129
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
index d62f40d..f647c0d 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
@@ -15,18 +15,116 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
+import java.io.IOException;
+
 import org.onosproject.yangutils.datamodel.YangGrouping;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
+import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
+import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
+
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
+import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfNode;
 
 /**
  * Represents grouping information extended to support java code generation.
  */
 public class YangJavaGrouping
-        extends YangGrouping {
+        extends YangGrouping implements JavaCodeGeneratorInfo, JavaCodeGenerator {
+
+    /**
+     * Contains the information of the java file being generated.
+     */
+    private JavaFileInfo javaFileInfo;
+
+    /**
+     * File handle to maintain temporary java code fragments as per the code
+     * snippet types.
+     */
+    private TempJavaCodeFragmentFiles tempFileHandle;
 
     /**
      * Creates YANG Java grouping object.
      */
     public YangJavaGrouping() {
         super();
+        setJavaFileInfo(new JavaFileInfo());
+        getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
     }
+
+    /**
+     * Returns the generated java file information.
+     *
+     * @return generated java file information
+     */
+    @Override
+    public JavaFileInfo getJavaFileInfo() {
+        if (javaFileInfo == null) {
+            throw new TranslatorException("Missing java info in java datamodel node");
+        }
+        return javaFileInfo;
+    }
+
+    /**
+     * Sets the java file info object.
+     *
+     * @param javaInfo java file info object
+     */
+    @Override
+    public void setJavaFileInfo(JavaFileInfo 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
+     * grouping info.
+     *
+     * @param yangPlugin YANG plugin config
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
+        try {
+            generateCodeOfNode(this, yangPlugin);
+        } catch (IOException e) {
+            throw new TranslatorException(
+                    "Failed to prepare generate code entry for container node " + this.getName());
+        }
+    }
+
+    /**
+     * Create a java file using the YANG grouping info.
+     *
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeExit() throws TranslatorException {
+        try {
+            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+        } catch (IOException e) {
+            throw new TranslatorException("Failed to generate code for container node " + this.getName());
+        }
+    }
+
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java
index e5f2dab..7934ba1 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java
@@ -26,7 +26,7 @@
 import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
-import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfNode;
+import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfAugmentableNode;
 
 /**
  * Represents input information extended to support java code generation.
@@ -46,6 +46,8 @@
      */
     private TempJavaCodeFragmentFiles tempFileHandle;
 
+    private boolean codeGenFlag;
+
     /**
      * Creates an instance of java input.
      */
@@ -108,7 +110,7 @@
     @Override
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
         try {
-            generateCodeOfNode(this, yangPlugin);
+            generateCodeOfAugmentableNode(this, yangPlugin);
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code entry for input node " + this.getName());
@@ -123,9 +125,29 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            if (isCodeGenFlag()) {
+                getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            }
         } catch (IOException e) {
             throw new TranslatorException("Failed to generate code for input node " + this.getName());
         }
     }
+
+    /**
+     * Returns code generator flag.
+     *
+     * @return code generator flag
+     */
+    public boolean isCodeGenFlag() {
+        return codeGenFlag;
+    }
+
+    /**
+     * Sets code generator flag.
+     *
+     * @param codeGenFlag code generator flag
+     */
+    public void setCodeGenFlag(boolean codeGenFlag) {
+        this.codeGenFlag = codeGenFlag;
+    }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java
index 10df251..6afa8c5 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java
@@ -71,6 +71,7 @@
      *
      * @return java naming conflict resolve configurations
      */
+    @Override
     public YangToJavaNamingConflictUtil getConflictResolveConfig() {
         return conflictResolveConfig;
     }
@@ -80,6 +81,7 @@
      *
      * @param conflictResolveConfig java naming conflict resolve configurations
      */
+    @Override
     public void setConflictResolveConfig(YangToJavaNamingConflictUtil conflictResolveConfig) {
         this.conflictResolveConfig = conflictResolveConfig;
     }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java
index fec436c..5c84ddc 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java
@@ -26,7 +26,7 @@
 import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
-import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfNode;
+import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfAugmentableNode;
 
 /**
  * Represents output information extended to support java code generation.
@@ -46,6 +46,8 @@
      */
     private TempJavaCodeFragmentFiles tempFileHandle;
 
+    private boolean codeGenFlag;
+
     /**
      * Creates an instance of java output.
      */
@@ -108,7 +110,7 @@
     @Override
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
         try {
-            generateCodeOfNode(this, yangPlugin);
+            generateCodeOfAugmentableNode(this, yangPlugin);
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code entry for output node " + this.getName());
@@ -124,10 +126,30 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            if (isCodeGenFlag()) {
+                getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            }
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code exit for output node " + this.getName());
         }
     }
+
+    /**
+     * Returns code generator flag.
+     *
+     * @return code generator flag
+     */
+    public boolean isCodeGenFlag() {
+        return codeGenFlag;
+    }
+
+    /**
+     * Sets code generator flag.
+     *
+     * @param codeGenFlag code generator flag
+     */
+    public void setCodeGenFlag(boolean codeGenFlag) {
+        this.codeGenFlag = codeGenFlag;
+    }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java
index e721fa7..78c4f64 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java
@@ -17,26 +17,36 @@
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
 import java.io.IOException;
+import java.util.List;
 
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangInput;
+import org.onosproject.yangutils.datamodel.YangLeaf;
+import org.onosproject.yangutils.datamodel.YangLeafList;
+import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangOutput;
 import org.onosproject.yangutils.datamodel.YangRpc;
+import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
-import org.onosproject.yangutils.translator.tojava.JavaImportData;
 import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
 import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
 
+import static org.onosproject.yangutils.datamodel.YangNodeType.LIST_NODE;
 import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
 import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode;
+import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.resolveGroupingsQuailifiedInfo;
+import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.getJavaDataType;
+import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.getJavaImportClass;
+import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.getJavaImportPackage;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCamelCase;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCapitalCase;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getParentNodeInGenCode;
 import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.updatePackageInfo;
@@ -58,6 +68,11 @@
      */
     private TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles;
 
+    private boolean isInputLeafHolder;
+    private boolean isOutputLeafHolder;
+    private boolean isInputSingleChildHolder;
+    private boolean isOutputSingleChildHolder;
+
     /**
      * Creates an instance of YANG java rpc.
      */
@@ -67,123 +82,6 @@
     }
 
     /**
-     * Prepares the information for java code generation corresponding to YANG
-     * RPC info.
-     *
-     * @param yangPlugin YANG plugin config
-     * @throws TranslatorException translator operations fails
-     */
-    @Override
-    public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
-
-        if (!(this instanceof JavaCodeGeneratorInfo)) {
-            // TODO:throw exception
-        }
-
-        // Add package information for rpc and create corresponding folder.
-        try {
-            updatePackageInfo(this, yangPlugin);
-        } catch (IOException e) {
-            throw new TranslatorException("Failed to prepare generate code entry for RPC node " + this.getName());
-        }
-    }
-
-    /**
-     * Creates a java file using the YANG RPC info.
-     *
-     * @throws TranslatorException translator operations fails
-     */
-    @Override
-    public void generateCodeExit() throws TranslatorException {
-        // Get the parent module/sub-module.
-        YangNode parent = getParentNodeInGenCode(this);
-
-        // Parent should be holder of rpc or notification.
-        if (!(parent instanceof RpcNotificationContainer)) {
-            throw new TranslatorException("parent node of rpc can only be module or sub-module");
-        }
-
-        /*
-         * Create attribute info for input and output of rpc and add it to the
-         * parent import list.
-         */
-
-        JavaAttributeInfo javaAttributeInfoOfInput = null;
-        JavaAttributeInfo javaAttributeInfoOfOutput = null;
-
-        // Get the child input and output node and obtain create java attribute
-        // info.
-        YangNode yangNode = this.getChild();
-        while (yangNode != null) {
-            if (yangNode instanceof YangInput) {
-                javaAttributeInfoOfInput = getChildNodeAsAttributeInParentService(yangNode, this);
-            } else if (yangNode instanceof YangOutput) {
-                javaAttributeInfoOfOutput = getChildNodeAsAttributeInParentService(yangNode, this);
-            } else {
-                // TODO throw exception
-            }
-            yangNode = yangNode.getNextSibling();
-        }
-
-        if (!(parent instanceof TempJavaCodeFragmentFilesContainer)) {
-            throw new TranslatorException("missing parent temp file handle");
-        }
-
-        /*
-         * Add the rpc information to the parent's service temp file.
-         */
-        try {
-            ((TempJavaCodeFragmentFilesContainer) parent).getTempJavaCodeFragmentFiles().getServiceTempFiles()
-                    .addJavaSnippetInfoToApplicableTempFiles(javaAttributeInfoOfInput, javaAttributeInfoOfOutput,
-                            ((JavaFileInfoContainer) parent).getJavaFileInfo().getPluginConfig(),
-                            ((YangNode) this).getName());
-        } catch (IOException e) {
-            throw new TranslatorException("Failed to generate code for RPC node " + this.getName());
-        }
-        // No file will be generated during RPC exit.
-    }
-
-    /**
-     * Creates an attribute info object corresponding to a data model node and
-     * return it.
-     *
-     * @param childNode child data model node(input / output) for which the java code generation
-     * is being handled
-     * @param currentNode parent node (module / sub-module) in which the child node is an attribute
-     * @return AttributeInfo attribute details required to add in temporary
-     * files
-     */
-    public static JavaAttributeInfo getChildNodeAsAttributeInParentService(
-            YangNode childNode, YangNode currentNode) {
-
-        YangNode parentNode = getParentNodeInGenCode(currentNode);
-
-        String childNodeName = ((JavaFileInfoContainer) childNode).getJavaFileInfo().getJavaName();
-        /*
-         * Get the import info corresponding to the attribute for import in
-         * generated java files or qualified access
-         */
-        JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(currentNode,
-                getCapitalCase(childNodeName));
-        if (!(parentNode instanceof TempJavaCodeFragmentFilesContainer)) {
-            throw new TranslatorException("Parent node does not have file info");
-        }
-
-        TempJavaFragmentFiles tempJavaFragmentFiles;
-        tempJavaFragmentFiles = ((TempJavaCodeFragmentFilesContainer) parentNode)
-                .getTempJavaCodeFragmentFiles()
-                .getServiceTempFiles();
-
-        if (tempJavaFragmentFiles == null) {
-            throw new TranslatorException("Parent node does not have service file info");
-        }
-
-        JavaImportData parentImportData = tempJavaFragmentFiles.getJavaImportData();
-        boolean isQualified = parentImportData.addImportInfo(qualifiedTypeInfo);
-        return getAttributeInfoForTheData(qualifiedTypeInfo, childNodeName, null, isQualified, false);
-    }
-
-    /**
      * Returns the generated java file information.
      *
      * @return generated java file information
@@ -217,4 +115,487 @@
         tempJavaCodeFragmentFiles = fileHandle;
     }
 
+    /**
+     * Prepares the information for java code generation corresponding to YANG
+     * RPC info.
+     *
+     * @param yangPlugin YANG plugin config
+     * @throws TranslatorException translator operations fails
+     */
+    @Override
+    public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
+
+        if (!(this instanceof JavaCodeGeneratorInfo)) {
+            // TODO:throw exception
+        }
+
+        // Add package information for rpc and create corresponding folder.
+        try {
+            updatePackageInfo(this, yangPlugin);
+            if (this.getChild() != null) {
+                processNodeEntry(this.getChild(), yangPlugin);
+                if (this.getChild().getNextSibling() != null) {
+                    processNodeEntry(this.getChild().getNextSibling(), yangPlugin);
+                }
+            }
+        } catch (IOException e) {
+            throw new TranslatorException("Failed to prepare generate code entry for RPC node " + this.getName());
+        }
+    }
+
+    /**
+     * Creates a java file using the YANG RPC info.
+     *
+     * @throws TranslatorException translator operations fails
+     */
+    @Override
+    public void generateCodeExit() throws TranslatorException {
+        // Get the parent module/sub-module.
+        YangNode parent = getParentNodeInGenCode(this);
+
+        // Parent should be holder of rpc or notification.
+        if (!(parent instanceof RpcNotificationContainer)) {
+            throw new TranslatorException("parent node of rpc can only be module or sub-module");
+        }
+
+        /*
+         * Create attribute info for input and output of rpc and add it to the
+         * parent import list.
+         */
+
+        JavaAttributeInfo javaAttributeInfoOfInput = null;
+        JavaAttributeInfo javaAttributeInfoOfOutput = null;
+
+        // Get the child input and output node and obtain create java attribute
+        // info.
+        YangNode yangNode = this.getChild();
+        while (yangNode != null) {
+            if (yangNode instanceof YangInput) {
+                javaAttributeInfoOfInput = processNodeExit(yangNode, getJavaFileInfo().getPluginConfig());
+
+            } else if (yangNode instanceof YangOutput) {
+                javaAttributeInfoOfOutput = processNodeExit(yangNode, getJavaFileInfo().getPluginConfig());
+            } else {
+                // TODO throw exception
+            }
+            yangNode = yangNode.getNextSibling();
+        }
+
+        if (!(parent instanceof TempJavaCodeFragmentFilesContainer)) {
+            throw new TranslatorException("missing parent temp file handle");
+        }
+
+        /*
+         * Add the rpc information to the parent's service temp file.
+         */
+        try {
+            ((TempJavaCodeFragmentFilesContainer) parent).getTempJavaCodeFragmentFiles().getServiceTempFiles()
+                    .addJavaSnippetInfoToApplicableTempFiles(javaAttributeInfoOfInput, javaAttributeInfoOfOutput,
+                            ((JavaFileInfoContainer) parent).getJavaFileInfo().getPluginConfig(),
+                            ((YangNode) this).getName(), isInputLeafHolder(), isOutputLeafHolder(),
+                            isInputSingleChildHolder(), isOutputSingleChildHolder());
+        } catch (IOException e) {
+            throw new TranslatorException("Failed to generate code for RPC node " + this.getName());
+        }
+        // No file will be generated during RPC exit.
+    }
+
+    /**
+     * Creates an attribute info object corresponding to a data model node and
+     * return it.
+     *
+     * @param childNode child data model node(input / output) for which the java code generation
+     * is being handled
+     * @param currentNode parent node (module / sub-module) in which the child node is an attribute
+     * @return AttributeInfo attribute details required to add in temporary
+     * files
+     */
+    public JavaAttributeInfo getChildNodeAsAttributeInParentService(
+            YangNode childNode, YangNode currentNode) {
+
+        YangNode parentNode = getParentNodeInGenCode(currentNode);
+
+        String childNodeName = ((JavaFileInfoContainer) childNode).getJavaFileInfo().getJavaName();
+        /*
+         * Get the import info corresponding to the attribute for import in
+         * generated java files or qualified access
+         */
+        JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(currentNode,
+                getCapitalCase(childNodeName));
+        if (!(parentNode instanceof TempJavaCodeFragmentFilesContainer)) {
+            throw new TranslatorException("Parent node does not have file info");
+        }
+
+        TempJavaFragmentFiles tempJavaFragmentFiles;
+        tempJavaFragmentFiles = ((TempJavaCodeFragmentFilesContainer) parentNode)
+                .getTempJavaCodeFragmentFiles()
+                .getServiceTempFiles();
+
+        if (tempJavaFragmentFiles == null) {
+            throw new TranslatorException("Parent node does not have service file info");
+        }
+        boolean isQualified = addImportToService(qualifiedTypeInfo);
+        return getAttributeInfoForTheData(qualifiedTypeInfo, childNodeName, null, isQualified, false);
+    }
+
+    /**
+     * Process input/output nodes.
+     *
+     * @param node YANG node
+     * @param yangPluginConfig plugin configurations
+     */
+    private void processNodeEntry(YangNode node, YangPluginConfig yangPluginConfig) {
+        YangLeavesHolder holder = (YangLeavesHolder) node;
+        if (node.getChild() == null) {
+            if (holder.getListOfLeaf() != null && holder.getListOfLeafList().isEmpty()
+                    && holder.getListOfLeaf().size() == 1) {
+                setCodeGenFlagForNode(node, false);
+            } else if (holder.getListOfLeaf().isEmpty() && holder.getListOfLeafList() != null
+                    && holder.getListOfLeafList().size() == 1) {
+                setCodeGenFlagForNode(node, false);
+            } else {
+                setCodeGenFlagForNode(node, true);
+            }
+        } else if (node.getChild() != null && holder.getListOfLeaf().isEmpty()
+                && holder.getListOfLeafList().isEmpty()) {
+            if (getNumberOfChildNodes(node) == 1) {
+                setCodeGenFlagForNode(node, false);
+            } else {
+                setCodeGenFlagForNode(node, true);
+            }
+        } else {
+            setCodeGenFlagForNode(node, true);
+        }
+    }
+
+    /**
+     * Process input/output nodes.
+     *
+     * @param node YANG node
+     * @param yangPluginConfig plugin configurations
+     * @return java attribute info
+     */
+    private JavaAttributeInfo processNodeExit(YangNode node, YangPluginConfig yangPluginConfig) {
+        YangLeavesHolder holder = (YangLeavesHolder) node;
+        if (node.getChild() == null) {
+            if (holder.getListOfLeaf() != null && holder.getListOfLeafList().isEmpty()
+                    && holder.getListOfLeaf().size() == 1) {
+                return processNodeWhenOnlyOneLeafIsPresent(node, yangPluginConfig);
+
+            } else if (holder.getListOfLeaf().isEmpty() && holder.getListOfLeafList() != null
+                    && holder.getListOfLeafList().size() == 1) {
+                return processNodeWhenOnlyOneLeafListIsPresent(node, yangPluginConfig);
+            } else {
+                return processNodeWhenMultipleContaintsArePresent(node);
+            }
+        } else if (node.getChild() != null && holder.getListOfLeaf().isEmpty()
+                && holder.getListOfLeafList().isEmpty()) {
+            if (getNumberOfChildNodes(node) == 1) {
+                return processNodeWhenOnlyOneChildNodeIsPresent(node, yangPluginConfig);
+            } else {
+                return processNodeWhenMultipleContaintsArePresent(node);
+            }
+        } else {
+            return processNodeWhenMultipleContaintsArePresent(node);
+        }
+    }
+
+    /**
+     * Process input/output node when one leaf is present.
+     *
+     * @param node input/output node
+     * @param yangPluginConfig plugin configurations
+     * @return java attribute for node
+     */
+    private JavaAttributeInfo processNodeWhenOnlyOneLeafIsPresent(YangNode node,
+            YangPluginConfig yangPluginConfig) {
+
+        YangLeavesHolder holder = (YangLeavesHolder) node;
+        List<YangLeaf> listOfLeaves = holder.getListOfLeaf();
+
+        for (YangLeaf leaf : listOfLeaves) {
+            if (!(leaf instanceof JavaLeafInfoContainer)) {
+                throw new TranslatorException("Leaf does not have java information");
+            }
+            JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leaf;
+            javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver());
+            javaLeaf.updateJavaQualifiedInfo();
+            JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData(
+                    javaLeaf.getJavaQualifiedInfo(),
+                    javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()),
+                    javaLeaf.getDataType(),
+                    addTypeImport(javaLeaf.getDataType(), false, yangPluginConfig), false);
+            setLeafHolderFlag(node, true);
+            return javaAttributeInfo;
+        }
+        return null;
+    }
+
+    /**
+     * Process input/output node when one leaf list is present.
+     *
+     * @param node input/output node
+     * @param yangPluginConfig plugin configurations
+     * @return java attribute for node
+     */
+    private JavaAttributeInfo processNodeWhenOnlyOneLeafListIsPresent(YangNode node,
+            YangPluginConfig yangPluginConfig) {
+
+        YangLeavesHolder holder = (YangLeavesHolder) node;
+        List<YangLeafList> listOfLeafList = holder.getListOfLeafList();
+
+        for (YangLeafList leafList : listOfLeafList) {
+            if (!(leafList instanceof JavaLeafInfoContainer)) {
+                throw new TranslatorException("Leaf-list does not have java information");
+            }
+            JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leafList;
+            javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver());
+            javaLeaf.updateJavaQualifiedInfo();
+            ((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles()
+                    .getServiceTempFiles().getJavaImportData().setIfListImported(true);
+            JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData(
+                    javaLeaf.getJavaQualifiedInfo(),
+                    javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()),
+                    javaLeaf.getDataType(),
+                    addTypeImport(javaLeaf.getDataType(), true, yangPluginConfig),
+                    true);
+            setLeafHolderFlag(node, true);
+            return javaAttributeInfo;
+        }
+        return null;
+    }
+
+    /**
+     * Process input/output node when one child node is present.
+     *
+     * @param node input/output node
+     * @param yangPluginConfig plugin configurations
+     * @return java attribute for node
+     */
+    private JavaAttributeInfo processNodeWhenOnlyOneChildNodeIsPresent(YangNode node,
+            YangPluginConfig yangPluginConfig) {
+        JavaFileInfo rpcInfo = getJavaFileInfo();
+        String clsInfo = "";
+        JavaQualifiedTypeInfo childInfo = new JavaQualifiedTypeInfo();
+        if (node.getChild() instanceof YangJavaUses) {
+            childInfo = resolveGroupingsQuailifiedInfo(((YangJavaUses) node.getChild()).getRefGroup(),
+                    yangPluginConfig);
+            clsInfo = getCapitalCase(getCamelCase(((YangJavaUses) node.getChild()).getRefGroup().getName(),
+                    yangPluginConfig.getConflictResolver()));
+        } else {
+            String pkg = (rpcInfo.getPackage() + "." + rpcInfo.getJavaName() + "."
+                    + getCamelCase(node.getName(), yangPluginConfig.getConflictResolver())).toLowerCase();
+            clsInfo = getCapitalCase(
+                    getCamelCase(node.getChild().getName(), yangPluginConfig.getConflictResolver()));
+            childInfo.setPkgInfo(pkg);
+            childInfo.setClassInfo(clsInfo);
+        }
+        boolean isList = false;
+        if (node.getChild().getNodeType().equals(LIST_NODE)) {
+            isList = true;
+        }
+        boolean isQualified = addImportToService(childInfo);
+
+        JavaAttributeInfo javaAttributeInfo =
+                getAttributeInfoForTheData(childInfo, clsInfo, null, isQualified, isList);
+
+        setLeafHolderFlag(node, false);
+        setSingleChildHolderFlag(node, true);
+        return javaAttributeInfo;
+    }
+
+    /**
+     * Process input/output node when multiple leaf and child nodes are present.
+     *
+     * @param node input/output node
+     * @return java attribute for node
+     */
+    private JavaAttributeInfo processNodeWhenMultipleContaintsArePresent(YangNode node) {
+
+        setLeafHolderFlag(node, false);
+        setSingleChildHolderFlag(node, false);
+        return getChildNodeAsAttributeInParentService(node, this);
+    }
+
+    /**
+     * Adds type import to the RPC import list.
+     *
+     * @param type YANG type
+     * @param isList is list attribute
+     * @param pluginConfig plugin configurations
+     * @return type import to the RPC import list
+     */
+    private boolean addTypeImport(YangType<?> type, boolean isList, YangPluginConfig pluginConfig) {
+
+        String classInfo = getJavaImportClass(type, isList, pluginConfig.getConflictResolver());
+        if (classInfo == null) {
+            classInfo = getJavaDataType(type);
+            return false;
+        } else {
+            classInfo = getJavaImportClass(type, isList, pluginConfig.getConflictResolver());
+            String pkgInfo = getJavaImportPackage(type, isList, pluginConfig.getConflictResolver());
+            JavaQualifiedTypeInfo importInfo = new JavaQualifiedTypeInfo();
+            importInfo.setPkgInfo(pkgInfo);
+            importInfo.setClassInfo(classInfo);
+            if (!((JavaFileInfoContainer) this.getParent()).getJavaFileInfo().getJavaName().equals(classInfo)) {
+                return addImportToService(importInfo);
+            } else {
+                return true;
+            }
+        }
+    }
+
+    /**
+     * Adds to service class import list.
+     *
+     * @param importInfo import info
+     * @return true or false
+     */
+    private boolean addImportToService(JavaQualifiedTypeInfo importInfo) {
+        if (((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles()
+                .getServiceTempFiles().getJavaImportData().addImportInfo(importInfo)) {
+            return !((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles()
+                    .getServiceTempFiles().getJavaImportData().getImportSet().contains(importInfo);
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * Sets leaf holder flag for input/output.
+     *
+     * @param node input/output node
+     * @param flag true or false
+     */
+    private void setLeafHolderFlag(YangNode node, boolean flag) {
+        if (node instanceof YangJavaInput) {
+            setInputLeafHolder(flag);
+        } else {
+            setOutputLeafHolder(flag);
+        }
+    }
+
+    /**
+     * Sets sing child holder flag for input/output.
+     *
+     * @param node input/output node
+     * @param flag true or false
+     */
+    private void setSingleChildHolderFlag(YangNode node, boolean flag) {
+        if (node instanceof YangJavaInput) {
+            setInputSingleChildHolder(flag);
+        } else {
+            setOutputSingleChildHolder(flag);
+        }
+    }
+
+    /**
+     * Sets code generator flag for input and output.
+     *
+     * @param node YANG node
+     * @param flag cod generator flag
+     */
+    private void setCodeGenFlagForNode(YangNode node, boolean flag) {
+        if (node instanceof YangJavaInput) {
+            ((YangJavaInput) node).setCodeGenFlag(flag);
+        } else {
+            ((YangJavaOutput) node).setCodeGenFlag(flag);
+        }
+
+    }
+
+    /**
+     * Counts the number of child nodes of a YANG node.
+     *
+     * @param node YANG node
+     * @return count of children
+     */
+    private int getNumberOfChildNodes(YangNode node) {
+        YangNode tempNode = node.getChild();
+        int count = 0;
+        if (tempNode != null) {
+            count = 1;
+        }
+        while (tempNode != null) {
+
+            tempNode = tempNode.getNextSibling();
+            if (tempNode != null) {
+                count++;
+            }
+        }
+        return count;
+    }
+
+    /**
+     * Returns true if input is a leaf holder.
+     *
+     * @return true if input is a leaf holder
+     */
+    public boolean isInputLeafHolder() {
+        return isInputLeafHolder;
+    }
+
+    /**
+     * Sets true if input is a leaf holder.
+     *
+     * @param isInputLeafHolder true if input is a leaf holder
+     */
+    public void setInputLeafHolder(boolean isInputLeafHolder) {
+        this.isInputLeafHolder = isInputLeafHolder;
+    }
+
+    /**
+     * Returns true if output is a leaf holder.
+     *
+     * @return true if output is a leaf holder
+     */
+    public boolean isOutputLeafHolder() {
+        return isOutputLeafHolder;
+    }
+
+    /**
+     * Sets true if output is a leaf holder.
+     *
+     * @param isOutputLeafHolder true if output is a leaf holder
+     */
+    public void setOutputLeafHolder(boolean isOutputLeafHolder) {
+        this.isOutputLeafHolder = isOutputLeafHolder;
+    }
+
+    /**
+     * Returns true if input is single child holder.
+     *
+     * @return true if input is single child holder
+     */
+    public boolean isInputSingleChildHolder() {
+        return isInputSingleChildHolder;
+    }
+
+    /**
+     * Sets true if input is single child holder.
+     *
+     * @param isInputSingleChildHolder true if input is single child holder
+     */
+    public void setInputSingleChildHolder(boolean isInputSingleChildHolder) {
+        this.isInputSingleChildHolder = isInputSingleChildHolder;
+    }
+
+    /**
+     * Returns true if output is single child holder.
+     *
+     * @return true if output is single child holder
+     */
+    public boolean isOutputSingleChildHolder() {
+        return isOutputSingleChildHolder;
+    }
+
+    /**
+     * Sets true if output is single child holder.
+     *
+     * @param isOutputSingleChildHolder true if output is single child holder
+     */
+    public void setOutputSingleChildHolder(boolean isOutputSingleChildHolder) {
+        this.isOutputSingleChildHolder = isOutputSingleChildHolder;
+    }
+
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java
index 660940f..e537743 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java
@@ -55,7 +55,7 @@
              */
             importInfo.setClassInfo(className);
             String classPkg = AttributesJavaDataType.getJavaImportPackage(this,
-                    false, className, conflictResolver);
+                    false,  conflictResolver);
             if (classPkg == null) {
                 throw new TranslatorException("import package cannot be null when the class is used");
             }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
index a498893..f2d2ada 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
@@ -15,18 +15,113 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
+import java.io.IOException;
+
 import org.onosproject.yangutils.datamodel.YangUses;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
+import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
+import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
+
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
+import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.addCurNodeInfoInParentTempFile;
 
 /**
  * Represents uses information extended to support java code generation.
  */
 public class YangJavaUses
-        extends YangUses {
+        extends YangUses implements JavaCodeGeneratorInfo, JavaCodeGenerator {
+
+
+    /**
+     * Contains the information of the java file being generated.
+     */
+    private JavaFileInfo javaFileInfo;
+
+    /**
+     * File handle to maintain temporary java code fragments as per the code
+     * snippet types.
+     */
+    private TempJavaCodeFragmentFiles tempFileHandle;
 
     /**
      * Creates YANG java uses object.
      */
     public YangJavaUses() {
         super();
+        setJavaFileInfo(new JavaFileInfo());
+        getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
     }
+
+    /**
+     * Returns the generated java file information.
+     *
+     * @return generated java file information
+     */
+    @Override
+    public JavaFileInfo getJavaFileInfo() {
+        if (javaFileInfo == null) {
+            throw new TranslatorException("Missing java info in java datamodel node");
+        }
+        return javaFileInfo;
+    }
+
+    /**
+     * Sets the java file info object.
+     *
+     * @param javaInfo java file info object
+     */
+    @Override
+    public void setJavaFileInfo(JavaFileInfo 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
+     * uses info.
+     *
+     * @param yangPlugin YANG plugin config
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
+        try {
+            addCurNodeInfoInParentTempFile(this, false, yangPlugin);
+        } catch (IOException e) {
+            throw new TranslatorException(
+                    "Failed to prepare generate code entry for container node " + this.getName());
+        }
+    }
+
+    /**
+     * Create a java file using the YANG uses info.
+     *
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeExit() throws TranslatorException {
+        // no code generation will be done for uses.
+    }
+
 }