This is an automated email from the ASF dual-hosted git repository. pinal pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push: new f2293acf0 ATLAS-4610: ATLAS-4655: Classification/ Term: Add parent name for classification & name f2293acf0 is described below commit f2293acf0d1ea720de17c345b518d64f324ba1f6 Author: Prasad Pawar <prasad.pa...@freestoneinfotech.com> AuthorDate: Thu Oct 20 14:29:39 2022 +0530 ATLAS-4610: ATLAS-4655: Classification/ Term: Add parent name for classification & name Signed-off-by: Pinal Shah <pinal.s...@freestoneinfotech.com> --- dashboardv2/public/css/scss/common.scss | 29 +++++++++++++++++ .../detail_page/DetailPageLayoutView_tmpl.html | 4 +-- dashboardv2/public/js/utils/CommonViewFunction.js | 17 +++++++--- .../js/views/detail_page/DetailPageLayoutView.js | 37 +++++++++++++++------- .../js/views/glossary/GlossaryDetailLayoutView.js | 19 ++++++++--- .../glossary/TermRelationAttributeLayoutView.js | 7 ++-- .../public/js/views/schema/SchemaLayoutView.js | 4 +-- .../js/views/search/SearchResultLayoutView.js | 6 ++-- dashboardv2/public/js/views/tag/TagLayoutView.js | 4 +-- dashboardv3/public/css/scss/common.scss | 29 +++++++++++++++++ dashboardv3/public/js/router/Router.js | 4 +-- .../detail_page/DetailPageLayoutView_tmpl.html | 4 +-- dashboardv3/public/js/utils/CommonViewFunction.js | 15 ++++++--- .../js/views/detail_page/DetailPageLayoutView.js | 36 +++++++++++++++------ .../js/views/glossary/GlossaryDetailLayoutView.js | 19 ++++++++--- .../glossary/TermRelationAttributeLayoutView.js | 7 ++-- .../public/js/views/schema/SchemaLayoutView.js | 4 +-- .../js/views/search/SearchResultLayoutView.js | 6 ++-- .../search/tree/ClassificationTreeLayoutView.js | 2 +- .../glossary/relations/AtlasRelatedTermHeader.java | 5 +++ .../relations/AtlasTermAssignmentHeader.java | 9 ++++-- .../atlas/model/instance/AtlasRelatedObjectId.java | 9 ++++++ .../org/apache/atlas/glossary/GlossaryService.java | 15 ++++++++- .../store/graph/v2/EntityGraphRetriever.java | 23 ++++++++++++++ 24 files changed, 248 insertions(+), 66 deletions(-) diff --git a/dashboardv2/public/css/scss/common.scss b/dashboardv2/public/css/scss/common.scss index 60b272214..73f67c75c 100644 --- a/dashboardv2/public/css/scss/common.scss +++ b/dashboardv2/public/css/scss/common.scss @@ -81,6 +81,27 @@ } .detail-page { + + .entityDetail { + + .tagBox, + .termBox, + .propagatedTagBox { + span { + >span { + @include ellipsis(); + float: left; + max-width: 200px; + } + } + + i { + float: right; + line-height: 21px; + } + } + } + .details-backbutton { display: table-cell !important; } @@ -350,4 +371,12 @@ pre { overflow-wrap: break-word; cursor: default !important; background-color: transparent !important; +} + +.tagBox { + z-index: 2; +} + +.termBox { + z-index: 1; } \ No newline at end of file diff --git a/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html b/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html index ee4b9431f..9e8cf4721 100644 --- a/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html +++ b/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html @@ -25,7 +25,7 @@ </h1> {{#if entityUpdate}} <!-- <div data-id="editButtonContainer" class="pull-right"></div> --> {{/if}} - <div class="form-group col-md-12"> + <div class="form-group tagBox col-md-12"> <span class="control-label-sm-pr pull-left">Classifications:</span> <div class="pull-left" data-id="tagList"> <button class="btn btn-action btn-sm" title="Add Classification" data-id="addTag"> @@ -41,7 +41,7 @@ </button> </div> </div> - <div class="form-group col-md-12" style="display: none;" data-id="propagatedTagDiv"> + <div class="form-group propagatedTagBox col-md-12" style="display: none;" data-id="propagatedTagDiv"> <span class="control-label-sm-pr pull-left">Propagated Classifications:</span> <div class="pull-left" data-id="propagatedTagList"> </div> diff --git a/dashboardv2/public/js/utils/CommonViewFunction.js b/dashboardv2/public/js/utils/CommonViewFunction.js index f93b1788a..b1c15507f 100644 --- a/dashboardv2/public/js/utils/CommonViewFunction.js +++ b/dashboardv2/public/js/utils/CommonViewFunction.js @@ -347,7 +347,7 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum }); return table && table.length > 0 ? table : '<tr class="empty"><td colspan="22"><span>No Record found!</span></td></tr>'; } - CommonViewFunction.tagForTable = function(obj) { + CommonViewFunction.tagForTable = function(obj, classificationDefCollection) { var traits = obj.classifications, tagHtml = "", addTag = "", @@ -365,7 +365,13 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum } else { className += " propagte-classification"; } - var tagString = '<a class="' + className + '" data-id="tagClick"><span title="' + tag.typeName + '">' + tag.typeName + '</span>' + deleteIcon + '</a>'; + var tagObj = classificationDefCollection.fullCollection.find({ "name": tag.typeName }), + tagParents = tagObj ? tagObj.get('superTypes') : null, + parentName = tag.typeName; + if (tagParents && tagParents.length) { + parentName += (tagParents.length > 1) ? ("@(" + tagParents.join() + ")") : ("@" + tagParents.join()); + } + var tagString = '<a class="' + className + '" data-id="tagClick"><span title="' + parentName + '">' + parentName + '</span>' + deleteIcon + '</a>'; if (count >= 1) { popTag += tagString; } else { @@ -395,10 +401,11 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum entityName = Utils.getName(obj); if (terms) { terms.map(function(term) { - var displayText = _.escape(term.displayText); - var className = "btn btn-action btn-sm btn-blue btn-icon", + var displayText = _.escape(term.displayText), + gloassaryName = _.escape(term.qualifiedName) || displayText, + className = "btn btn-action btn-sm btn-blue btn-icon", deleteIcon = '<i class="fa fa-times" data-id="delete" data-assetname="' + entityName + '" data-name="' + displayText + '" data-type="term" data-guid="' + obj.guid + '" data-termGuid="' + term.termGuid + '" ></i>', - termString = '<a class="' + className + '" data-id="termClick"><span title="' + displayText + '">' + displayText + '</span>' + deleteIcon + '</a>'; + termString = '<a class="' + className + '" data-id="termClick"><span title="' + gloassaryName + '">' + gloassaryName + '</span>' + deleteIcon + '</a>'; if (count >= 1) { popTerm += termString; } else { diff --git a/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js b/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js index 73293507c..33addf5ec 100644 --- a/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js +++ b/dashboardv2/public/js/views/detail_page/DetailPageLayoutView.js @@ -68,7 +68,9 @@ define(['require', termList: '[data-id="termList"]', propagatedTagList: '[data-id="propagatedTagList"]', tablist: '[data-id="tab-list"] li', - entityIcon: '[data-id="entityIcon"]' + entityIcon: '[data-id="entityIcon"]', + tagParent: '[data-id="tagParent"]', + termGlossary: '[data-id="termGlossary"]' }, templateHelpers: function() { return { @@ -80,9 +82,9 @@ define(['require', events: function() { var events = {}; events["click " + this.ui.tagClick] = function(e) { - if (e.target.nodeName.toLocaleLowerCase() != "i") { + if ((e.target.nodeName.toLocaleLowerCase() != "i") && (!$(e.target).hasClass("parent-list-btn")) && (!$(e.target).hasClass("fa"))) { Utils.setUrl({ - url: '#!/tag/tagAttribute/' + e.currentTarget.textContent, + url: '#!/tag/tagAttribute/' + e.target.textContent.split('@')[0], mergeBrowserUrl: false, trigger: true }); @@ -97,11 +99,13 @@ define(['require', }); }; events["click " + this.ui.termClick] = function(e) { - if (e.target.nodeName.toLocaleLowerCase() != "i") { + if ((e.target.nodeName.toLocaleLowerCase() != "i") && (!$(e.target).hasClass("parent-list-btn")) && (!$(e.target).hasClass("fa"))) { + var guid = $(e.currentTarget).find('.fa-close').data('guid'), + gType = "term"; Utils.setUrl({ - url: '#!/glossary/' + $(e.currentTarget).find('i').data('guid'), + url: '#!/glossary/' + guid, mergeBrowserUrl: false, - urlParams: { gType: "term", viewType: "term", fromView: "entity" }, + urlParams: { gType: gType, viewType: "term", fromView: "entity" }, trigger: true }); } @@ -121,7 +125,6 @@ define(['require', }); }; - return events; }, /** @@ -465,7 +468,7 @@ define(['require', }, onClickTagCross: function(e) { var that = this, - tagName = $(e.currentTarget).parent().text(), + tagName = $(e.currentTarget).parent().text().split('@')[0], entityGuid = $(e.currentTarget).data("entityguid"); CommonViewFunction.deleteTag(_.extend({}, { guid: that.id, @@ -510,10 +513,12 @@ define(['require', tagData = "", propagatedTagListData = ""; _.each(tagObject.self, function(val) { - tagData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="tagClick"><span>' + val.typeName + '</span><i class="fa fa-close" data-id="deleteTag" data-type="tag" title="Remove Classification"></i></span>'; + var parentName = that.getTagParentList(val.typeName); + tagData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="tagClick"><span title="' + parentName + '">' + _.escape(parentName) + '</span><i class="fa fa-close" data-id="deleteTag" data-type="tag" title="Remove Classification"></i></span>'; }); _.each(tagObject.propagatedMap, function(val, key) { - propagatedTagListData += '<span class="btn btn-action btn-sm btn-icon btn-blue"><span data-id="tagClick">' + val.typeName + '</span>' + (val.count > 1 ? '<span class="active" data-id="pTagCountClick">(' + val.count + ')</span>' : "") + '</span>'; + var parentName = that.getTagParentList(val.typeName); + propagatedTagListData += '<span class="btn btn-action btn-sm btn-icon btn-blue"><span data-id="tagClick" title="' + parentName + '">' + parentName + '</span>' + (val.count > 1 ? '<span class="active" data-id="pTagCountClick">(' + val.count + ')</span>' : "") + '</span>'; }); propagatedTagListData !== "" ? this.ui.propagatedTagDiv.show() : this.ui.propagatedTagDiv.hide(); this.ui.tagList.find("span.btn").remove(); @@ -525,11 +530,21 @@ define(['require', var that = this, termData = ""; _.each(data, function(val) { - termData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="termClick"><span>' + _.escape(val.displayText) + '</span><i class="' + (val.relationshipStatus == "ACTIVE" ? 'fa fa-close' : "") + '" data-id="deleteTerm" data-guid="' + val.guid + '" data-type="term" title="Remove Term"></i></span>'; + var glossaryName = val.qualifiedName ? val.qualifiedName : val.displayText; + termData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="termClick" title= "' + glossaryName + '"><span>' + _.escape(glossaryName) + '</span><i class="' + (val.relationshipStatus == "ACTIVE" ? 'fa fa-close' : "") + '" data-id="deleteTerm" data-guid="' + val.guid + '" data-type="term" title="Remove Term"></i></span>'; }); this.ui.termList.find("span.btn").remove(); this.ui.termList.prepend(termData); }, + getTagParentList: function(name) { + var tagObj = this.classificationDefCollection.fullCollection.find({ "name": name }), + tagParents = tagObj ? tagObj.get('superTypes') : null, + parentName = name; + if (tagParents && tagParents.length) { + parentName += (tagParents.length > 1) ? ("@(" + tagParents.join() + ")") : ("@" + tagParents.join()); + } + return parentName; + }, hideLoader: function() { Utils.hideTitleLoader(this.$('.page-title .fontLoader'), this.$('.entityDetail')); }, diff --git a/dashboardv2/public/js/views/glossary/GlossaryDetailLayoutView.js b/dashboardv2/public/js/views/glossary/GlossaryDetailLayoutView.js index 02606067b..93b073da9 100644 --- a/dashboardv2/public/js/views/glossary/GlossaryDetailLayoutView.js +++ b/dashboardv2/public/js/views/glossary/GlossaryDetailLayoutView.js @@ -114,7 +114,7 @@ define(['require', this.onClickTagCross(e); } else { Utils.setUrl({ - url: '#!/tag/tagAttribute/' + e.currentTarget.textContent, + url: '#!/tag/tagAttribute/' + e.currentTarget.textContent.split('@')[0], mergeBrowserUrl: false, trigger: true }); @@ -345,9 +345,11 @@ define(['require', }, generateTag: function(tagObject) { var that = this, - tagData = ""; + tagData = "", + propagatedTagListData = ""; _.each(tagObject, function(val) { - tagData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="tagClickTerm"><span>' + val.typeName + '</span><i class="fa fa-close" data-id="removeTagTerm" data-type="tag" title="Remove Classification"></i></span>'; + var parentName = that.getTagParentList(val.typeName); + tagData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="tagClickTerm"><span title="' + parentName + '">' + _.escape(parentName) + '</span><i class="fa fa-close" data-id="removeTagTerm" data-type="tag" title="Remove Classification"></i></span>'; }); this.ui.tagList.find("span.btn").remove(); this.ui.tagList.prepend(tagData); @@ -361,6 +363,15 @@ define(['require', }); return terms; }, + getTagParentList: function(name) { + var tagObj = this.classificationDefCollection.fullCollection.find({ "name": name }), + tagParents = tagObj ? tagObj.get('superTypes') : null, + parentName = name; + if (tagParents && tagParents.length) { + parentName += (tagParents.length > 1) ? ("@(" + tagParents.join() + ")") : ("@" + tagParents.join()); + } + return parentName; + }, onClickAddTermBtn: function(e) { var that = this, glossary = this.glossaryCollection; @@ -439,7 +450,7 @@ define(['require', }, onClickTagCross: function(e) { var that = this, - tagName = $(e.currentTarget).text(), + tagName = $(e.currentTarget).text().split('@')[0], termName = this.data.name; CommonViewFunction.deleteTag(_.extend({}, { msg: "<div class='ellipsis-with-margin'>Remove: " + "<b>" + _.escape(tagName) + "</b> assignment from <b>" + _.escape(termName) + "?</b></div>", diff --git a/dashboardv2/public/js/views/glossary/TermRelationAttributeLayoutView.js b/dashboardv2/public/js/views/glossary/TermRelationAttributeLayoutView.js index ded1ab943..aeafcf121 100644 --- a/dashboardv2/public/js/views/glossary/TermRelationAttributeLayoutView.js +++ b/dashboardv2/public/js/views/glossary/TermRelationAttributeLayoutView.js @@ -62,7 +62,7 @@ define(['require', this.modal = new Modal({ "title": ((this.editMode ? "Edit attributes" : "Attributes") + " of " + this.selectedTermAttribute), "content": this, - "okText": (this.editMode ? "Update" : "ok"), + "okText": (this.editMode ? "Update" : "Close"), "allowCancel": (this.editMode ? true : false), "okCloses": true, "width": "80%", @@ -197,6 +197,7 @@ define(['require', notifyObj = { modal: true, text: "Are you sure you want to remove term association", + okText:"Remove", ok: function(argument) { var model = new that.glossaryCollection.model(), selectedGuid = $(e.currentTarget).data('termguid'), @@ -230,8 +231,8 @@ define(['require', relationTypeTable: true, getTerms: function(key) { var terms = _.map(that.data[key], function(obj) { - var name = _.escape(obj.displayText); - return '<span data-guid="' + obj.termGuid + '" class="btn btn-action btn-sm btn-icon btn-blue" data-id="termClick"><span>' + name + '</span><i class="fa fa-close" data-id="deleteAttribute" data-attributename="' + key + '" data-termguid="' + obj.termGuid + '" data-type="term" title="Remove Term"></i></span>'; + var name = _.escape(obj.qualifiedName) || _.escape(obj.displayText); + return '<span data-guid="' + obj.termGuid + '" class="btn btn-action btn-sm btn-icon btn-blue" data-id="termClick"><span title="' + name + '">' + name + '</span><i class="fa fa-close" data-id="deleteAttribute" data-attributename="' + key + '" data-termguid="' + obj.termGuid + '" data-type="term" title="Remove Term"></i></span>'; }).join(""), attributeButtons = ""; if (terms.length) { diff --git a/dashboardv2/public/js/views/schema/SchemaLayoutView.js b/dashboardv2/public/js/views/schema/SchemaLayoutView.js index efc8e9356..b8357aef1 100644 --- a/dashboardv2/public/js/views/schema/SchemaLayoutView.js +++ b/dashboardv2/public/js/views/schema/SchemaLayoutView.js @@ -234,9 +234,9 @@ define(['require', fromRaw: function(rawValue, model) { var obj = model.toJSON(); if (obj.status && Enums.entityStateReadOnly[obj.status]) { - return '<div class="readOnly">' + CommonViewFunction.tagForTable(obj); + '</div>'; + return '<div class="readOnly">' + CommonViewFunction.tagForTable(obj, that.classificationDefCollection); + '</div>'; } else { - return CommonViewFunction.tagForTable(obj); + return CommonViewFunction.tagForTable(obj, that.classificationDefCollection); } } }) diff --git a/dashboardv2/public/js/views/search/SearchResultLayoutView.js b/dashboardv2/public/js/views/search/SearchResultLayoutView.js index 66466e21d..fd30281f9 100644 --- a/dashboardv2/public/js/views/search/SearchResultLayoutView.js +++ b/dashboardv2/public/js/views/search/SearchResultLayoutView.js @@ -91,7 +91,7 @@ define(['require', this.onClickTagCross(e); } else { this.triggerUrl({ - url: '#!/tag/tagAttribute/' + scope.text(), + url: '#!/tag/tagAttribute/' + scope.text().split('@')[0], urlParams: null, mergeBrowserUrl: false, trigger: true, @@ -1029,9 +1029,9 @@ define(['require', return } if (obj.status && Enums.entityStateReadOnly[obj.status]) { - return '<div class="readOnly">' + CommonViewFunction.tagForTable(obj); + '</div>'; + return '<div class="readOnly">' + CommonViewFunction.tagForTable(obj, that.classificationDefCollection); + '</div>'; } else { - return CommonViewFunction.tagForTable(obj); + return CommonViewFunction.tagForTable(obj, that.classificationDefCollection); } } diff --git a/dashboardv2/public/js/views/tag/TagLayoutView.js b/dashboardv2/public/js/views/tag/TagLayoutView.js index 7de7aea14..e78f45aeb 100644 --- a/dashboardv2/public/js/views/tag/TagLayoutView.js +++ b/dashboardv2/public/js/views/tag/TagLayoutView.js @@ -403,7 +403,7 @@ define(['require', }).open(); modal.$el.find('button.ok').attr("disabled", "true"); view.ui.tagName.on('keyup input', function(e) { - $(view.ui.description).trumbowyg('html', $(this).val().replace(/\s+/g, ' ')); + $(view.ui.description).trumbowyg('html', _.escape($(this).val()).replace(/\s+/g, ' ')); }); view.ui.description.on('input keydown', function(e) { $(this).val($(this).val().replace(/\s+/g, ' ')); @@ -651,7 +651,7 @@ define(['require', }, cust_error: function() {}, complete: function() { - if(that.collection.fullCollection.length === 0){ + if (that.collection.fullCollection.length === 0) { that.setUrl('#!/tag', true); } that.notificationModal.hideButtonLoader(); diff --git a/dashboardv3/public/css/scss/common.scss b/dashboardv3/public/css/scss/common.scss index c0f65fdab..93f5ddbdd 100644 --- a/dashboardv3/public/css/scss/common.scss +++ b/dashboardv3/public/css/scss/common.scss @@ -81,6 +81,27 @@ } .detail-page { + + .entityDetail { + + .tagBox, + .termBox, + .propagatedTagBox { + span { + >span { + @include ellipsis(); + float: left; + max-width: 200px; + } + } + + i { + float: right; + line-height: 21px; + } + } + } + .details-backbutton { display: table-cell !important; } @@ -349,4 +370,12 @@ pre { overflow-wrap: break-word; cursor: default !important; background-color: transparent !important; +} + +.tagBox { + z-index: 2; +} + +.termBox { + z-index: 1; } \ No newline at end of file diff --git a/dashboardv3/public/js/router/Router.js b/dashboardv3/public/js/router/Router.js index a48b4cc78..72736898c 100644 --- a/dashboardv3/public/js/router/Router.js +++ b/dashboardv3/public/js/router/Router.js @@ -252,7 +252,7 @@ define([ require(["views/site/Header", "views/tag/TagContainerLayoutView", "views/site/SideNavLayoutView"], function(Header, TagContainerLayoutView, SideNavLayoutView) { var paramObj = Utils.getUrlState.getQueryParams(); //Below if condition is added to handle "when Classification tab does not have any classification and selected in Old UI and switched to New UI is show continous loading - if (paramObj === undefined || tagName === "viewType=tree" || tagName === "viewType=flat") { + if ((paramObj === undefined && !tagName) || tagName === "viewType=tree" || tagName === "viewType=flat") { that.defaultAction(); return; } @@ -282,7 +282,7 @@ define([ require(["views/site/Header", "views/glossary/GlossaryContainerLayoutView", "views/search/SearchDefaultLayoutView", "views/site/SideNavLayoutView"], function(Header, GlossaryContainerLayoutView, SearchDefaultLayoutView, SideNavLayoutView) { var paramObj = Utils.getUrlState.getQueryParams(); //Below if condition is added to handle "when Glossary tab does not have any glossary and selected in Old UI and switched to New UI is show continous loading - if (paramObj === undefined || id === "viewType=category" || id === "viewType=term") { + if ((paramObj === undefined && !id) || id === "viewType=category" || id === "viewType=term") { that.defaultAction(); return; } diff --git a/dashboardv3/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html b/dashboardv3/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html index b209a49e4..53347ddf4 100644 --- a/dashboardv3/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html +++ b/dashboardv3/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html @@ -28,7 +28,7 @@ </h1> {{#if entityUpdate}} <!-- <div data-id="editButtonContainer" class="pull-right"></div> --> {{/if}} - <div class="form-group col-md-12"> + <div class="form-group tagBox col-md-12"> <span class="control-label-sm-pr pull-left">Classifications:</span> <div class="pull-left" data-id="tagList"> <button class="btn btn-action btn-sm" title="Add Classification" data-id="addTag"> @@ -44,7 +44,7 @@ </button> </div> </div> - <div class="form-group col-md-12" style="display: none;" data-id="propagatedTagDiv"> + <div class="form-group propagatedTagBox col-md-12" style="display: none;" data-id="propagatedTagDiv"> <span class="control-label-sm-pr pull-left">Propagated Classifications:</span> <div class="pull-left" data-id="propagatedTagList"> </div> diff --git a/dashboardv3/public/js/utils/CommonViewFunction.js b/dashboardv3/public/js/utils/CommonViewFunction.js index 5b2b0c2dc..636bdae28 100644 --- a/dashboardv3/public/js/utils/CommonViewFunction.js +++ b/dashboardv3/public/js/utils/CommonViewFunction.js @@ -364,7 +364,13 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum } else { className += " propagte-classification"; } - var tagString = '<a class="' + className + '" data-id="tagClick"><span title="' + tag.typeName + '">' + tag.typeName + '</span>' + deleteIcon + '</a>'; + var tagObj = classificationDefCollection.fullCollection.find({ "name": tag.typeName }), + tagParents = tagObj ? tagObj.get('superTypes') : null, + parentName = tag.typeName; + if (tagParents && tagParents.length) { + parentName += (tagParents.length > 1) ? ("@(" + tagParents.join() + ")") : ("@" + tagParents.join()); + } + var tagString = '<a class="' + className + '" data-id="tagClick"><span title="' + parentName + '">' + parentName + '</span>' + deleteIcon + '</a>'; if (count >= 1) { popTag += tagString; } else { @@ -394,10 +400,11 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum entityName = Utils.getName(obj); if (terms) { terms.map(function(term) { - var displayText = _.escape(term.displayText); - var className = "btn btn-action btn-sm btn-blue btn-icon", + var displayText = _.escape(term.displayText), + gloassaryName = _.escape(term.qualifiedName) || displayText, + className = "btn btn-action btn-sm btn-blue btn-icon", deleteIcon = '<i class="fa fa-times" data-id="delete" data-assetname="' + entityName + '" data-name="' + displayText + '" data-type="term" data-guid="' + obj.guid + '" data-termGuid="' + term.termGuid + '" ></i>', - termString = '<a class="' + className + '" data-id="termClick"><span title="' + displayText + '">' + displayText + '</span>' + deleteIcon + '</a>'; + termString = '<a class="' + className + '" data-id="termClick"><span title="' + gloassaryName + '">' + gloassaryName + '</span>' + deleteIcon + '</a>'; if (count >= 1) { popTerm += termString; } else { diff --git a/dashboardv3/public/js/views/detail_page/DetailPageLayoutView.js b/dashboardv3/public/js/views/detail_page/DetailPageLayoutView.js index a64032278..6b04b1bae 100644 --- a/dashboardv3/public/js/views/detail_page/DetailPageLayoutView.js +++ b/dashboardv3/public/js/views/detail_page/DetailPageLayoutView.js @@ -69,7 +69,9 @@ define(['require', propagatedTagList: '[data-id="propagatedTagList"]', tablist: '[data-id="tab-list"] li', entityIcon: '[data-id="entityIcon"]', - backButton: '[data-id="backButton"]' + backButton: '[data-id="backButton"]', + tagParent: '[data-id="tagParent"]', + termGlossary: '[data-id="termGlossary"]' }, templateHelpers: function() { return { @@ -81,9 +83,9 @@ define(['require', events: function() { var events = {}; events["click " + this.ui.tagClick] = function(e) { - if (e.target.nodeName.toLocaleLowerCase() != "i") { + if ((e.target.nodeName.toLocaleLowerCase() != "i") && (!$(e.target).hasClass("parent-list-btn")) && (!$(e.target).hasClass("fa"))) { Utils.setUrl({ - url: '#!/tag/tagAttribute/' + e.currentTarget.textContent, + url: '#!/tag/tagAttribute/' + e.target.textContent.split('@')[0], mergeBrowserUrl: false, trigger: true }); @@ -98,11 +100,13 @@ define(['require', }); }; events["click " + this.ui.termClick] = function(e) { - if (e.target.nodeName.toLocaleLowerCase() != "i") { + if ((e.target.nodeName.toLocaleLowerCase() != "i") && (!$(e.target).hasClass("parent-list-btn")) && (!$(e.target).hasClass("fa"))) { + var guid = $(e.currentTarget).find('.fa-close').data('guid'), + gType = "term"; Utils.setUrl({ - url: '#!/glossary/' + $(e.currentTarget).find('i').data('guid'), + url: '#!/glossary/' + guid, mergeBrowserUrl: false, - urlParams: { gType: "term", viewType: "term", fromView: "entity" }, + urlParams: { gType: gType, viewType: "term", fromView: "entity" }, trigger: true }); } @@ -466,7 +470,7 @@ define(['require', }, onClickTagCross: function(e) { var that = this, - tagName = $(e.currentTarget).parent().text(), + tagName = $(e.currentTarget).parent().text().split('@')[0], entityGuid = $(e.currentTarget).data("entityguid"); CommonViewFunction.deleteTag(_.extend({}, { guid: that.id, @@ -514,10 +518,12 @@ define(['require', tagData = "", propagatedTagListData = ""; _.each(tagObject.self, function(val) { - tagData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="tagClick"><span>' + val.typeName + '</span><i class="fa fa-close" data-id="deleteTag" data-type="tag" title="Remove Classification"></i></span>'; + var parentName = that.getTagParentList(val.typeName); + tagData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="tagClick"><span title="' + parentName + '">' + _.escape(parentName) + '</span><i class="fa fa-close" data-id="deleteTag" data-type="tag" title="Remove Classification"></i></span>'; }); _.each(tagObject.propagatedMap, function(val, key) { - propagatedTagListData += '<span class="btn btn-action btn-sm btn-icon btn-blue"><span data-id="tagClick">' + val.typeName + '</span>' + (val.count > 1 ? '<span class="active" data-id="pTagCountClick">(' + val.count + ')</span>' : "") + '</span>'; + var parentName = that.getTagParentList(val.typeName); + propagatedTagListData += '<span class="btn btn-action btn-sm btn-icon btn-blue"><span data-id="tagClick" title="' + parentName + '">' + parentName + '</span>' + (val.count > 1 ? '<span class="active" data-id="pTagCountClick">(' + val.count + ')</span>' : "") + '</span>'; }); propagatedTagListData !== "" ? this.ui.propagatedTagDiv.show() : this.ui.propagatedTagDiv.hide(); this.ui.tagList.find("span.btn").remove(); @@ -529,11 +535,21 @@ define(['require', var that = this, termData = ""; _.each(data, function(val) { - termData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="termClick"><span>' + _.escape(val.displayText) + '</span><i class="' + (val.relationshipStatus == "ACTIVE" ? 'fa fa-close' : "") + '" data-id="deleteTerm" data-guid="' + val.guid + '" data-type="term" title="Remove Term"></i></span>'; + var glossaryName = val.qualifiedName ? val.qualifiedName : val.displayText; + termData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="termClick" title= "' + glossaryName + '"><span>' + _.escape(glossaryName) + '</span><i class="' + (val.relationshipStatus == "ACTIVE" ? 'fa fa-close' : "") + '" data-id="deleteTerm" data-guid="' + val.guid + '" data-type="term" title="Remove Term"></i></span>'; }); this.ui.termList.find("span.btn").remove(); this.ui.termList.prepend(termData); }, + getTagParentList: function(name) { + var tagObj = this.classificationDefCollection.fullCollection.find({ "name": name }), + tagParents = tagObj ? tagObj.get('superTypes') : null, + parentName = name; + if (tagParents && tagParents.length) { + parentName += (tagParents.length > 1) ? ("@(" + tagParents.join() + ")") : ("@" + tagParents.join()); + } + return parentName; + }, hideLoader: function() { Utils.hideTitleLoader(this.$('.page-title .fontLoader'), this.$('.entityDetail')); }, diff --git a/dashboardv3/public/js/views/glossary/GlossaryDetailLayoutView.js b/dashboardv3/public/js/views/glossary/GlossaryDetailLayoutView.js index 019cd9d3f..11eb6ca2a 100644 --- a/dashboardv3/public/js/views/glossary/GlossaryDetailLayoutView.js +++ b/dashboardv3/public/js/views/glossary/GlossaryDetailLayoutView.js @@ -115,7 +115,7 @@ define(['require', this.onClickTagCross(e); } else { Utils.setUrl({ - url: '#!/tag/tagAttribute/' + e.currentTarget.textContent, + url: '#!/tag/tagAttribute/' + e.currentTarget.textContent.split('@')[0], mergeBrowserUrl: false, trigger: true }); @@ -359,9 +359,11 @@ define(['require', }, generateTag: function(tagObject) { var that = this, - tagData = ""; + tagData = "", + propagatedTagListData = ""; _.each(tagObject, function(val) { - tagData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="tagClickTerm"><span>' + val.typeName + '</span><i class="fa fa-close" data-id="removeTagTerm" data-type="tag" title="Remove Classification"></i></span>'; + var parentName = that.getTagParentList(val.typeName); + tagData += '<span class="btn btn-action btn-sm btn-icon btn-blue" data-id="tagClickTerm"><span title="' + parentName + '">' + _.escape(parentName) + '</span><i class="fa fa-close" data-id="removeTagTerm" data-type="tag" title="Remove Classification"></i></span>'; }); this.ui.tagList.find("span.btn").remove(); this.ui.tagList.prepend(tagData); @@ -375,6 +377,15 @@ define(['require', }); return terms; }, + getTagParentList: function(name) { + var tagObj = this.classificationDefCollection.fullCollection.find({ "name": name }), + tagParents = tagObj ? tagObj.get('superTypes') : null, + parentName = name; + if (tagParents && tagParents.length) { + parentName += (tagParents.length > 1) ? ("@(" + tagParents.join() + ")") : ("@" + tagParents.join()); + } + return parentName; + }, onClickAddTermBtn: function(e) { var that = this, glossary = this.glossaryCollection; @@ -453,7 +464,7 @@ define(['require', }, onClickTagCross: function(e) { var that = this, - tagName = $(e.currentTarget).text(), + tagName = $(e.currentTarget).text().split('@')[0], termName = this.data.name; CommonViewFunction.deleteTag(_.extend({}, { msg: "<div class='ellipsis-with-margin'>Remove: " + "<b>" + _.escape(tagName) + "</b> assignment from <b>" + _.escape(termName) + "?</b></div>", diff --git a/dashboardv3/public/js/views/glossary/TermRelationAttributeLayoutView.js b/dashboardv3/public/js/views/glossary/TermRelationAttributeLayoutView.js index ded1ab943..aeafcf121 100644 --- a/dashboardv3/public/js/views/glossary/TermRelationAttributeLayoutView.js +++ b/dashboardv3/public/js/views/glossary/TermRelationAttributeLayoutView.js @@ -62,7 +62,7 @@ define(['require', this.modal = new Modal({ "title": ((this.editMode ? "Edit attributes" : "Attributes") + " of " + this.selectedTermAttribute), "content": this, - "okText": (this.editMode ? "Update" : "ok"), + "okText": (this.editMode ? "Update" : "Close"), "allowCancel": (this.editMode ? true : false), "okCloses": true, "width": "80%", @@ -197,6 +197,7 @@ define(['require', notifyObj = { modal: true, text: "Are you sure you want to remove term association", + okText:"Remove", ok: function(argument) { var model = new that.glossaryCollection.model(), selectedGuid = $(e.currentTarget).data('termguid'), @@ -230,8 +231,8 @@ define(['require', relationTypeTable: true, getTerms: function(key) { var terms = _.map(that.data[key], function(obj) { - var name = _.escape(obj.displayText); - return '<span data-guid="' + obj.termGuid + '" class="btn btn-action btn-sm btn-icon btn-blue" data-id="termClick"><span>' + name + '</span><i class="fa fa-close" data-id="deleteAttribute" data-attributename="' + key + '" data-termguid="' + obj.termGuid + '" data-type="term" title="Remove Term"></i></span>'; + var name = _.escape(obj.qualifiedName) || _.escape(obj.displayText); + return '<span data-guid="' + obj.termGuid + '" class="btn btn-action btn-sm btn-icon btn-blue" data-id="termClick"><span title="' + name + '">' + name + '</span><i class="fa fa-close" data-id="deleteAttribute" data-attributename="' + key + '" data-termguid="' + obj.termGuid + '" data-type="term" title="Remove Term"></i></span>'; }).join(""), attributeButtons = ""; if (terms.length) { diff --git a/dashboardv3/public/js/views/schema/SchemaLayoutView.js b/dashboardv3/public/js/views/schema/SchemaLayoutView.js index 1ae75d922..81b7e442c 100644 --- a/dashboardv3/public/js/views/schema/SchemaLayoutView.js +++ b/dashboardv3/public/js/views/schema/SchemaLayoutView.js @@ -234,9 +234,9 @@ define(['require', fromRaw: function(rawValue, model) { var obj = model.toJSON(); if (obj.status && Enums.entityStateReadOnly[obj.status]) { - return '<div class="readOnly">' + CommonViewFunction.tagForTable(obj); + '</div>'; + return '<div class="readOnly">' + CommonViewFunction.tagForTable(objthat.classificationDefCollection); + '</div>'; } else { - return CommonViewFunction.tagForTable(obj); + return CommonViewFunction.tagForTable(objthat.classificationDefCollection); } } }) diff --git a/dashboardv3/public/js/views/search/SearchResultLayoutView.js b/dashboardv3/public/js/views/search/SearchResultLayoutView.js index d9d238353..e4857249f 100644 --- a/dashboardv3/public/js/views/search/SearchResultLayoutView.js +++ b/dashboardv3/public/js/views/search/SearchResultLayoutView.js @@ -92,7 +92,7 @@ define(['require', this.onClickTagCross(e); } else { this.triggerUrl({ - url: '#!/tag/tagAttribute/' + scope.text(), + url: '#!/tag/tagAttribute/' + scope.text().split('@')[0], urlParams: null, mergeBrowserUrl: false, trigger: true, @@ -1043,9 +1043,9 @@ define(['require', return } if (obj.status && Enums.entityStateReadOnly[obj.status]) { - return '<div class="readOnly">' + CommonViewFunction.tagForTable(obj); + '</div>'; + return '<div class="readOnly">' + CommonViewFunction.tagForTable(obj, that.classificationDefCollection); + '</div>'; } else { - return CommonViewFunction.tagForTable(obj); + return CommonViewFunction.tagForTable(obj, that.classificationDefCollection); } } diff --git a/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js b/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js index 13a5a899d..fb9336613 100644 --- a/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js +++ b/dashboardv3/public/js/views/search/tree/ClassificationTreeLayoutView.js @@ -688,7 +688,7 @@ define([ }).open(); modal.$el.find("button.ok").attr("disabled", "true"); view.ui.tagName.on('keyup input', function(e) { - $(view.ui.description).trumbowyg('html', $(this).val().replace(/\s+/g, ' ')); + $(view.ui.description).trumbowyg('html', _.escape($(this).val()).replace(/\s+/g, ' ')); }); view.ui.description.on('input keydown', function(e) { $(this).val($(this).val().replace(/\s+/g, ' ')); diff --git a/intg/src/main/java/org/apache/atlas/model/glossary/relations/AtlasRelatedTermHeader.java b/intg/src/main/java/org/apache/atlas/model/glossary/relations/AtlasRelatedTermHeader.java index f16cf25ed..5cacefe6e 100644 --- a/intg/src/main/java/org/apache/atlas/model/glossary/relations/AtlasRelatedTermHeader.java +++ b/intg/src/main/java/org/apache/atlas/model/glossary/relations/AtlasRelatedTermHeader.java @@ -33,6 +33,7 @@ public class AtlasRelatedTermHeader { private String source; private AtlasTermRelationshipStatus status; + private String qualifiedName; public AtlasRelatedTermHeader() { } @@ -112,6 +113,7 @@ public class AtlasRelatedTermHeader { sb.append(", relationGuid='").append(relationGuid).append('\''); sb.append(", description='").append(description).append('\''); sb.append(", displayText='").append(displayText).append('\''); + sb.append(", qualifiedName='").append(qualifiedName).append('\''); sb.append(", expression='").append(expression).append('\''); sb.append(", steward='").append(steward).append('\''); sb.append(", source='").append(source).append('\''); @@ -135,4 +137,7 @@ public class AtlasRelatedTermHeader { public void setRelationGuid(final String relationGuid) { this.relationGuid = relationGuid; } + public String getQualifiedName() { return qualifiedName; } + public void setQualifiedName(String qualifiedName) { this.qualifiedName = qualifiedName; } + } diff --git a/intg/src/main/java/org/apache/atlas/model/glossary/relations/AtlasTermAssignmentHeader.java b/intg/src/main/java/org/apache/atlas/model/glossary/relations/AtlasTermAssignmentHeader.java index c7de0638a..ef9588920 100644 --- a/intg/src/main/java/org/apache/atlas/model/glossary/relations/AtlasTermAssignmentHeader.java +++ b/intg/src/main/java/org/apache/atlas/model/glossary/relations/AtlasTermAssignmentHeader.java @@ -33,8 +33,8 @@ public class AtlasTermAssignmentHeader { private String steward; private String source; private int confidence; - private AtlasTermAssignmentStatus status; + private String qualifiedName; public AtlasTermAssignmentHeader() { } @@ -111,6 +111,10 @@ public class AtlasTermAssignmentHeader { this.displayText = displayText; } + public String getQualifiedName() { return qualifiedName; } + + public void setQualifiedName(String qualifiedName) { this.qualifiedName = qualifiedName; } + @Override public boolean equals(final Object o) { if (this == o) return true; @@ -140,11 +144,12 @@ public class AtlasTermAssignmentHeader { sb.append(", relationGuid='").append(relationGuid).append('\''); sb.append(", description='").append(description).append('\''); sb.append(", displayText='").append(displayText).append('\''); + sb.append(", qualifiedName='").append(qualifiedName).append('\''); sb.append(", expression='").append(expression).append('\''); sb.append(", createdBy='").append(createdBy).append('\''); sb.append(", steward='").append(steward).append('\''); sb.append(", source='").append(source).append('\''); - sb.append(", confidence=").append(confidence); + sb.append(", confidence=").append(confidence).append('\'');; sb.append(", status=").append(status); sb.append('}'); return sb.toString(); diff --git a/intg/src/main/java/org/apache/atlas/model/instance/AtlasRelatedObjectId.java b/intg/src/main/java/org/apache/atlas/model/instance/AtlasRelatedObjectId.java index ae6932de5..d640d21f5 100644 --- a/intg/src/main/java/org/apache/atlas/model/instance/AtlasRelatedObjectId.java +++ b/intg/src/main/java/org/apache/atlas/model/instance/AtlasRelatedObjectId.java @@ -54,6 +54,7 @@ public class AtlasRelatedObjectId extends AtlasObjectId implements Serializable private String relationshipGuid = null; private AtlasRelationship.Status relationshipStatus = null; private AtlasStruct relationshipAttributes = null; + private String qualifiedName = null; public AtlasRelatedObjectId() { } @@ -155,6 +156,13 @@ public class AtlasRelatedObjectId extends AtlasObjectId implements Serializable setRelationshipType(relationshipAttributes.getTypeName()); } } + public String getQualifiedName() { + return qualifiedName; + } + + public void setQualifiedName(String qualifiedName) { + this.qualifiedName = qualifiedName; + } @Override public boolean equals(Object o) { @@ -190,6 +198,7 @@ public class AtlasRelatedObjectId extends AtlasObjectId implements Serializable super.toString(sb); sb.append("entityStatus='").append(entityStatus).append('\''); sb.append(", displayText='").append(displayText).append('\''); + sb.append(", qualifiedName='").append(qualifiedName).append('\''); sb.append(", relationshipType='").append(relationshipType).append('\''); sb.append(", relationshipGuid='").append(relationshipGuid).append('\''); sb.append(", relationshipStatus='").append(relationshipStatus).append('\''); diff --git a/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java b/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java index 110c447ad..87fc2cd49 100644 --- a/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java +++ b/repository/src/main/java/org/apache/atlas/glossary/GlossaryService.java @@ -77,6 +77,7 @@ public class GlossaryService { private static final String GLOSSARY_QUALIFIED_NAME_PROPERTY = "AtlasGlossary." + QUALIFIED_NAME_ATTR; private static final String GLOSSARY_CATEGORY_NAME_PROPERTY = "AtlasGlossaryCategory.name"; private static final String GLOSSARY_TERM_NAME_PROPERTY = ATLAS_GLOSSARY_TERM + "." + NAME_ATTR; + private static final String GLOSSARY_TERM_QUALIFIED_NAME_PROPERTY = ATLAS_GLOSSARY_TERM + "." + QUALIFIED_NAME_ATTR; private static final String TERM_UNIQUE_QUALIFIED_NAME_PROPERTY = ATLAS_GLOSSARY_TERM + ".__u_" + QUALIFIED_NAME_ATTR; private static final String GLOSSARY_TERM_ANCHOR_EDGE_LABEL = "r:AtlasGlossaryTermAnchor"; @@ -1072,6 +1073,7 @@ public class GlossaryService { if (Objects.nonNull(glossaryTerm.getRelatedTerms())) { for (Map.Entry<AtlasGlossaryTerm.Relation, Set<AtlasRelatedTermHeader>> entry : glossaryTerm.getRelatedTerms().entrySet()) { setDisplayNameForTerms(entry.getValue()); + setQualifiedNameForTerms(entry.getValue()); } } } @@ -1122,13 +1124,24 @@ public class GlossaryService { String termGuid = termHeader.getTermGuid(); AtlasVertex termVertex = AtlasGraphUtilsV2.findByGuid(termGuid); String termDisplayText = termVertex.getProperty(GLOSSARY_TERM_NAME_PROPERTY, String.class); - if (StringUtils.isNotEmpty(termDisplayText)) { termHeader.setDisplayText(termDisplayText); } } } + private void setQualifiedNameForTerms(final Collection<AtlasRelatedTermHeader> termHeaders) throws AtlasBaseException { + + for (AtlasRelatedTermHeader termHeader : termHeaders) { + String termGuid = termHeader.getTermGuid(); + AtlasVertex termVertex = AtlasGraphUtilsV2.findByGuid(termGuid); + String termQualifiedName = termVertex.getProperty(GLOSSARY_TERM_QUALIFIED_NAME_PROPERTY, String.class); + if (StringUtils.isNotEmpty(termQualifiedName)) { + termHeader.setQualifiedName(termQualifiedName); + } + } + } + public static boolean isNameInvalid(String name) { return StringUtils.containsAny(name, invalidNameChars); } diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphRetriever.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphRetriever.java index 0ee86735d..0ed418330 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphRetriever.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphRetriever.java @@ -127,6 +127,7 @@ public class EntityGraphRetriever { private static final Logger LOG = LoggerFactory.getLogger(EntityGraphRetriever.class); private static final String GLOSSARY_TERM_DISPLAY_NAME_ATTR = "AtlasGlossaryTerm.name"; + private static final String GLOSSARY_TERM_QUALIFIED_NAME_ATTR = "AtlasGlossaryTerm.qualifiedName"; public static final String TERM_RELATION_NAME = "AtlasGlossarySemanticAssignment"; public static final String NAME = "name"; @@ -929,6 +930,11 @@ public class EntityGraphRetriever { ret.setDisplayText((String) displayName); } + Object qualifiedName = AtlasGraphUtilsV2.getEncodedProperty(termVertex, GLOSSARY_TERM_QUALIFIED_NAME_ATTR, Object.class); + if (qualifiedName instanceof String) { + ret.setQualifiedName((String) qualifiedName); + } + String description = edge.getProperty(TERM_ASSIGNMENT_ATTR_DESCRIPTION, String.class); if (description != null) { ret.setDescription(description); @@ -1549,6 +1555,11 @@ public class EntityGraphRetriever { ret.setDisplayText(displayText.toString()); } + Object qualifiedName = getQualifiedName(referenceVertex, entityTypeName); + if (qualifiedName != null) { + ret.setQualifiedName(qualifiedName.toString()); + } + if (isOwnedRef && entityExtInfo != null) { if (isMinExtInfo) { mapVertexToAtlasEntityMin(referenceVertex, entityExtInfo); @@ -1607,6 +1618,18 @@ public class EntityGraphRetriever { return ret; } + private Object getQualifiedName(AtlasVertex entityVertex, String entityTypeName) throws AtlasBaseException { + return getQualifiedName(entityVertex, typeRegistry.getEntityTypeByName(entityTypeName)); + } + + private Object getQualifiedName(AtlasVertex entityVertex, AtlasEntityType entityType) throws AtlasBaseException { + Object ret = null; + if (entityType != null) { + ret = getVertexAttribute(entityVertex, entityType.getAttribute(QUALIFIED_NAME)); + } + return ret; + } + public AtlasRelationship mapEdgeToAtlasRelationship(AtlasEdge edge) throws AtlasBaseException { return mapEdgeToAtlasRelationship(edge, false).getRelationship(); }