[ONOS-5589] empty type defect fix

Change-Id: I31b0bd078c9d5dce47da133787d9535dc0f36fed
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangDecimal64.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangDecimal64.java
index 58fd8ce..c61c69d 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangDecimal64.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangDecimal64.java
@@ -271,10 +271,8 @@
         } else {
             // Check value is in fraction-digits decimal64 value range
             if (!FractionDigits.isValueInDecimal64Range(value, getFractionDigit())) {
-                throw new DataModelException(getErrorMsg(
-                        "YANG file error : decimal64 validation failed.", "decimal64",
-                        getLineNumber(), getCharPosition(), getFileName() + "\""));
-
+                throw new DataModelException(
+                        "YANG file error : value is not in decimal64 range.");
             }
         }
     }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
index 28aceec..f8ebda1 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
@@ -25,6 +25,8 @@
 import java.util.List;
 import java.util.Map;
 
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.validateEmptyDataType;
+
 /*
  * Reference:RFC 6020.
  *  The "leaf" statement is used to define a leaf node in the schema
@@ -312,6 +314,11 @@
         return dataType;
     }
 
+    @Override
+    public boolean isEmptyDataType() {
+        return validateEmptyDataType(dataType);
+    }
+
     /**
      * Sets the data type.
      *
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java
index b7f6931..ab1b468 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java
@@ -16,13 +16,16 @@
 
 package org.onosproject.yangutils.datamodel;
 
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.datamodel.utils.Parsable;
+import org.onosproject.yangutils.datamodel.utils.YangConstructType;
+
 import java.io.Serializable;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
-import org.onosproject.yangutils.datamodel.utils.Parsable;
-import org.onosproject.yangutils.datamodel.utils.YangConstructType;
+
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.validateEmptyDataType;
 
 /*
  *  Reference:RFC 6020.
@@ -329,6 +332,11 @@
         return dataType;
     }
 
+    @Override
+    public boolean isEmptyDataType() {
+        return validateEmptyDataType(dataType);
+    }
+
     /**
      * Sets the data type.
      *
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
index 26fcbd4..bc665ff 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
@@ -690,6 +690,12 @@
         throw new DataModelException("Method is called for node other than module/sub-module.");
     }
 
+    @Override
+    public boolean isEmptyDataType() throws DataModelException {
+        throw new DataModelException("Method is called for node other than " +
+                                             "leaf/leaf-list.");
+    }
+
     /**
      * Adds child schema in child schema map, this is used to add the schema
      * to the map in case of leaf as a child.
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
index 8489d73..b138fc1 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
@@ -146,4 +146,13 @@
      * @return referred schema node
      */
     YangSchemaNode getReferredSchema();
+
+    /**
+     * Checks for the presence of empty data-type in requested schema node.
+     * Exception will be thrown if this is called for other then leaf/leaf-list
+     * node type.
+     *
+     * @return true if empty data-type is present, false otherwise
+     */
+    boolean isEmptyDataType() throws DataModelException;
 }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
index c169250..67e05b7 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
@@ -22,6 +22,7 @@
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangBase;
 import org.onosproject.yangutils.datamodel.YangCompilerAnnotation;
+import org.onosproject.yangutils.datamodel.YangDerivedInfo;
 import org.onosproject.yangutils.datamodel.YangEntityToResolveInfoImpl;
 import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.datamodel.YangIdentityRef;
@@ -59,6 +60,8 @@
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.EMPTY;
+
 /**
  * Represents utilities for data model tree.
  */
@@ -808,4 +811,35 @@
         jar.close();
         return nodes;
     }
+
+    /**
+     * Validates the requested data-type resolve type in empty or not.
+     *
+     * @param dataType the data type
+     * @return true, for empty resolved data-type; false otherwise
+     */
+    public static boolean validateEmptyDataType(YangType dataType) {
+        switch (dataType.getDataType()) {
+            case DERIVED:
+                return ((YangDerivedInfo) dataType.getDataTypeExtendedInfo())
+                        .getEffectiveBuiltInType().equals(EMPTY);
+
+            case LEAFREF:
+                YangType type = ((YangLeafRef) dataType
+                        .getDataTypeExtendedInfo())
+                        .getEffectiveDataType();
+                if (type.getDataType() == YangDataTypes.DERIVED) {
+                    return ((YangDerivedInfo) type.getDataTypeExtendedInfo())
+                            .getEffectiveBuiltInType().equals(EMPTY);
+                }
+                return ((YangLeafRef) dataType.getDataTypeExtendedInfo())
+                        .getEffectiveDataType().getDataType().equals(EMPTY);
+
+            case UNION:
+                return ((YangUnion) dataType.getDataTypeExtendedInfo())
+                        .getTypeList().contains(EMPTY);
+            default:
+                return dataType.getDataType().equals(EMPTY);
+        }
+    }
 }
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/parser/impl/listeners/Decimal64ListenerTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/parser/impl/listeners/Decimal64ListenerTest.java
index 30e61e3..9a0373e 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/parser/impl/listeners/Decimal64ListenerTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/parser/impl/listeners/Decimal64ListenerTest.java
@@ -156,7 +156,8 @@
     @Test
     public void processDecimal64ValueFailureValidation() throws IOException, ParserException, DataModelException {
         thrown.expect(DataModelException.class);
-        thrown.expectMessage("YANG file error : decimal64 validation failed.");
+        thrown.expectMessage(
+                "YANG file error : value is not in decimal64 range.");
 
         YangNode node = manager.getDataModel("src/test/resources/decimal64/Decimal64TypeValidation.yang");