[ONOS-4993] [ONOS-4956] [ONOS-4935] YANG interfile linker defect fix

Change-Id: I0037c9bd2a73b13a50bb874c7a72c6b2f5050e7e
diff --git a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
index f338672..00fb699 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
@@ -21,6 +21,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Stack;
+
 import org.onosproject.yangutils.datamodel.Resolvable;
 import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.TraversalType;
@@ -286,7 +287,8 @@
      * Adds the leafref/identityref type to the type, which has derived type referring to
      * typedef with leafref/identityref type.
      */
-    private void addDerivedRefTypeToRefTypeResolutionList() throws DataModelException {
+    private void addDerivedRefTypeToRefTypeResolutionList()
+            throws DataModelException {
 
         YangNode potentialAncestorWithReferredNode = getEntityToResolveInfo().getHolderOfEntityToResolve();
 
@@ -377,7 +379,7 @@
         if (entityToResolve != null && !entityToResolve.isEmpty()) {
             Iterator<T> entityToResolveIterator = entityToResolve.listIterator();
             while (entityToResolveIterator.hasNext()) {
-                addUnresolvedEntitiesToStack(entityToResolveIterator.next());
+                addUnresolvedEntitiesToResolutionList(entityToResolveIterator.next());
             }
         }
         if (((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() != INTRA_FILE_RESOLVED
@@ -393,7 +395,8 @@
      * @param entityToResolve entity to resolve
      * @throws DataModelException a violation of data model rules
      */
-    private void addUnresolvedEntitiesToStack(T entityToResolve) throws DataModelException {
+    private void addUnresolvedEntitiesToResolutionList(T entityToResolve)
+            throws DataModelException {
         if (entityToResolve instanceof YangEntityToResolveInfoImpl) {
             YangEntityToResolveInfoImpl entityToResolveInfo = (YangEntityToResolveInfoImpl) entityToResolve;
             if (entityToResolveInfo.getEntityToResolve() instanceof YangLeafRef) {
@@ -403,12 +406,13 @@
                 if (leafref.getResolvableStatus() == UNRESOLVED) {
                     leafref.setResolvableStatus(INTRA_FILE_RESOLVED);
                 }
-                // Add resolution information to the list.
-                YangResolutionInfoImpl resolutionInfoImpl = new YangResolutionInfoImpl<YangLeafRef>(leafref,
-                        parentNodeOfLeafref, entityToResolveInfo.getLineNumber(),
-                        entityToResolveInfo.getCharPosition());
-                addResolutionInfo(resolutionInfoImpl);
             }
+
+            // Add resolution information to the list.
+            YangResolutionInfoImpl resolutionInfoImpl = new YangResolutionInfoImpl<>(
+                    entityToResolveInfo.getEntityToResolve(), entityToResolveInfo.getHolderOfEntityToResolve(),
+                    entityToResolveInfo.getLineNumber(), entityToResolveInfo.getCharPosition());
+            addResolutionInfo(resolutionInfoImpl);
         }
     }
 
@@ -450,6 +454,11 @@
             return;
         } else {
 
+            YangType type = null;
+            if (getCurrentEntityToResolveFromStack() instanceof YangType) {
+                type = (YangType) getCurrentEntityToResolveFromStack();
+            }
+
             /**
              * Traverse up in the ancestor tree to check if the referred node is
              * defined
@@ -465,6 +474,12 @@
                 }
 
                 potentialAncestorWithReferredNode = potentialAncestorWithReferredNode.getParent();
+
+                if (type != null && potentialAncestorWithReferredNode != null) {
+                    if (potentialAncestorWithReferredNode.getParent() == null) {
+                        type.setTypeNotResolvedTillRootNode(true);
+                    }
+                }
             }
         }
 
@@ -719,7 +734,8 @@
      * @throws DataModelException data model errors
      */
     private YangNode isReferredNodeInSiblingProcessedForIdentity(YangNode potentialReferredNode,
-                                                                 String referredNodeName) throws DataModelException {
+            String referredNodeName)
+            throws DataModelException {
 
         while (potentialReferredNode != null) {
             if (potentialReferredNode instanceof YangIdentity) {
@@ -902,7 +918,8 @@
         return false;
     }
 
-    private boolean isFeatureDefinedInNode(YangNode node) throws DataModelException {
+    private boolean isFeatureDefinedInNode(YangNode node)
+            throws DataModelException {
         YangNodeIdentifier ifFeature = ((YangIfFeature) getCurrentEntityToResolveFromStack()).getName();
         List<YangFeature> featureList = ((YangFeatureHolder) node).getFeatureList();
         if (featureList != null && !featureList.isEmpty()) {
@@ -1209,7 +1226,7 @@
      * @param root            root node
      */
     private void processXPathLinking(T entityToResolve,
-                                     YangReferenceResolver root) {
+            YangReferenceResolver root) {
 
         YangXpathLinker<T> xPathLinker = new YangXpathLinker<T>();
 
@@ -1455,7 +1472,8 @@
      * @param resolutionInfo information about the YANG construct which has to be resolved
      * @throws DataModelException a violation of data model rules
      */
-    public void setAbsolutePathFromRelativePathInLeafref(T resolutionInfo) throws DataModelException {
+    public void setAbsolutePathFromRelativePathInLeafref(T resolutionInfo)
+            throws DataModelException {
         if (resolutionInfo instanceof YangLeafRef) {
 
             YangNode parentOfLeafref = ((YangLeafRef) resolutionInfo).getParentNodeOfLeafref();
@@ -1504,7 +1522,8 @@
      * @throws DataModelException a violation of data model rules
      */
     private void fillAbsolutePathValuesInLeafref(YangLeafRef leafref, String pathNameToBePrefixed,
-                                                 List<YangAtomicPath> atomicPathsInRelative) throws DataModelException {
+            List<YangAtomicPath> atomicPathsInRelative)
+            throws DataModelException {
 
         leafref.setPathType(YangPathArgType.ABSOLUTE_PATH);
         String[] pathName = new String[0];