[ONOS-5633][ONOS-5702] ONOS YANG tools to support multi-threaded execution + defect fix

Change-Id: I20733f0350ea7e4e6558bd895a3c7c18477af6cf
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
index f8ebda1..5fc301d 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
@@ -125,7 +125,7 @@
     /**
      * YANG Node in which the leaf is contained.
      */
-    private transient YangLeavesHolder containedIn;
+    private YangLeavesHolder containedIn;
 
     /**
      * List of must statement constraints.
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
index 724c9cf..bde310d 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
@@ -39,40 +39,12 @@
 public final class JavaCodeGeneratorUtil {
 
     /**
-     * Current YANG node.
-     */
-    private static YangNode curNode;
-
-    /**
-     * Root node.
-     */
-    private static YangNode rootNode;
-
-    /**
      * Creates a java code generator utility object.
      */
     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;
-    }
-
-    /**
      * Generates Java code files corresponding to the YANG schema.
      *
      * @param rootNode   root node of the data model tree
@@ -84,7 +56,6 @@
             throws TranslatorException, IOException {
 
         YangNode codeGenNode = rootNode;
-        setRootNode(rootNode);
         TraversalType curTraversal = ROOT;
 
         while (codeGenNode != null) {
@@ -94,9 +65,8 @@
                             codeGenNode.getName() + " in " + codeGenNode.getLineNumber() + " at "
                             + codeGenNode.getCharPosition() + " in " + codeGenNode.getFileName());
                 }
-                setCurNode(codeGenNode);
                 try {
-                    generateCodeEntry(codeGenNode, yangPlugin);
+                    generateCodeEntry(codeGenNode, yangPlugin, rootNode);
                     codeGenNode.setNameSpaceAndAddToParentSchemaMap();
                 } catch (InvalidNodeForTranslatorException e) {
                     if (codeGenNode.getNextSibling() != null) {
@@ -109,7 +79,7 @@
                     continue;
                 } catch (Exception e) {
                     e.printStackTrace();
-                    close(codeGenNode, yangPlugin);
+                    close(codeGenNode, yangPlugin, rootNode);
                     throw new TranslatorException(e.getMessage());
                 }
 
@@ -119,20 +89,20 @@
                 codeGenNode = codeGenNode.getChild();
             } else if (codeGenNode.getNextSibling() != null) {
                 try {
-                    generateCodeExit(codeGenNode, yangPlugin);
+                    generateCodeExit(codeGenNode, yangPlugin, rootNode);
                 } catch (Exception e) {
                     e.printStackTrace();
-                    close(codeGenNode, yangPlugin);
+                    close(codeGenNode, yangPlugin, rootNode);
                     throw new TranslatorException(e.getMessage());
                 }
                 curTraversal = SIBILING;
                 codeGenNode = codeGenNode.getNextSibling();
             } else {
                 try {
-                    generateCodeExit(codeGenNode, yangPlugin);
+                    generateCodeExit(codeGenNode, yangPlugin, rootNode);
                 } catch (Exception e) {
                     e.printStackTrace();
-                    close(codeGenNode, yangPlugin);
+                    close(codeGenNode, yangPlugin, rootNode);
                     throw new TranslatorException(e.getMessage());
                 }
                 curTraversal = PARENT;
@@ -146,16 +116,19 @@
      *
      * @param codeGenNode current data model node for which the code needs to be generated
      * @param yangPlugin  YANG plugin config
+     * @param rootNode    YANG root node
      * @throws TranslatorException when fails to generate java code file the current node
      * @throws IOException         when fails to do IO operations
      */
-    private static void generateCodeEntry(YangNode codeGenNode, YangPluginConfig yangPlugin)
+    private static void generateCodeEntry(YangNode codeGenNode,
+                                          YangPluginConfig yangPlugin,
+                                          YangNode rootNode)
             throws TranslatorException, IOException {
 
         if (codeGenNode instanceof JavaCodeGenerator) {
             ((JavaCodeGenerator) codeGenNode).generateCodeEntry(yangPlugin);
         } else {
-            close(codeGenNode, yangPlugin);
+            close(codeGenNode, yangPlugin, rootNode);
             throw new TranslatorException(
                     "Generated data model node cannot be translated to target language code for " +
                             codeGenNode.getName() + " in " + codeGenNode.getLineNumber()
@@ -168,16 +141,19 @@
      *
      * @param codeGenNode  current data model node for which the code needs to be generated
      * @param pluginConfig plugin configurations
+     * @param rootNode     YANG root node
      * @throws TranslatorException when fails to generate java code file the current node
      * @throws IOException         when fails to do IO operations
      */
-    private static void generateCodeExit(YangNode codeGenNode, YangPluginConfig pluginConfig)
+    private static void generateCodeExit(YangNode codeGenNode,
+                                         YangPluginConfig pluginConfig,
+                                         YangNode rootNode)
             throws TranslatorException, IOException {
 
         if (codeGenNode instanceof JavaCodeGenerator) {
             ((JavaCodeGenerator) codeGenNode).generateCodeExit();
         } else {
-            close(codeGenNode, pluginConfig);
+            close(codeGenNode, pluginConfig, rootNode);
             throw new TranslatorException(
                     "Generated data model node cannot be translated to target language code for " +
                             codeGenNode.getName() + " in " + codeGenNode.getLineNumber()
@@ -187,11 +163,12 @@
 
     /**
      * Free other YANG nodes of data-model tree when error occurs while file generation of current node.
+     *
+     * @param freedNode current data model node
      */
-    private static void freeRestResources() {
+    private static void freeRestResources(YangNode freedNode) {
 
-        YangNode freedNode = getCurNode();
-        if (getCurNode() != null) {
+        if (freedNode != null) {
             YangNode tempNode = freedNode;
             TraversalType curTraversal = ROOT;
 
@@ -246,18 +223,16 @@
             throws IOException {
 
         if (rootNode != null) {
-            //Free other resources where translator has failed.
-            freeRestResources();
 
             // Start removing all open files.
             YangNode tempNode = rootNode;
-            setCurNode(tempNode.getChild());
+            YangNode curNode = tempNode.getChild();
             TraversalType curTraversal = ROOT;
 
             while (tempNode != null) {
 
                 if (curTraversal != PARENT) {
-                    close(tempNode, yangPluginConfig);
+                    close(tempNode, yangPluginConfig, rootNode);
                 }
                 if (curTraversal != PARENT && tempNode.getChild() != null) {
                     curTraversal = CHILD;
@@ -271,7 +246,7 @@
                 }
             }
 
-            freeRestResources();
+            freeRestResources(curNode);
         }
     }
 
@@ -280,19 +255,21 @@
      *
      * @param node       current YANG node
      * @param yangPlugin plugin configurations
+     * @param rootNode   YANG root node
      * @throws IOException when fails to do IO operations
      */
-    private static void close(YangNode node, YangPluginConfig yangPlugin)
+    private static void close(YangNode node, YangPluginConfig yangPlugin,
+                              YangNode rootNode)
             throws IOException {
         if (node instanceof JavaCodeGenerator && ((TempJavaCodeFragmentFilesContainer) node)
                 .getTempJavaCodeFragmentFiles() != null) {
             ((TempJavaCodeFragmentFilesContainer) node).getTempJavaCodeFragmentFiles().freeTemporaryResources(true);
         }
-        if (getRootNode() != null) {
-            JavaFileInfoTranslator javaFileInfo = ((JavaFileInfoContainer) getRootNode()).getJavaFileInfo();
+        if (rootNode != null) {
+            JavaFileInfoTranslator javaFileInfo = ((JavaFileInfoContainer) rootNode).getJavaFileInfo();
             if (javaFileInfo.getPackage() != null) {
                 searchAndDeleteTempDir(javaFileInfo.getBaseCodeGenPath() +
-                        javaFileInfo.getPackageFilePath());
+                                               javaFileInfo.getPackageFilePath());
             } else {
                 searchAndDeleteTempDir(yangPlugin.getCodeGenDir());
             }
@@ -301,24 +278,6 @@
     }
 
     /**
-     * Returns root node.
-     *
-     * @return root node
-     */
-    private static YangNode getRootNode() {
-        return rootNode;
-    }
-
-    /**
-     * Sets root node.
-     *
-     * @param rootNode root node
-     */
-    private static void setRootNode(YangNode rootNode) {
-        JavaCodeGeneratorUtil.rootNode = rootNode;
-    }
-
-    /**
      * Searches child node in data model tree.
      *
      * @param parentNode parent node
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
index fe6a40b..221f414 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -562,7 +562,7 @@
                                              List<String> importsList)
             throws IOException {
 
-        insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
+        insertDataIntoJavaFile(file, CopyrightHeader.parseCopyrightHeader());
         insertDataIntoJavaFile(file, pkg);
 
         /*
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
index 3e60817..d4904ae 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
@@ -1204,21 +1204,38 @@
         return "                    Class<?>[] classArray = " + call + "" +
                 ".getClass()" +
                 ".getInterfaces();\n" +
-                "                    Class<?> caseClass = classArray[0];\n" +
+                "                    Class<?> caseIntf = classArray[0];\n" +
                 "                    try {\n" +
-                "                        Object obj1 = caseClass.newInstance();\n" +
+                "                        ClassLoader classLoader = this" +
+                ".getClass().getClassLoader();\n" +
+                "                        String className = \"Default\" + " +
+                "caseIntf.getSimpleName();\n" +
+                "                        className = caseIntf.getPackage()" +
+                ".getName() + \".\" + className;\n" +
+                "                        Class<?> caseClass = classLoader" +
+                ".loadClass(className);\n" +
+                "                        java.lang.reflect.Constructor<?> " +
+                "constructor = caseClass.getDeclaredConstructor();\n" +
+                "                        constructor.setAccessible(true);\n" +
+                "                        Object obj1 = constructor" +
+                ".newInstance();\n" +
                 "                        java.lang.reflect.Method method =" +
-                " caseClass.getMethod(\"builder\", caseClass);\n" +
-                "                        Object obj = method.invoke(obj1," +
-                " (Object) null);\n" +
-                "                        method = caseClass.getMethod(\"build\", caseClass);\n" +
-                "                        Object obj2 = method.invoke(obj, " +
-                "(Object) null);\n" +
-                "                        method = caseClass.getMethod(\"processSubtreeFiltering\", caseClass);\n" +
+                " caseClass.getMethod(\"builder\");\n" +
+                "                        Object obj = method.invoke(obj1);\n" +
+                "                        Class<?> builderClass = obj.getClass();\n" +
+                "                        method = builderClass.getMethod(\"build\");\n" +
+                "                        Object obj2 = method.invoke(obj);\n" +
+                "                        Class<?> input = this.getClass()" +
+                ".getMethod(" + "\"" + name + "\").getReturnType();\n" +
+                "                        method = caseClass.getMethod" +
+                "(\"processSubtreeFiltering\", input,\n" +
+                "                                     boolean.class);\n" +
                 "                        result = (" + returnType + ") method.invoke" +
                 "(obj2, " + call + ", true);\n" +
                 "                    } catch (NoSuchMethodException | InstantiationException |\n" +
-                "                            IllegalAccessException | InvocationTargetException e) {\n" +
+                "                            IllegalAccessException | " +
+                "InvocationTargetException |\n" +
+                "                            ClassNotFoundException e) {\n" +
                 "                        e.printStackTrace();\n" +
                 "                    }\n";
     }
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
index 5833de2..8b55768 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
@@ -37,9 +37,6 @@
     private static final String COPYRIGHTS_FIRST_LINE = "/*\n * Copyright " + Calendar.getInstance().get(Calendar.YEAR)
             + "-present Open Networking Laboratory\n";
     private static final String TEMP_FILE = "temp.txt";
-    private static ClassLoader classLoader = CopyrightHeader.class.getClassLoader();
-
-    private static String copyrightHeader;
 
     /**
      * Creates an instance of copyright header.
@@ -48,40 +45,18 @@
     }
 
     /**
-     * Returns copyright file header.
-     *
-     * @return copyright file header
-     * @throws IOException when fails to parse copyright header
-     */
-    public static String getCopyrightHeader() throws IOException {
-
-        if (copyrightHeader == null) {
-            parseCopyrightHeader();
-        }
-        return copyrightHeader;
-    }
-
-    /**
-     * Sets the copyright header.
-     *
-     * @param header copyright header
-     */
-    private static void setCopyrightHeader(String header) {
-
-        copyrightHeader = header;
-    }
-
-    /**
      * parses Copyright to the temporary file.
      *
+     * @return string of file.
      * @throws IOException when fails to get the copyright header
      */
-    private static void parseCopyrightHeader() throws IOException {
+    public static String parseCopyrightHeader() throws IOException {
 
         File temp = new File(TEMP_FILE);
 
         try {
-            InputStream stream = classLoader.getResourceAsStream(COPYRIGHT_HEADER_FILE);
+            InputStream stream = CopyrightHeader.class.getClassLoader()
+                    .getResourceAsStream(COPYRIGHT_HEADER_FILE);
             OutputStream out = new FileOutputStream(temp);
 
             int index;
@@ -91,8 +66,7 @@
             }
             out.close();
             stream.close();
-            getStringFileContent(temp);
-            setCopyrightHeader(getStringFileContent(temp));
+            return getStringFileContent(temp);
         } catch (IOException e) {
             throw new IOException("failed to parse the Copyright header");
         } finally {
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
index a03ebb4..15051cb 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
@@ -68,7 +68,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.UNDER_SCORE;
 import static org.onosproject.yangutils.utils.UtilConstants.UNUSED;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUTO_PREFIX;
-import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.getCopyrightHeader;
+import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.parseCopyrightHeader;
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.appendFileContents;
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.PACKAGE_INFO;
@@ -134,7 +134,7 @@
             FileWriter fileWriter = new FileWriter(packageInfo);
             BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
 
-            bufferedWriter.write(getCopyrightHeader());
+            bufferedWriter.write(parseCopyrightHeader());
             //TODO: get the compiler annotations and pass the info
             bufferedWriter.write(getJavaDoc(PACKAGE_INFO, classInfo, isChildNode,
                                             null));
@@ -688,7 +688,8 @@
      * @param conflictResolver object of YANG to java naming conflict util
      * @return camel case rule checked string
      */
-    private static String applyCamelCaseRule(String[] stringArray, YangToJavaNamingConflictUtil conflictResolver) {
+    private static String applyCamelCaseRule(String[] stringArray,
+                                             YangToJavaNamingConflictUtil conflictResolver) {
 
         String ruleChecker = stringArray[0].toLowerCase();
         int i;
diff --git a/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java b/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
index 493ec09..17ec860 100644
--- a/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
+++ b/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
@@ -91,10 +91,6 @@
     private static final String REGEX_EQUAL = "[=]";
     private static final String REGEX_OPEN_BRACE = "[(]";
 
-    private static YangConstructType pathType;
-    private static PathStatementContext pathCtx;
-    private static YangLeafRef yangLeafRef;
-
     // No instantiation.
     private ListenerUtil() {
     }
@@ -124,7 +120,9 @@
      * @param ctx           yang construct's context to get the line number and character position
      * @return concatenated string after removing double quotes
      */
-    public static String getValidIdentifier(String identifier, YangConstructType yangConstruct, ParserRuleContext ctx) {
+    public static String getValidIdentifier(String identifier,
+                                            YangConstructType yangConstruct,
+                                            ParserRuleContext ctx) {
 
         String identifierString = removeQuotesAndHandleConcat(identifier);
         ParserException parserException;
@@ -713,33 +711,33 @@
                                     YangLeafRef leafRef) {
 
         String concatPath = removeQuotesAndHandleConcat(path);
-        pathType = type;
-        pathCtx = ctx;
-        yangLeafRef = leafRef;
         if (!concatPath.startsWith(SLASH_FOR_STRING) &&
                 !concatPath.startsWith(ANCESTOR)) {
-            throw getPathException();
+            throw getPathException(ctx, leafRef);
         }
         leafRef.setPath(concatPath);
         if (concatPath.startsWith(SLASH_FOR_STRING)) {
             List<YangAtomicPath> atomicList = new LinkedList<>();
-            valAbsPath(concatPath, atomicList);
+            valAbsPath(concatPath, atomicList, ctx, leafRef, type);
             leafRef.setPathType(ABSOLUTE_PATH);
             valPrefix(atomicList, leafRef);
             leafRef.setAtomicPath(atomicList);
             return;
         }
         leafRef.setPathType(RELATIVE_PATH);
-        valRelPath(concatPath, leafRef);
+        valRelPath(concatPath, leafRef, ctx, type);
     }
 
     /**
      * Validates relative path, parses the string and stores it in the leaf-ref.
      *
-     * @param path    leaf-ref path
-     * @param leafRef YANG leaf-ref
+     * @param path     leaf-ref path
+     * @param leafRef  YANG leaf-ref data model information
+     * @param pathType yang construct for creating error message
      */
-    private static void valRelPath(String path, YangLeafRef leafRef) {
+    private static void valRelPath(String path, YangLeafRef leafRef,
+                                   PathStatementContext pathCtx,
+                                   YangConstructType pathType) {
 
         YangRelativePath relPath = new YangRelativePath();
         int count = 0;
@@ -748,12 +746,13 @@
             count = count + 1;
         }
         if (path.isEmpty()) {
-            throw getPathException();
+            throw getPathException(pathCtx, leafRef);
         }
 
         List<YangAtomicPath> atomicList = new ArrayList<>();
         relPath.setAncestorNodeCount(count);
-        valAbsPath(SLASH_FOR_STRING + path, atomicList);
+        valAbsPath(SLASH_FOR_STRING + path, atomicList, pathCtx, leafRef,
+                   pathType);
         valPrefix(atomicList, leafRef);
         relPath.setAtomicPathList(atomicList);
         leafRef.setRelativePath(relPath);
@@ -762,23 +761,30 @@
     /**
      * Validates absolute path, parses the string and stores it in leaf-ref.
      *
-     * @param path    leaf-ref path
-     * @param atomics atomic content list
+     * @param path        leaf-ref path
+     * @param atomics     atomic content list
+     * @param pathCtx     path statement context
+     * @param yangLeafRef YANG leaf ref
+     * @param pathType    yang construct for creating error message
      */
-    private static void valAbsPath(String path, List<YangAtomicPath> atomics) {
+    private static void valAbsPath(String path, List<YangAtomicPath> atomics,
+                                   PathStatementContext pathCtx,
+                                   YangLeafRef yangLeafRef,
+                                   YangConstructType pathType) {
 
         String comPath = path;
         while (comPath != null) {
             comPath = comPath.substring(1);
             if (comPath.isEmpty()) {
-                throw getPathException();
+                throw getPathException(pathCtx, yangLeafRef);
             }
             int nodeId = comPath.indexOf(CHAR_OF_SLASH);
             int predicate = comPath.indexOf(CHAR_OF_OPEN_SQUARE_BRACKET);
             if (predicate < nodeId && predicate != -1) {
-                comPath = getPathWithPredicate(comPath, atomics);
+                comPath = getPathWithPredicate(comPath, atomics,
+                                               pathCtx, yangLeafRef, pathType);
             } else {
-                comPath = getPath(comPath, atomics);
+                comPath = getPath(comPath, atomics, pathType, pathCtx);
             }
         }
     }
@@ -787,38 +793,53 @@
      * Returns the remaining path after parsing and the predicates of an atomic
      * content.
      *
-     * @param path    leaf-ref path
-     * @param atomics atomic content list
+     * @param path        leaf-ref path
+     * @param atomics     atomic content list
+     * @param pathCtx     yang construct's context to get the line number and
+     *                    character position
+     * @param yangLeafRef YANG leaf-ref data model information
+     * @param pathType    yang construct for creating error message
      * @return parsed path after removing one atomic content.
      */
     private static String getPathWithPredicate(String path,
-                                               List<YangAtomicPath> atomics) {
+                                               List<YangAtomicPath> atomics,
+                                               PathStatementContext pathCtx,
+                                               YangLeafRef yangLeafRef,
+                                               YangConstructType pathType) {
 
         String[] node = new String[2];
         int bracket = path.indexOf(CHAR_OF_OPEN_SQUARE_BRACKET);
         node[0] = path.substring(0, bracket);
         node[1] = path.substring(bracket);
-        return getParsedPath(node[0], node[1], atomics);
+        return getParsedPath(node[0], node[1], atomics, pathCtx, yangLeafRef,
+                             pathType);
     }
 
     /**
      * Returns the path after taking all the path predicates of an atomic
      * content.
      *
-     * @param nodeId  atomic content nodeId
-     * @param path    leaf-ref path
-     * @param atomics atomic content list
+     * @param nodeId      atomic content nodeId
+     * @param path        leaf-ref path
+     * @param atomics     atomic content list
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
+     * @param pathType    yang construct for creating error message
      * @return parsed path after removing one atomic content.
      */
     public static String getParsedPath(String nodeId, String path,
-                                       List<YangAtomicPath> atomics) {
+                                       List<YangAtomicPath> atomics,
+                                       PathStatementContext pathCtx,
+                                       YangLeafRef yangLeafRef,
+                                       YangConstructType pathType) {
 
         String comPath = path;
         List<String> predicateList = new ArrayList<>();
         while (comPath.startsWith(OPEN_SQUARE_BRACKET)) {
             String matchedVal = getMatchedPredicate(comPath);
             if (matchedVal == null || matchedVal.isEmpty()) {
-                throw getPathException();
+                throw getPathException(pathCtx, yangLeafRef);
             }
             predicateList.add(matchedVal);
             comPath = comPath.substring(matchedVal.length());
@@ -828,7 +849,9 @@
         YangNodeIdentifier validId =
                 getValidNodeIdentifier(nodeId, pathType, pathCtx);
 
-        List<YangPathPredicate> predicates = valPathPredicates(predicateList);
+        List<YangPathPredicate> predicates = valPathPredicates(predicateList,
+                                                               pathType,
+                                                               pathCtx, yangLeafRef);
         atomicPath.setNodeIdentifier(validId);
         atomicPath.setPathPredicatesList(predicates);
         atomics.add(atomicPath);
@@ -839,15 +862,22 @@
      * Validates the path predicates of an atomic content after parsing the
      * predicates and storing it in the leaf-ref.
      *
-     * @param predicates list of predicates
+     * @param predicates  list of predicates
+     * @param pathType    yang construct for creating error message
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return list of path predicates of an atomic content
      */
-    private static List<YangPathPredicate> valPathPredicates(List<String> predicates) {
+    private static List<YangPathPredicate> valPathPredicates(List<String> predicates,
+                                                             YangConstructType pathType,
+                                                             PathStatementContext pathCtx,
+                                                             YangLeafRef yangLeafRef) {
 
         List<YangPathPredicate> result = new ArrayList<>();
         for (String p : predicates) {
             p = p.substring(1, p.length() - 1);
-            result.add(valPathEqualityExp(p.trim()));
+            result.add(valPathEqualityExp(p.trim(), pathType, pathCtx, yangLeafRef));
         }
         return result;
     }
@@ -856,15 +886,23 @@
      * Validates the path equality expression of a path predicate and after
      * parsing the string assigns it to the YANG path predicate.
      *
-     * @param predicate path predicate
+     * @param predicate   path predicate
+     * @param pathType    yang construct for creating error message
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return YANG path predicate
      */
-    private static YangPathPredicate valPathEqualityExp(String predicate) {
+    private static YangPathPredicate valPathEqualityExp(String predicate,
+                                                        YangConstructType pathType,
+                                                        PathStatementContext pathCtx,
+                                                        YangLeafRef yangLeafRef) {
 
         String[] exp = predicate.split(REGEX_EQUAL);
         YangNodeIdentifier nodeId =
                 getValidNodeIdentifier(exp[0].trim(), pathType, pathCtx);
-        YangRelativePath relPath = valPathKeyExp(exp[1].trim());
+        YangRelativePath relPath = valPathKeyExp(exp[1].trim(), pathType,
+                                                 pathCtx, yangLeafRef);
 
         YangPathPredicate pathPredicate = new YangPathPredicate();
         pathPredicate.setNodeId(nodeId);
@@ -877,10 +915,17 @@
      * Validates the path key expression of the path-predicate and stores it
      * in the relative path of the leaf-ref.
      *
-     * @param relPath relative path
+     * @param relPath     relative path
+     * @param pathType    yang construct for creating error message
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return YANG relative path
      */
-    private static YangRelativePath valPathKeyExp(String relPath) {
+    private static YangRelativePath valPathKeyExp(String relPath,
+                                                  YangConstructType pathType,
+                                                  PathStatementContext pathCtx,
+                                                  YangLeafRef yangLeafRef) {
 
         String[] relative = relPath.split(SLASH_FOR_STRING);
         int count = 0;
@@ -895,7 +940,9 @@
 
         YangRelativePath relativePath = new YangRelativePath();
         relativePath.setAncestorNodeCount(count);
-        relativePath.setAtomicPathList(valRelPathKeyExp(atomicContent));
+        relativePath.setAtomicPathList(valRelPathKeyExp(atomicContent,
+                                                        pathType,
+                                                        pathCtx, yangLeafRef));
         return relativePath;
     }
 
@@ -903,16 +950,23 @@
      * Validates relative path key expression in the right relative path of
      * the path predicate, by taking every atomic content in it.
      *
-     * @param content atomic content list
+     * @param content     atomic content list
+     * @param pathType    yang construct for creating error message
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return YANG atomic content list
      */
-    private static List<YangAtomicPath> valRelPathKeyExp(List<String> content) {
+    private static List<YangAtomicPath> valRelPathKeyExp(List<String> content,
+                                                         YangConstructType pathType,
+                                                         PathStatementContext pathCtx,
+                                                         YangLeafRef yangLeafRef) {
 
         String current = content.get(0);
         String[] curStr = (current.trim()).split(REGEX_OPEN_BRACE);
         if (!(curStr[0].trim().equals(CURRENT)) ||
                 !(curStr[1].trim().equals(CLOSE_PARENTHESIS))) {
-            throw getPathException();
+            throw getPathException(pathCtx, yangLeafRef);
         }
 
         content.remove(0);
@@ -933,9 +987,14 @@
      *
      * @param path       leaf-ref path
      * @param atomicList atomic content list
+     * @param pathType   yang construct for creating error message
+     * @param pathCtx    yang construct's context to get the line number
+     *                   and character position
      * @return remaining path after parsing one atomic content
      */
-    public static String getPath(String path, List<YangAtomicPath> atomicList) {
+    public static String getPath(String path, List<YangAtomicPath> atomicList,
+                                 YangConstructType pathType,
+                                 PathStatementContext pathCtx) {
 
         String comPath = path;
         String nodeId;
@@ -958,9 +1017,13 @@
     /**
      * Returns the path syntax parser exception.
      *
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return parser exception
      */
-    private static ParserException getPathException() {
+    private static ParserException getPathException(PathStatementContext pathCtx,
+                                                    YangLeafRef yangLeafRef) {
         ParserException exception = new ParserException(
                 "YANG file error : Path " + yangLeafRef.getPath() +
                         " does not follow valid path syntax");
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java
index 40ac92c..d7da436 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java
@@ -33,7 +33,7 @@
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertThat;
-import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.getCopyrightHeader;
+import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.parseCopyrightHeader;
 
 /**
  * Unit Tests for the CopyrightHeader contents.
@@ -89,7 +89,7 @@
             out.write(c);
         }
 
-        String licenseHeader = getCopyrightHeader();
+        String licenseHeader = parseCopyrightHeader();
         File test = new File("target/TestCopyrightHeader.txt");
 
         FileWriter writer = new FileWriter(test);