[ONOS-5400][ONOS-5614] identity ref support in yangtools and defect fixes.

Change-Id: Ia1f32a6772e9d468717340953cf7598c61d9f1ed
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
index b901b62..9311e2d 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
@@ -17,6 +17,9 @@
 package org.onosproject.yangutils.translator.tojava.utils;
 
 import org.onosproject.yangutils.datamodel.YangCompilerAnnotation;
+import org.onosproject.yangutils.datamodel.YangDataStructure;
+import org.onosproject.yangutils.datamodel.YangIdentity;
+import org.onosproject.yangutils.datamodel.YangIdentityRef;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
@@ -41,7 +44,7 @@
 import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE;
 import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE_AND_RETURN_TYPE;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getIfConditionForAddToListMethod;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangDataStructure;
 import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.AND;
 import static org.onosproject.yangutils.utils.UtilConstants.APPEND;
@@ -90,12 +93,14 @@
 import static org.onosproject.yangutils.utils.UtilConstants.INTEGER_WRAPPER;
 import static org.onosproject.yangutils.utils.UtilConstants.INT_MAX_RANGE;
 import static org.onosproject.yangutils.utils.UtilConstants.INT_MIN_RANGE;
+import static org.onosproject.yangutils.utils.UtilConstants.KEYS;
 import static org.onosproject.yangutils.utils.UtilConstants.LEAF_IDENTIFIER;
 import static org.onosproject.yangutils.utils.UtilConstants.LIST;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG_MAX_RANGE;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG_MIN_RANGE;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG_WRAPPER;
+import static org.onosproject.yangutils.utils.UtilConstants.MAP;
 import static org.onosproject.yangutils.utils.UtilConstants.MORE_OBJ_ATTR;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
@@ -147,6 +152,8 @@
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_MAP;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_UTILS_TODO;
 import static org.onosproject.yangutils.utils.UtilConstants.ZERO;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.trimAtLast;
 
 /**
@@ -329,13 +336,6 @@
                         signatureClose();
             case DEFAULT_CONSTRUCTOR:
                 return EMPTY_STRING;
-            case ADD_TO_LIST:
-                return space + getIfConditionForAddToListMethod(paraName) +
-                        space + paraName +
-                        brackets(OPEN_CLOSE_BRACKET, null, null) + PERIOD +
-                        ADD_STRING + getOpenCloseParaWithValue(VALUE) +
-                        signatureClose() + getReturnString(
-                        THIS + signatureClose(), space);
             case AUGMENTED_MAP_ADD:
                 return space + YANG_AUGMENTED_INFO_MAP +
                         PERIOD + PUT + OPEN_PARENTHESIS + CLASS +
@@ -589,10 +589,9 @@
     static String getListAttribute(String attrType,
                                    YangCompilerAnnotation compilerAnnotation) {
         String listAttr;
-        if (compilerAnnotation != null &&
-                compilerAnnotation.getYangAppDataStructure() != null) {
-            switch (compilerAnnotation.getYangAppDataStructure()
-                    .getDataStructure()) {
+        YangDataStructure ds = getYangDataStructure(compilerAnnotation);
+        if (ds != null) {
+            switch (ds) {
                 case QUEUE: {
                     listAttr = QUEUE + DIAMOND_OPEN_BRACKET + attrType +
                             DIAMOND_CLOSE_BRACKET;
@@ -608,6 +607,10 @@
                             DIAMOND_CLOSE_BRACKET;
                     break;
                 }
+                case MAP:
+                    listAttr = MAP + DIAMOND_OPEN_BRACKET + attrType + KEYS +
+                            COMMA + attrType + DIAMOND_CLOSE_BRACKET;
+                    break;
                 default: {
                     listAttr = getListString() + attrType +
                             DIAMOND_CLOSE_BRACKET;
@@ -789,9 +792,7 @@
 
             case INSTANCE_IDENTIFIER:
             case STRING:
-            case IDENTITYREF:
                 return EMPTY_STRING;
-
             case EMPTY:
             case BOOLEAN:
                 return BOOLEAN_WRAPPER + PERIOD + PARSE_BOOLEAN;
@@ -799,6 +800,12 @@
             case ENUMERATION:
                 return targetDataType + PERIOD + OF;
 
+            case IDENTITYREF:
+                YangIdentityRef ir = (YangIdentityRef) yangType
+                        .getDataTypeExtendedInfo();
+                YangIdentity identity = ir.getReferredIdentity();
+                return getCapitalCase(getCamelCase(identity.getName(), null))
+                        + PERIOD + FROM_STRING_METHOD_NAME;
             case DERIVED:
             case UNION:
                 return targetDataType + PERIOD + FROM_STRING_METHOD_NAME;
@@ -1036,6 +1043,26 @@
     }
 
     /**
+     * Returns class definition for implements.
+     *
+     * @param classType class type
+     * @param name      name of class
+     * @param modifier  modifier
+     * @param implClass implements class
+     * @return class definition
+     */
+    static String getDefinitionWithImplements(String classType, String name,
+                                              String modifier, String
+                                                      implClass) {
+        String mod = EMPTY_STRING;
+        if (modifier != null) {
+            mod = modifier + SPACE;
+        }
+        return mod + classType + SPACE + name + SPACE + IMPLEMENTS + SPACE +
+                implClass + defCloseString();
+    }
+
+    /**
      * Returns string for service class.
      *
      * @param name1 name of even listener class