diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java
index 4e488bb..8ac2514 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java
@@ -43,6 +43,7 @@
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaRpc;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaInput;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaOutput;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 
 /**
  * Factory to create data model objects based on the target file type.
@@ -68,7 +69,7 @@
                 return new YangJavaModule();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -86,7 +87,7 @@
                 return new YangJavaAugment();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -104,7 +105,7 @@
                 return new YangJavaCase();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -122,7 +123,7 @@
                 return new YangJavaChoice();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -140,7 +141,7 @@
                 return new YangJavaContainer();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -158,7 +159,7 @@
                 return new YangJavaGrouping();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -176,7 +177,7 @@
                 return new YangJavaList();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -194,7 +195,7 @@
                 return new YangJavaSubModule();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -212,7 +213,7 @@
                 return new YangJavaTypeDef();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -230,7 +231,7 @@
                 return new YangJavaUses();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -248,7 +249,7 @@
                 return new YangJavaNotification();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -266,7 +267,7 @@
                 return new YangJavaRpc();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -284,7 +285,7 @@
                 return new YangJavaInput();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
@@ -302,7 +303,7 @@
                 return new YangJavaOutput();
             }
             default: {
-                throw new RuntimeException("Only YANG to Java is supported.");
+                throw new TranslatorException("Only YANG to Java is supported.");
             }
         }
     }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index 27e5aa0..7000361 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yangutils.plugin.manager;
 
+import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
 
@@ -27,6 +28,7 @@
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.YangUtilsParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
@@ -36,6 +38,7 @@
 import static org.apache.maven.plugins.annotations.LifecyclePhase.GENERATE_SOURCES;
 import static org.apache.maven.plugins.annotations.ResolutionScope.COMPILE;
 import static org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorUtil.generateJavaCode;
+import static org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorUtil.translatorErrorHandler;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage;
 import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_BASE_PKG;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
@@ -94,16 +97,7 @@
     private YangUtilsParser yangUtilsParser = new YangUtilsParserManager();
     private String searchDir;
     private String codeGenDir;
-
-    /**
-     * Set current project.
-     *
-     * @param curProject maven project
-     */
-    public void setCurrentProject(final MavenProject curProject) {
-
-        project = curProject;
-    }
+    private YangNode rootNode;
 
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
@@ -125,6 +119,7 @@
                 String yangFile = yangFileIterator.next();
                 try {
                     YangNode yangNode = yangUtilsParser.getDataModel(yangFile);
+                    setRootNode(yangNode);
                     generateJavaCode(yangNode, codeGenDir);
                 } catch (ParserException e) {
                     String logInfo = "Error in file: " + e.getFileName();
@@ -143,8 +138,52 @@
             addToSource(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG, project, context);
             copyYangFilesToTarget(yangFiles, getDirectory(baseDir, outputDirectory), project);
         } catch (Exception e) {
-            getLog().info(e);
+            try {
+                translatorErrorHandler(getRootNode());
+                clean(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG);
+            } catch (IOException | DataModelException ex) {
+                throw new MojoExecutionException("Error handler failed to delete files for data model node.");
+            }
             throw new MojoExecutionException("Exception occured due to " + e.getLocalizedMessage());
         }
     }
+
+    /**
+     * Set current project.
+     *
+     * @param curProject maven project
+     */
+    public void setCurrentProject(MavenProject curProject) {
+        project = curProject;
+
+    }
+
+    /**
+     * Returns current project.
+     *
+     * @return current project
+     */
+    public MavenProject getCurrentProject() {
+        return project;
+    }
+
+    /**
+     * Returns current root YANG node of data-model tree.
+     *
+     * @return current root YANG node of data-model tree
+     */
+    public YangNode getRootNode() {
+        return rootNode;
+    }
+
+    /**
+     * Sets current root YANG node of data-model tree.
+     *
+     * @param rootNode current root YANG node of data-model tree
+     */
+
+    public void setRootNode(YangNode rootNode) {
+        this.rootNode = rootNode;
+    }
+
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
index 24a0daa..092f77f 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
@@ -18,6 +18,7 @@
 
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType;
 
 import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getIsQualifiedAccessOrAddToImportList;
@@ -63,7 +64,7 @@
     }
 
     /**
-     * Construct object of java attribute info.
+     * Creates object of java attribute info.
      *
      * @param attrType YANG type
      * @param name attribute name
@@ -85,7 +86,7 @@
     public YangType<?> getAttributeType() {
 
         if (attrType == null) {
-            throw new RuntimeException("Expected java attribute type is null");
+            throw new TranslatorException("Expected java attribute type is null");
         }
         return attrType;
     }
@@ -96,7 +97,6 @@
      * @param type the data type info of attribute
      */
     public void setAttributeType(YangType<?> type) {
-
         attrType = type;
     }
 
@@ -108,7 +108,7 @@
     public String getAttributeName() {
 
         if (name == null) {
-            throw new RuntimeException("Expected java attribute name is null");
+            throw new TranslatorException("Expected java attribute name is null");
         }
         return name;
     }
@@ -119,7 +119,6 @@
      * @param attrName name of the attribute
      */
     public void setAttributeName(String attrName) {
-
         name = attrName;
     }
 
@@ -129,7 +128,6 @@
      * @return the if the added attribute is a list of info
      */
     public boolean isListAttr() {
-
         return isListAttr;
     }
 
@@ -139,7 +137,6 @@
      * @param isList if the added attribute is a list of info
      */
     public void setListAttr(boolean isList) {
-
         isListAttr = isList;
     }
 
@@ -151,7 +148,6 @@
      *         qualified manner.
      */
     public boolean isQualifiedName() {
-
         return isQualifiedName;
     }
 
@@ -163,7 +159,6 @@
      *            qualified manner
      */
     public void setIsQualifiedAccess(boolean isQualified) {
-
         isQualifiedName = isQualified;
     }
 
@@ -174,7 +169,6 @@
      * @return import info
      */
     public JavaQualifiedTypeInfo getImportInfo() {
-
         return importInfo;
     }
 
@@ -184,7 +178,6 @@
      * @param importInfo import info for the attribute type
      */
     public void setImportInfo(JavaQualifiedTypeInfo importInfo) {
-
         this.importInfo = importInfo;
     }
 
@@ -204,23 +197,14 @@
             YangType<?> attributeType, String attributeName,
             boolean isListAttribute) {
 
-        JavaAttributeInfo newAttr = new JavaAttributeInfo();
-
         /*
          * Get the import info corresponding to the attribute for import in
          * generated java files or qualified access
          */
         JavaQualifiedTypeInfo importInfo = getQualifiedTypeInfoOfLeafAttribute(curNode,
                 attributeType, attributeName, isListAttribute);
-        newAttr.setImportInfo(importInfo);
-        newAttr.setIsQualifiedAccess(getIsQualifiedAccessOrAddToImportList(
-                curNode, importInfo));
-        newAttr.setAttributeName(getCamelCase(attributeName));
-        newAttr.setListAttr(isListAttribute);
-        newAttr.setImportInfo(importInfo);
-        newAttr.setAttributeType(attributeType);
 
-        return newAttr;
+        return getAttributeInfoForTheData(importInfo, attributeName, attributeType, curNode, isListAttribute);
     }
 
     /**
@@ -237,12 +221,6 @@
     public static JavaAttributeInfo getCurNodeAsAttributeInParent(
             YangNode curNode, YangNode parentNode, boolean isListNode) {
 
-        JavaAttributeInfo newAttr = new JavaAttributeInfo();
-
-        //        if (curNode instanceof HasJavaFileInfo) {
-        //          throw new RuntimeException("translator data model node does not have java info");
-        //    }
-
         String curNodeName = ((HasJavaFileInfo) curNode).getJavaFileInfo().getJavaName();
 
         /*
@@ -251,16 +229,8 @@
          */
         JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(parentNode,
                 curNodeName, isListNode);
-        newAttr.setImportInfo(qualifiedTypeInfo);
-        newAttr.setIsQualifiedAccess(
-                getIsQualifiedAccessOrAddToImportList(parentNode,
-                        qualifiedTypeInfo));
-        newAttr.setAttributeName(getCamelCase(curNodeName));
-        newAttr.setListAttr(isListNode);
-        newAttr.setImportInfo(qualifiedTypeInfo);
-        newAttr.setAttributeType(null);
 
-        return newAttr;
+        return getAttributeInfoForTheData(qualifiedTypeInfo, curNodeName, null, parentNode, isListNode);
     }
 
     /**
@@ -279,8 +249,6 @@
             YangType<?> attributeType, String attributeName,
             boolean isListAttribute) {
 
-        JavaAttributeInfo newAttr = new JavaAttributeInfo();
-
         /*
          * Get the import info corresponding to the attribute for import in
          * generated java files or qualified access
@@ -288,9 +256,26 @@
         JavaQualifiedTypeInfo importInfo = getQualifiedTypeInfoOfLeafAttribute(curNode,
                 attributeType, attributeName, isListAttribute);
         AttributesJavaDataType.addImportInfo(importInfo);
+
+        return getAttributeInfoForTheData(importInfo, attributeName, attributeType, curNode, isListAttribute);
+    }
+
+    /**
+     * Returns java attribute info.
+     *
+     * @param importInfo java qualified type info
+     * @param attributeName attribute name
+     * @param attributeType attribute type
+     * @param curNode current YANG node
+     * @param isListAttribute is list attribute
+     * @return java attribute info.
+     */
+    private static JavaAttributeInfo getAttributeInfoForTheData(JavaQualifiedTypeInfo importInfo, String attributeName,
+            YangType<?> attributeType, YangNode curNode, boolean isListAttribute) {
+
+        JavaAttributeInfo newAttr = new JavaAttributeInfo();
         newAttr.setImportInfo(importInfo);
-        newAttr.setIsQualifiedAccess(getIsQualifiedAccessOrAddToImportList(
-                curNode, importInfo));
+        newAttr.setIsQualifiedAccess(getIsQualifiedAccessOrAddToImportList(curNode, importInfo));
         newAttr.setAttributeName(getCamelCase(attributeName));
         newAttr.setListAttr(isListAttribute);
         newAttr.setImportInfo(importInfo);
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
index 40fed6e..8402004 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
@@ -19,6 +19,13 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
+
+import static org.onosproject.yangutils.translator.tojava.TraversalType.CHILD;
+import static org.onosproject.yangutils.translator.tojava.TraversalType.PARENT;
+import static org.onosproject.yangutils.translator.tojava.TraversalType.ROOT;
+import static org.onosproject.yangutils.translator.tojava.TraversalType.SIBILING;
 
 /**
  * Implementation of Java code generator based on application schema.
@@ -26,12 +33,36 @@
 public final class JavaCodeGeneratorUtil {
 
     /**
+     * Current YANG node.
+     */
+    private static YangNode curNode;
+
+    /**
      * Default constructor.
      */
     private JavaCodeGeneratorUtil() {
     }
 
     /**
+     * Returns current YANG node.
+     *
+     * @return current YANG node
+     */
+    public static YangNode getCurNode() {
+        return curNode;
+    }
+
+    /**
+     * Sets current YANG node.
+     *
+     * @param node current YANG node
+     */
+
+    public static void setCurNode(YangNode node) {
+        curNode = node;
+    }
+
+    /**
      * Generate Java code files corresponding to the YANG schema.
      *
      * @param rootNode root node of the data model tree
@@ -40,23 +71,25 @@
      *             node
      */
     public static void generateJavaCode(YangNode rootNode, String codeGenDir) throws IOException {
+
         YangNode curNode = rootNode;
-        TraversalType curTraversal = TraversalType.ROOT;
+        TraversalType curTraversal = ROOT;
 
         while (!(curNode == null)) {
-            if (curTraversal != TraversalType.PARENT) {
+            if (curTraversal != PARENT) {
+                setCurNode(curNode);
                 generateCodeEntry(curNode, codeGenDir);
             }
-            if (curTraversal != TraversalType.PARENT && curNode.getChild() != null) {
-                curTraversal = TraversalType.CHILD;
+            if (curTraversal != PARENT && curNode.getChild() != null) {
+                curTraversal = CHILD;
                 curNode = curNode.getChild();
             } else if (curNode.getNextSibling() != null) {
                 generateCodeExit(curNode);
-                curTraversal = TraversalType.SIBILING;
+                curTraversal = SIBILING;
                 curNode = curNode.getNextSibling();
             } else {
                 generateCodeExit(curNode);
-                curTraversal = TraversalType.PARENT;
+                curTraversal = PARENT;
                 curNode = curNode.getParent();
             }
         }
@@ -76,8 +109,8 @@
         if (curNode instanceof JavaCodeGenerator) {
             ((JavaCodeGenerator) curNode).generateCodeEntry(codeGenDir);
         } else {
-            throw new RuntimeException(
-                    "Gnenerated data model node cannot be translated to target language code");
+            throw new TranslatorException(
+                    "Generated data model node cannot be translated to target language code");
         }
     }
 
@@ -93,8 +126,113 @@
         if (curNode instanceof JavaCodeGenerator) {
             ((JavaCodeGenerator) curNode).generateCodeExit();
         } else {
-            throw new RuntimeException(
-                    "Gnenerated data model node cannot be translated to target language code");
+            throw new TranslatorException(
+                    "Generated data model node cannot be translated to target language code");
+        }
+    }
+
+    /**
+     * Free other YANG nodes of data-model tree when error occurs while file generation of current node.
+     *
+     * @throws DataModelException when fails to do datamodel operations
+     */
+    public static void freeRestResources() throws DataModelException {
+
+        YangNode curNode = getCurNode();
+        YangNode tempNode = curNode;
+        TraversalType curTraversal = ROOT;
+
+        while (!(curNode == tempNode.getParent())) {
+
+            if (curTraversal != PARENT && curNode.getChild() != null) {
+                curTraversal = CHILD;
+                curNode = curNode.getChild();
+            } else if (curNode.getNextSibling() != null) {
+                curTraversal = SIBILING;
+                if (curNode != tempNode) {
+                    free(curNode);
+                }
+                curNode = curNode.getNextSibling();
+            } else {
+                curTraversal = PARENT;
+                if (curNode != tempNode) {
+                    free(curNode);
+                }
+                curNode = curNode.getParent();
+            }
+        }
+    }
+
+    /**
+     * Free the current node.
+     *
+     * @param node YANG node
+     * @throws DataModelException when fails to do datamodel operations
+     */
+    private static void free(YangNode node) throws DataModelException {
+
+        YangNode parent = node.getParent();
+        parent.setChild(null);
+        if (node.getNextSibling() != null) {
+            parent.setChild(node.getNextSibling());
+        } else if (node.getPreviousSibling() != null) {
+            parent.setChild(node.getPreviousSibling());
+        }
+        node = null;
+    }
+
+    /**
+     * Delete Java code files corresponding to the YANG schema.
+     *
+     * @param rootNode root node of data-model tree
+     * @throws IOException when fails to delete java code file the current node
+     * @throws DataModelException when fails to do datamodel operations
+     */
+    public static void translatorErrorHandler(YangNode rootNode) throws IOException, DataModelException {
+
+        /**
+         * Free other resources where translator has failed.
+         */
+        freeRestResources();
+
+        /**
+         * Start removing all open files.
+         */
+        YangNode curNode = rootNode;
+        setCurNode(curNode.getChild());
+        TraversalType curTraversal = ROOT;
+
+        while (!(curNode == null)) {
+
+            if (curTraversal != PARENT) {
+                close(curNode);
+            }
+            if (curTraversal != PARENT && curNode.getChild() != null) {
+                curTraversal = CHILD;
+                curNode = curNode.getChild();
+            } else if (curNode.getNextSibling() != null) {
+                curTraversal = SIBILING;
+                curNode = curNode.getNextSibling();
+            } else {
+                curTraversal = PARENT;
+                curNode = curNode.getParent();
+            }
+        }
+
+        freeRestResources();
+        curNode = null;
+    }
+
+    /**
+     * Closes all the current open file handles of node and delete all generated files.
+     *
+     * @param curNode current YANG node
+     * @throws IOException when fails to do IO operations
+     */
+    private static void close(YangNode curNode) throws IOException {
+
+        if (((HasTempJavaCodeFragmentFiles) curNode).getTempJavaCodeFragmentFiles() != null) {
+            ((HasTempJavaCodeFragmentFiles) curNode).getTempJavaCodeFragmentFiles().close(true);
         }
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfo.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfo.java
index 8b69fca..bbad23a 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfo.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfo.java
@@ -16,11 +16,14 @@
 
 package org.onosproject.yangutils.translator.tojava;
 
+import org.onosproject.yangutils.translator.exception.TranslatorException;
+
 /**
  * Cached java file handle, which supports the addition of member attributes and
  * methods.
  */
 public class JavaFileInfo {
+
     /**
      * The type(s) of java source file(s) to be generated when the cached file
      * handle is closed.
@@ -93,8 +96,9 @@
      * @return the java package
      */
     public String getPackage() {
+
         if (pkg == null) {
-            throw new RuntimeException("Referencing package of a generated java file which is not set");
+            throw new TranslatorException("Referencing package of a generated java file which is not set");
         }
         return pkg;
     }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
index 682a101..c4ff7e5 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
@@ -21,6 +21,7 @@
 import java.util.TreeSet;
 
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 
 import static org.onosproject.yangutils.utils.UtilConstants.COLLECTION_IMPORTS;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
@@ -64,7 +65,6 @@
      * @return true if any of the attribute needs to be maintained as a list.
      */
     public boolean getIfListImported() {
-
         return isListToImport;
     }
 
@@ -74,7 +74,6 @@
      * @param isList status to mention list is bing imported.
      */
     public void setIfListImported(boolean isList) {
-
         isListToImport = isList;
     }
 
@@ -84,7 +83,6 @@
      * @return the set containing the imported class/interface info
      */
     public SortedSet<JavaQualifiedTypeInfo> getImportSet() {
-
         return importSet;
     }
 
@@ -94,7 +92,6 @@
      * @param importSet the set containing the imported class/interface info
      */
     private void setImportSet(SortedSet<JavaQualifiedTypeInfo> importSet) {
-
         this.importSet = importSet;
     }
 
@@ -116,7 +113,7 @@
     public boolean addImportInfo(YangNode curNode, JavaQualifiedTypeInfo newImportInfo) {
 
         if (!(curNode instanceof HasJavaImportData)) {
-            throw new RuntimeException("missing import info in data model node");
+            throw new TranslatorException("missing import info in data model node");
         }
         for (JavaQualifiedTypeInfo curImportInfo : ((HasJavaImportData) curNode).getJavaImportData().getImportSet()) {
             if (curImportInfo.getClassInfo()
@@ -165,7 +162,6 @@
      * @return import for hash and equals method
      */
     public String getImportForHashAndEquals() {
-
         return IMPORT + JAVA_UTIL_OBJECTS_IMPORT_PKG + PERIOD + JAVA_UTIL_OBJECTS_IMPORT_CLASS;
     }
 
@@ -175,15 +171,13 @@
      * @return import for to string method
      */
     public String getImportForToString() {
-
         return IMPORT + GOOGLE_MORE_OBJECT_IMPORT_PKG + PERIOD + GOOGLE_MORE_OBJECT_IMPORT_CLASS;
     }
 
     /**
-     * Sets import for to list.
+     * Sets import for the list attribute.
      */
     private static String setImportForList() {
-
         return IMPORT + COLLECTION_IMPORTS + PERIOD + LIST + SEMI_COLAN + NEW_LINE;
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java
index ba4b99b..f703a2c 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java
@@ -20,6 +20,7 @@
 
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType;
 
 import com.google.common.base.MoreObjects;
@@ -51,7 +52,6 @@
      * @return the imported package info
      */
     public String getPkgInfo() {
-
         return pkgInfo;
     }
 
@@ -61,7 +61,6 @@
      * @param pkgInfo the imported package info
      */
     public void setPkgInfo(String pkgInfo) {
-
         this.pkgInfo = pkgInfo;
     }
 
@@ -71,7 +70,6 @@
      * @return the imported class/interface info
      */
     public String getClassInfo() {
-
         return classInfo;
     }
 
@@ -81,7 +79,6 @@
      * @param classInfo the imported class/interface info
      */
     public void setClassInfo(String classInfo) {
-
         this.classInfo = classInfo;
     }
 
@@ -105,7 +102,7 @@
         JavaQualifiedTypeInfo importInfo = new JavaQualifiedTypeInfo();
 
         if (attrType == null) {
-            throw new RuntimeException("missing data type of leaf " + attributeName);
+            throw new TranslatorException("missing data type of leaf " + attributeName);
         }
 
         /*
@@ -121,7 +118,7 @@
             importInfo.setClassInfo(className);
             String classPkg = AttributesJavaDataType.getJavaImportPackage(attrType, isListAttr, className);
             if (classPkg == null) {
-                throw new RuntimeException("import package cannot be null when the class is used");
+                throw new TranslatorException("import package cannot be null when the class is used");
             }
             importInfo.setPkgInfo(classPkg);
         } else {
@@ -131,7 +128,7 @@
              */
             String dataTypeName = AttributesJavaDataType.getJavaDataType(attrType);
             if (dataTypeName == null) {
-                throw new RuntimeException("not supported data type");
+                throw new TranslatorException("not supported data type");
             }
             importInfo.setClassInfo(dataTypeName);
         }
@@ -155,7 +152,7 @@
         JavaQualifiedTypeInfo importInfo = new JavaQualifiedTypeInfo();
 
         if (!(curNode instanceof HasJavaFileInfo)) {
-            throw new RuntimeException("missing java file information to get the package details "
+            throw new TranslatorException("missing java file information to get the package details "
                     + "of attribute corresponding to child node");
         }
         /*
@@ -184,7 +181,7 @@
 
         boolean isImportPkgEqualCurNodePkg;
         if (!(curNode instanceof HasJavaFileInfo)) {
-            throw new RuntimeException("missing java file info for getting the qualified access");
+            throw new TranslatorException("missing java file info for getting the qualified access");
         }
         if (importInfo.getClassInfo().contentEquals(
                 ((HasJavaFileInfo) curNode).getJavaFileInfo().getJavaName())) {
@@ -211,7 +208,7 @@
                      * If the current data model node is not supposed to import
                      * data, then this is a usage issue and needs to be fixed.
                      */
-                    throw new RuntimeException("Current node needs to support Imports");
+                    throw new TranslatorException("Current node needs to support Imports");
                 }
 
                 boolean isImportAdded = ((HasJavaImportData) curNode).getJavaImportData()
@@ -241,7 +238,7 @@
             YangNode curNode, JavaQualifiedTypeInfo importInfo) {
 
         if (!(curNode instanceof HasJavaFileInfo)) {
-            throw new RuntimeException("missing java file info for the data model node");
+            throw new TranslatorException("missing java file info for the data model node");
         }
         return ((HasJavaFileInfo) curNode).getJavaFileInfo().getPackage()
                 .contentEquals(importInfo.getPkgInfo()
@@ -250,7 +247,6 @@
 
     @Override
     public int hashCode() {
-
         return Objects.hash(pkgInfo, classInfo);
     }
 
@@ -275,7 +271,6 @@
      * @return if equal or not
      */
     public boolean exactMatch(JavaQualifiedTypeInfo importInfo) {
-
         return equals(importInfo)
                 && Objects.equals(pkgInfo, importInfo.getPkgInfo())
                 && Objects.equals(classInfo, importInfo.getClassInfo());
@@ -283,7 +278,6 @@
 
     @Override
     public String toString() {
-
         return MoreObjects.toStringHelper(getClass())
                 .add("pkgInfo", pkgInfo)
                 .add("classInfo", classInfo).toString();
@@ -296,7 +290,6 @@
      */
     @Override
     public int compareTo(JavaQualifiedTypeInfo other) {
-
         return getClassInfo().compareTo(other.getClassInfo());
     }
 
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaCodeFragmentFiles.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaCodeFragmentFiles.java
index 6396c9c..0c7666c 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaCodeFragmentFiles.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaCodeFragmentFiles.java
@@ -26,12 +26,7 @@
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangTypeDef;
-import org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen;
-import org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax;
-import org.onosproject.yangutils.utils.UtilConstants;
-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.translator.exception.TranslatorException;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
@@ -52,13 +47,18 @@
 import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoOfTypeDef;
 import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getCurNodeAsAttributeInParent;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaAttributeDefination;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefClose;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateBuilderClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateBuilderInterfaceFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateImplClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateInterfaceFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateTypeDefClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getFileObject;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCamelCase;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCaptialCase;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getParentNodeInGenCode;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getSmallCase;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getBuildString;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getConstructor;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getDefaultConstructorString;
@@ -83,8 +83,11 @@
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.createPackage;
+import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.readAppendFile;
+import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
+import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.OF_METHOD;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.TYPE_DEF_CONSTRUCTOR;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.TYPE_DEF_SETTER_METHOD;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.clean;
@@ -389,7 +392,6 @@
         if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
             setToStringImplTempFileHandle(getTemporaryFileHandle(TO_STRING_METHOD_FILE_NAME));
         }
-
     }
 
     /**
@@ -398,7 +400,6 @@
      * @return java file handle for interface file
      */
     public File getInterfaceJavaFileHandle() {
-
         return interfaceJavaFileHandle;
     }
 
@@ -408,7 +409,6 @@
      * @param interfaceJavaFileHandle java file handle
      */
     public void setInterfaceJavaFileHandle(File interfaceJavaFileHandle) {
-
         this.interfaceJavaFileHandle = interfaceJavaFileHandle;
     }
 
@@ -418,7 +418,6 @@
      * @return java file handle for builder interface file
      */
     public File getBuilderInterfaceJavaFileHandle() {
-
         return builderInterfaceJavaFileHandle;
     }
 
@@ -428,7 +427,6 @@
      * @param builderInterfaceJavaFileHandle java file handle
      */
     public void setBuilderInterfaceJavaFileHandle(File builderInterfaceJavaFileHandle) {
-
         this.builderInterfaceJavaFileHandle = builderInterfaceJavaFileHandle;
     }
 
@@ -438,7 +436,6 @@
      * @return java file handle for builder class file
      */
     public File getBuilderClassJavaFileHandle() {
-
         return builderClassJavaFileHandle;
     }
 
@@ -448,7 +445,6 @@
      * @param builderClassJavaFileHandle java file handle
      */
     public void setBuilderClassJavaFileHandle(File builderClassJavaFileHandle) {
-
         this.builderClassJavaFileHandle = builderClassJavaFileHandle;
     }
 
@@ -458,7 +454,6 @@
      * @return java file handle for impl class file
      */
     public File getImplClassJavaFileHandle() {
-
         return implClassJavaFileHandle;
     }
 
@@ -468,7 +463,6 @@
      * @param implClassJavaFileHandle java file handle
      */
     public void setImplClassJavaFileHandle(File implClassJavaFileHandle) {
-
         this.implClassJavaFileHandle = implClassJavaFileHandle;
     }
 
@@ -478,7 +472,6 @@
      * @return java file handle for typedef class file
      */
     public File getTypedefClassJavaFileHandle() {
-
         return typedefClassJavaFileHandle;
     }
 
@@ -488,7 +481,6 @@
      * @param typedefClassJavaFileHandle java file handle
      */
     public void setTypedefClassJavaFileHandle(File typedefClassJavaFileHandle) {
-
         this.typedefClassJavaFileHandle = typedefClassJavaFileHandle;
     }
 
@@ -498,7 +490,6 @@
      * @return temporary file handle
      */
     public File getAttributesTempFileHandle() {
-
         return attributesTempFileHandle;
     }
 
@@ -508,7 +499,6 @@
      * @param attributeForClass file handle for attribute
      */
     public void setAttributesTempFileHandle(File attributeForClass) {
-
         attributesTempFileHandle = attributeForClass;
     }
 
@@ -518,7 +508,6 @@
      * @return temporary file handle
      */
     public File getGetterInterfaceTempFileHandle() {
-
         return getterInterfaceTempFileHandle;
     }
 
@@ -528,7 +517,6 @@
      * @param getterForInterface file handle for to getter method
      */
     public void setGetterInterfaceTempFileHandle(File getterForInterface) {
-
         getterInterfaceTempFileHandle = getterForInterface;
     }
 
@@ -538,7 +526,6 @@
      * @return temporary file handle
      */
     public File getGetterImplTempFileHandle() {
-
         return getterImplTempFileHandle;
     }
 
@@ -548,7 +535,6 @@
      * @param getterImpl file handle for to getter method's impl
      */
     public void setGetterImplTempFileHandle(File getterImpl) {
-
         getterImplTempFileHandle = getterImpl;
     }
 
@@ -558,7 +544,6 @@
      * @return temporary file handle
      */
     public File getSetterInterfaceTempFileHandle() {
-
         return setterInterfaceTempFileHandle;
     }
 
@@ -568,7 +553,6 @@
      * @param setterForInterface file handle for to setter method
      */
     public void setSetterInterfaceTempFileHandle(File setterForInterface) {
-
         setterInterfaceTempFileHandle = setterForInterface;
     }
 
@@ -578,7 +562,6 @@
      * @return temporary file handle
      */
     public File getSetterImplTempFileHandle() {
-
         return setterImplTempFileHandle;
     }
 
@@ -588,7 +571,6 @@
      * @param setterImpl file handle for to setter method's implementation class
      */
     public void setSetterImplTempFileHandle(File setterImpl) {
-
         setterImplTempFileHandle = setterImpl;
     }
 
@@ -598,7 +580,6 @@
      * @return temporary file handle
      */
     public File getConstructorImplTempFileHandle() {
-
         return constructorImplTempFileHandle;
     }
 
@@ -608,7 +589,6 @@
      * @param constructor file handle for to constructor
      */
     public void setConstructorImplTempFileHandle(File constructor) {
-
         constructorImplTempFileHandle = constructor;
     }
 
@@ -618,7 +598,6 @@
      * @return temporary file handle
      */
     public File getHashCodeImplTempFileHandle() {
-
         return hashCodeImplTempFileHandle;
     }
 
@@ -628,7 +607,6 @@
      * @param hashCodeMethod file handle for hash code method
      */
     public void setHashCodeImplTempFileHandle(File hashCodeMethod) {
-
         hashCodeImplTempFileHandle = hashCodeMethod;
     }
 
@@ -638,7 +616,6 @@
      * @return temporary file handle
      */
     public File getEqualsImplTempFileHandle() {
-
         return equalsImplTempFileHandle;
     }
 
@@ -648,7 +625,6 @@
      * @param equalsMethod file handle for to equals method
      */
     public void setEqualsImplTempFileHandle(File equalsMethod) {
-
         equalsImplTempFileHandle = equalsMethod;
     }
 
@@ -658,7 +634,6 @@
      * @return temporary file handle
      */
     public File getToStringImplTempFileHandle() {
-
         return toStringImplTempFileHandle;
     }
 
@@ -668,7 +643,6 @@
      * @param toStringMethod file handle for to string method
      */
     public void setToStringImplTempFileHandle(File toStringMethod) {
-
         toStringImplTempFileHandle = toStringMethod;
     }
 
@@ -678,7 +652,6 @@
      * @return java attribute info
      */
     public JavaAttributeInfo getNewAttrInfo() {
-
         return newAttrInfo;
     }
 
@@ -701,7 +674,6 @@
      * @return current YANG node
      */
     public YangNode getCurYangNode() {
-
         return curYangNode;
     }
 
@@ -711,7 +683,6 @@
      * @param curYangNode YANG node
      */
     public void setCurYangNode(YangNode curYangNode) {
-
         this.curYangNode = curYangNode;
     }
 
@@ -722,7 +693,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public void addAttribute(JavaAttributeInfo attr) throws IOException {
-
         appendToFile(getAttributesTempFileHandle(), parseAttribute(attr) + FOUR_SPACE_INDENTATION);
     }
 
@@ -733,7 +703,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public void addGetterForInterface(JavaAttributeInfo attr) throws IOException {
-
         appendToFile(getGetterInterfaceTempFileHandle(), getGetterString(attr) + NEW_LINE);
     }
 
@@ -761,7 +730,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public void addSetterForInterface(JavaAttributeInfo attr) throws IOException {
-
         appendToFile(getSetterInterfaceTempFileHandle(),
                 getSetterString(attr, generatedJavaClassName) + NEW_LINE);
     }
@@ -773,7 +741,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public void addSetterImpl(JavaAttributeInfo attr) throws IOException {
-
         appendToFile(getSetterImplTempFileHandle(),
                 getOverRideString() + getSetterForClass(attr, generatedJavaClassName) + NEW_LINE);
     }
@@ -785,7 +752,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public String addBuildMethodForInterface() throws IOException {
-
         return parseBuilderInterfaceBuildMethodString(generatedJavaClassName);
     }
 
@@ -796,7 +762,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public String addBuildMethodImpl() throws IOException {
-
         return getBuildString(generatedJavaClassName) + NEW_LINE;
     }
 
@@ -807,7 +772,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public void addConstructor(JavaAttributeInfo attr) throws IOException {
-
         appendToFile(getConstructorImplTempFileHandle(), getConstructor(generatedJavaClassName, attr));
     }
 
@@ -820,7 +784,6 @@
      * @throws IOException when fails to append to file
      */
     public String addDefaultConstructor(String modifier, String toAppend) throws IOException {
-
         return NEW_LINE + getDefaultConstructorString(generatedJavaClassName + toAppend, modifier);
     }
 
@@ -831,7 +794,6 @@
      * @throws IOException when fails to append to file
      */
     public String addTypeDefConstructor() throws IOException {
-
         return NEW_LINE + getJavaDoc(TYPE_DEF_CONSTRUCTOR, generatedJavaClassName, false)
                 + getTypeDefConstructor(newAttrInfo, generatedJavaClassName) + NEW_LINE;
     }
@@ -843,7 +805,6 @@
      * @throws IOException when fails to append to file
      */
     public String addTypeDefsSetter() throws IOException {
-
         return getJavaDoc(TYPE_DEF_SETTER_METHOD, generatedJavaClassName, false) + getSetterForTypeDefClass(newAttrInfo)
                 + NEW_LINE;
     }
@@ -855,8 +816,7 @@
      * @throws IOException when fails to append to file
      */
     public String addOfMethod() throws IOException {
-
-        return JavaDocGen.getJavaDoc(JavaDocType.OF_METHOD, generatedJavaClassName, false)
+        return getJavaDoc(OF_METHOD, generatedJavaClassName, false)
                 + getOfMethod(generatedJavaClassName, newAttrInfo);
     }
 
@@ -867,7 +827,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public void addHashCodeMethod(JavaAttributeInfo attr) throws IOException {
-
         appendToFile(getHashCodeImplTempFileHandle(), getHashCodeMethod(attr) + NEW_LINE);
     }
 
@@ -878,7 +837,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public void addEqualsMethod(JavaAttributeInfo attr) throws IOException {
-
         appendToFile(getEqualsImplTempFileHandle(), getEqualsMethod(attr) + NEW_LINE);
     }
 
@@ -889,7 +847,6 @@
      * @throws IOException when fails to append to temporary file
      */
     public void addToStringMethod(JavaAttributeInfo attr) throws IOException {
-
         appendToFile(getToStringImplTempFileHandle(), getToStringMethod(attr) + NEW_LINE);
     }
 
@@ -923,9 +880,7 @@
      * @throws IOException when fails to create new file handle
      */
     private File getJavaFileHandle(String fileName) throws IOException {
-
         createPackage(absoluteDirPath, getJavaFileInfo().getJavaName());
-
         return getFileObject(getDirPath(), fileName, JAVA_FILE_EXTENSION, getJavaFileInfo());
     }
 
@@ -940,7 +895,7 @@
 
         String path = getTempDirPath();
         if (new File(path + file.getName()).exists()) {
-            return FileSystemUtil.readAppendFile(path + file.getName(), EMPTY_STRING);
+            return readAppendFile(path + file.getName(), EMPTY_STRING);
         } else {
             throw new IOException("Unable to get data from the given "
                     + file.getName() + " file for " + generatedJavaClassName + PERIOD);
@@ -953,9 +908,8 @@
      * @return directory path
      */
     private String getTempDirPath() {
-
-        return absoluteDirPath.replace(PERIOD, UtilConstants.SLASH)
-                + SLASH + generatedJavaClassName + TEMP_FOLDER_NAME_SUFIX + SLASH;
+        return getPackageDirPathFromJavaJPackage(absoluteDirPath) + SLASH + generatedJavaClassName
+                + TEMP_FOLDER_NAME_SUFIX + SLASH;
     }
 
     /**
@@ -969,8 +923,7 @@
         /*
          * TODO: check if this utility needs to be called or move to the caller
          */
-        String attributeName = JavaIdentifierSyntax
-                .getCamelCase(JavaIdentifierSyntax.getSmallCase(attr.getAttributeName()));
+        String attributeName = getCamelCase(getSmallCase(attr.getAttributeName()));
         if (attr.isQualifiedName()) {
             return getJavaAttributeDefination(attr.getImportInfo().getPkgInfo(), attr.getImportInfo().getClassInfo(),
                     attributeName, attr.isListAttr());
@@ -1009,13 +962,13 @@
 
         YangNode parent = getParentNodeInGenCode(curNode);
         if (!(parent instanceof JavaCodeGenerator)) {
-            throw new RuntimeException("missing parent node to contain current node info in generated file");
+            throw new TranslatorException("missing parent node to contain current node info in generated file");
         }
         JavaAttributeInfo javaAttributeInfo = getCurNodeAsAttributeInParent(curNode,
                 parent, isList);
 
         if (!(parent instanceof HasTempJavaCodeFragmentFiles)) {
-            throw new RuntimeException("missing parent temp file handle");
+            throw new TranslatorException("missing parent temp file handle");
         }
         ((HasTempJavaCodeFragmentFiles) parent)
                 .getTempJavaCodeFragmentFiles()
@@ -1060,7 +1013,7 @@
              */
             if (listOfLeafList.size() != 0) {
                 if (!(curNode instanceof HasJavaImportData)) {
-                    throw new RuntimeException("missing import info in current data model node");
+                    throw new TranslatorException("missing import info in current data model node");
 
                 }
                 ((HasJavaImportData) curNode).getJavaImportData()
@@ -1164,7 +1117,6 @@
      * @return java file info
      */
     private JavaFileInfo getJavaFileInfo() {
-
         return ((HasJavaFileInfo) getCurYangNode()).getJavaFileInfo();
     }
 
@@ -1175,8 +1127,7 @@
      * @return java class name
      */
     private String getJavaClassName(String suffix) {
-
-        return JavaIdentifierSyntax.getCaptialCase(getJavaFileInfo().getJavaName()) + suffix;
+        return getCaptialCase(getJavaFileInfo().getJavaName()) + suffix;
     }
 
     /**
@@ -1185,7 +1136,6 @@
      * @return directory path
      */
     private String getDirPath() {
-
         return getJavaFileInfo().getPackageFilePath();
     }
 
@@ -1225,7 +1175,7 @@
              * Append builder interface file to interface file and close it.
              */
             mergeJavaFiles(getBuilderInterfaceJavaFileHandle(), getInterfaceJavaFileHandle());
-            insertDataIntoJavaFile(getInterfaceJavaFileHandle(), JavaCodeSnippetGen.getJavaClassDefClose());
+            insertDataIntoJavaFile(getInterfaceJavaFileHandle(), getJavaClassDefClose());
 
         }
 
@@ -1254,8 +1204,7 @@
              * Append impl class to builder class and close it.
              */
             mergeJavaFiles(getImplClassJavaFileHandle(), getBuilderClassJavaFileHandle());
-            insertDataIntoJavaFile(getBuilderClassJavaFileHandle(), JavaCodeSnippetGen.getJavaClassDefClose());
-
+            insertDataIntoJavaFile(getBuilderClassJavaFileHandle(), getJavaClassDefClose());
         }
 
         /**
@@ -1269,48 +1218,72 @@
         /**
          * Close all the file handles.
          */
-        close();
+        close(false);
     }
 
     /**
      * Removes all temporary file handles.
      *
+     * @param isErrorOccurred when translator fails to generate java files we need to close
+     * all open file handles include temporary files and java files.
+     *
      * @throws IOException when failed to delete the temporary files
      */
-    private void close() throws IOException {
+    public void close(boolean isErrorOccurred) throws IOException {
 
+        boolean isError = isErrorOccurred;
+        /**
+         * Close all java file handles and when error occurs delete the files.
+         */
         if ((generatedJavaFiles & INTERFACE_MASK) != 0) {
-            closeFile(getInterfaceJavaFileHandle(), false);
+            closeFile(getInterfaceJavaFileHandle(), isError);
         }
-
         if ((generatedJavaFiles & BUILDER_CLASS_MASK) != 0) {
-            closeFile(getBuilderClassJavaFileHandle(), false);
+            closeFile(getBuilderClassJavaFileHandle(), isError);
         }
-
         if ((generatedJavaFiles & BUILDER_INTERFACE_MASK) != 0) {
             closeFile(getBuilderInterfaceJavaFileHandle(), true);
         }
-
         if ((generatedJavaFiles & IMPL_CLASS_MASK) != 0) {
             closeFile(getImplClassJavaFileHandle(), true);
         }
-
         if ((generatedJavaFiles & GENERATE_TYPEDEF_CLASS) != 0) {
-            closeFile(getTypedefClassJavaFileHandle(), false);
+            closeFile(getTypedefClassJavaFileHandle(), isError);
         }
 
         /**
          * Close all temporary file handles and delete the files.
          */
-        closeFile(getGetterInterfaceTempFileHandle(), true);
-        closeFile(getGetterImplTempFileHandle(), true);
-        closeFile(getSetterInterfaceTempFileHandle(), true);
-        closeFile(getSetterImplTempFileHandle(), true);
-        closeFile(getConstructorImplTempFileHandle(), true);
-        closeFile(getAttributesTempFileHandle(), true);
-        closeFile(getHashCodeImplTempFileHandle(), true);
-        closeFile(getToStringImplTempFileHandle(), true);
-        closeFile(getEqualsImplTempFileHandle(), true);
+        if ((generatedTempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
+            closeFile(getGetterInterfaceTempFileHandle(), true);
+        }
+        if ((generatedTempFiles & GETTER_FOR_CLASS_MASK) != 0) {
+            closeFile(getGetterImplTempFileHandle(), true);
+        }
+        if ((generatedTempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
+            closeFile(getSetterInterfaceTempFileHandle(), true);
+        }
+        if ((generatedTempFiles & SETTER_FOR_CLASS_MASK) != 0) {
+            closeFile(getSetterImplTempFileHandle(), true);
+        }
+        if ((generatedTempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
+            closeFile(getConstructorImplTempFileHandle(), true);
+        }
+        if ((generatedTempFiles & ATTRIBUTES_MASK) != 0) {
+            closeFile(getAttributesTempFileHandle(), true);
+        }
+        if ((generatedTempFiles & HASH_CODE_IMPL_MASK) != 0) {
+            closeFile(getHashCodeImplTempFileHandle(), true);
+        }
+        if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
+            closeFile(getToStringImplTempFileHandle(), true);
+        }
+        if ((generatedTempFiles & EQUALS_IMPL_MASK) != 0) {
+            closeFile(getEqualsImplTempFileHandle(), true);
+        }
+
+        clean(getTempDirPath());
+        generatedTempFiles = 0;
     }
 
     /**
@@ -1321,12 +1294,11 @@
      */
     private void closeFile(File file, boolean toBeDeleted) throws IOException {
 
-        if (file.exists()) {
-            FileSystemUtil.updateFileHandle(file, null, true);
+        if (file != null) {
+            updateFileHandle(file, null, true);
             if (toBeDeleted) {
                 file.delete();
             }
-            clean(getTempDirPath());
         }
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugment.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugment.java
index 329d934..5da421d 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugment.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugment.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangAugment;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -76,7 +77,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -88,7 +89,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -99,7 +99,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -111,7 +110,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -122,11 +120,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("missing temp file hand for current node "
-                    + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -137,7 +130,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCase.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCase.java
index 739119e..cf104fc 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCase.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCase.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangCase;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -76,7 +77,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -88,7 +89,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -99,7 +99,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -111,7 +110,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -122,11 +120,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("missing temp file hand for current node "
-                    + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -137,7 +130,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoice.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoice.java
index 50c04ed..94a4315 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoice.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoice.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangChoice;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -76,7 +77,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -88,7 +89,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -99,7 +99,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -111,7 +110,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -122,11 +120,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("missing temp file hand for current node "
-                    + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -137,7 +130,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainer.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainer.java
index 3c2b773..5427543 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainer.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainer.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangContainer;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -76,7 +77,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -88,7 +89,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -99,7 +99,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -111,7 +110,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -122,11 +120,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("Missing temp file handle for current node "
-                    + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -137,7 +130,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
@@ -177,7 +169,6 @@
      */
     @Override
     public void generateCodeExit() throws IOException {
-
         getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
     }
 
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 1b1b818..a93c83d 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
@@ -18,6 +18,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangGrouping;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -76,7 +77,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -88,7 +89,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -99,7 +99,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -111,7 +110,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -122,11 +120,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("missing temp file hand for current node "
-                    + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -137,7 +130,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
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 f3f3674..20aac19 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
@@ -19,6 +19,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangInput;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -78,7 +79,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -90,7 +91,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -101,7 +101,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -113,7 +112,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -124,11 +122,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("Missing temporary file handle for" +
-                    "current node " + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -139,7 +132,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
@@ -179,7 +171,6 @@
      */
     @Override
     public void generateCodeExit() throws IOException {
-
         getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaList.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaList.java
index c504b8f..91a2866 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaList.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaList.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangList;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -77,7 +78,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -89,7 +90,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -100,7 +100,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -112,7 +111,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -123,11 +121,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("missing temp file hand for current node "
-                    + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -138,7 +131,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
@@ -180,7 +172,6 @@
      */
     @Override
     public void generateCodeExit() throws IOException {
-
         getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java
index 9413c64..8d899a2 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangModule;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -76,7 +77,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -88,7 +89,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -99,7 +99,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -111,7 +110,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -122,11 +120,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("missing temp file hand for current node "
-                    + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -137,7 +130,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
@@ -170,7 +162,6 @@
 
     @Override
     public void generateCodeExit() throws IOException {
-
         getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
         return;
     }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotification.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotification.java
index ac9a588..81a0915 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotification.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotification.java
@@ -17,6 +17,7 @@
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
 import java.io.IOException;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.datamodel.YangNotification;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
@@ -76,7 +77,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -88,7 +89,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -99,7 +99,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -111,7 +110,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -122,11 +120,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("Missing temporary file handle for" +
-                    "current node " + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -137,7 +130,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
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 498510a..b062428 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
@@ -19,6 +19,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangOutput;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -78,7 +79,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -90,7 +91,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -101,7 +101,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -113,7 +112,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -124,11 +122,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("Missing temporary file handle for" +
-                    "current node " + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -139,7 +132,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
@@ -179,7 +171,6 @@
      */
     @Override
     public void generateCodeExit() throws IOException {
-
         getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java
index caa05bc..eaa0060 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java
@@ -19,6 +19,7 @@
 
 import org.onosproject.yangutils.datamodel.YangBelongsTo;
 import org.onosproject.yangutils.datamodel.YangSubModule;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -77,7 +78,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -89,7 +90,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -100,7 +100,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -112,7 +111,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -123,11 +121,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("missing temp file hand for current node "
-                    + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -138,7 +131,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
@@ -150,7 +142,6 @@
      * @return the name space string of the module.
      */
     private String getNameSpaceFromModule(YangBelongsTo belongsToInfo) {
-
         // TODO Auto-generated method stub
         return "";
     }
@@ -190,6 +181,5 @@
     @Override
     public void generateCodeExit() {
         // TODO Auto-generated method stub
-
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDef.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDef.java
index a8cc75b..7440461 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDef.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDef.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangTypeDef;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
@@ -75,7 +76,7 @@
     public JavaFileInfo getJavaFileInfo() {
 
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -87,7 +88,6 @@
      */
     @Override
     public void setJavaFileInfo(JavaFileInfo javaInfo) {
-
         javaFileInfo = javaInfo;
     }
 
@@ -98,7 +98,6 @@
      */
     @Override
     public JavaImportData getJavaImportData() {
-
         return javaImportData;
     }
 
@@ -110,7 +109,6 @@
      */
     @Override
     public void setJavaImportData(JavaImportData javaImportData) {
-
         this.javaImportData = javaImportData;
     }
 
@@ -121,11 +119,6 @@
      */
     @Override
     public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
-
-        if (tempFileHandle == null) {
-            throw new RuntimeException("missing temp file hand for current node "
-                    + getJavaFileInfo().getJavaName());
-        }
         return tempFileHandle;
     }
 
@@ -136,7 +129,6 @@
      */
     @Override
     public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
-
         tempFileHandle = fileHandle;
     }
 
@@ -170,11 +162,11 @@
 
     /**
      * Create a java file using the YANG grouping info.
+     *
      * @throws IOException IO operations fails
      */
     @Override
     public void generateCodeExit() throws IOException {
-
         getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_TYPEDEF_CLASS, this);
     }
 
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 cc29a74..b799d65 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
@@ -16,6 +16,7 @@
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
 import org.onosproject.yangutils.datamodel.YangUses;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
@@ -61,8 +62,9 @@
      */
     @Override
     public JavaFileInfo getJavaFileInfo() {
+
         if (javaFileInfo == null) {
-            throw new RuntimeException("Missing java info in java datamodel node");
+            throw new TranslatorException("Missing java info in java datamodel node");
         }
         return javaFileInfo;
     }
@@ -106,6 +108,7 @@
      */
     @Override
     public void generateCodeEntry(String codeGenDir) {
+
         getJavaFileInfo().setJavaName(getCaptialCase(getCamelCase(getName())));
         getJavaFileInfo().setPackage(getCurNodePackage(this));
         getJavaFileInfo().setPackageFilePath(
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java
index 5ea5f1e..1f42d68 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java
@@ -47,6 +47,8 @@
     private static final int INDEX_ZERO = 0;
     private static final int INDEX_ONE = 1;
     private static final int INDEX_TWO = 2;
+    private static final int VALUE_CHECK = 10;
+    private static final String ZERO = "0";
 
     /**
      * Default constructor.
@@ -103,12 +105,12 @@
         String pkg;
         if (!(curNode instanceof HasJavaFileInfo)
                 || curNode.getParent() == null) {
-            throw new RuntimeException("missing parent node to get current node's package");
+            throw new TranslatorException("missing parent node to get current node's package");
         }
 
         YangNode parentNode = getParentNodeInGenCode(curNode);
         if (!(parentNode instanceof HasJavaFileInfo)) {
-            throw new RuntimeException("missing parent java node to get current node's package");
+            throw new TranslatorException("missing parent java node to get current node's package");
         }
         JavaFileInfo parentJavaFileHandle = ((HasJavaFileInfo) parentNode).getJavaFileInfo();
         pkg = parentJavaFileHandle.getPackage() + PERIOD + parentJavaFileHandle.getJavaName();
@@ -122,7 +124,6 @@
      * @return version
      */
     private static String getYangVersion(byte ver) {
-
         return VERSION_PREFIX + ver;
     }
 
@@ -164,8 +165,8 @@
             for (int i = INDEX_ONE; i < revisionArr.length; i++) {
 
                 Integer val = Integer.parseInt(revisionArr[i]);
-                if (val < 10) {
-                    rev = rev + "0";
+                if (val < VALUE_CHECK) {
+                    rev = rev + ZERO;
                 }
                 rev = rev + val;
             }
@@ -242,7 +243,6 @@
      * @return corresponding java identifier
      */
     public static String getCaptialCase(String yangIdentifier) {
-
         return yangIdentifier.substring(0, 1).toUpperCase() + yangIdentifier.substring(1);
     }
 
@@ -254,7 +254,6 @@
      * @return corresponding java identifier
      */
     public static String getSmallCase(String yangIdentifier) {
-
         return yangIdentifier.substring(0, 1).toLowerCase() + yangIdentifier.substring(1);
     }
 
@@ -265,7 +264,6 @@
      * @return java package
      */
     public static String getJavaPackageFromPackagePath(String packagePath) {
-
         return packagePath.replace(SLASH, PERIOD);
     }
 
@@ -276,7 +274,6 @@
      * @return java package
      */
     public static String getPackageDirPathFromJavaJPackage(String packagePath) {
-
         return packagePath.replace(PERIOD, SLASH);
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index 369b08a..a11b6d7 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -34,17 +34,18 @@
     /**
      * JavaDocs for impl class.
      */
-    public static final String IMPL_CLASS_JAVA_DOC = " * Provides the implementation of ";
+    public static final String IMPL_CLASS_JAVA_DOC = " * Reperesents the implementation of ";
 
     /**
      * JavaDocs for builder class.
      */
-    public static final String BUILDER_CLASS_JAVA_DOC = " * Provides the builder implementation of ";
+    public static final String BUILDER_CLASS_JAVA_DOC = " * Reperesents the builder implementation of ";
 
     /**
      * JavaDocs for interface class.
      */
-    public static final String INTERFACE_JAVA_DOC = " * Abstraction of an entity which provides functionalities of ";
+    public static final String INTERFACE_JAVA_DOC = " * Abstraction of an entity which Reperesents the"
+            + " functionalities of ";
 
     /**
      * JavaDocs for builder interface class.
@@ -102,14 +103,9 @@
     public static final String JAVA_DOC_GETTERS = " * Returns the attribute ";
 
     /**
-     * JavaDocs's description for default constructor.
-     */
-    public static final String JAVA_DOC_DEFAULT_CONSTRUCTOR = " * Default Constructor.\n";
-
-    /**
      * JavaDocs's description for constructor.
      */
-    public static final String JAVA_DOC_CONSTRUCTOR = " * Construct the object of ";
+    public static final String JAVA_DOC_CONSTRUCTOR = " * Creates an instance of ";
 
     /**
      * JavaDocs's description for build method.
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
index c3ff0a3..e2003d9 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
@@ -30,7 +30,6 @@
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_BUILD;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_BUILD_RETURN;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_CONSTRUCTOR;
-import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_DEFAULT_CONSTRUCTOR;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_END_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_FIRST_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_GETTERS;
@@ -164,7 +163,7 @@
         } else if (type.equals(JavaDocType.OF_METHOD)) {
             javaDoc = generateForOf(name);
         } else if (type.equals(JavaDocType.DEFAULT_CONSTRUCTOR)) {
-            javaDoc = generateForDefaultConstructors();
+            javaDoc = generateForDefaultConstructors(name);
         } else if (type.equals(JavaDocType.BUILD_METHOD)) {
             javaDoc = generateForBuild(name);
         } else {
@@ -226,7 +225,6 @@
      * @return javaDocs
      */
     private static String generateForOf(String attribute) {
-
         return NEW_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_FIRST_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_OF
                 + attribute + PERIOD + NEW_LINE + FOUR_SPACE_INDENTATION + NEW_LINE_ASTERISK + FOUR_SPACE_INDENTATION
                 + JAVA_DOC_PARAM + VALUE + SPACE + VALUE + SPACE + OF + SPACE + attribute + NEW_LINE
@@ -241,7 +239,6 @@
      * @return javaDocs
      */
     private static String generateForTypeDefSetter(String attribute) {
-
         return (NEW_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_FIRST_LINE + FOUR_SPACE_INDENTATION
                 + JAVA_DOC_SETTERS_COMMON + attribute + PERIOD + NEW_LINE + FOUR_SPACE_INDENTATION + NEW_LINE_ASTERISK
                 + FOUR_SPACE_INDENTATION + JAVA_DOC_PARAM + VALUE + SPACE + VALUE + SPACE + OF + SPACE + attribute
@@ -255,7 +252,6 @@
      * @return javaDocs
      */
     private static String generateForTypeDefConstructor(String attribute) {
-
         return (NEW_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_FIRST_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_CONSTRUCTOR
                 + attribute + PERIOD + NEW_LINE + FOUR_SPACE_INDENTATION + NEW_LINE_ASTERISK + FOUR_SPACE_INDENTATION
                 + JAVA_DOC_PARAM + VALUE + SPACE + VALUE + SPACE + OF + SPACE + attribute + NEW_LINE
@@ -269,7 +265,6 @@
      * @return javaDocs
      */
     private static String generateForImplClass(String className) {
-
         return NEW_LINE + JAVA_DOC_FIRST_LINE + IMPL_CLASS_JAVA_DOC + className + PERIOD + NEW_LINE + JAVA_DOC_END_LINE;
     }
 
@@ -280,7 +275,6 @@
      * @return javaDocs
      */
     private static String generateForBuilderClass(String className) {
-
         return NEW_LINE + JAVA_DOC_FIRST_LINE + BUILDER_CLASS_JAVA_DOC + className + PERIOD + NEW_LINE
                 + JAVA_DOC_END_LINE;
     }
@@ -292,7 +286,6 @@
      * @return javaDocs
      */
     private static String generateForInterface(String interfaceName) {
-
         return NEW_LINE + JAVA_DOC_FIRST_LINE + INTERFACE_JAVA_DOC + interfaceName + PERIOD + NEW_LINE
                 + JAVA_DOC_END_LINE;
     }
@@ -304,7 +297,6 @@
      * @return javaDocs
      */
     private static String generateForBuilderInterface(String builderforName) {
-
         return JAVA_DOC_FIRST_LINE + BUILDER_INTERFACE_JAVA_DOC + builderforName + PERIOD + NEW_LINE
                 + JAVA_DOC_END_LINE;
     }
@@ -316,19 +308,18 @@
      * @return javaDocs
      */
     private static String generateForPackage(String packageName) {
-
         return JAVA_DOC_FIRST_LINE + PACKAGE_INFO_JAVADOC + packageName + PERIOD + NEW_LINE + JAVA_DOC_END_LINE;
     }
 
     /**
      * Generate javaDocs for default constructor.
      *
+     * @param className class name
      * @return javaDocs
      */
-    private static String generateForDefaultConstructors() {
-
-        return FOUR_SPACE_INDENTATION + JAVA_DOC_FIRST_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_DEFAULT_CONSTRUCTOR
-                + FOUR_SPACE_INDENTATION + JAVA_DOC_END_LINE;
+    private static String generateForDefaultConstructors(String className) {
+        return FOUR_SPACE_INDENTATION + JAVA_DOC_FIRST_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_CONSTRUCTOR + className
+                + PERIOD + NEW_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_END_LINE;
     }
 
     /**
@@ -338,7 +329,6 @@
      * @return javaDocs
      */
     private static String generateForConstructors(String className) {
-
         return NEW_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_FIRST_LINE
                 + FOUR_SPACE_INDENTATION + JAVA_DOC_CONSTRUCTOR + className + IMPL + PERIOD + NEW_LINE
                 + FOUR_SPACE_INDENTATION + NEW_LINE_ASTERISK + FOUR_SPACE_INDENTATION + JAVA_DOC_PARAM
@@ -353,7 +343,6 @@
      * @return javaDocs
      */
     private static String generateForBuild(String buildName) {
-
         return NEW_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_FIRST_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_BUILD
                 + buildName + PERIOD + NEW_LINE + FOUR_SPACE_INDENTATION + NEW_LINE_ASTERISK + FOUR_SPACE_INDENTATION
                 + JAVA_DOC_RETURN + JAVA_DOC_BUILD_RETURN + buildName + PERIOD + NEW_LINE + FOUR_SPACE_INDENTATION
