Adding builder and operation type in generated interfaces

Change-Id: I0c3ed6f01a8f933ad91ce1a46aeebc62029ca47a
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
index 7891b08..ed37a36 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
@@ -16,10 +16,6 @@
 
 package org.onosproject.yangutils.translator.tojava;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangAtomicPath;
 import org.onosproject.yangutils.datamodel.YangAugment;
@@ -38,11 +34,22 @@
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModuleTranslator;
 import org.onosproject.yangutils.utils.io.YangPluginConfig;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.isRpcChildNodePresent;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
 import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.addCurNodeInfoInParentTempFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage;
+import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_NODE;
+import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_PARENT_NODE;
+import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_TRANSLATION_NODE;
+import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
+import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsg;
+import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsgForCodeGenerator;
 import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED;
+import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
@@ -54,145 +61,156 @@
  */
 public final class YangJavaModelUtils {
 
-    /**
-     * Creates an instance of YANG java model utility.
-     */
+    // No instantiation.
     private YangJavaModelUtils() {
     }
 
     /**
      * Updates YANG java file package information.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
-     * @param yangPluginConfig      YANG plugin config
+     * @param info   YANG java file info node
+     * @param config YANG plugin config
      * @throws IOException IO operations fails
      */
-    public static void updatePackageInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
-                                         YangPluginConfig yangPluginConfig)
+    public static void updatePackageInfo(JavaCodeGeneratorInfo info,
+                                         YangPluginConfig config)
             throws IOException {
-        if (javaCodeGeneratorInfo instanceof YangJavaAugmentTranslator) {
-            updatePackageForAugmentInfo(javaCodeGeneratorInfo, yangPluginConfig);
+
+        JavaFileInfoTranslator translator = info.getJavaFileInfo();
+
+        if (info instanceof YangJavaAugmentTranslator) {
+            updatePackageForAugmentInfo(info, config);
         } else {
-            javaCodeGeneratorInfo.getJavaFileInfo()
-                    .setJavaName(getCamelCase(((YangNode) javaCodeGeneratorInfo).getName(),
-                                              yangPluginConfig.getConflictResolver()));
-            javaCodeGeneratorInfo.getJavaFileInfo().setJavaAttributeName(javaCodeGeneratorInfo
-                                                                                 .getJavaFileInfo().getJavaName());
-            javaCodeGeneratorInfo.getJavaFileInfo().setPackage(getCurNodePackage((YangNode) javaCodeGeneratorInfo));
+            translator.setJavaName(getCamelCase(((YangNode) info).getName(),
+                                                config.getConflictResolver()));
+            translator.setJavaAttributeName(info.getJavaFileInfo()
+                                                    .getJavaName());
+            translator.setPackage(getCurNodePackage((YangNode) info));
         }
-        javaCodeGeneratorInfo.getJavaFileInfo().setPackageFilePath(
-                getPackageDirPathFromJavaJPackage(javaCodeGeneratorInfo.getJavaFileInfo().getPackage()));
-
-        javaCodeGeneratorInfo.getJavaFileInfo().setBaseCodeGenPath(yangPluginConfig.getCodeGenDir());
-        javaCodeGeneratorInfo.getJavaFileInfo().setPluginConfig(yangPluginConfig);
-
+        updateCommonPackageInfo(translator, info, config);
     }
 
     /**
      * Updates YANG java file package information.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
-     * @param yangPluginConfig      YANG plugin config
+     * @param info   YANG java file info node
+     * @param config YANG plugin config
      * @throws IOException IO operations fails
      */
-    private static void updatePackageForAugmentInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
-                                                    YangPluginConfig yangPluginConfig)
+    private static void updatePackageForAugmentInfo(JavaCodeGeneratorInfo info,
+                                                    YangPluginConfig config)
             throws IOException {
-        javaCodeGeneratorInfo.getJavaFileInfo()
-                .setJavaName(getAugmentClassName((YangJavaAugmentTranslator) javaCodeGeneratorInfo,
-                                                 yangPluginConfig));
-        javaCodeGeneratorInfo.getJavaFileInfo().setPackage(
-                getAugmentsNodePackage((YangNode) javaCodeGeneratorInfo, yangPluginConfig));
-        javaCodeGeneratorInfo.getJavaFileInfo().setPackageFilePath(
-                getPackageDirPathFromJavaJPackage(javaCodeGeneratorInfo.getJavaFileInfo().getPackage()));
-        javaCodeGeneratorInfo.getJavaFileInfo().setBaseCodeGenPath(yangPluginConfig.getCodeGenDir());
-        javaCodeGeneratorInfo.getJavaFileInfo().setPluginConfig(yangPluginConfig);
+
+        JavaFileInfoTranslator translator = info.getJavaFileInfo();
+
+        translator.setJavaName(getAugmentClassName(
+                (YangJavaAugmentTranslator) info, config));
+        translator.setPackage(getAugmentsNodePackage((YangNode) info, config));
+        updateCommonPackageInfo(translator, info, config);
     }
 
     /**
      * Returns package for augment node.
      *
-     * @param yangNode         augment node
-     * @param yangPluginConfig plugin configurations
+     * @param yangNode augment node
+     * @param config   plugin configurations
      * @return package for augment node
      */
-    private static String getAugmentsNodePackage(YangNode yangNode, YangPluginConfig yangPluginConfig) {
+    private static String getAugmentsNodePackage(YangNode yangNode,
+                                                 YangPluginConfig config) {
         YangAugment augment = (YangAugment) yangNode;
         StringBuilder augmentPkg = new StringBuilder();
         augmentPkg.append(getCurNodePackage(augment));
 
-        String pkg = PERIOD;
+        StringBuilder pkg = new StringBuilder();
+        pkg.append(PERIOD);
         for (YangAtomicPath atomicPath : augment.getTargetNode()) {
-            pkg = pkg + getCamelCase(atomicPath.getNodeIdentifier().getName(), yangPluginConfig.getConflictResolver())
-                    + PERIOD;
+            pkg.append(getCamelCase(atomicPath.getNodeIdentifier().getName(),
+                                    config.getConflictResolver()))
+                    .append(PERIOD);
         }
-        pkg = trimAtLast(pkg, PERIOD);
-        augmentPkg.append(pkg.toLowerCase());
+        augmentPkg.append(trimAtLast(pkg.toString(), PERIOD).toLowerCase());
         return augmentPkg.toString();
     }
 
     /**
      * Updates YANG java file package information for specified package.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
-     * @param yangPlugin            YANG plugin config
-     * @throws IOException IO operations fails
+     * @param info   YANG java file info node
+     * @param config YANG plugin config
      */
-    private static void updatePackageInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo, YangPluginConfig yangPlugin,
-                                          String pkg)
-            throws IOException {
-        javaCodeGeneratorInfo.getJavaFileInfo()
-                .setJavaName(getCamelCase(((YangNode) javaCodeGeneratorInfo).getName(),
-                                          yangPlugin.getConflictResolver()));
-        javaCodeGeneratorInfo.getJavaFileInfo().setPackage(pkg);
-        javaCodeGeneratorInfo.getJavaFileInfo().setPackageFilePath(
-                getPackageDirPathFromJavaJPackage(javaCodeGeneratorInfo.getJavaFileInfo().getPackage()));
-        javaCodeGeneratorInfo.getJavaFileInfo().setBaseCodeGenPath(yangPlugin.getCodeGenDir());
-        javaCodeGeneratorInfo.getJavaFileInfo().setPluginConfig(yangPlugin);
+    private static void updatePackageInfo(JavaCodeGeneratorInfo info,
+                                          YangPluginConfig config,
+                                          String pkg) {
+
+        JavaFileInfoTranslator translator = info.getJavaFileInfo();
+        translator.setJavaName(getCamelCase(((YangNode) info).getName(),
+                                            config.getConflictResolver()));
+        translator.setPackage(pkg);
+        updateCommonPackageInfo(translator, info, config);
+    }
+
+    /**
+     * Updates common package information.
+     *
+     * @param translator JAVA file info translator
+     * @param info       YANG java file info node
+     * @param config     YANG plugin config
+     */
+    private static void updateCommonPackageInfo(JavaFileInfoTranslator translator,
+                                                JavaCodeGeneratorInfo info,
+                                                YangPluginConfig config) {
+        translator.setPackageFilePath(getPackageDirPathFromJavaJPackage(
+                info.getJavaFileInfo().getPackage()));
+        translator.setBaseCodeGenPath(config.getCodeGenDir());
+        translator.setPluginConfig(config);
     }
 
     /**
      * Updates temporary java code fragment files.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
+     * @param info YANG java file info node
      * @throws IOException IO operations fails
      */
-    private static void createTempFragmentFile(JavaCodeGeneratorInfo javaCodeGeneratorInfo)
+    private static void createTempFragmentFile(JavaCodeGeneratorInfo info)
             throws IOException {
-        javaCodeGeneratorInfo.setTempJavaCodeFragmentFiles(
-                new TempJavaCodeFragmentFiles(javaCodeGeneratorInfo.getJavaFileInfo()));
+        info.setTempJavaCodeFragmentFiles(
+                new TempJavaCodeFragmentFiles(info.getJavaFileInfo()));
     }
 
     /**
      * Updates leaf information in temporary java code fragment files.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
+     * @param info YANG java file info node
      * @throws IOException IO operations fails
      */
-    private static void updateTempFragmentFiles(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
-                                                YangPluginConfig yangPluginConfig)
+    private static void updateTempFragmentFiles(JavaCodeGeneratorInfo info,
+                                                YangPluginConfig config)
             throws IOException {
 
-        if (javaCodeGeneratorInfo instanceof RpcNotificationContainer) {
-            javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles().getBeanTempFiles().setRooNode(true);
+        TempJavaCodeFragmentFiles translator =
+                info.getTempJavaCodeFragmentFiles();
+
+        if (info instanceof RpcNotificationContainer) {
+            getBeanFiles(info).setRootNode(true);
             /*
              * Module / sub module node code generation.
              */
-            javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
-                    .getServiceTempFiles().addCurNodeLeavesInfoToTempFiles(
-                    (YangNode) javaCodeGeneratorInfo, yangPluginConfig);
-            if (javaCodeGeneratorInfo instanceof YangJavaModuleTranslator) {
-                if (!((YangJavaModuleTranslator) javaCodeGeneratorInfo).getNotificationNodes().isEmpty()) {
-                    updateNotificationNodeInfo(javaCodeGeneratorInfo, yangPluginConfig);
+            translator.getServiceTempFiles()
+                    .addCurNodeLeavesInfoToTempFiles((YangNode) info, config);
+            if (info instanceof YangJavaModuleTranslator) {
+                if (!((YangJavaModuleTranslator) info).getNotificationNodes()
+                        .isEmpty()) {
+                    updateNotificationNodeInfo(info, config);
                 }
-            } else if (javaCodeGeneratorInfo instanceof YangJavaSubModuleTranslator) {
-                if (!((YangJavaSubModuleTranslator) javaCodeGeneratorInfo).getNotificationNodes().isEmpty()) {
-                    updateNotificationNodeInfo(javaCodeGeneratorInfo, yangPluginConfig);
+            } else if (info instanceof YangJavaSubModuleTranslator) {
+                if (!((YangJavaSubModuleTranslator) info).getNotificationNodes()
+                        .isEmpty()) {
+                    updateNotificationNodeInfo(info, config);
                 }
             }
-
         }
-        if (javaCodeGeneratorInfo instanceof YangLeavesHolder) {
+        if (info instanceof YangLeavesHolder) {
             /*
              * Container
              * Case
@@ -202,155 +220,157 @@
              * Notification
              * Output
              */
-            javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
-                    .getBeanTempFiles().addCurNodeLeavesInfoToTempFiles(
-                    (YangNode) javaCodeGeneratorInfo, yangPluginConfig);
-        } else if (javaCodeGeneratorInfo instanceof YangTypeHolder) {
+            getBeanFiles(info).addCurNodeLeavesInfoToTempFiles((YangNode) info,
+                                                               config);
+
+            // Add operation type as an attribute.
+            getBeanFiles(info).addOperationTypeToTempFiles((YangNode) info,
+                                                           config);
+        } else if (info instanceof YangTypeHolder) {
             /*
              * Typedef
              * Union
              */
-            javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
-                    .addTypeInfoToTempFiles((YangTypeHolder) javaCodeGeneratorInfo, yangPluginConfig);
-        } else if (javaCodeGeneratorInfo instanceof YangJavaEnumerationTranslator) {
+            translator.addTypeInfoToTempFiles((YangTypeHolder) info, config);
+        } else if (info instanceof YangJavaEnumerationTranslator) {
             /*
              * Enumeration
              */
-            javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles().getEnumerationTempFiles()
-                    .addEnumAttributeToTempFiles((YangNode) javaCodeGeneratorInfo, yangPluginConfig);
-
-        } else if (javaCodeGeneratorInfo instanceof YangChoice) {
+            translator.getEnumerationTempFiles()
+                    .addEnumAttributeToTempFiles((YangNode) info, config);
+        } else if (info instanceof YangChoice) {
             /*Do nothing, only the interface needs to be generated*/
         } else {
-            throw new TranslatorException("Unsupported Node Translation "
-                                                  + javaCodeGeneratorInfo.getLineNumber() + " at " +
-                                                  javaCodeGeneratorInfo.getCharPosition()
-                                                  + " in " + javaCodeGeneratorInfo.getFileName());
+            throw new TranslatorException(
+                    getErrorMsgForCodeGenerator(INVALID_TRANSLATION_NODE,
+                                                info));
         }
     }
 
     /**
      * Process generate code entry of YANG node.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
-     * @param yangPluginConfig      plugin configurations
+     * @param info   YANG java file info node
+     * @param config plugin configurations
      * @throws IOException IO operations fails
      */
-    private static void generateTempFiles(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
-                                          YangPluginConfig yangPluginConfig)
+    private static void generateTempFiles(JavaCodeGeneratorInfo info,
+                                          YangPluginConfig config)
             throws IOException {
-        if (!(javaCodeGeneratorInfo instanceof YangNode)) {
-            throw new TranslatorException("translation is not supported for the node "
-                                                  + javaCodeGeneratorInfo.getLineNumber() + " at " +
-                                                  javaCodeGeneratorInfo.getCharPosition()
-                                                  + " in " + javaCodeGeneratorInfo.getFileName());
+        if (!(info instanceof YangNode)) {
+            throw new TranslatorException(
+                    getErrorMsgForCodeGenerator(INVALID_TRANSLATION_NODE,
+                                                info));
         }
-        createTempFragmentFile(javaCodeGeneratorInfo);
-        updateTempFragmentFiles(javaCodeGeneratorInfo, yangPluginConfig);
-
+        createTempFragmentFile(info);
+        updateTempFragmentFiles(info, config);
     }
 
     /**
      * Updates notification node info in service temporary file.
      *
-     * @param javaCodeGeneratorInfo java code generator info
-     * @param yangPluginConfig      plugin configurations
+     * @param info   java code generator info
+     * @param config plugin configurations
      * @throws IOException when fails to do IO operations
      */
-    private static void updateNotificationNodeInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
-                                                   YangPluginConfig yangPluginConfig)
+    private static void updateNotificationNodeInfo(JavaCodeGeneratorInfo info,
+                                                   YangPluginConfig config)
             throws IOException {
-        if (javaCodeGeneratorInfo instanceof YangJavaModuleTranslator) {
-            for (YangNode notification : ((YangJavaModuleTranslator) javaCodeGeneratorInfo).getNotificationNodes()) {
-                javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
-                        .getEventFragmentFiles()
-                        .addJavaSnippetOfEvent(notification, yangPluginConfig);
+        TempJavaCodeFragmentFiles translator =
+                info.getTempJavaCodeFragmentFiles();
+        if (info instanceof YangJavaModuleTranslator) {
+            for (YangNode notification : ((YangJavaModuleTranslator) info)
+                    .getNotificationNodes()) {
+                translator.getEventFragmentFiles()
+                        .addJavaSnippetOfEvent(notification, config);
             }
         }
-        if (javaCodeGeneratorInfo instanceof YangJavaSubModuleTranslator) {
-            for (YangNode notification : ((YangJavaSubModuleTranslator) javaCodeGeneratorInfo)
+        if (info instanceof YangJavaSubModuleTranslator) {
+            for (YangNode notification : ((YangJavaSubModuleTranslator) info)
                     .getNotificationNodes()) {
-                javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
-                        .getEventFragmentFiles()
-                        .addJavaSnippetOfEvent(notification, yangPluginConfig);
+                translator.getEventFragmentFiles()
+                        .addJavaSnippetOfEvent(notification, config);
             }
         }
     }
 
     /**
-     * Generates code for the current ata model node and adds itself as an attribute in the parent.
+     * Generates code for the current ata model node and adds itself as an
+     * attribute in the parent.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
-     * @param yangPlugin            YANG plugin config
-     * @param isMultiInstance       flag to indicate whether it's a list
+     * @param info            YANG java file info node
+     * @param config          YANG plugin config
+     * @param isMultiInstance flag to indicate whether it's a list
      * @throws IOException IO operations fails
      */
-    public static void generateCodeAndUpdateInParent(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
-                                                     YangPluginConfig yangPlugin, boolean isMultiInstance)
+    public static void generateCodeAndUpdateInParent(JavaCodeGeneratorInfo info,
+                                                     YangPluginConfig config,
+                                                     boolean isMultiInstance)
             throws IOException {
-        if (!(javaCodeGeneratorInfo instanceof YangNode)) {
-            throw new TranslatorException("Invalid node for translation " +
-                                                  javaCodeGeneratorInfo.getLineNumber() + " at " +
-                                                  javaCodeGeneratorInfo.getCharPosition()
-                                                  + " in " + javaCodeGeneratorInfo.getFileName());
+        if (!(info instanceof YangNode)) {
+            throw new TranslatorException(
+                    getErrorMsgForCodeGenerator(INVALID_TRANSLATION_NODE,
+                                                info));
         }
 
         /*
          * Generate the Java files corresponding to the current node.
          */
-        generateCodeOfAugmentableNode(javaCodeGeneratorInfo, yangPlugin);
+        generateCodeOfAugmentableNode(info, config);
 
         /*
          * Update the current nodes info in its parent nodes generated files.
          */
-        addCurNodeInfoInParentTempFile((YangNode) javaCodeGeneratorInfo, isMultiInstance, yangPlugin);
+        addCurNodeInfoInParentTempFile((YangNode) info, isMultiInstance,
+                                       config);
     }
 
     /**
-     * Generates code for the current data model node and adds support for it to be augmented.
+     * Generates code for the current data model node and adds support for it to
+     * be augmented.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
-     * @param yangPlugin            YANG plugin config
+     * @param info   YANG java file info node
+     * @param config YANG plugin config
      * @throws IOException IO operations fails
      */
-    public static void generateCodeOfAugmentableNode(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
-                                                     YangPluginConfig yangPlugin)
+    public static void generateCodeOfAugmentableNode(JavaCodeGeneratorInfo info,
+                                                     YangPluginConfig config)
             throws IOException {
-        if (!(javaCodeGeneratorInfo instanceof YangNode)) {
-            throw new TranslatorException("invalid node for translation " +
-                                                  javaCodeGeneratorInfo.getLineNumber() + " at " +
-                                                  javaCodeGeneratorInfo.getCharPosition()
-                                                  + " in " + javaCodeGeneratorInfo.getFileName());
+        if (!(info instanceof YangNode)) {
+            throw new TranslatorException(
+                    getErrorMsgForCodeGenerator(INVALID_TRANSLATION_NODE,
+                                                info));
         }
 
-        generateCodeOfNode(javaCodeGeneratorInfo, yangPlugin);
-        TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles();
+        generateCodeOfNode(info, config);
+        TempJavaCodeFragmentFiles tempFiles =
+                info.getTempJavaCodeFragmentFiles();
 
-        if (javaCodeGeneratorInfo instanceof YangCase) {
-            YangNode parent = ((YangCase) javaCodeGeneratorInfo).getParent();
-            JavaQualifiedTypeInfoTranslator parentsInfo = getQualifierInfoForCasesParent(parent, yangPlugin);
-            javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles().getBeanTempFiles().getJavaExtendsListHolder()
-                    .addToExtendsList(parentsInfo, (YangNode) javaCodeGeneratorInfo,
-                                      tempJavaCodeFragmentFiles.getBeanTempFiles());
+        if (info instanceof YangCase) {
+            YangNode parent = ((YangCase) info).getParent();
+            JavaQualifiedTypeInfoTranslator typeInfo =
+                    getQualifierInfoForCasesParent(parent, config);
+            getBeanFiles(info).getJavaExtendsListHolder()
+                    .addToExtendsList(typeInfo, (YangNode) info,
+                                      tempFiles.getBeanTempFiles());
 
-            javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles().getBeanTempFiles()
-                    .addParentInfoInCurNodeTempFile((YangNode) javaCodeGeneratorInfo, yangPlugin);
-
+            getBeanFiles(info).addParentInfoInCurNodeTempFile((YangNode) info,
+                                                              config);
         }
     }
 
     /**
      * Returns cases parent's qualified info.
      *
-     * @param parent           parent node
-     * @param yangPluginConfig plugin configuration
+     * @param parent parent node
+     * @param config plugin configuration
      * @return cases parent's qualified info
      */
-    public static JavaQualifiedTypeInfoTranslator getQualifierInfoForCasesParent(YangNode parent,
-                                                                                 YangPluginConfig yangPluginConfig) {
+    public static JavaQualifiedTypeInfoTranslator
+    getQualifierInfoForCasesParent(YangNode parent,
+                                   YangPluginConfig config) {
         String parentName;
         String parentPkg;
-        JavaQualifiedTypeInfoTranslator parentsInfo = new JavaQualifiedTypeInfoTranslator();
         JavaFileInfoTranslator parentInfo;
         if (parent instanceof YangChoice) {
             parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
@@ -362,59 +382,60 @@
             parentName = getCapitalCase(parentInfo.getJavaName());
             parentPkg = parentInfo.getPackage();
         } else {
-            parentName = getCapitalCase(getCamelCase(parent.getName(), yangPluginConfig.getConflictResolver()));
-            parentPkg = getNodesPackage(parent, yangPluginConfig);
+            parentName = getCapitalCase(getCamelCase(parent.getName(),
+                                                     config.getConflictResolver()));
+            parentPkg = getNodesPackage(parent, config);
         }
-        parentsInfo.setClassInfo(parentName);
-        parentsInfo.setPkgInfo(parentPkg);
-        return parentsInfo;
-
+        JavaQualifiedTypeInfoTranslator qualifiedTypeInfo =
+                new JavaQualifiedTypeInfoTranslator();
+        qualifiedTypeInfo.setClassInfo(parentName);
+        qualifiedTypeInfo.setPkgInfo(parentPkg);
+        return qualifiedTypeInfo;
     }
 
     /**
      * Generates code for the current data model node.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
-     * @param yangPluginConfig      YANG plugin config
+     * @param info   YANG java file info node
+     * @param config YANG plugin config
      * @throws IOException IO operations fails
      */
-    public static void generateCodeOfNode(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
-                                          YangPluginConfig yangPluginConfig)
+    public static void generateCodeOfNode(JavaCodeGeneratorInfo info,
+                                          YangPluginConfig config)
             throws IOException {
-        if (!(javaCodeGeneratorInfo instanceof YangNode)) {
-            throw new TranslatorException("invalid node for translation "
-                                                  + javaCodeGeneratorInfo.getLineNumber() + " at " +
-                                                  javaCodeGeneratorInfo.getCharPosition()
-                                                  + " in " + javaCodeGeneratorInfo.getFileName());
+        if (!(info instanceof YangNode)) {
+            throw new TranslatorException(
+                    getErrorMsgForCodeGenerator(INVALID_TRANSLATION_NODE,
+                                                info));
         }
-        updatePackageInfo(javaCodeGeneratorInfo, yangPluginConfig);
-        generateTempFiles(javaCodeGeneratorInfo, yangPluginConfig);
+        updatePackageInfo(info, config);
+        generateTempFiles(info, config);
     }
 
     /**
      * Generates code for the root module/sub-module node.
      *
-     * @param javaCodeGeneratorInfo YANG java file info node
-     * @param yangPluginConfig      YANG plugin config
-     * @param rootPkg               package of the root node
+     * @param info    YANG java file info node
+     * @param config  YANG plugin config
+     * @param rootPkg package of the root node
      * @throws IOException IO operations fails
      */
-    public static void generateCodeOfRootNode(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
-                                              YangPluginConfig yangPluginConfig, String rootPkg)
+    public static void generateCodeOfRootNode(JavaCodeGeneratorInfo info,
+                                              YangPluginConfig config,
+                                              String rootPkg)
             throws IOException {
-        if (!(javaCodeGeneratorInfo instanceof YangNode)) {
-            throw new TranslatorException("invalid node for translation " + javaCodeGeneratorInfo.getLineNumber()
-                                                  + " at " +
-                                                  javaCodeGeneratorInfo.getCharPosition()
-                                                  + " in " + javaCodeGeneratorInfo.getFileName());
+        if (!(info instanceof YangNode)) {
+            throw new TranslatorException(
+                    getErrorMsgForCodeGenerator(INVALID_TRANSLATION_NODE,
+                                                info));
         }
-        updatePackageInfo(javaCodeGeneratorInfo, yangPluginConfig, rootPkg);
+        updatePackageInfo(info, config, rootPkg);
 
-        if (isRpcChildNodePresent((YangNode) javaCodeGeneratorInfo)) {
-            javaCodeGeneratorInfo.getJavaFileInfo().addGeneratedFileTypes(GENERATE_SERVICE_AND_MANAGER);
+        if (isRpcChildNodePresent((YangNode) info)) {
+            info.getJavaFileInfo()
+                    .addGeneratedFileTypes(GENERATE_SERVICE_AND_MANAGER);
         }
-
-        generateTempFiles(javaCodeGeneratorInfo, yangPluginConfig);
+        generateTempFiles(info, config);
     }
 
     /**
@@ -423,28 +444,23 @@
      * @param curNode current java node whose package string needs to be set
      * @return returns the root package string
      */
-    public static String getCurNodePackage(YangNode curNode) {
+    public static String getCurNodePackage(YangNode curNode)
+            throws TranslatorException {
 
         String pkg;
-        if (!(curNode instanceof JavaFileInfoContainer)
-                || curNode.getParent() == null) {
-            throw new TranslatorException("missing parent node to get current node's package " +
-                                                  curNode.getName() + " in " +
-                                                  curNode.getLineNumber() + " at " +
-                                                  curNode.getCharPosition()
-                                                  + " in " + curNode.getFileName());
+        if (!(curNode instanceof JavaFileInfoContainer) ||
+                curNode.getParent() == null) {
+            throw new TranslatorException(getErrorMsg(INVALID_NODE, curNode));
         }
 
         YangNode parentNode = DataModelUtils.getParentNodeInGenCode(curNode);
         if (!(parentNode instanceof JavaFileInfoContainer)) {
-            throw new TranslatorException("missing parent java node to get current node's package " +
-                                                  curNode.getName() + " in " +
-                                                  curNode.getLineNumber() + " at " +
-                                                  curNode.getCharPosition()
-                                                  + " in " + curNode.getFileName());
+            throw new TranslatorException(getErrorMsg(INVALID_PARENT_NODE,
+                                                      curNode));
         }
-        JavaFileInfoTranslator parentJavaFileHandle = ((JavaFileInfoContainer) parentNode).getJavaFileInfo();
-        pkg = parentJavaFileHandle.getPackage() + PERIOD + parentJavaFileHandle.getJavaName();
+        JavaFileInfoTranslator handle =
+                ((JavaFileInfoContainer) parentNode).getJavaFileInfo();
+        pkg = handle.getPackage() + PERIOD + handle.getJavaName();
         return pkg.toLowerCase();
     }
 
@@ -455,74 +471,80 @@
      * @return true if root node contains any data node
      */
     public static boolean isRootNodesCodeGenRequired(YangNode node) {
-        YangLeavesHolder holder = (YangLeavesHolder) node;
-
-        if (holder.getListOfLeaf().isEmpty()) {
-            if (holder.getListOfLeafList().isEmpty()) {
-                YangNode tempNode = node.getChild();
-                if (tempNode == null) {
-                    return false;
-                }
-                while (tempNode != null) {
-                    if (!(tempNode instanceof YangTranslatorOperatorNode)) {
-                        return true;
-                    }
-                    tempNode = tempNode.getNextSibling();
-                }
-                return false;
-            } else {
-                return true;
-            }
-        } else {
-            return true;
-        }
+        return isNodeCodeGenRequired(node, true);
     }
 
     /**
      * Returns true if get/set method of root node are required.
      *
-     * @param curNode root node
+     * @param node root node
      * @return true if get/set method of root node are required
      */
-    public static boolean isGetSetOfRootNodeRequired(YangNode curNode) {
-        YangLeavesHolder holder = (YangLeavesHolder) curNode;
+    public static boolean isGetSetOfRootNodeRequired(YangNode node) {
+        return isNodeCodeGenRequired(node, false);
+    }
 
-        if (holder.getListOfLeaf().isEmpty()) {
-            if (holder.getListOfLeafList().isEmpty()) {
-                curNode = curNode.getChild();
-                if (curNode == null) {
-                    return false;
-                }
-                while (curNode != null) {
-                    if (!(curNode instanceof YangAugment)) {
-                        return true;
-                    }
-                    curNode = curNode.getNextSibling();
-                }
-                return false;
-            } else {
-                return true;
-            }
-        } else {
+    /**
+     * Returns true if either get/set method of root node are required or root
+     * node contains any data node. This check is done depending on the
+     * boolean parameter indicating whether check to be performed for root
+     * node code generation or get/set method generation.
+     *
+     * @param node        root node
+     * @param rootNodeGen flag indicating check type
+     * @return true if check pass, false otherwise
+     */
+    public static boolean isNodeCodeGenRequired(YangNode node,
+                                                boolean rootNodeGen) {
+        YangLeavesHolder holder = (YangLeavesHolder) node;
+
+        if (!holder.getListOfLeaf().isEmpty()) {
             return true;
         }
+        if (!holder.getListOfLeafList().isEmpty()) {
+            return true;
+        }
+        node = node.getChild();
+        if (node == null) {
+            return false;
+        }
+
+        if (rootNodeGen) {
+            while (node != null) {
+                if (!(node instanceof YangTranslatorOperatorNode)) {
+                    return true;
+                }
+                node = node.getNextSibling();
+            }
+            return false;
+        }
+        while (node != null) {
+            if (!(node instanceof YangAugment)) {
+                return true;
+            }
+            node = node.getNextSibling();
+        }
+        return false;
     }
 
     /**
      * Returns nodes package.
      *
-     * @param node             YANG node
-     * @param yangPluginConfig plugin config
+     * @param node   YANG node
+     * @param config plugin config
      * @return java package
      */
-    public static String getNodesPackage(YangNode node, YangPluginConfig yangPluginConfig) {
+    public static String getNodesPackage(YangNode node,
+                                         YangPluginConfig config) {
 
         List<String> clsInfo = new ArrayList<>();
         while (node.getParent() != null) {
             if (node instanceof YangJavaAugmentTranslator) {
-                clsInfo.add(getAugmentClassName((YangAugment) node, yangPluginConfig));
+                clsInfo.add(getAugmentClassName((YangAugment) node,
+                                                config));
             } else {
-                clsInfo.add(getCamelCase(node.getName(), yangPluginConfig.getConflictResolver()));
+                clsInfo.add(getCamelCase(node.getName(), config
+                        .getConflictResolver()));
             }
             node = node.getParent();
         }
@@ -530,41 +552,44 @@
         StringBuilder pkg = new StringBuilder();
         if (node instanceof YangJavaModuleTranslator) {
             YangJavaModuleTranslator module = (YangJavaModuleTranslator) node;
-            pkg.append(getRootPackage(module.getVersion(), module.getNameSpace(), module
-                    .getRevision(), yangPluginConfig.getConflictResolver()));
+            pkg.append(getRootPackage(module.getVersion(), module.getNameSpace(),
+                                      module.getRevision(),
+                                      config.getConflictResolver()));
         } else if (node instanceof YangJavaSubModuleTranslator) {
-            YangJavaSubModuleTranslator subModule = (YangJavaSubModuleTranslator) node;
+            YangJavaSubModuleTranslator subModule =
+                    (YangJavaSubModuleTranslator) node;
             pkg.append(getRootPackage(subModule.getVersion(),
                                       subModule.getNameSpaceFromModule(),
-                                      subModule.getRevision(), yangPluginConfig.getConflictResolver()));
+                                      subModule.getRevision(),
+                                      config.getConflictResolver()));
         }
-        String concat = "";
-        for (int i = 1; i <= clsInfo.size(); i++) {
-            concat = concat + "." + clsInfo.get(clsInfo.size() - i);
+        pkg.append(EMPTY_STRING);
+        int size = clsInfo.size();
+        for (int i = size - 1; i >= 0; i--) {
+            pkg.append(PERIOD).append(clsInfo.get(i));
         }
-        pkg.append(concat);
         return pkg.toString().toLowerCase();
-
     }
 
     /**
      * Returns augment class name.
      *
-     * @param augment          YANG augment
-     * @param yangPluginConfig plugin configurations
+     * @param augment YANG augment
+     * @param config  plugin configurations
      * @return augment class name
      */
-    private static String getAugmentClassName(YangAugment augment, YangPluginConfig yangPluginConfig) {
-        YangNodeIdentifier yangNodeIdentifier = augment.getTargetNode().get(augment.getTargetNode().size() - 1)
-                .getNodeIdentifier();
-        String name = getCapitalCase(getCamelCase(yangNodeIdentifier.getName(), yangPluginConfig
-                .getConflictResolver()));
-        if (yangNodeIdentifier.getPrefix() != null) {
-            return AUGMENTED + getCapitalCase(getCamelCase(yangNodeIdentifier.getPrefix(), yangPluginConfig
-                    .getConflictResolver())) + name;
-        } else {
-            return AUGMENTED + name;
+    private static String getAugmentClassName(YangAugment augment,
+                                              YangPluginConfig config) {
+        YangNodeIdentifier identifier =
+                augment.getTargetNode().get(augment.getTargetNode().size() - 1)
+                        .getNodeIdentifier();
+        String name = getCapitalCase(getCamelCase(identifier.getName(),
+                                                  config.getConflictResolver()));
+        if (identifier.getPrefix() != null) {
+            return AUGMENTED + getCapitalCase(
+                    getCamelCase(identifier.getPrefix(),
+                                 config.getConflictResolver())) + name;
         }
+        return AUGMENTED + name;
     }
-
 }