ATLAS-1819: V2 API to get entity with classification returns 500

Signed-off-by: Madhan Neethiraj <madhan@apache.org>
diff --git a/0001-ATLAS-1668-updated-UI-to-exclude-terms-from-tag-UI-e.patch b/0001-ATLAS-1668-updated-UI-to-exclude-terms-from-tag-UI-e.patch
new file mode 100644
index 0000000..7fe4281
--- /dev/null
+++ b/0001-ATLAS-1668-updated-UI-to-exclude-terms-from-tag-UI-e.patch
@@ -0,0 +1,147 @@
+From 46485ba13cf8dce280389ba872d357b23ffcebd6 Mon Sep 17 00:00:00 2001
+From: kevalbhatt <kbhatt@apache.org>
+Date: Fri, 10 Mar 2017 18:14:02 +0530
+Subject: [PATCH] ATLAS-1668: updated UI to exclude terms from tag UI elements
+
+Signed-off-by: Madhan Neethiraj <madhan@apache.org>
+(cherry picked from commit e0145ffd40c08054cea7073239541879447794b4)
+---
+ .../business_catalog/AddTermToEntityLayoutView.js     |  6 +++---
+ .../js/views/business_catalog/TreeLayoutView.js       |  1 -
+ .../public/js/views/search/SearchLayoutView.js        |  8 ++++++--
+ .../public/js/views/search/SearchResultLayoutView.js  |  2 +-
+ .../public/js/views/tag/CreateTagLayoutView.js        |  6 +++++-
+ dashboardv2/public/js/views/tag/TagLayoutView.js      | 19 +++++++++----------
+ dashboardv2/public/js/views/tag/addTagModalView.js    |  3 +++
+ 7 files changed, 27 insertions(+), 18 deletions(-)
+
+diff --git a/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js b/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js
+index dd45e488..0212efe1 100644
+--- a/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js
++++ b/dashboardv2/public/js/views/business_catalog/AddTermToEntityLayoutView.js
+@@ -74,9 +74,9 @@ define(['require',
+                             }
+                             var obj = {
+                                 termName: termName,
+-                                guid: that.multiple[i].id.id,
+-                                deletedEntity: Enums.entityStateReadOnly[that.multiple[i].id.state],
+-                                entityName: that.multiple[i].model.get('name')
++                                guid: that.multiple[i].id,
++                                deletedEntity: Enums.entityStateReadOnly[that.multiple[i].model.status],
++                                entityName: Utils.getName(that.multiple[i].model)
+                             };
+                             if (obj.deletedEntity) {
+                                 Utils.notifyError({
+diff --git a/dashboardv2/public/js/views/business_catalog/TreeLayoutView.js b/dashboardv2/public/js/views/business_catalog/TreeLayoutView.js
+index 0bca0df7..998c8f42 100644
+--- a/dashboardv2/public/js/views/business_catalog/TreeLayoutView.js
++++ b/dashboardv2/public/js/views/business_catalog/TreeLayoutView.js
+@@ -377,7 +377,6 @@ define(['require',
+                         }
+                         var name = Utils.checkTagOrTerm(model.get('name'), true);
+                         if (name.name) {
+-                            // data-name="<space>'<tagName>'"  Space is required for DSL search Input 
+                             if (that.viewBased) {
+                                 parentLi = '<div class="tools"><i class="fa fa-refresh fa-spin-custom taxanomyloader"></i><i class="fa fa-ellipsis-h termPopover"></i></div><i class="fa fa-angle-right toggleArrow" data-id="expandArrow" data-href="' + hrefUrl + '"></i><a href="javascript:void(0)" data-href="' + hrefUrl + '" data-name="`' + model.get('name') + '`">' + name.name + '</a>';
+                             } else {
+diff --git a/dashboardv2/public/js/views/search/SearchLayoutView.js b/dashboardv2/public/js/views/search/SearchLayoutView.js
+index d3a90305..e68f8c06 100644
+--- a/dashboardv2/public/js/views/search/SearchLayoutView.js
++++ b/dashboardv2/public/js/views/search/SearchLayoutView.js
+@@ -172,11 +172,15 @@ define(['require',
+                     return Utils.getName(model.toJSON(), 'name').toLowerCase();
+                 }
+                 this.typeHeaders.fullCollection.sort().each(function(model) {
++                    var name = Utils.getName(model.toJSON(), 'name');
+                     if (model.get('category') == 'ENTITY') {
+-                        typeStr += '<option>' + (Utils.getName(model.toJSON(), 'name')) + '</option>';
++                        typeStr += '<option>' + (name) + '</option>';
+                     }
+                     if (model.get('category') == 'CLASSIFICATION') {
+-                        tagStr += '<option>' + (Utils.getName(model.toJSON(), 'name')) + '</option>';
++                        var checkTagOrTerm = Utils.checkTagOrTerm(name);
++                        if (checkTagOrTerm.tag) {
++                            tagStr += '<option>' + (name) + '</option>';
++                        }
+                     }
+                 });
+                 that.ui.typeLov.html(typeStr);
+diff --git a/dashboardv2/public/js/views/search/SearchResultLayoutView.js b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
+index d2a3b51d..3446a670 100644
+--- a/dashboardv2/public/js/views/search/SearchResultLayoutView.js
++++ b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
+@@ -294,7 +294,7 @@ define(['require',
+                         if (Globals.entityCreate && Globals.entityTypeConfList && Utils.getUrlState.isSearchTab()) {
+                             createEntityTag = "<p>If you do not find the entity in search result below then you can" + '<a href="javascript:void(0)" data-id="createEntity"> create new entity</a></p>';
+                         }
+-                        that.$('.searchResult').html(resultData + multiAssignDataTag + multiAssignDataTerm + createEntityTag);
++                        that.$('.searchResult').html(resultData + multiAssignDataTerm + multiAssignDataTag + createEntityTag);
+                     },
+                     silent: true,
+                     reset: true
+diff --git a/dashboardv2/public/js/views/tag/CreateTagLayoutView.js b/dashboardv2/public/js/views/tag/CreateTagLayoutView.js
+index 957a056e..34fa1147 100644
+--- a/dashboardv2/public/js/views/tag/CreateTagLayoutView.js
++++ b/dashboardv2/public/js/views/tag/CreateTagLayoutView.js
+@@ -98,7 +98,11 @@ define(['require',
+                     that = this;
+                 this.ui.parentTag.empty();
+                 this.tagCollection.fullCollection.each(function(val) {
+-                    str += '<option>' + (Utils.getName(val.toJSON())) + '</option>';
++                    var name = Utils.getName(val.toJSON()),
++                        checkTagOrTerm = Utils.checkTagOrTerm(name);
++                    if (checkTagOrTerm.tag) {
++                        str += '<option>' + (name) + '</option>';
++                    }
+                 });
+                 that.ui.parentTag.html(str);
+                 // IE9 support
+diff --git a/dashboardv2/public/js/views/tag/TagLayoutView.js b/dashboardv2/public/js/views/tag/TagLayoutView.js
+index e6b20655..5311ad1b 100644
+--- a/dashboardv2/public/js/views/tag/TagLayoutView.js
++++ b/dashboardv2/public/js/views/tag/TagLayoutView.js
+@@ -144,18 +144,17 @@ define(['require',
+                 };
+                 that.collection.fullCollection.sort().each(function(model) {
+                     var name = Utils.getName(model.toJSON(), 'name');
+-                    if (name.indexOf(".") > -1) {
+-                        return;
+-                    }
+-                    if (searchString) {
+-                        if (name.search(new RegExp(searchString, "i")) != -1) {
+-                            // data-name="<space>'<tagName>'"  Space is required for DSL search Input 
+-                            str += '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-ellipsis-h tagPopover"></i></div><a href="#!/tag/tagAttribute/' + name + '"  data-name=" `' + name + '`" >' + name + '</a></li>';
++                    var checkTagOrTerm = Utils.checkTagOrTerm(name);
++                    if (checkTagOrTerm.tag) {
++                        if (searchString) {
++                            if (name.search(new RegExp(searchString, "i")) != -1) {
++                                str += '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-ellipsis-h tagPopover"></i></div><a href="#!/tag/tagAttribute/' + name + '"  data-name="`' + name + '`" >' + name + '</a></li>';
++                            } else {
++                                return;
++                            }
+                         } else {
+-                            return;
++                            str += '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-ellipsis-h tagPopover"></i></div><a href="#!/tag/tagAttribute/' + name + '"  data-name="`' + name + '`">' + name + '</a></li>';
+                         }
+-                    } else {
+-                        str += '<li class="parent-node" data-id="tags"><div class="tools"><i class="fa fa-ellipsis-h tagPopover"></i></div><a href="#!/tag/tagAttribute/' + name + '"  data-name=" `' + name + '`">' + name + '</a></li>';
+                     }
+                 });
+                 this.ui.tagsParent.empty().html(str);
+diff --git a/dashboardv2/public/js/views/tag/addTagModalView.js b/dashboardv2/public/js/views/tag/addTagModalView.js
+index 559b2d57..cda5cf6c 100644
+--- a/dashboardv2/public/js/views/tag/addTagModalView.js
++++ b/dashboardv2/public/js/views/tag/addTagModalView.js
+@@ -193,6 +193,9 @@ define(['require',
+             var str = '<option selected="selected" disabled="disabled">-- Select a tag from the dropdown list --</option>';
+             this.collection.fullCollection.sort().each(function(obj, key) {
+                 var name = Utils.getName(obj.toJSON(), 'name');
++                if (name === "TaxonomyTerm") {
++                    return;
++                }
+                 // using obj.get('name') insted of name variable because if html is presen in name then escaped name will not found in tagList.
+                 if (_.indexOf(that.tagList, obj.get('name')) === -1) {
+                     str += '<option>' + name + '</option>';
+-- 
+2.11.0 (Apple Git-81)
+
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java
index 075b9b6..da6d636 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java
@@ -275,6 +275,11 @@
         }
 
         List<AtlasClassification> classifications = getClassifications(instanceVertex, classificationName);
+
+        if(CollectionUtils.isEmpty(classifications)) {
+            throw new AtlasBaseException(AtlasErrorCode.CLASSIFICATION_NOT_FOUND, classificationName);
+        }
+
         return classifications.get(0);
     }
 
@@ -550,4 +555,4 @@
     private Object getVertexAttribute(AtlasVertex vertex, AtlasAttribute attribute) throws AtlasBaseException {
         return vertex != null && attribute != null ? mapVertexToAttribute(vertex, attribute, null) : null;
     }
-}
\ No newline at end of file
+}