[ONOS-4839] update file priority for input files

Change-Id: I4aa0cbbfb0f168efd7c1895c9bb0c6589088eefd
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
index f63d8df..8cfe779 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
@@ -16,9 +16,15 @@
 
 package org.onosproject.yangutils.linker.impl;
 
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Set;
 import org.onosproject.yangutils.datamodel.ResolvableType;
+import org.onosproject.yangutils.datamodel.YangImport;
+import org.onosproject.yangutils.datamodel.YangInclude;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
 import org.onosproject.yangutils.datamodel.YangSubModule;
@@ -73,6 +79,9 @@
         // Add reference to include list.
         addRefToYangFilesIncludeList(yangNodeSet);
 
+        // Update the priority for all the files.
+        updateFilePriority(yangNodeSet);
+
         // TODO check for circular import/include.
 
         // Carry out inter-file linking.
@@ -154,7 +163,10 @@
      */
     public void processInterFileLinking(Set<YangNode> yangNodeSet)
             throws LinkerException {
-        for (YangNode yangNode : yangNodeSet) {
+        List<YangNode> yangNodeSortedList = new LinkedList<>();
+        yangNodeSortedList.addAll(yangNodeSet);
+        Collections.sort(yangNodeSortedList);
+        for (YangNode yangNode : yangNodeSortedList) {
             try {
                 ((YangReferenceResolver) yangNode)
                         .resolveInterFileLinking(ResolvableType.YANG_IF_FEATURE);
@@ -178,4 +190,53 @@
             }
         }
     }
+
+    /**
+     * Updates the priority for all the input files.
+     *
+     * @param yangNodeSet set of YANG files info
+     */
+    public void updateFilePriority(Set<YangNode> yangNodeSet) {
+        for (YangNode yangNode : yangNodeSet) {
+            updateFilePriorityOfNode(yangNode);
+        }
+    }
+
+    /**
+     * Updates priority of the node.
+     *
+     * @param yangNode YANG node information
+     */
+    public void updateFilePriorityOfNode(YangNode yangNode) {
+        int curNodePriority = yangNode.getPriority();
+        if (yangNode instanceof YangReferenceResolver) {
+            List<YangImport> yangImportList = ((YangReferenceResolver) yangNode).getImportList();
+            if (yangImportList != null && !yangImportList.isEmpty()) {
+                Iterator<YangImport> importInfoIterator = yangImportList.iterator();
+                // Run through the imported list to update priority.
+                while (importInfoIterator.hasNext()) {
+                    YangImport yangImport = importInfoIterator.next();
+                    YangNode importedNode = yangImport.getImportedNode();
+                    if (curNodePriority >= importedNode.getPriority()) {
+                        importedNode.setPriority(curNodePriority + 1);
+                        updateFilePriorityOfNode(importedNode);
+                    }
+                }
+            }
+
+            List<YangInclude> yangIncludeList = ((YangReferenceResolver) yangNode).getIncludeList();
+            if (yangIncludeList != null && !yangIncludeList.isEmpty()) {
+                Iterator<YangInclude> includeInfoIterator = yangIncludeList.iterator();
+                // Run through the imported list to update priority.
+                while (includeInfoIterator.hasNext()) {
+                    YangInclude yangInclude = includeInfoIterator.next();
+                    YangNode includedNode = yangInclude.getIncludedNode();
+                    if (curNodePriority >= includedNode.getPriority()) {
+                        includedNode.setPriority(curNodePriority + 1);
+                        updateFilePriorityOfNode(includedNode);
+                    }
+                }
+            }
+        }
+    }
 }