diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/CachedJavaFileHandle.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/CachedJavaFileHandle.java
index 5e2cbe3..338cba3 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/CachedJavaFileHandle.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/CachedJavaFileHandle.java
@@ -305,8 +305,8 @@
     @Override
     public void close() throws IOException {
 
+        List<AttributeInfo> attrList = getCachedAttributeList();
         flushCacheAttrToTempFile();
-
         String className = getYangName();
         className = JavaIdentifierSyntax.getCaptialCase(className);
         String path = getRelativeFilePath();
@@ -322,11 +322,14 @@
 
         for (ImportInfo importInfo : new ArrayList<ImportInfo>(getImportSet())) {
             importString = UtilConstants.IMPORT;
-            if (importInfo.getPkgInfo() != null) {
+            if (importInfo.getPkgInfo() != "" && importInfo.getClassInfo() != null
+                    && importInfo.getPkgInfo() != UtilConstants.JAVA_LANG) {
                 importString = importString + importInfo.getPkgInfo() + ".";
+                importString = importString + importInfo.getClassInfo() + UtilConstants.SEMI_COLAN
+                        + UtilConstants.NEW_LINE;
+
+                imports.add(importString);
             }
-            importString = importString + importInfo.getClassInfo() + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE;
-            imports.add(importString);
         }
         java.util.Collections.sort(imports);
 
@@ -342,7 +345,7 @@
             String interfaceFileName = className;
             File interfaceFile = JavaFileGenerator.getFileObject(path, interfaceFileName, JAVA_FILE_EXTENSION, this);
             interfaceFile = JavaFileGenerator.generateInterfaceFile(interfaceFile, className, imports,
-                    getCachedAttributeList(), path.replace('/', '.'), this);
+                    attrList, path.replace('/', '.'), this);
             /**
              * Create temp builder interface file.
              */
@@ -350,7 +353,7 @@
             File builderInterfaceFile = JavaFileGenerator.getFileObject(path, builderInterfaceFileName,
                     TEMP_FILE_EXTENSION, this);
             builderInterfaceFile = JavaFileGenerator.generateBuilderInterfaceFile(builderInterfaceFile, className,
-                    path.replace('/', '.'), getCachedAttributeList(), this);
+                    path.replace('/', '.'), attrList, this);
             /**
              * Append builder interface file to interface file and close it.
              */
@@ -369,9 +372,11 @@
             JavaFileGenerator.clean(builderInterfaceFile);
         }
 
-        imports.add(UtilConstants.MORE_OBJECT_IMPORT);
-        imports.add(UtilConstants.JAVA_UTIL_OBJECTS_IMPORT);
-        java.util.Collections.sort(imports);
+        if (!attrList.isEmpty()) {
+            imports.add(UtilConstants.MORE_OBJECT_IMPORT);
+            imports.add(UtilConstants.JAVA_UTIL_OBJECTS_IMPORT);
+            java.util.Collections.sort(imports);
+        }
 
         if ((fileType & GeneratedFileType.BUILDER_CLASS_MASK) != 0
                 || fileType == GeneratedFileType.GENERATE_INTERFACE_WITH_BUILDER) {
@@ -382,7 +387,7 @@
             String builderFileName = className + UtilConstants.BUILDER;
             File builderFile = JavaFileGenerator.getFileObject(path, builderFileName, JAVA_FILE_EXTENSION, this);
             builderFile = JavaFileGenerator.generateBuilderClassFile(builderFile, className, imports,
-                    path.replace('/', '.'), getCachedAttributeList(), this);
+                    path.replace('/', '.'), attrList, this);
             /**
              * Create temp impl class file.
              */
@@ -390,7 +395,7 @@
             String implFileName = className + UtilConstants.IMPL;
             File implTempFile = JavaFileGenerator.getFileObject(path, implFileName, TEMP_FILE_EXTENSION, this);
             implTempFile = JavaFileGenerator.generateImplClassFile(implTempFile, className,
-                    path.replace('/', '.'), getCachedAttributeList(), this);
+                    path.replace('/', '.'), attrList, this);
             /**
              * Append impl class to builder class and close it.
              */
@@ -418,7 +423,7 @@
             String typeDefFileName = className;
             File typeDefFile = JavaFileGenerator.getFileObject(path, typeDefFileName, JAVA_FILE_EXTENSION, this);
             typeDefFile = JavaFileGenerator.generateTypeDefClassFile(typeDefFile, className, imports,
-                    path.replace('/', '.'), getCachedAttributeList(), this);
+                    path.replace('/', '.'), attrList, this);
             JavaFileGenerator.insert(typeDefFile,
                     JavaFileGenerator.closeFile(GeneratedFileType.GENERATE_TYPEDEF_CLASS, typeDefFileName));
 
@@ -428,10 +433,17 @@
             JavaFileGenerator.closeFileHandles(typeDefFile);
         }
 
-        closeTempDataFileHandles(className, getCodeGenFilePath() + getRelativeFilePath());
-        JavaFileGenerator
-                .cleanTempFiles(new File(getCodeGenFilePath() + getRelativeFilePath() + File.separator + className
-                        + TEMP_FOLDER_NAME_SUFIX));
+        if (!getCachedAttributeList().isEmpty()) {
+            closeTempDataFileHandles(className, getCodeGenFilePath() + getRelativeFilePath());
+            JavaFileGenerator
+                    .cleanTempFiles(new File(getCodeGenFilePath() + getRelativeFilePath() + File.separator + className
+                            + TEMP_FOLDER_NAME_SUFIX));
+        }
+
+        /*
+         * clear the contents from the cached attribute list.
+         */
+        getCachedAttributeList().clear();
     }
 
     @Override
@@ -512,7 +524,12 @@
                 + File.separator + className + TEMP_FOLDER_NAME_SUFIX + File.separator;
 
         try {
-            return readFile(path + fileName + TEMP_FILE_EXTENSION);
+            String file = path + fileName + TEMP_FILE_EXTENSION;
+            if (new File(file).exists()) {
+                return readFile(path + fileName + TEMP_FILE_EXTENSION);
+            } else {
+                return "";
+            }
 
         } catch (FileNotFoundException e) {
             throw new FileNotFoundException("No such file or directory.");
@@ -533,8 +550,14 @@
             String line = bufferReader.readLine();
 
             while (line != null) {
-                stringBuilder.append(line);
-                stringBuilder.append("\n");
+                if (line.equals(UtilConstants.FOUR_SPACE_INDENTATION)
+                        || line.equals(UtilConstants.EIGHT_SPACE_INDENTATION)
+                        || line.equals(UtilConstants.SPACE) || line.equals("") || line.equals(UtilConstants.NEW_LINE)) {
+                    stringBuilder.append("\n");
+                } else {
+                    stringBuilder.append(line);
+                    stringBuilder.append("\n");
+                }
                 line = bufferReader.readLine();
             }
             return stringBuilder.toString();
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
index 58a0896..c0f4a15 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
@@ -84,7 +84,7 @@
      */
     private static String getBuilderInterfaceDefinition(String yangName) {
         return UtilConstants.INTERFACE + UtilConstants.SPACE + yangName + UtilConstants.BUILDER + UtilConstants.SPACE
-                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE + UtilConstants.NEW_LINE;
     }
 
     /**
@@ -112,8 +112,7 @@
         return UtilConstants.PUBLIC + UtilConstants.SPACE + UtilConstants.FINAL + UtilConstants.SPACE
                 + UtilConstants.CLASS + UtilConstants.SPACE + yangName + UtilConstants.IMPL + UtilConstants.SPACE
                 + UtilConstants.IMPLEMENTS + UtilConstants.SPACE + yangName + UtilConstants.SPACE
-                + UtilConstants.OPEN_CURLY_BRACKET
-                + UtilConstants.SPACE + UtilConstants.NEW_LINE;
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE + UtilConstants.NEW_LINE;
     }
 
     /**
@@ -126,7 +125,7 @@
 
         return UtilConstants.PUBLIC + UtilConstants.SPACE + UtilConstants.FINAL + UtilConstants.SPACE
                 + UtilConstants.CLASS + UtilConstants.SPACE + yangName + UtilConstants.SPACE
-                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.SPACE + UtilConstants.NEW_LINE;
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
     }
 
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
index 0ae81f7..221f757 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
@@ -36,6 +36,7 @@
 import org.onosproject.yangutils.utils.io.impl.FileSystemUtil;
 import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
 import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
+import org.onosproject.yangutils.utils.io.impl.YangIoUtils;
 import org.slf4j.Logger;
 
 /**
@@ -81,19 +82,21 @@
         String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
         initiateFile(file, className, INTERFACE_MASK, imports, pkg);
 
-        List<String> methods = new ArrayList<>();
-        try {
-            methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS, className, path));
-        } catch (ClassNotFoundException | IOException e) {
-            log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
-            throw new IOException("Fail to read data from temp file.");
-        }
+        if (!attrList.isEmpty()) {
+            List<String> methods = new ArrayList<>();
+            try {
+                methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS, className, path));
+            } catch (ClassNotFoundException | IOException e) {
+                log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
+                throw new IOException("Fail to read data from temp file.");
+            }
 
-        /**
-         * Add getter methods to interface file.
-         */
-        for (String method : methods) {
-            appendMethod(file, method);
+            /**
+             * Add getter methods to interface file.
+             */
+            for (String method : methods) {
+                appendMethod(file, method);
+            }
         }
         return file;
     }
@@ -115,14 +118,16 @@
         initiateFile(file, className, BUILDER_INTERFACE_MASK, null, pkg);
         List<String> methods = new ArrayList<>();
 
-        try {
-            methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS, className, path));
-            methods.add(handle.getTempData(TempDataStoreTypes.SETTER_METHODS, className, path));
-        } catch (ClassNotFoundException | IOException e) {
-            log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
-            throw new IOException("Fail to read data from temp file.");
-        }
+        if (!attrList.isEmpty()) {
 
+            try {
+                methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS, className, path));
+                methods.add(handle.getTempData(TempDataStoreTypes.SETTER_METHODS, className, path));
+            } catch (ClassNotFoundException | IOException e) {
+                log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
+                throw new IOException("Fail to read data from temp file.");
+            }
+        }
         /**
          * Add build method to builder interface file.
          */
@@ -156,38 +161,41 @@
         String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
         initiateFile(file, className, BUILDER_CLASS_MASK, imports, pkg);
 
-        /**
-         * Add attribute strings.
-         */
-        List<String> attributes = new ArrayList<>();
-        try {
-            attributes.add(handle.getTempData(TempDataStoreTypes.ATTRIBUTE, className, path));
-        } catch (ClassNotFoundException | IOException e) {
-            log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
-            throw new IOException("Fail to read data from temp file.");
-        }
-        /**
-         * Add attributes to the file.
-         */
-        for (String attribute : attributes) {
-            insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
-        }
-
         List<String> methods = new ArrayList<>();
-        try {
-            methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS_IMPL, className, path));
-            methods.add(handle.getTempData(TempDataStoreTypes.SETTER_METHODS_IMPL, className, path));
-        } catch (ClassNotFoundException | IOException e) {
-            log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
-            throw new IOException("Fail to read data from temp file.");
-        }
+        if (!attrList.isEmpty()) {
+            /**
+             * Add attribute strings.
+             */
+            List<String> attributes = new ArrayList<>();
+            try {
+                attributes.add(handle.getTempData(TempDataStoreTypes.ATTRIBUTE, className, path));
+            } catch (ClassNotFoundException | IOException e) {
+                log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
+                throw new IOException("Fail to read data from temp file.");
+            }
+            /**
+             * Add attributes to the file.
+             */
+            for (String attribute : attributes) {
+                insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
+            }
 
+            try {
+                methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS_IMPL, className, path));
+                methods.add(handle.getTempData(TempDataStoreTypes.SETTER_METHODS_IMPL, className, path));
+            } catch (ClassNotFoundException | IOException e) {
+                log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
+                throw new IOException("Fail to read data from temp file.");
+            }
+
+        }
         /**
          * Add default constructor and build method impl.
          */
-        methods.add(UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_FIRST_LINE
-                + MethodsGenerator.getDefaultConstructorString(className + UtilConstants.BUILDER,
-                        UtilConstants.PUBLIC));
+        methods.add(
+                UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_FIRST_LINE
+                        + MethodsGenerator.getDefaultConstructorString(className + UtilConstants.BUILDER,
+                                UtilConstants.PUBLIC));
         methods.add(MethodsGenerator.getBuildString(className));
 
         /**
@@ -216,47 +224,55 @@
         String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
         initiateFile(file, className, IMPL_CLASS_MASK, null, path);
 
-        List<String> attributes = new ArrayList<>();
-        try {
-            attributes.add(handle.getTempData(TempDataStoreTypes.ATTRIBUTE, className, path));
-        } catch (ClassNotFoundException | IOException e) {
-            log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
-            throw new IOException("Fail to read data from temp file.");
-        }
-
-        /**
-         * Add attributes to the file.
-         */
-        for (String attribute : attributes) {
-            insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
-        }
-
         List<String> methods = new ArrayList<>();
+        if (!attrList.isEmpty()) {
+            List<String> attributes = new ArrayList<>();
+            try {
+                attributes.add(handle.getTempData(TempDataStoreTypes.ATTRIBUTE, className, path));
+            } catch (ClassNotFoundException | IOException e) {
+                log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
+                throw new IOException("Fail to read data from temp file.");
+            }
+
+            /**
+             * Add attributes to the file.
+             */
+            for (String attribute : attributes) {
+                insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
+            }
+
+            try {
+
+                methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS_IMPL, className, path));
+
+                methods.add(MethodsGenerator.getHashCodeMethodClose(MethodsGenerator.getHashCodeMethodOpen()
+                        + YangIoUtils
+                                .partString(handle.getTempData(TempDataStoreTypes.HASH_CODE, className, path).replace(
+                                        UtilConstants.NEW_LINE, ""))));
+
+                methods.add(MethodsGenerator
+                        .getEqualsMethodClose(MethodsGenerator.getEqualsMethodOpen(className + UtilConstants.IMPL)
+                                + handle.getTempData(TempDataStoreTypes.EQUALS, className, path)));
+
+                methods.add(MethodsGenerator.getToStringMethodOpen()
+                        + handle.getTempData(TempDataStoreTypes.TO_STRING, className, path)
+                        + MethodsGenerator.getToStringMethodClose());
+
+            } catch (ClassNotFoundException | IOException e) {
+                log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
+                throw new IOException("Fail to read data from temp file.");
+            }
+
+        }
+
         try {
-
-            methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS_IMPL, className, path));
-
             methods.add(getConstructorString(className)
                     + handle.getTempData(TempDataStoreTypes.CONSTRUCTOR, className, path)
                     + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET);
-
-            methods.add(MethodsGenerator.getHashCodeMethodClose(MethodsGenerator.getHashCodeMethodOpen()
-                    + handle.getTempData(TempDataStoreTypes.HASH_CODE, className, path).replace(UtilConstants.NEW_LINE,
-                            "")));
-
-            methods.add(MethodsGenerator
-                    .getEqualsMethodClose(MethodsGenerator.getEqualsMethodOpen(className + UtilConstants.IMPL)
-                            + handle.getTempData(TempDataStoreTypes.EQUALS, className, path)));
-
-            methods.add(MethodsGenerator.getToStringMethodOpen()
-                    + handle.getTempData(TempDataStoreTypes.TO_STRING, className, path)
-                    + MethodsGenerator.getToStringMethodClose());
-
         } catch (ClassNotFoundException | IOException e) {
             log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
             throw new IOException("Fail to read data from temp file.");
         }
-
         /**
          * Add methods in impl class.
          */
@@ -315,8 +331,9 @@
         String javadoc = MethodsGenerator.getConstructorString(yangName);
         String constructor = UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
                 + yangName + UtilConstants.IMPL + UtilConstants.OPEN_PARENTHESIS + yangName + UtilConstants.BUILDER
-                + UtilConstants.SPACE + builderAttribute + UtilConstants.OBJECT + UtilConstants.CLOSE_PARENTHESIS
-                + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
+                + UtilConstants.SPACE + builderAttribute + UtilConstants.BUILDER + UtilConstants.OBJECT
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET
+                + UtilConstants.NEW_LINE;
         return javadoc + constructor;
     }
 
@@ -514,15 +531,16 @@
                         + MethodsGenerator.getSetterForTypeDefClass(attr)
                         + UtilConstants.NEW_LINE;
 
-                hashCodeString = hashCodeString + MethodsGenerator.getHashCodeMethodOpen()
-                        + MethodsGenerator.getHashCodeMethod(attr).replace(UtilConstants.NEW_LINE, "");
+                hashCodeString = MethodsGenerator.getHashCodeMethodOpen()
+                        + YangIoUtils.partString(
+                                MethodsGenerator.getHashCodeMethod(attr).replace(UtilConstants.NEW_LINE, ""));
                 hashCodeString = MethodsGenerator.getHashCodeMethodClose(hashCodeString) + UtilConstants.NEW_LINE;
 
-                equalsString = equalsString + MethodsGenerator.getEqualsMethodOpen(className) + UtilConstants.NEW_LINE
+                equalsString = MethodsGenerator.getEqualsMethodOpen(className) + UtilConstants.NEW_LINE
                         + MethodsGenerator.getEqualsMethod(attr);
                 equalsString = MethodsGenerator.getEqualsMethodClose(equalsString) + UtilConstants.NEW_LINE;
 
-                toString = toString + MethodsGenerator.getToStringMethodOpen()
+                toString = MethodsGenerator.getToStringMethodOpen()
                         + MethodsGenerator.getToStringMethod(attr) + UtilConstants.NEW_LINE
                         + MethodsGenerator.getToStringMethodClose()
                         + UtilConstants.NEW_LINE;
@@ -568,7 +586,6 @@
                 for (String imports : importsList) {
                     insert(file, imports);
                 }
-                insert(file, UtilConstants.NEW_LINE);
             }
             write(file, fileName, type, JavaDocType.IMPL_CLASS);
         } else {
@@ -581,7 +598,6 @@
                     for (String imports : importsList) {
                         insert(file, imports);
                     }
-                    insert(file, UtilConstants.NEW_LINE);
                 }
                 write(file, fileName, type, JavaDocType.INTERFACE);
             } else if ((type & BUILDER_CLASS_MASK) != 0) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index 6ca6829..576ebff 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -434,7 +434,7 @@
         String constructor = UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.THIS
                 + UtilConstants.PERIOD + JavaIdentifierSyntax.getCamelCase(attributeName)
                 + UtilConstants.SPACE + UtilConstants.EQUAL + UtilConstants.SPACE + builderAttribute
-                + UtilConstants.OBJECT + UtilConstants.PERIOD + UtilConstants.GET_METHOD_PREFIX
+                + UtilConstants.BUILDER + UtilConstants.OBJECT + UtilConstants.PERIOD + UtilConstants.GET_METHOD_PREFIX
                 + JavaIdentifierSyntax.getCaptialCase(JavaIdentifierSyntax.getCamelCase(attributeName))
                 + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN
                 + UtilConstants.NEW_LINE;
@@ -539,7 +539,6 @@
     public static String getHashCodeMethodClose(String hashcodeString) {
         hashcodeString = YangIoUtils.trimAtLast(hashcodeString, UtilConstants.COMMA);
         hashcodeString = YangIoUtils.trimAtLast(hashcodeString, UtilConstants.SPACE);
-        hashcodeString = YangIoUtils.partString(hashcodeString);
         return hashcodeString + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE
                 + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET;
     }
