[ONOS-4744] Leafref implementation and UT
Change-Id: I151797185e0bb1695c0640b667ae76ef87c4d4b0
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java
index 4d7c9fc..6df66af 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java
@@ -17,13 +17,15 @@
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
 import java.util.Stack;
-import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
+
 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
 import org.onosproject.yangutils.datamodel.YangEnumeration;
+import org.onosproject.yangutils.datamodel.YangLeafRef;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.datamodel.YangUnion;
+import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
@@ -101,6 +103,10 @@
                 return STRING_DATA_TYPE;
             case BOOLEAN:
                 return BOOLEAN_DATA_TYPE;
+            case INSTANCE_IDENTIFIER:
+                return STRING_DATA_TYPE;
+            case LEAFREF:
+                return getJavaDataType(getReferredTypeFromLeafref(yangType));
             default:
                 throw new TranslatorException("given data type is not supported.");
         }
@@ -152,8 +158,8 @@
                 case BINARY:
                     return YANG_BINARY_CLASS;
                 case LEAFREF:
-                    //TODO:LEAFREF
-                    break;
+                    YangType<?> referredType = getReferredTypeFromLeafref(yangType);
+                    return getJavaImportClass(referredType, isListAttr, pluginConfig);
                 case IDENTITYREF:
                     //TODO:IDENTITYREF
                     break;
@@ -163,8 +169,7 @@
                     return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(),
                             pluginConfig));
                 case INSTANCE_IDENTIFIER:
-                    //TODO:INSTANCE_IDENTIFIER
-                    break;
+                    return STRING_DATA_TYPE;
                 case DERIVED:
                     return getCapitalCase(
                             getCamelCase(yangType.getDataTypeName(), pluginConfig));
@@ -188,8 +193,8 @@
                 case BINARY:
                     return YANG_BINARY_CLASS;
                 case LEAFREF:
-                    //TODO:LEAFREF
-                    break;
+                    YangType<?> referredType = getReferredTypeFromLeafref(yangType);
+                    return getJavaImportClass(referredType, isListAttr, pluginConfig);
                 case IDENTITYREF:
                     //TODO:IDENTITYREF
                     break;
@@ -199,8 +204,7 @@
                     return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(),
                             pluginConfig));
                 case INSTANCE_IDENTIFIER:
-                    //TODO:INSTANCE_IDENTIFIER
-                    break;
+                    return STRING_DATA_TYPE;
                 case DERIVED:
                     return getCapitalCase(
                             getCamelCase(yangType.getDataTypeName(), pluginConfig));
@@ -246,16 +250,15 @@
                 case BINARY:
                     return YANG_TYPES_PKG;
                 case LEAFREF:
-                    //TODO:LEAFREF
-                    break;
+                    YangType<?> referredType = getReferredTypeFromLeafref(yangType);
+                    return getJavaImportPackage(referredType, isListAttr, conflictResolver);
                 case IDENTITYREF:
                     //TODO:IDENTITYREF
                     break;
                 case UNION:
                     return getUnionPackage(yangType, conflictResolver);
                 case INSTANCE_IDENTIFIER:
-                    //TODO:INSTANCE_IDENTIFIER
-                    break;
+                    return JAVA_LANG;
                 case DERIVED:
                     return getTypDefsPackage(yangType, conflictResolver);
                 default:
@@ -274,8 +277,8 @@
                 case BINARY:
                     return YANG_TYPES_PKG;
                 case LEAFREF:
-                    //TODO:LEAFREF
-                    break;
+                    YangType<?> referredType = getReferredTypeFromLeafref(yangType);
+                    return getJavaImportPackage(referredType, isListAttr, conflictResolver);
                 case IDENTITYREF:
                     //TODO:IDENTITYREF
                     break;
@@ -284,8 +287,7 @@
                 case UNION:
                     return getUnionPackage(yangType, conflictResolver);
                 case INSTANCE_IDENTIFIER:
-                    //TODO:INSTANCE_IDENTIFIER
-                    break;
+                    return JAVA_LANG;
                 case DERIVED:
                     return getTypDefsPackage(yangType, conflictResolver);
                 default:
@@ -444,4 +446,15 @@
                                     .getPackage()));
         }
     }
+
+    /**
+     * Returns the referred type from leaf/leaf-list.
+     *
+     * @param type current type in leaf
+     * @return type from the leafref
+     */
+    private static YangType<?> getReferredTypeFromLeafref(YangType type) {
+        YangLeafRef<?> leafRefInfo = (YangLeafRef<?>) type.getDataTypeExtendedInfo();
+        return leafRefInfo.getEffectiveDataType();
+    }
 }