[ONOS-5330] Code-Reusability by generating code for Grouping rather then uses

Change-Id: I80a7d5c92a47e30c5ea0fe45c407a8246d9994d7
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 ae7b016..2d70219 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
@@ -16,8 +16,6 @@
 
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
-import java.util.Stack;
-
 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
 import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.datamodel.YangIdentity;
@@ -33,6 +31,8 @@
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
 import org.onosproject.yangutils.utils.io.YangToJavaNamingConflictUtil;
 
+import java.util.Stack;
+
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getCurNodePackage;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage;
 import static org.onosproject.yangutils.utils.UtilConstants.BIG_DECIMAL;
@@ -49,6 +49,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_MATH;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG_WRAPPER;
+import static org.onosproject.yangutils.utils.UtilConstants.OBJECT_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.UtilConstants.SHORT;
 import static org.onosproject.yangutils.utils.UtilConstants.SHORT_WRAPPER;
@@ -109,6 +110,10 @@
             case INSTANCE_IDENTIFIER:
                 return STRING_DATA_TYPE;
             case LEAFREF:
+                YangType refType = getReferredTypeFromLeafref(yangType);
+                if (refType == null) {
+                    return OBJECT_STRING;
+                }
                 return getJavaDataType(getReferredTypeFromLeafref(yangType));
             default:
                 throw new TranslatorException("given data type is not supported. " +
@@ -165,13 +170,9 @@
                 case BINARY:
                     return BYTE + SQUARE_BRACKETS;
                 case LEAFREF:
-                    YangType<?> referredType = getReferredTypeFromLeafref(yangType);
-                    return getJavaImportClass(referredType, true, pluginConfig);
+                    return getLeafRefImpClass(yangType, pluginConfig, true);
                 case IDENTITYREF:
-                    YangIdentityRef identityRef = (YangIdentityRef) yangType.getDataTypeExtendedInfo();
-                    YangIdentity identity = identityRef.getReferredIdentity();
-                    return getCapitalCase(getCamelCase(identity.
-                            getName(), pluginConfig));
+                    return getIdentityRefImpClass(yangType, pluginConfig);
                 case EMPTY:
                     return BOOLEAN_WRAPPER;
                 case UNION:
@@ -204,12 +205,9 @@
                 case DECIMAL64:
                     return BIG_DECIMAL;
                 case LEAFREF:
-                    YangType<?> referredType = getReferredTypeFromLeafref(yangType);
-                    return getJavaImportClass(referredType, false, pluginConfig);
+                    return getLeafRefImpClass(yangType, pluginConfig, false);
                 case IDENTITYREF:
-                    YangIdentityRef identityRef = (YangIdentityRef) yangType.getDataTypeExtendedInfo();
-                    YangIdentity identity = identityRef.getReferredIdentity();
-                    return getCapitalCase(getCamelCase(identity.getName(), pluginConfig));
+                    return getIdentityRefImpClass(yangType, pluginConfig);
                 case EMPTY:
                     return BOOLEAN_DATA_TYPE;
                 case UNION:
@@ -261,8 +259,7 @@
                 case BITS:
                     return COLLECTION_IMPORTS;
                 case LEAFREF:
-                    YangType<?> referredType = getReferredTypeFromLeafref(yangType);
-                    return getJavaImportPackage(referredType, true, conflictResolver);
+                    return getLeafRefImpPkg(yangType, conflictResolver, true);
                 case IDENTITYREF:
                     return getIdentityRefPackage(yangType, conflictResolver);
                 case UNION:
@@ -291,8 +288,7 @@
                 case BITS:
                     return COLLECTION_IMPORTS;
                 case LEAFREF:
-                    YangType<?> referredType = getReferredTypeFromLeafref(yangType);
-                    return getJavaImportPackage(referredType, false, conflictResolver);
+                    return getLeafRefImpPkg(yangType, conflictResolver, false);
                 case IDENTITYREF:
                     return getIdentityRefPackage(yangType, conflictResolver);
                 case UNION:
@@ -333,10 +329,7 @@
         }
 
         YangJavaTypeDefTranslator typedef = (YangJavaTypeDefTranslator) ((YangDerivedInfo<?>) var).getReferredTypeDef();
-        if (typedef.getJavaFileInfo().getPackage() == null) {
-            return getPackageFromParent(typedef.getParent(), conflictResolver);
-        }
-        return typedef.getJavaFileInfo().getPackage();
+        return getTypePackage(typedef, conflictResolver);
     }
 
     /**
@@ -357,10 +350,7 @@
         }
 
         YangJavaUnionTranslator union = (YangJavaUnionTranslator) type.getDataTypeExtendedInfo();
-        if (union.getJavaFileInfo().getPackage() == null) {
-            return getPackageFromParent(union.getParent(), conflictResolver);
-        }
-        return union.getJavaFileInfo().getPackage();
+        return getTypePackage(union, conflictResolver);
     }
 
     /**
@@ -380,10 +370,7 @@
                                                   + " in " + type.getFileName());
         }
         YangJavaEnumerationTranslator enumeration = (YangJavaEnumerationTranslator) type.getDataTypeExtendedInfo();
-        if (enumeration.getJavaFileInfo().getPackage() == null) {
-            return getPackageFromParent(enumeration.getParent(), conflictResolver);
-        }
-        return enumeration.getJavaFileInfo().getPackage();
+        return getTypePackage(enumeration, conflictResolver);
     }
 
     /**
@@ -403,11 +390,32 @@
                                                   + " in " + type.getFileName());
         }
         YangIdentityRef identityRef = (YangIdentityRef) type.getDataTypeExtendedInfo();
-        YangJavaIdentityTranslator identity = (YangJavaIdentityTranslator) (identityRef.getReferredIdentity());
-        if (identity.getJavaFileInfo().getPackage() == null) {
-            return getPackageFromParent(identity.getParent(), conflictResolver);
+        if (identityRef.isInGrouping()) {
+            return JAVA_LANG;
         }
-        return identity.getJavaFileInfo().getPackage();
+        YangJavaIdentityTranslator identity = (YangJavaIdentityTranslator) (identityRef.getReferredIdentity());
+        return getTypePackage(identity, conflictResolver);
+    }
+
+    /**
+     * Returns type package.
+     *
+     * @param info             YANG code generator info
+     * @param conflictResolver object of YANG to java naming conflict util
+     * @return type java package
+     */
+    private static String getTypePackage(JavaCodeGeneratorInfo info,
+                                         YangToJavaNamingConflictUtil conflictResolver) {
+        YangNode node = (YangNode) info;
+        // Check for referred schema type node for grouping scenario.
+        while (node.getReferredSchema() != null) {
+            node = (YangNode) node.getReferredSchema();
+        }
+        info = (JavaCodeGeneratorInfo) node;
+        if (info.getJavaFileInfo().getPackage() == null) {
+            return getPackageFromParent(node.getParent(), conflictResolver);
+        }
+        return info.getJavaFileInfo().getPackage();
     }
 
     /**
@@ -476,7 +484,6 @@
                                                       yangNode.getLineNumber() + " at " +
                                                       yangNode.getCharPosition()
                                                       + " in " + yangNode.getFileName());
-
             }
 
             ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
@@ -513,7 +520,53 @@
      * @return type from the leafref
      */
     private static YangType<?> getReferredTypeFromLeafref(YangType type) {
-        YangLeafRef<?> leafRefInfo = (YangLeafRef<?>) type.getDataTypeExtendedInfo();
-        return leafRefInfo.getEffectiveDataType();
+        YangLeafRef<?> lri = (YangLeafRef<?>) type.getDataTypeExtendedInfo();
+        return lri.isInGrouping() ? null : lri.getEffectiveDataType();
+    }
+
+    /**
+     * Returns leaf ref import string.
+     *
+     * @param type   YANG type
+     * @param cnfg   YANG to java naming conflict util
+     * @param isList true if list, false otherwise
+     * @return import class
+     */
+    private static String getLeafRefImpClass(
+            YangType type, YangToJavaNamingConflictUtil cnfg, boolean isList) {
+        YangType<?> rt = getReferredTypeFromLeafref(type);
+        return rt == null ? OBJECT_STRING : getJavaImportClass(rt, isList,
+                                                               cnfg);
+    }
+
+    /**
+     * Returns identity ref import class.
+     *
+     * @param type YANG type
+     * @param cnfg YANG to java naming conflict util
+     * @return import class
+     */
+    private static String getIdentityRefImpClass(
+            YangType type, YangToJavaNamingConflictUtil cnfg) {
+        YangIdentityRef ir = (YangIdentityRef) type.getDataTypeExtendedInfo();
+        if (ir.isInGrouping()) {
+            return OBJECT_STRING;
+        }
+        YangIdentity identity = ir.getReferredIdentity();
+        return getCapitalCase(getCamelCase(identity.getName(), cnfg));
+    }
+
+    /**
+     * Returns leaf ref import package.
+     *
+     * @param type   YANG type
+     * @param cnfg   YANG to java naming conflict util
+     * @param isList true if list, false otherwise
+     * @return import package
+     */
+    private static String getLeafRefImpPkg(
+            YangType type, YangToJavaNamingConflictUtil cnfg, boolean isList) {
+        YangType<?> rt = getReferredTypeFromLeafref(type);
+        return rt == null ? JAVA_LANG : getJavaImportPackage(rt, isList, cnfg);
     }
 }