identityref tostring generation

Change-Id: I06b7b62c923f4ae73f64cc38efa8e3b93656a372
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
index 231675e..60f5208 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
@@ -79,7 +79,7 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getFileObject;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAddToListMethodImpl;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAddToListMethodInterface;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getAddToListMethodInterface;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getDefaultConstructorString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getEqualsMethod;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getFromStringMethod;
@@ -89,7 +89,7 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getSetterForClass;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getSetterString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringMethod;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getYangDataStructure;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getYangDataStructure;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getImportString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getOverRideString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorErrorType.INVALID_LEAF_HOLDER;
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaTypeFragmentFiles.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaTypeFragmentFiles.java
index 81a7718..76930f8 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaTypeFragmentFiles.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaTypeFragmentFiles.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yang.compiler.translator.tojava;
 
+import org.onosproject.yang.compiler.datamodel.YangIdentity;
 import org.onosproject.yang.compiler.datamodel.YangIdentityRef;
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.datamodel.YangType;
@@ -50,6 +51,7 @@
 import static org.onosproject.yang.compiler.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedInfoOfFromString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGenerator.generateTypeDefClassFile;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGenerator.generateUnionClassFile;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getDerivedPkfInfo;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getOfMethodStringAndJavaDoc;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getTypeConstructorStringAndJavaDoc;
@@ -331,10 +333,17 @@
     //TODO: Union with two identities code generation has to be changed.
     private void addIdentityToImport(List<YangType<?>> types,
                                      YangPluginConfig config) {
-        for (YangType<?> type :types) {
+        for (YangType<?> type : types) {
             Object ex = type.getDataTypeExtendedInfo();
             if (ex != null && ex instanceof YangIdentityRef) {
+                YangIdentity base = ((YangIdentityRef) ex).getReferredIdentity();
                 getAttributeForType(type, config);
+                List<YangIdentity> idList = base.getExtendList();
+                for (YangIdentity id : idList) {
+                    JavaQualifiedTypeInfoTranslator derPkgInfo =
+                            getDerivedPkfInfo(id);
+                    getIsQualifiedAccessOrAddToImportList(derPkgInfo);
+                }
             }
         }
     }
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java
index 3b7fa5e..9c2dc06 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java
@@ -37,6 +37,7 @@
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_IDENTITY_CLASS;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yang.compiler.translator.tojava.YangJavaModelUtils.updatePackageInfo;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getDerivedPkfInfo;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getFileObject;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.initiateJavaFileGeneration;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
@@ -48,7 +49,6 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getErrorMsg;
 import static org.onosproject.yang.compiler.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EMPTY_STRING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.IDENTITY;
 import static org.onosproject.yang.compiler.utils.UtilConstants.JAVA_FILE_EXTENSION;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
 import static org.onosproject.yang.compiler.utils.io.impl.FileSystemUtil.closeFile;
@@ -191,26 +191,10 @@
      */
     private List<String> getImportOfDerId(List<YangIdentity> idList,
                                           List<String> imports, String className) {
-        String derClassName;
         if (idList != null) {
             for (YangIdentity id : idList) {
-                if (id.isNameConflict()) {
-                    derClassName = getCapitalCase(
-                            getCamelCase(id.getName() + IDENTITY, null));
-                } else {
-                    derClassName = getCapitalCase(
-                            getCamelCase(id.getName(), null));
-                }
-                JavaFileInfoTranslator info = ((
-                        YangJavaIdentityTranslator) id).getJavaFileInfo();
-                String derPkg = info.getPackage();
-                if (derPkg == null) {
-                    derPkg = getDerivedPackage(id);
-                }
                 JavaQualifiedTypeInfoTranslator derPkgInfo =
-                        new JavaQualifiedTypeInfoTranslator();
-                derPkgInfo.setClassInfo(derClassName);
-                derPkgInfo.setPkgInfo(derPkg);
+                        getDerivedPkfInfo(id);
                 importData.addImportInfo(derPkgInfo, className,
                                          javaFileInfo.getPackage());
             }
@@ -225,8 +209,8 @@
      * @param id YANG Identity.
      * @return package of identity.
      */
-    private String getDerivedPackage(YangIdentity id) {
-        String derPkg = null;
+    public static String getDerivedPackage(YangIdentity id) {
+        String derPkg;
         byte version;
         String moduleName;
         YangRevision revision;
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaCodeSnippetGen.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaCodeSnippetGen.java
index 8a9d90b..396b522 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaCodeSnippetGen.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaCodeSnippetGen.java
@@ -29,7 +29,7 @@
 
 import static java.util.Collections.sort;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaIdentifierSyntax.getEnumJavaAttribute;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getYangDataStructure;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getYangDataStructure;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getDefaultDefinition;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getImportString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getOpenCloseParaWithValue;
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
index 624cf7e..bc6e5e3 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
@@ -123,7 +123,7 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringMethodClose;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringMethodOpen;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getUnionToStringMethod;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getYangDataStructure;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getYangDataStructure;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.isLeafValueSetInterface;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getImportString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getInterfaceLeafIdEnumMethods;
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGeneratorUtils.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGeneratorUtils.java
index f38c90b..42f946e 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGeneratorUtils.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -17,14 +17,19 @@
 package org.onosproject.yang.compiler.translator.tojava.utils;
 
 import org.onosproject.yang.compiler.datamodel.InvalidOpTypeHolder;
+import org.onosproject.yang.compiler.datamodel.YangAppDataStructure;
 import org.onosproject.yang.compiler.datamodel.YangAtomicPath;
 import org.onosproject.yang.compiler.datamodel.YangAugment;
+import org.onosproject.yang.compiler.datamodel.YangCompilerAnnotation;
+import org.onosproject.yang.compiler.datamodel.YangDataStructure;
+import org.onosproject.yang.compiler.datamodel.YangIdentity;
 import org.onosproject.yang.compiler.datamodel.YangLeafRef;
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.datamodel.YangNodeIdentifier;
 import org.onosproject.yang.compiler.datamodel.YangType;
 import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yang.compiler.translator.exception.TranslatorException;
+import org.onosproject.yang.compiler.translator.tojava.JavaAttributeInfo;
 import org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorInfo;
 import org.onosproject.yang.compiler.translator.tojava.JavaFileInfoContainer;
 import org.onosproject.yang.compiler.translator.tojava.JavaFileInfoTranslator;
@@ -37,14 +42,18 @@
 import org.onosproject.yang.compiler.translator.tojava.TempJavaFragmentFiles;
 import org.onosproject.yang.compiler.translator.tojava.TempJavaServiceFragmentFiles;
 import org.onosproject.yang.compiler.translator.tojava.TempJavaTypeFragmentFiles;
+import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaIdentityTranslator;
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
 import org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.DEFAULT_CLASS_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_CLASS;
@@ -86,17 +95,48 @@
 import static org.onosproject.yang.compiler.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
 import static org.onosproject.yang.compiler.translator.tojava.YangJavaModelUtils.getNodesPackage;
 import static org.onosproject.yang.compiler.translator.tojava.utils.ClassDefinitionGenerator.generateClassDefinition;
+import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.FOUR_SPACE;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodClassTypes.INTERFACE_TYPE;
+import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getIfConditionBegin;
+import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getOverRideString;
+import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getReturnString;
+import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getTwoParaEqualsString;
+import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.methodClose;
+import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.methodSignature;
+import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.multiAttrMethodSignature;
+import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.signatureClose;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ADD_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.AUGMENTED;
+import static org.onosproject.yang.compiler.utils.UtilConstants.CLASS_STRING;
+import static org.onosproject.yang.compiler.utils.UtilConstants.CLOSE_CURLY_BRACKET;
+import static org.onosproject.yang.compiler.utils.UtilConstants.COMPARE_TO;
+import static org.onosproject.yang.compiler.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
+import static org.onosproject.yang.compiler.utils.UtilConstants.DIAMOND_OPEN_BRACKET;
+import static org.onosproject.yang.compiler.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ERROR_MSG_FOR_GEN_CODE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.EXTEND;
+import static org.onosproject.yang.compiler.utils.UtilConstants.FOUR_SPACE_INDENTATION;
+import static org.onosproject.yang.compiler.utils.UtilConstants.IDENTITY;
+import static org.onosproject.yang.compiler.utils.UtilConstants.INT;
+import static org.onosproject.yang.compiler.utils.UtilConstants.KEYS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.LEAFREF;
+import static org.onosproject.yang.compiler.utils.UtilConstants.NEG_ONE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OP_PARAM;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PACKAGE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
+import static org.onosproject.yang.compiler.utils.UtilConstants.PUBLIC;
+import static org.onosproject.yang.compiler.utils.UtilConstants.QUESTION_MARK;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SEMI_COLON;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SET_METHOD_PREFIX;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SLASH;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SPACE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.TO_CAPS;
+import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_CAPS;
+import static org.onosproject.yang.compiler.utils.UtilConstants.VOID;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ZERO;
 import static org.onosproject.yang.compiler.utils.io.impl.CopyrightHeader.parseCopyrightHeader;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.DEFAULT_CLASS;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.ENUM_CLASS;
@@ -846,4 +886,165 @@
         }
         return attributeType;
     }
+
+    /**
+     * Returns package info of derived identity.
+     *
+     * @param id YANG identity.
+     * @return derived package info.
+     */
+    public static JavaQualifiedTypeInfoTranslator getDerivedPkfInfo(YangIdentity id) {
+        String pkg = YangJavaIdentityTranslator.getDerivedPackage(id);
+        String name;
+        if (id.isNameConflict()) {
+            name = getCapitalCase(
+                    getCamelCase(id.getName() + IDENTITY, null));
+        } else {
+            name = getCapitalCase(
+                    getCamelCase(id.getName(), null));
+        }
+        JavaQualifiedTypeInfoTranslator derPkgInfo =
+                new JavaQualifiedTypeInfoTranslator();
+        derPkgInfo.setClassInfo(name);
+        derPkgInfo.setPkgInfo(pkg);
+        return derPkgInfo;
+    }
+
+    /**
+     * Returns Identity name of the Identity.
+     *
+     * @param id YANG identity.
+     * @return YANG identity name.
+     */
+    public static String getIdName(YangIdentity id) {
+        String idName;
+        if (id.isNameConflict()) {
+            idName = getCapitalCase(
+                    getCamelCase(id.getName() + IDENTITY, null));
+        } else {
+            idName = getCapitalCase(
+                    getCamelCase(id.getName(), null));
+        }
+        return idName;
+    }
+
+    /**
+     * Returns add to list method interface.
+     *
+     * @param attr      java attribute
+     * @param className name of the class
+     * @return add to list method interface
+     */
+    public static String getAddToListMethodInterface(JavaAttributeInfo attr,
+                                                     String className) {
+
+        String methodName = ADD_STRING + TO_CAPS + getCapitalCase(
+                attr.getAttributeName());
+        String retType = getReturnType(attr);
+        YangDataStructure struct = getYangDataStructure(attr.getCompilerAnnotation());
+        if (struct != null) {
+            switch (struct) {
+                case MAP:
+                    Map<String, String> param = new LinkedHashMap<>();
+                    param.put(attr.getAttributeName() + KEYS, retType + KEYS);
+                    param.put(attr.getAttributeName() + VALUE_CAPS, retType);
+                    return multiAttrMethodSignature(methodName, null, null,
+                                                    VOID, param,
+                                                    INTERFACE_TYPE,
+                                                    FOUR_SPACE_INDENTATION);
+                default:
+                    return methodSignature(methodName, null, null, ADD_STRING + TO_CAPS,
+                                           VOID, retType,
+                                           INTERFACE_TYPE);
+            }
+        }
+        return methodSignature(methodName, null, null, ADD_STRING + TO_CAPS,
+                               VOID, getReturnType(attr),
+                               INTERFACE_TYPE);
+    }
+
+    /**
+     * Returns YANG data structure from java attribute.
+     *
+     * @param annotation compiler annotation
+     * @return YANG data structure from java attribute
+     */
+    public static YangDataStructure getYangDataStructure(
+            YangCompilerAnnotation annotation) {
+        if (annotation != null) {
+            YangAppDataStructure data = annotation.getYangAppDataStructure();
+            if (data != null) {
+                return data.getDataStructure();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns return type for attribute.
+     *
+     * @param attr attribute info
+     * @return return type
+     */
+    static String getReturnType(JavaAttributeInfo attr) {
+        StringBuilder builder = new StringBuilder();
+
+        if (attr.isQualifiedName() &&
+                attr.getImportInfo().getPkgInfo() != null) {
+            builder.append(attr.getImportInfo().getPkgInfo()).append(PERIOD);
+        }
+        builder.append(attr.getImportInfo().getClassInfo());
+
+        if (attr.getAttributeType() != null &&
+                attr.getAttributeType().getDataType() == IDENTITYREF) {
+            return CLASS_STRING + DIAMOND_OPEN_BRACKET +
+                    QUESTION_MARK + SPACE + EXTEND + SPACE +
+                    builder.toString() + DIAMOND_CLOSE_BRACKET;
+        }
+        return builder.toString();
+    }
+
+    /**
+     * Returns compare to method for key class.
+     *
+     * @param attrs     attribute list
+     * @param className class name
+     * @return compare to method
+     */
+    public static String getCompareToForKeyClass(
+            List<JavaAttributeInfo> attrs, String className) {
+
+        StringBuilder builder = new StringBuilder(getOverRideString());
+        builder.append(methodSignature(COMPARE_TO, null, PUBLIC, VALUE, INT,
+                                       className, CLASS_TYPE));
+        String cond;
+        String attrName;
+        String para;
+        StringBuilder space = new StringBuilder();
+        List<String> spaces = new ArrayList<>();
+        int count = 1;
+        for (JavaAttributeInfo attr : attrs) {
+            attrName = attr.getAttributeName();
+            para = VALUE + PERIOD + attrName;
+            cond = getTwoParaEqualsString(attrName, para);
+            if (count == 1) {
+                space.append(EIGHT_SPACE_INDENTATION);
+            } else {
+                space.append(FOUR_SPACE_INDENTATION);
+            }
+            spaces.add(space.toString());
+            count++;
+            builder.append(getIfConditionBegin(space.toString(), cond));
+        }
+        space.append(FOUR_SPACE_INDENTATION);
+        builder.append(getReturnString(ZERO, space.toString()))
+                .append(signatureClose());
+        for (int i = spaces.size() - 1; i >= 0; i--) {
+            builder.append(spaces.get(i)).append(CLOSE_CURLY_BRACKET)
+                    .append(NEW_LINE);
+        }
+        builder.append(getReturnString(NEG_ONE, EIGHT_SPACE_INDENTATION))
+                .append(signatureClose()).append(methodClose(FOUR_SPACE));
+        return builder.toString();
+    }
 }
\ No newline at end of file
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
index ed46a96..fbefdd7 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
@@ -17,7 +17,6 @@
 package org.onosproject.yang.compiler.translator.tojava.utils;
 
 import org.onosproject.yang.compiler.datamodel.InvalidOpTypeHolder;
-import org.onosproject.yang.compiler.datamodel.YangAppDataStructure;
 import org.onosproject.yang.compiler.datamodel.YangAtomicPath;
 import org.onosproject.yang.compiler.datamodel.YangCompilerAnnotation;
 import org.onosproject.yang.compiler.datamodel.YangDataStructure;
@@ -34,7 +33,6 @@
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
 import org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType;
 
-import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -50,7 +48,10 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.TWELVE_SPACE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getAugmentedClassNameForDataMethods;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getCurNodeName;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getIdName;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getReturnType;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getSetOfNodeIdentifiers;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getYangDataStructure;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaIdentifierSyntax.getEnumJavaAttribute;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodBodyTypes.GETTER;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodBodyTypes.MANAGER_METHODS;
@@ -80,6 +81,7 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getReturnOfSubString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getReturnString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getSetValueParaCondition;
+import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getSetterInterfaceString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getStringBuilderAttr;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getToStringCall;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getTrySubString;
@@ -117,10 +119,7 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.CLOSE_PARENTHESIS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.COLON;
 import static org.onosproject.yang.compiler.utils.UtilConstants.COMMA;
-import static org.onosproject.yang.compiler.utils.UtilConstants.COMPARE_TO;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DECODE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.DIAMOND_OPEN_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ELSE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EMPTY_STRING;
@@ -159,7 +158,6 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.MIN_RANGE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_LEAF_IDENTIFIER;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_OBJECT;
-import static org.onosproject.yang.compiler.utils.UtilConstants.NEG_ONE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_STRING_JOINER_OBJECT;
@@ -215,7 +213,6 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_LEAF_SET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VARIABLE_C;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VOID;
-import static org.onosproject.yang.compiler.utils.UtilConstants.ZERO;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.CONSTRUCTOR;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.DEFAULT_CONSTRUCTOR;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.FROM_METHOD;
@@ -253,7 +250,6 @@
      * @return getter string
      */
     public static String getGetterString(JavaAttributeInfo attr, int genType) {
-
         String returnType = getReturnType(attr);
         String attributeName = attr.getAttributeName();
         String appDataStructure = null;
@@ -614,51 +610,6 @@
     }
 
     /**
-     * Returns setter string for interface.
-     *
-     * @param name     class name
-     * @param attrName attribute name
-     * @param attrType attribute type
-     * @return setter string
-     */
-    private static String getSetterInterfaceString(String name,
-                                                   String attrName,
-                                                   String attrType,
-                                                   int genType) {
-        if (genType == GENERATE_SERVICE_AND_MANAGER) {
-            return methodSignature(getCapitalCase(attrName), SET_METHOD_PREFIX,
-                                   null, attrName, VOID, attrType + OP_PARAM,
-                                   INTERFACE_TYPE);
-        }
-        return methodSignature(attrName, EMPTY_STRING, null,
-                               attrName, VOID, attrType, INTERFACE_TYPE);
-    }
-
-    /**
-     * Returns return type for attribute.
-     *
-     * @param attr attribute info
-     * @return return type
-     */
-    private static String getReturnType(JavaAttributeInfo attr) {
-        StringBuilder builder = new StringBuilder();
-
-        if (attr.isQualifiedName() &&
-                attr.getImportInfo().getPkgInfo() != null) {
-            builder.append(attr.getImportInfo().getPkgInfo()).append(PERIOD);
-        }
-        builder.append(attr.getImportInfo().getClassInfo());
-
-        if (attr.getAttributeType() != null &&
-                attr.getAttributeType().getDataType() == IDENTITYREF) {
-            return CLASS_STRING + DIAMOND_OPEN_BRACKET +
-                    QUESTION_MARK + SPACE + EXTEND + SPACE +
-                    builder.toString() + DIAMOND_CLOSE_BRACKET;
-        }
-        return builder.toString();
-    }
-
-    /**
      * Returns the constructor strings for class file.
      *
      * @param attr    attribute info
@@ -1431,58 +1382,6 @@
     }
 
     /**
-     * Returns add to list method interface.
-     *
-     * @param attr      java attribute
-     * @param className name of the class
-     * @return add to list method interface
-     */
-    public static String getAddToListMethodInterface(JavaAttributeInfo attr,
-                                                     String className) {
-
-        String methodName = ADD_STRING + TO_CAPS + getCapitalCase(
-                attr.getAttributeName());
-        String retType = getReturnType(attr);
-        YangDataStructure struct = getYangDataStructure(attr.getCompilerAnnotation());
-        if (struct != null) {
-            switch (struct) {
-                case MAP:
-                    Map<String, String> param = new LinkedHashMap<>();
-                    param.put(attr.getAttributeName() + KEYS, retType + KEYS);
-                    param.put(attr.getAttributeName() + VALUE_CAPS, retType);
-                    return multiAttrMethodSignature(methodName, null, null,
-                                                    VOID, param,
-                                                    INTERFACE_TYPE,
-                                                    FOUR_SPACE_INDENTATION);
-                default:
-                    return methodSignature(methodName, null, null, ADD_STRING + TO_CAPS,
-                                           VOID, retType,
-                                           INTERFACE_TYPE);
-            }
-        }
-        return methodSignature(methodName, null, null, ADD_STRING + TO_CAPS,
-                               VOID, getReturnType(attr),
-                               INTERFACE_TYPE);
-    }
-
-    /**
-     * Returns YANG data structure from java attribute.
-     *
-     * @param annotation compiler annotation
-     * @return YANG data structure from java attribute
-     */
-    public static YangDataStructure getYangDataStructure(
-            YangCompilerAnnotation annotation) {
-        if (annotation != null) {
-            YangAppDataStructure data = annotation.getYangAppDataStructure();
-            if (data != null) {
-                return data.getDataStructure();
-            }
-        }
-        return null;
-    }
-
-    /**
      * Returns add to list method impl.
      *
      * @param attr java attribute
@@ -1683,9 +1582,16 @@
         StringBuilder builder = new StringBuilder(getOverRideString())
                 .append(methodSignature(TO_STRING_METHOD, null, PUBLIC, null,
                                         STRING_DATA_TYPE, null, CLASS_TYPE));
-        builder.append(getReturnString(
-                getToStringForSpecialType(type, attr), EIGHT_SPACE_INDENTATION))
-                .append(signatureClose()).append(methodClose(FOUR_SPACE));
+        if (type.getDataType() == IDENTITYREF) {
+            builder.append(getToStringForSpecialType(type, attr))
+                    .append(getReturnString(null, EIGHT_SPACE_INDENTATION))
+                    .append(signatureClose())
+                    .append(methodClose(FOUR_SPACE));
+        } else {
+            builder.append(getReturnString(
+                    getToStringForSpecialType(type, attr), EIGHT_SPACE_INDENTATION))
+                    .append(signatureClose()).append(methodClose(FOUR_SPACE));
+        }
         return builder.toString();
     }
 
@@ -1727,13 +1633,7 @@
                         getToStringForSpecialType(rt, name);
 
             case IDENTITYREF:
-                YangIdentityRef ir = (YangIdentityRef) type
-                        .getDataTypeExtendedInfo();
-                YangIdentity identity = ir.getReferredIdentity();
-                String idName = getCamelCase(getIdentityRefName(type), null);
-                return getCapitalCase(idName) + PERIOD +
-                        getCamelCase(identity.getName(), null) + TO_CAPS +
-                        STRING_DATA_TYPE + OPEN_CLOSE_BRACKET_STRING;
+                return getIdRefToString(type, name, "");
             case ENUMERATION:
             case INSTANCE_IDENTIFIER:
             case UINT64:
@@ -1748,24 +1648,83 @@
     }
 
     /**
+     * Returns indented toString method of identiref.
+     *
+     * @param type   type of attribute.
+     * @param name   @return to string method body for typedef class
+     * @param indent number of indent spaces.
+     * @return returns tostring method.
+     */
+    private static String getIdRefToString(YangType type, String name, String
+            indent) {
+        YangIdentityRef ir = (YangIdentityRef) type
+                .getDataTypeExtendedInfo();
+        StringBuilder builder = new StringBuilder();
+        String idName = getCamelCase(getIdentityRefName(type), null);
+        YangIdentity identity = ir.getReferredIdentity();
+        //condition for comparision
+        String cond = getTwoParaEqualsString(name, getCapitalCase(idName) + PERIOD + CLASS);
+        //return value in toString method
+        String returnVal = getCapitalCase(idName) + PERIOD + getCamelCase(
+                identity.getName(), null) + TO_CAPS +
+                STRING_DATA_TYPE + OPEN_CLOSE_BRACKET_STRING;
+        List<YangIdentity> idList = identity.getExtendList();
+        //adding present identity's tostring method
+        builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION + indent,
+                                           cond))
+                .append(getReturnString(returnVal, TWELVE_SPACE_INDENTATION +
+                        indent))
+                .append(signatureClose());
+        //adding derived identities tostring method
+        for (YangIdentity id : idList) {
+            idName = getIdName(id);
+            cond = getTwoParaEqualsString(name, getCapitalCase(idName) +
+                    PERIOD + CLASS);
+
+            returnVal = getCapitalCase(idName) + PERIOD + getCamelCase(id.getName(), null) + TO_CAPS +
+                    STRING_DATA_TYPE + OPEN_CLOSE_BRACKET_STRING;
+
+            builder.append(getElseIfConditionBegin(
+                    EIGHT_SPACE_INDENTATION + indent, cond))
+                    .append(getReturnString(returnVal,
+                                            TWELVE_SPACE_INDENTATION + indent))
+                    .append(signatureClose());
+        }
+        //passing indents for if-else statements in toString methods
+        if (indent.equals(FOUR_SPACE_INDENTATION)) {
+            builder.append(methodClose(TWELVE_SPACE));
+        } else {
+            builder.append(methodClose(EIGHT_SPACE));
+        }
+        return builder.toString();
+    }
+
+    /**
      * Returns union class's to string method.
      *
      * @param types list of types
      * @return union class's to string method
      */
     static String getUnionToStringMethod(List<YangType<?>> types) {
-
         StringBuilder builder = new StringBuilder(getOverRideString());
         builder.append(methodSignature(TO_STRING_METHOD, null, PUBLIC, null,
                                        STRING_DATA_TYPE, null, CLASS_TYPE));
         for (YangType type : types) {
             builder.append(getIfConditionBegin(
                     EIGHT_SPACE_INDENTATION, getSetValueParaCondition(
-                            types.indexOf(type)))).append(getReturnString(
-                    getToStringForSpecialType(type,
-                                              getCamelCase(type.getDataTypeName(), null)),
-                    TWELVE_SPACE_INDENTATION))
-                    .append(signatureClose()).append(methodClose(EIGHT_SPACE));
+                            types.indexOf(type))));
+            String retVal = getToStringForSpecialType(
+                    type, getCamelCase(type.getDataTypeName(), null));
+            if (type.getDataType() != IDENTITYREF) {
+                builder.append(getReturnString(retVal, TWELVE_SPACE_INDENTATION))
+                        .append(signatureClose());
+            } else {
+                retVal = getIdRefToString(type,
+                                          getCamelCase(type.getDataTypeName(), null),
+                                          FOUR_SPACE_INDENTATION);
+                builder.append(retVal);
+            }
+            builder.append(methodClose(EIGHT_SPACE));
         }
         builder.append(getReturnString(NULL, EIGHT_SPACE_INDENTATION)).append(signatureClose())
                 .append(methodClose(FOUR_SPACE));
@@ -1906,50 +1865,6 @@
     }
 
     /**
-     * Returns compare to method for key class.
-     *
-     * @param attrs     attribute list
-     * @param className class name
-     * @return compare to method
-     */
-    public static String getCompareToForKeyClass(
-            List<JavaAttributeInfo> attrs, String className) {
-
-        StringBuilder builder = new StringBuilder(getOverRideString());
-        builder.append(methodSignature(COMPARE_TO, null, PUBLIC, VALUE, INT,
-                                       className, CLASS_TYPE));
-        String cond;
-        String attrName;
-        String para;
-        StringBuilder space = new StringBuilder();
-        List<String> spaces = new ArrayList<>();
-        int count = 1;
-        for (JavaAttributeInfo attr : attrs) {
-            attrName = attr.getAttributeName();
-            para = VALUE + PERIOD + attrName;
-            cond = getTwoParaEqualsString(attrName, para);
-            if (count == 1) {
-                space.append(EIGHT_SPACE_INDENTATION);
-            } else {
-                space.append(FOUR_SPACE_INDENTATION);
-            }
-            spaces.add(space.toString());
-            count++;
-            builder.append(getIfConditionBegin(space.toString(), cond));
-        }
-        space.append(FOUR_SPACE_INDENTATION);
-        builder.append(getReturnString(ZERO, space.toString()))
-                .append(signatureClose());
-        for (int i = spaces.size() - 1; i >= 0; i--) {
-            builder.append(spaces.get(i)).append(CLOSE_CURLY_BRACKET)
-                    .append(NEW_LINE);
-        }
-        builder.append(getReturnString(NEG_ONE, EIGHT_SPACE_INDENTATION))
-                .append(signatureClose()).append(methodClose(FOUR_SPACE));
-        return builder.toString();
-    }
-
-    /**
      * Returns parameterisied constructor string.
      *
      * @param name         class name
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java
index ff8c231..7f0a2f3 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java
@@ -40,11 +40,13 @@
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.UINT32;
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.UINT64;
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.UINT8;
+import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
 import static org.onosproject.yang.compiler.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET;
 import static org.onosproject.yang.compiler.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE_AND_RETURN_TYPE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getYangDataStructure;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getYangDataStructure;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodClassTypes.INTERFACE_TYPE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getIdentityRefName;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ABSTRACT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ADD;
@@ -108,6 +110,7 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_CLOSE_BRACKET_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_CURLY_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_PARENTHESIS;
+import static org.onosproject.yang.compiler.utils.UtilConstants.OP_PARAM;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OVERRIDE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PARSE_BOOLEAN;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PARSE_BYTE;
@@ -122,6 +125,7 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.RETURN;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SEMI_COLON;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SET;
+import static org.onosproject.yang.compiler.utils.UtilConstants.SET_METHOD_PREFIX;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SET_VALUE_PARA;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SHORT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SHORT_MAX_RANGE;
@@ -147,6 +151,7 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.ULONG_MIN_RANGE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALIDATE_RANGE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.VOID;
 import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_UTILS_TODO;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ZERO;
 import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getCamelCase;
@@ -1365,4 +1370,25 @@
                 .append(pkg).append(PERIOD).append(cls).append(signatureClose());
         return builder.toString();
     }
+
+    /**
+     * Returns setter string for interface.
+     *
+     * @param name     class name
+     * @param attrName attribute name
+     * @param attrType attribute type
+     * @return setter string
+     */
+    static String getSetterInterfaceString(String name,
+                                           String attrName,
+                                           String attrType,
+                                           int genType) {
+        if (genType == GENERATE_SERVICE_AND_MANAGER) {
+            return methodSignature(getCapitalCase(attrName), SET_METHOD_PREFIX,
+                                   null, attrName, VOID, attrType + OP_PARAM,
+                                   INTERFACE_TYPE);
+        }
+        return methodSignature(attrName, EMPTY_STRING, null,
+                               attrName, VOID, attrType, INTERFACE_TYPE);
+    }
 }
diff --git a/compiler/plugin/maven/src/test/resources/DerivedIdentity/DerivedIdentities.yang b/compiler/plugin/maven/src/test/resources/DerivedIdentity/DerivedIdentities.yang
index 379f832..70fcc5a 100644
--- a/compiler/plugin/maven/src/test/resources/DerivedIdentity/DerivedIdentities.yang
+++ b/compiler/plugin/maven/src/test/resources/DerivedIdentity/DerivedIdentities.yang
@@ -15,6 +15,32 @@
         base ref-address-family;
     }
 
+    typedef type2 {
+        type identityref {
+             base ipv4-address-family;
+        }
+    }
+
+    typedef type3 {
+        type union {
+            type type2;
+            type identityref {
+                 base ipv4-address-family;
+            }
+        }
+    }
+
+    typedef type4 {
+        type union {
+            type identityref {
+                base ipv4-address-family;
+            }
+            type identityref {
+                base ipv6-address-family;
+            }
+        }
+    }
+
     leaf tunnel {
         type type15;
     }