You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by pi...@apache.org on 2022/10/20 16:18:44 UTC
[atlas] branch branch-2.0 updated: ATLAS-4610: ATLAS-4655: Classification/ Term: Add parent name for classification & name
This is an automated email from the ASF dual-hosted git repository.
pinal pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new c7f07ba8e ATLAS-4610: ATLAS-4655: Classification/ Term: Add parent name for classification & name
c7f07ba8e is described below
commit c7f07ba8ec150bcecb8f3485d11eaa8a99d86bcb
Author: Prasad Pawar <pr...@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 <pi...@freestoneinfotech.com>
(cherry picked from commit f2293acf0d1ea720de17c345b518d64f324ba1f6)
---
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();
}