Repository: atlas Updated Branches: refs/heads/branch-1.0 07d595cc8 -> ddef7a30e
ATLAS-2815: UI Slow loading enhancements 1. Updated REST APIs that read entities with an option to include only minimum attributes for referred entities 2. UI changes for minExtInfo Change-Id: I633b46cc79de8ec807236719d8b5828aef537208 Signed-off-by: apoorvnaik <[email protected]> (cherry picked from commit fbb244c) Project: http://git-wip-us.apache.org/repos/asf/atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/ddef7a30 Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/ddef7a30 Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/ddef7a30 Branch: refs/heads/branch-1.0 Commit: ddef7a30e532dec26a1e415c2628ff25f40df729 Parents: 07d595c Author: Abhishek Kadam <[email protected]> Authored: Tue Jul 31 07:06:17 2018 -0700 Committer: apoorvnaik <[email protected]> Committed: Tue Aug 7 19:36:50 2018 -0700 ---------------------------------------------------------------------- dashboardv2/public/js/models/VEntity.js | 14 +- dashboardv2/public/js/models/VSearch.js | 2 +- dashboardv2/public/js/models/VTag.js | 4 +- dashboardv2/public/js/router/Router.js | 2 +- .../public/js/utils/CommonViewFunction.js | 4 +- dashboardv2/public/js/utils/UrlLinks.js | 27 +++- .../js/views/entity/CreateEntityLayoutView.js | 4 +- .../org/apache/atlas/type/AtlasEntityType.java | 132 ++++++++++++----- .../store/graph/AtlasEntityStore.java | 40 ++++- .../store/graph/v2/AtlasEntityStoreV2.java | 79 +++++++--- .../store/graph/v2/EntityGraphRetriever.java | 146 +++++++++++++------ .../org/apache/atlas/web/rest/EntityREST.java | 110 ++++++-------- .../atlas/web/adapters/TestEntitiesREST.java | 2 +- .../atlas/web/adapters/TestEntityREST.java | 8 +- 14 files changed, 381 insertions(+), 193 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/dashboardv2/public/js/models/VEntity.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/models/VEntity.js b/dashboardv2/public/js/models/VEntity.js index aa8dbc4..deeb6b0 100644 --- a/dashboardv2/public/js/models/VEntity.js +++ b/dashboardv2/public/js/models/VEntity.js @@ -43,7 +43,17 @@ define(['require', *************************/ getEntity: function(token, options) { - var url = UrlLinks.entitiesApiUrl(token); + var url = UrlLinks.entitiesApiUrl({ guid: token }); + + options = _.extend({ + contentType: 'application/json', + dataType: 'json' + }, options); + + return this.constructor.nonCrudOperation.call(this, url, 'GET', options); + }, + getEntityHeader: function(token, options) { + var url = UrlLinks.entityHeaderApiUrl(token); options = _.extend({ contentType: 'application/json', @@ -80,4 +90,4 @@ define(['require', } }, {}); return VEntity; -}); +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/dashboardv2/public/js/models/VSearch.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/models/VSearch.js b/dashboardv2/public/js/models/VSearch.js index 700a909..32d4278 100644 --- a/dashboardv2/public/js/models/VSearch.js +++ b/dashboardv2/public/js/models/VSearch.js @@ -41,7 +41,7 @@ define(['require', * Non - CRUD operations *************************/ getEntity: function(id, options) { - var url = UrlLinks.entitiesApiUrl(id); + var url = UrlLinks.entitiesApiUrl({guid: id}); options = _.extend({ contentType: 'application/json', http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/dashboardv2/public/js/models/VTag.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/models/VTag.js b/dashboardv2/public/js/models/VTag.js index 65010cf..fc5a97f 100644 --- a/dashboardv2/public/js/models/VTag.js +++ b/dashboardv2/public/js/models/VTag.js @@ -41,7 +41,7 @@ define(['require', * Non - CRUD operations *************************/ deleteAssociation: function(guid, name, options) { - var url = UrlLinks.entitiesApiUrl(guid, name); + var url = UrlLinks.entitiesApiUrl({ guid: guid, name: name }); options = _.extend({ contentType: 'application/json', dataType: 'json' @@ -66,4 +66,4 @@ define(['require', } }, {}); return VTag; -}); +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/dashboardv2/public/js/router/Router.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/router/Router.js b/dashboardv2/public/js/router/Router.js index 230ca9b..daf7974 100644 --- a/dashboardv2/public/js/router/Router.js +++ b/dashboardv2/public/js/router/Router.js @@ -125,7 +125,7 @@ define([ 'id': id, 'value': paramObj }, that.preFetchedCollectionLists, that.sharedObj))); - this.entityCollection.url = UrlLinks.entitiesApiUrl(id); + this.entityCollection.url = UrlLinks.entitiesApiUrl({ guid: id, minExtInfo: true }); this.entityCollection.fetch({ reset: true }); }); } http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/dashboardv2/public/js/utils/CommonViewFunction.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/utils/CommonViewFunction.js b/dashboardv2/public/js/utils/CommonViewFunction.js index 51b141a..bbe39e5 100644 --- a/dashboardv2/public/js/utils/CommonViewFunction.js +++ b/dashboardv2/public/js/utils/CommonViewFunction.js @@ -81,11 +81,11 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum var table = "", fetchInputOutputValue = function(id) { var that = this; - scope.entityModel.getEntity(id, { + scope.entityModel.getEntityHeader(id, { success: function(serverData) { var value = "", deleteButton = "", - data = serverData.entity; + data = serverData; value = Utils.getName(data); var id = ""; if (data.guid) { http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/dashboardv2/public/js/utils/UrlLinks.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/utils/UrlLinks.js b/dashboardv2/public/js/utils/UrlLinks.js index a53bb77..09cf2c0 100644 --- a/dashboardv2/public/js/utils/UrlLinks.js +++ b/dashboardv2/public/js/utils/UrlLinks.js @@ -48,16 +48,28 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require return defApiUrl.defs + '?excludeInternalTypesAndReferences=true&type=' + type; } }, - entitiesApiUrl: function(guid, name) { + entitiesApiUrl: function(options) { var entitiesUrl = this.baseUrlV2 + '/entity'; - if (guid && name) { - return entitiesUrl + '/guid/' + guid + '/classification/' + name; - } else if (guid && !name) { - return entitiesUrl + '/guid/' + guid; - } else { + if (options) { + var guid = options.guid, + name = options.name, + minExtInfo = options.minExtInfo; + if (guid && name) { + entitiesUrl += '/guid/' + guid + '/classification/' + name; + } else if (guid && !name) { + entitiesUrl += '/guid/' + guid; + } + } + + if (!minExtInfo) { return entitiesUrl; + } else { + return entitiesUrl += '?minExtInfo=' + (minExtInfo); } }, + entityHeaderApiUrl: function(guid) { + return this.entitiesApiUrl({ guid: guid }) + "/header" + }, entitiesTraitsApiUrl: function(token) { if (token) { return this.baseUrlV2 + '/entity/guid/' + token + '/classifications'; @@ -69,6 +81,9 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require entityCollectionaudit: function(guid) { return this.baseUrlV2 + '/entity/' + guid + '/audit'; }, + replicationCollectionaudit: function(name) { + return this.baseUrl + '/admin/cluster/audit/' + name; + }, classicationApiUrl: function(name, guid) { var typeUrl = this.typedefsUrl(); if (name) { http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/dashboardv2/public/js/views/entity/CreateEntityLayoutView.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/views/entity/CreateEntityLayoutView.js b/dashboardv2/public/js/views/entity/CreateEntityLayoutView.js index a645237..6df1af0 100644 --- a/dashboardv2/public/js/views/entity/CreateEntityLayoutView.js +++ b/dashboardv2/public/js/views/entity/CreateEntityLayoutView.js @@ -184,7 +184,7 @@ define(['require', }, fetchCollections: function() { if (this.guid) { - this.collection.url = UrlLinks.entitiesApiUrl(this.guid); + this.collection.url = UrlLinks.entitiesApiUrl({ guid: this.guid }); this.collection.fetch({ reset: true }); } else { this.entityCollectionList(); @@ -212,7 +212,7 @@ define(['require', _.each(attrObj, function(obj) { if (obj.guid && !referredEntities[obj.guid]) { ++that.asyncReferEntityCounter; - that.collection.url = UrlLinks.entitiesApiUrl(obj.guid); + that.collection.url = UrlLinks.entitiesApiUrl({ guid: obj.guid }); that.collection.fetch({ success: function(data, response) { referredEntities[obj.guid] = response.entity; http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java index 6a92282..8ab41a3 100644 --- a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java +++ b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -47,6 +47,14 @@ import java.util.Set; public class AtlasEntityType extends AtlasStructType { private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityType.class); + private static final String NAME = "name"; + private static final String DESCRIPTION = "description"; + private static final String OWNER = "owner"; + private static final String CREATE_TIME = "createTime"; + + private static final String[] ENTITY_HEADER_ATTRIBUTES = new String[]{NAME, DESCRIPTION, OWNER, CREATE_TIME}; + private static final String OPTION_SCHEMA_ATTRIBUTES = "schemaAttributes"; + private final AtlasEntityDef entityDef; private final String typeQryStr; @@ -62,25 +70,29 @@ public class AtlasEntityType extends AtlasStructType { private Map<String, List<AtlasRelationshipType>> relationshipAttributesType = Collections.emptyMap(); private String typeAndAllSubTypesQryStr = ""; private boolean isInternalType = false; + private Map<String, AtlasAttribute> headerAttributes = Collections.emptyMap(); + private Map<String, AtlasAttribute> minInfoAttributes = Collections.emptyMap(); public AtlasEntityType(AtlasEntityDef entityDef) { super(entityDef); - this.entityDef = entityDef; + this.entityDef = entityDef; this.typeQryStr = AtlasAttribute.escapeIndexQueryValue(Collections.singleton(getTypeName())); } public AtlasEntityType(AtlasEntityDef entityDef, AtlasTypeRegistry typeRegistry) throws AtlasBaseException { super(entityDef); - this.entityDef = entityDef; + this.entityDef = entityDef; this.typeQryStr = AtlasAttribute.escapeIndexQueryValue(Collections.singleton(getTypeName())); resolveReferences(typeRegistry); } - public AtlasEntityDef getEntityDef() { return entityDef; } + public AtlasEntityDef getEntityDef() { + return entityDef; + } @Override void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException { @@ -96,20 +108,20 @@ public class AtlasEntityType extends AtlasStructType { AtlasType superType = typeRegistry.getType(superTypeName); if (superType instanceof AtlasEntityType) { - s.add((AtlasEntityType)superType); + s.add((AtlasEntityType) superType); } else { throw new AtlasBaseException(AtlasErrorCode.INCOMPATIBLE_SUPERTYPE, superTypeName, entityDef.getName()); } } - this.superTypes = Collections.unmodifiableList(s); - this.allSuperTypes = Collections.unmodifiableSet(allS); - this.allAttributes = Collections.unmodifiableMap(allA); - this.uniqAttributes = getUniqueAttributes(this.allAttributes); - this.subTypes = new HashSet<>(); // this will be populated in resolveReferencesPhase2() - this.allSubTypes = new HashSet<>(); // this will be populated in resolveReferencesPhase2() - this.typeAndAllSubTypes = new HashSet<>(); // this will be populated in resolveReferencesPhase2() - this.relationshipAttributes = new HashMap<>(); // this will be populated in resolveReferencesPhase3() + this.superTypes = Collections.unmodifiableList(s); + this.allSuperTypes = Collections.unmodifiableSet(allS); + this.allAttributes = Collections.unmodifiableMap(allA); + this.uniqAttributes = getUniqueAttributes(this.allAttributes); + this.subTypes = new HashSet<>(); // this will be populated in resolveReferencesPhase2() + this.allSubTypes = new HashSet<>(); // this will be populated in resolveReferencesPhase2() + this.typeAndAllSubTypes = new HashSet<>(); // this will be populated in resolveReferencesPhase2() + this.relationshipAttributes = new HashMap<>(); // this will be populated in resolveReferencesPhase3() this.relationshipAttributesType = new HashMap<>(); // this will be populated in resolveReferencesPhase3() this.typeAndAllSubTypes.add(this.getTypeName()); @@ -117,6 +129,34 @@ public class AtlasEntityType extends AtlasStructType { this.typeAndAllSuperTypes = new HashSet<>(this.allSuperTypes); this.typeAndAllSuperTypes.add(this.getTypeName()); this.typeAndAllSuperTypes = Collections.unmodifiableSet(this.typeAndAllSuperTypes); + + // headerAttributes includes uniqAttributes & ENTITY_HEADER_ATTRIBUTES + this.headerAttributes = new HashMap<>(this.uniqAttributes); + + for (String headerAttributeName : ENTITY_HEADER_ATTRIBUTES) { + AtlasAttribute headerAttribute = getAttribute(headerAttributeName); + + if (headerAttribute != null) { + this.headerAttributes.put(headerAttributeName, headerAttribute); + } + } + + // minInfoAttributes includes all headerAttributes & schema-attributes + this.minInfoAttributes = new HashMap<>(this.headerAttributes); + + Map<String, String> typeDefOptions = entityDef.getOptions(); + String jsonList = typeDefOptions != null ? typeDefOptions.get(OPTION_SCHEMA_ATTRIBUTES) : null; + List<String> schemaAttributeNames = StringUtils.isNotEmpty(jsonList) ? AtlasType.fromJson(jsonList, List.class) : null; + + if (CollectionUtils.isNotEmpty(schemaAttributeNames)) { + for (String schemaAttributeName : schemaAttributeNames) { + AtlasAttribute schemaAttribute = getAttribute(schemaAttributeName); + + if (schemaAttribute != null) { + this.minInfoAttributes.put(schemaAttributeName, schemaAttribute); + } + } + } } @Override @@ -143,7 +183,7 @@ public class AtlasEntityType extends AtlasStructType { // validate if RelationshipDefs is defined for all entityDefs if (attributeEntityType != null && !hasRelationshipAttribute(attributeName)) { LOG.warn("No RelationshipDef defined between {} and {} on attribute: {}.{}", getTypeName(), - attributeEntityType.getTypeName(), getTypeName(), attributeName); + attributeEntityType.getTypeName(), getTypeName(), attributeName); } } @@ -167,11 +207,11 @@ public class AtlasEntityType extends AtlasStructType { } } - subTypes = Collections.unmodifiableSet(subTypes); - allSubTypes = Collections.unmodifiableSet(allSubTypes); - typeAndAllSubTypes = Collections.unmodifiableSet(typeAndAllSubTypes); - typeAndAllSubTypesQryStr = ""; // will be computed on next access - relationshipAttributes = Collections.unmodifiableMap(relationshipAttributes); + subTypes = Collections.unmodifiableSet(subTypes); + allSubTypes = Collections.unmodifiableSet(allSubTypes); + typeAndAllSubTypes = Collections.unmodifiableSet(typeAndAllSubTypes); + typeAndAllSubTypesQryStr = ""; // will be computed on next access + relationshipAttributes = Collections.unmodifiableMap(relationshipAttributes); relationshipAttributesType = Collections.unmodifiableMap(relationshipAttributesType); entityDef.setSubTypes(subTypes); @@ -185,13 +225,25 @@ public class AtlasEntityType extends AtlasStructType { return allSuperTypes; } - public Set<String> getSubTypes() { return subTypes; } + public Set<String> getSubTypes() { + return subTypes; + } - public Set<String> getAllSubTypes() { return allSubTypes; } + public Set<String> getAllSubTypes() { + return allSubTypes; + } - public Set<String> getTypeAndAllSubTypes() { return typeAndAllSubTypes; } + public Set<String> getTypeAndAllSubTypes() { + return typeAndAllSubTypes; + } + + public Set<String> getTypeAndAllSuperTypes() { + return typeAndAllSuperTypes; + } - public Set<String> getTypeAndAllSuperTypes() { return typeAndAllSuperTypes; } + public Map<String, AtlasAttribute> getHeaderAttributes() { return headerAttributes; } + + public Map<String, AtlasAttribute> getMinInfoAttributes() { return minInfoAttributes; } public boolean isSuperTypeOf(AtlasEntityType entityType) { return entityType != null && allSubTypes.contains(entityType.getTypeName()); @@ -217,9 +269,13 @@ public class AtlasEntityType extends AtlasStructType { return isInternalType; } - public Map<String, AtlasAttribute> getRelationshipAttributes() { return relationshipAttributes; } + public Map<String, AtlasAttribute> getRelationshipAttributes() { + return relationshipAttributes; + } - public AtlasAttribute getRelationshipAttribute(String attributeName) { return relationshipAttributes.get(attributeName); } + public AtlasAttribute getRelationshipAttribute(String attributeName) { + return relationshipAttributes.get(attributeName); + } // this method should be called from AtlasRelationshipType.resolveReferencesPhase2() void addRelationshipAttribute(String attributeName, AtlasAttribute attribute) { @@ -254,7 +310,9 @@ public class AtlasEntityType extends AtlasStructType { return typeAndAllSubTypesQryStr; } - public String getTypeQryStr() { return typeQryStr; } + public String getTypeQryStr() { + return typeQryStr; + } public boolean hasRelationshipAttribute(String attributeName) { return relationshipAttributes.containsKey(attributeName); @@ -280,7 +338,7 @@ public class AtlasEntityType extends AtlasStructType { } @Override - public AtlasEntity createDefaultValue(Object defaultValue){ + public AtlasEntity createDefaultValue(Object defaultValue) { AtlasEntity ret = new AtlasEntity(entityDef.getName()); populateDefaultValues(ret); @@ -483,8 +541,8 @@ public class AtlasEntityType extends AtlasStructType { typeAndAllSubTypes.add(subType.getTypeName()); } - private void getTypeHierarchyInfo(AtlasTypeRegistry typeRegistry, - Set<String> allSuperTypeNames, + private void getTypeHierarchyInfo(AtlasTypeRegistry typeRegistry, + Set<String> allSuperTypeNames, Map<String, AtlasAttribute> allAttributes) throws AtlasBaseException { List<String> visitedTypes = new ArrayList<>(); @@ -498,10 +556,10 @@ public class AtlasEntityType extends AtlasStructType { * this.entityDef is the only safe member to reference here */ - private void collectTypeHierarchyInfo(AtlasTypeRegistry typeRegistry, - Set<String> allSuperTypeNames, - Map<String, AtlasAttribute> allAttributes, - List<String> visitedTypes) throws AtlasBaseException { + private void collectTypeHierarchyInfo(AtlasTypeRegistry typeRegistry, + Set<String> allSuperTypeNames, + Map<String, AtlasAttribute> allAttributes, + List<String> visitedTypes) throws AtlasBaseException { if (visitedTypes.contains(entityDef.getName())) { throw new AtlasBaseException(AtlasErrorCode.CIRCULAR_REFERENCE, entityDef.getName(), visitedTypes.toString()); @@ -528,6 +586,7 @@ public class AtlasEntityType extends AtlasStructType { } } } + boolean isAssignableFrom(AtlasObjectId objId) { boolean ret = AtlasTypeUtil.isValid(objId) && (StringUtils.equals(objId.getTypeName(), getTypeName()) || isSuperTypeOf(objId.getTypeName())); @@ -605,6 +664,7 @@ public class AtlasEntityType extends AtlasStructType { return ret; } + private boolean isValidRelationshipType(AtlasType attributeType) { boolean ret = false; @@ -700,7 +760,7 @@ public class AtlasEntityType extends AtlasStructType { } } else if (obj instanceof Map) { - Map attributes = AtlasTypeUtil.toStructAttributes((Map)obj); + Map attributes = AtlasTypeUtil.toStructAttributes((Map) obj); for (AtlasAttribute attribute : relationshipAttributes.values()) { http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java index be73a0d..c6be406 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java @@ -21,6 +21,7 @@ import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.instance.AtlasClassification; import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo; import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo; +import org.apache.atlas.model.instance.AtlasEntityHeader; import org.apache.atlas.model.instance.AtlasObjectId; import org.apache.atlas.model.instance.EntityMutationResponse; import org.apache.atlas.repository.store.graph.v2.EntityStream; @@ -51,6 +52,23 @@ public interface AtlasEntityStore { AtlasEntityWithExtInfo getById(String guid) throws AtlasBaseException; /** + * + * Get entity definition by its guid + * @param guid + * @param isMinExtInfo + * @return AtlasEntity + */ + AtlasEntityWithExtInfo getById(String guid, boolean isMinExtInfo) throws AtlasBaseException; + + /** + * Get entity header for the given GUID + * @param guid + * @return + * @throws AtlasBaseException + */ + AtlasEntityHeader getHeaderById(String guid) throws AtlasBaseException; + + /** * Batch GET to retrieve entities by their ID * @param guid * @return @@ -59,6 +77,15 @@ public interface AtlasEntityStore { AtlasEntitiesWithExtInfo getByIds(List<String> guid) throws AtlasBaseException; /** + * Batch GET to retrieve entities by their ID + * @param guid + * @param isMinExtInfo + * @return + * @throws AtlasBaseException + */ + AtlasEntitiesWithExtInfo getByIds(List<String> guid, boolean isMinExtInfo) throws AtlasBaseException; + + /** * * Get an eneity by its unique attribute * @param entityType type of the entity @@ -69,6 +96,17 @@ public interface AtlasEntityStore { throws AtlasBaseException; /** + * + * Get an eneity by its unique attribute + * @param entityType type of the entity + * @param uniqAttributes Attributes that uniquely identify the entity + * @param isMinExtInfo + * @return EntityMutationResponse details of the updates performed by this call + */ + AtlasEntityWithExtInfo getByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes, boolean isMinExtInfo) + throws AtlasBaseException; + + /** * Create or update entities in the stream * @param entityStream AtlasEntityStream * @return EntityMutationResponse Entity mutations operations with the corresponding set of entities on which these operations were performed @@ -130,7 +168,7 @@ public interface AtlasEntityStore { * @throws AtlasBaseException */ EntityMutationResponse deleteByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes) - throws AtlasBaseException; + throws AtlasBaseException; /** * * Get an entity guid by its unique attributes http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java index 1b709e4..c533e32 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java @@ -101,57 +101,98 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore { @Override @GraphTransaction public AtlasEntityWithExtInfo getById(String guid) throws AtlasBaseException { + return getById(guid, false); + } + + @Override + public AtlasEntityWithExtInfo getById(final String guid, final boolean isMinExtInfo) throws AtlasBaseException { if (LOG.isDebugEnabled()) { - LOG.debug("==> getById({})", guid); + LOG.debug("==> getById({}, {})", guid, isMinExtInfo); } - AtlasEntityWithExtInfo ret = entityRetriever.toAtlasEntityWithExtInfo(guid); + EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry); - AtlasAuthorizationUtils.verifyAccess(new AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new AtlasEntityHeader(ret.getEntity())), "read entity: guid=", guid); + AtlasEntityWithExtInfo ret = entityRetriever.toAtlasEntityWithExtInfo(guid, isMinExtInfo); + + if (ret == null) { + throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid); + } if (LOG.isDebugEnabled()) { - LOG.debug("<== getById({}): {}", guid, ret); + LOG.debug("<== getById({}, {}): {}", guid, isMinExtInfo, ret); } return ret; } @Override - @GraphTransaction - public AtlasEntitiesWithExtInfo getByIds(List<String> guids) throws AtlasBaseException { + public AtlasEntityHeader getHeaderById(final String guid) throws AtlasBaseException { if (LOG.isDebugEnabled()) { - LOG.debug("==> getByIds({})", guids); + LOG.debug("==> getHeaderById({})", guid); } - AtlasEntitiesWithExtInfo ret = entityRetriever.toAtlasEntitiesWithExtInfo(guids); + EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry); - // verify authorization to read the entities - if(ret != null){ - for(String guid : guids){ - AtlasEntity entity = ret.getEntity(guid); + AtlasEntityHeader ret = entityRetriever.toAtlasEntityHeader(guid); - AtlasAuthorizationUtils.verifyAccess(new AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new AtlasEntityHeader(entity)), "read entity: guid=", guid); - } + if (ret == null) { + throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("<== getHeaderById({}): {}", guid, ret); + } + + return ret; + } + + @Override + public AtlasEntitiesWithExtInfo getByIds(List<String> guids) throws AtlasBaseException { + return getByIds(guids, false); + } + + @Override + @GraphTransaction + public AtlasEntitiesWithExtInfo getByIds(List<String> guids, boolean isMinExtInfo) throws AtlasBaseException { + if (LOG.isDebugEnabled()) { + LOG.debug("==> getByIds({}, {})", guids, isMinExtInfo); } + EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry); + + AtlasEntitiesWithExtInfo ret = entityRetriever.toAtlasEntitiesWithExtInfo(guids, isMinExtInfo); + if (LOG.isDebugEnabled()) { - LOG.debug("<== getByIds({}): {}", guids, ret); + LOG.debug("<== getByIds({}, {}): {}", guids, isMinExtInfo, ret); } return ret; } @Override + public AtlasEntityWithExtInfo getByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes) + throws AtlasBaseException { + return getByUniqueAttributes(entityType, uniqAttributes, false); + } + + @Override @GraphTransaction - public AtlasEntityWithExtInfo getByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes) throws AtlasBaseException { + public AtlasEntityWithExtInfo getByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes, boolean isMinExtInfo) + throws AtlasBaseException { if (LOG.isDebugEnabled()) { LOG.debug("==> getByUniqueAttribute({}, {})", entityType.getTypeName(), uniqAttributes); } - AtlasVertex entityVertex = AtlasGraphUtilsV2.getVertexByUniqueAttributes(entityType, uniqAttributes); - AtlasEntityWithExtInfo ret = entityRetriever.toAtlasEntityWithExtInfo(entityVertex); + AtlasVertex entityVertex = AtlasGraphUtilsV2.getVertexByUniqueAttributes(entityType, uniqAttributes); - AtlasAuthorizationUtils.verifyAccess(new AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new AtlasEntityHeader(ret.getEntity())), "read entity: typeName=", entityType.getTypeName(), ", uniqueAttributes=", uniqAttributes); + EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry); + + AtlasEntityWithExtInfo ret = entityRetriever.toAtlasEntityWithExtInfo(entityVertex, isMinExtInfo); + + if (ret == null) { + throw new AtlasBaseException(AtlasErrorCode.INSTANCE_BY_UNIQUE_ATTRIBUTE_NOT_FOUND, entityType.getTypeName(), + uniqAttributes.toString()); + } if (LOG.isDebugEnabled()) { LOG.debug("<== getByUniqueAttribute({}, {}): {}", entityType.getTypeName(), uniqAttributes, ret); http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphRetriever.java ---------------------------------------------------------------------- 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 dca8afc..c227848 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 @@ -156,13 +156,21 @@ public final class EntityGraphRetriever { return toAtlasEntityWithExtInfo(getEntityVertex(guid)); } + public AtlasEntityWithExtInfo toAtlasEntityWithExtInfo(String guid, boolean isMinExtInfo) throws AtlasBaseException { + return toAtlasEntityWithExtInfo(getEntityVertex(guid), isMinExtInfo); + } + public AtlasEntityWithExtInfo toAtlasEntityWithExtInfo(AtlasObjectId objId) throws AtlasBaseException { return toAtlasEntityWithExtInfo(getEntityVertex(objId)); } public AtlasEntityWithExtInfo toAtlasEntityWithExtInfo(AtlasVertex entityVertex) throws AtlasBaseException { + return toAtlasEntityWithExtInfo(entityVertex, false); + } + + public AtlasEntityWithExtInfo toAtlasEntityWithExtInfo(AtlasVertex entityVertex, boolean isMinExtInfo) throws AtlasBaseException { AtlasEntityExtInfo entityExtInfo = new AtlasEntityExtInfo(); - AtlasEntity entity = mapVertexToAtlasEntity(entityVertex, entityExtInfo); + AtlasEntity entity = mapVertexToAtlasEntity(entityVertex, entityExtInfo, isMinExtInfo); AtlasEntityWithExtInfo ret = new AtlasEntityWithExtInfo(entity, entityExtInfo); ret.compact(); @@ -171,19 +179,7 @@ public final class EntityGraphRetriever { } public AtlasEntitiesWithExtInfo toAtlasEntitiesWithExtInfo(List<String> guids) throws AtlasBaseException { - AtlasEntitiesWithExtInfo ret = new AtlasEntitiesWithExtInfo(); - - for (String guid : guids) { - AtlasVertex vertex = getEntityVertex(guid); - - AtlasEntity entity = mapVertexToAtlasEntity(vertex, ret); - - ret.addEntity(entity); - } - - ret.compact(); - - return ret; + return toAtlasEntitiesWithExtInfo(guids, false); } public AtlasEntityHeader toAtlasEntityHeader(String guid) throws AtlasBaseException { @@ -323,6 +319,22 @@ public final class EntityGraphRetriever { return ret; } + public AtlasEntitiesWithExtInfo toAtlasEntitiesWithExtInfo(List<String> guids, boolean isMinExtInfo) throws AtlasBaseException { + AtlasEntitiesWithExtInfo ret = new AtlasEntitiesWithExtInfo(); + + for (String guid : guids) { + AtlasVertex vertex = getEntityVertex(guid); + + AtlasEntity entity = mapVertexToAtlasEntity(vertex, ret, isMinExtInfo); + + ret.addEntity(entity); + } + + ret.compact(); + + return ret; + } + private AtlasVertex getEntityVertex(AtlasObjectId objId) throws AtlasBaseException { AtlasVertex ret = null; @@ -347,7 +359,11 @@ public final class EntityGraphRetriever { } private AtlasEntity mapVertexToAtlasEntity(AtlasVertex entityVertex, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException { - String guid = getGuid(entityVertex); + return mapVertexToAtlasEntity(entityVertex, entityExtInfo, false); + } + + private AtlasEntity mapVertexToAtlasEntity(AtlasVertex entityVertex, AtlasEntityExtInfo entityExtInfo, boolean isMinExtInfo) throws AtlasBaseException { + String guid = GraphHelper.getGuid(entityVertex); AtlasEntity entity = entityExtInfo != null ? entityExtInfo.getEntity(guid) : null; if (entity == null) { @@ -363,11 +379,44 @@ public final class EntityGraphRetriever { mapSystemAttributes(entityVertex, entity); - mapAttributes(entityVertex, entity, entityExtInfo); + mapAttributes(entityVertex, entity, entityExtInfo, isMinExtInfo); - mapRelationshipAttributes(entityVertex, entity); + mapClassifications(entityVertex, entity); + } + + return entity; + } + + private AtlasEntity mapVertexToAtlasEntityMin(AtlasVertex entityVertex, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException { + return mapVertexToAtlasEntityMin(entityVertex, entityExtInfo, null); + } + + private AtlasEntity mapVertexToAtlasEntityMin(AtlasVertex entityVertex, AtlasEntityExtInfo entityExtInfo, Set<String> attributes) throws AtlasBaseException { + String guid = GraphHelper.getGuid(entityVertex); + AtlasEntity entity = entityExtInfo != null ? entityExtInfo.getEntity(guid) : null; + + if (entity == null) { + entity = new AtlasEntity(); + + if (entityExtInfo != null) { + entityExtInfo.addReferredEntity(guid, entity); + } + + mapSystemAttributes(entityVertex, entity); mapClassifications(entityVertex, entity); + + AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entity.getTypeName()); + + if (entityType != null) { + for (AtlasAttribute attribute : entityType.getMinInfoAttributes().values()) { + Object attrValue = getVertexAttribute(entityVertex, attribute); + + if (attrValue != null) { + entity.setAttribute(attribute.getName(), attrValue); + } + } + } } return entity; @@ -395,25 +444,17 @@ public final class EntityGraphRetriever { AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName); if (entityType != null) { - for (AtlasAttribute uniqueAttribute : entityType.getUniqAttributes().values()) { - Object attrValue = getVertexAttribute(entityVertex, uniqueAttribute); + for (AtlasAttribute headerAttribute : entityType.getHeaderAttributes().values()) { + Object attrValue = getVertexAttribute(entityVertex, headerAttribute); if (attrValue != null) { - ret.setAttribute(uniqueAttribute.getName(), attrValue); + ret.setAttribute(headerAttribute.getName(), attrValue); } } - Object name = getVertexAttribute(entityVertex, entityType.getAttribute(NAME)); - Object description = getVertexAttribute(entityVertex, entityType.getAttribute(DESCRIPTION)); - Object owner = getVertexAttribute(entityVertex, entityType.getAttribute(OWNER)); - Object createTime = getVertexAttribute(entityVertex, entityType.getAttribute(CREATE_TIME)); + Object name = ret.getAttribute(NAME); Object displayText = name != null ? name : ret.getAttribute(QUALIFIED_NAME); - ret.setAttribute(NAME, name); - ret.setAttribute(DESCRIPTION, description); - ret.setAttribute(OWNER, owner); - ret.setAttribute(CREATE_TIME, createTime); - if (displayText != null) { ret.setDisplayText(displayText.toString()); } @@ -432,7 +473,6 @@ public final class EntityGraphRetriever { } } } - } return ret; @@ -469,6 +509,10 @@ public final class EntityGraphRetriever { } private void mapAttributes(AtlasVertex entityVertex, AtlasStruct struct, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException { + mapAttributes(entityVertex, struct, entityExtInfo, false); + } + + private void mapAttributes(AtlasVertex entityVertex, AtlasStruct struct, AtlasEntityExtInfo entityExtInfo, boolean isMinExtInfo) throws AtlasBaseException { AtlasType objType = typeRegistry.getType(struct.getTypeName()); if (!(objType instanceof AtlasStructType)) { @@ -478,7 +522,7 @@ public final class EntityGraphRetriever { AtlasStructType structType = (AtlasStructType) objType; for (AtlasAttribute attribute : structType.getAllAttributes().values()) { - Object attrValue = mapVertexToAttribute(entityVertex, attribute, entityExtInfo); + Object attrValue = mapVertexToAttribute(entityVertex, attribute, entityExtInfo, isMinExtInfo); struct.setAttribute(attribute.getName(), attrValue); } @@ -594,7 +638,7 @@ public final class EntityGraphRetriever { } } - private Object mapVertexToAttribute(AtlasVertex entityVertex, AtlasAttribute attribute, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException { + private Object mapVertexToAttribute(AtlasVertex entityVertex, AtlasAttribute attribute, AtlasEntityExtInfo entityExtInfo, final boolean isMinExtInfo) throws AtlasBaseException { Object ret = null; AtlasType attrType = attribute.getAttributeType(); String vertexPropertyName = attribute.getQualifiedName(); @@ -614,16 +658,16 @@ public final class EntityGraphRetriever { ret = GraphHelper.getProperty(entityVertex, vertexPropertyName); break; case STRUCT: - ret = mapVertexToStruct(entityVertex, edgeLabel, null, entityExtInfo); + ret = mapVertexToStruct(entityVertex, edgeLabel, null, entityExtInfo, isMinExtInfo); break; case OBJECT_ID_TYPE: - ret = mapVertexToObjectId(entityVertex, edgeLabel, null, entityExtInfo, isOwnedAttribute, edgeDirection); + ret = mapVertexToObjectId(entityVertex, edgeLabel, null, entityExtInfo, isOwnedAttribute, edgeDirection, isMinExtInfo); break; case ARRAY: - ret = mapVertexToArray(entityVertex, entityExtInfo, isOwnedAttribute, attribute); + ret = mapVertexToArray(entityVertex, entityExtInfo, isOwnedAttribute, attribute, isMinExtInfo); break; case MAP: - ret = mapVertexToMap(entityVertex, vertexPropertyName, entityExtInfo, isOwnedAttribute, attribute); + ret = mapVertexToMap(entityVertex, vertexPropertyName, entityExtInfo, isOwnedAttribute, attribute, isMinExtInfo); break; case CLASSIFICATION: // do nothing @@ -634,7 +678,7 @@ public final class EntityGraphRetriever { } private Map<String, Object> mapVertexToMap(AtlasVertex entityVertex, final String propertyName, AtlasEntityExtInfo entityExtInfo, - boolean isOwnedAttribute, AtlasAttribute attribute) throws AtlasBaseException { + boolean isOwnedAttribute, AtlasAttribute attribute, final boolean isMinExtInfo) throws AtlasBaseException { Map<String, Object> ret = null; AtlasMapType mapType = (AtlasMapType) attribute.getAttributeType(); @@ -654,7 +698,7 @@ public final class EntityGraphRetriever { String mapKey = entry.getKey(); Object keyValue = entry.getValue(); Object mapValue = mapVertexToCollectionEntry(entityVertex, mapValueType, keyValue, attribute.getRelationshipEdgeLabel(), - entityExtInfo, isOwnedAttribute, attribute.getRelationshipEdgeDirection()); + entityExtInfo, isOwnedAttribute, attribute.getRelationshipEdgeDirection(), isMinExtInfo); if (mapValue != null) { ret.put(mapKey, mapValue); } @@ -672,7 +716,7 @@ public final class EntityGraphRetriever { } private List<Object> mapVertexToArray(AtlasVertex entityVertex, AtlasEntityExtInfo entityExtInfo, - boolean isOwnedAttribute, AtlasAttribute attribute) throws AtlasBaseException { + boolean isOwnedAttribute, AtlasAttribute attribute, final boolean isMinExtInfo) throws AtlasBaseException { AtlasArrayType arrayType = (AtlasArrayType) attribute.getAttributeType(); AtlasType arrayElementType = arrayType.getElementType(); @@ -699,7 +743,7 @@ public final class EntityGraphRetriever { } Object arrValue = mapVertexToCollectionEntry(entityVertex, arrayElementType, element, edgeLabel, - entityExtInfo, isOwnedAttribute, edgeDirection); + entityExtInfo, isOwnedAttribute, edgeDirection, isMinExtInfo); if (arrValue != null) { arrValues.add(arrValue); @@ -711,7 +755,7 @@ public final class EntityGraphRetriever { private Object mapVertexToCollectionEntry(AtlasVertex entityVertex, AtlasType arrayElement, Object value, String edgeLabel, AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute, - AtlasRelationshipEdgeDirection edgeDirection) throws AtlasBaseException { + AtlasRelationshipEdgeDirection edgeDirection, final boolean isMinExtInfo) throws AtlasBaseException { Object ret = null; switch (arrayElement.getTypeCategory()) { @@ -726,11 +770,11 @@ public final class EntityGraphRetriever { break; case STRUCT: - ret = mapVertexToStruct(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo); + ret = mapVertexToStruct(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo, isMinExtInfo); break; case OBJECT_ID_TYPE: - ret = mapVertexToObjectId(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo, isOwnedAttribute, edgeDirection); + ret = mapVertexToObjectId(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo, isOwnedAttribute, edgeDirection, isMinExtInfo); break; default: @@ -790,7 +834,7 @@ public final class EntityGraphRetriever { private AtlasObjectId mapVertexToObjectId(AtlasVertex entityVertex, String edgeLabel, AtlasEdge edge, AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute, - AtlasRelationshipEdgeDirection edgeDirection) throws AtlasBaseException { + AtlasRelationshipEdgeDirection edgeDirection, final boolean isMinExtInfo) throws AtlasBaseException { AtlasObjectId ret = null; if (edge == null) { @@ -806,7 +850,13 @@ public final class EntityGraphRetriever { if (referenceVertex != null) { if (entityExtInfo != null && isOwnedAttribute) { - AtlasEntity entity = mapVertexToAtlasEntity(referenceVertex, entityExtInfo); + final AtlasEntity entity; + + if (isMinExtInfo) { + entity = mapVertexToAtlasEntityMin(referenceVertex, entityExtInfo); + } else { + entity = mapVertexToAtlasEntity(referenceVertex, entityExtInfo); + } if (entity != null) { ret = AtlasTypeUtil.getAtlasObjectId(entity); @@ -820,7 +870,7 @@ public final class EntityGraphRetriever { return ret; } - private AtlasStruct mapVertexToStruct(AtlasVertex entityVertex, String edgeLabel, AtlasEdge edge, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException { + private AtlasStruct mapVertexToStruct(AtlasVertex entityVertex, String edgeLabel, AtlasEdge edge, AtlasEntityExtInfo entityExtInfo, final boolean isMinExtInfo) throws AtlasBaseException { AtlasStruct ret = null; if (edge == null) { @@ -831,14 +881,14 @@ public final class EntityGraphRetriever { final AtlasVertex referenceVertex = edge.getInVertex(); ret = new AtlasStruct(getTypeName(referenceVertex)); - mapAttributes(referenceVertex, ret, entityExtInfo); + mapAttributes(referenceVertex, ret, entityExtInfo, isMinExtInfo); } return ret; } private Object getVertexAttribute(AtlasVertex vertex, AtlasAttribute attribute) throws AtlasBaseException { - return vertex != null && attribute != null ? mapVertexToAttribute(vertex, attribute, null) : null; + return vertex != null && attribute != null ? mapVertexToAttribute(vertex, attribute, null, false) : null; } private void mapRelationshipAttributes(AtlasVertex entityVertex, AtlasEntity entity) throws AtlasBaseException { http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java ---------------------------------------------------------------------- diff --git a/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java b/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java index 4b15992..fd331fa 100644 --- a/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java +++ b/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java @@ -18,18 +18,15 @@ package org.apache.atlas.web.rest; import org.apache.atlas.AtlasErrorCode; -import org.apache.atlas.EntityAuditEvent; -import org.apache.atlas.model.audit.EntityAuditEventV2; import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.TypeCategory; import org.apache.atlas.model.instance.AtlasClassification; import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo; import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo; +import org.apache.atlas.model.instance.AtlasEntityHeader; import org.apache.atlas.model.instance.ClassificationAssociateRequest; import org.apache.atlas.model.instance.EntityMutationResponse; import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef; -import org.apache.atlas.repository.audit.EntityAuditRepository; -import org.apache.atlas.repository.converters.AtlasInstanceConverter; import org.apache.atlas.repository.store.graph.AtlasEntityStore; import org.apache.atlas.repository.store.graph.v2.AtlasEntityStream; import org.apache.atlas.repository.store.graph.v2.EntityStream; @@ -42,22 +39,12 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.inject.Inject; import javax.inject.Singleton; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; +import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import java.util.ArrayList; @@ -74,24 +61,17 @@ import java.util.Map; @Singleton @Service public class EntityREST { - private static final Logger LOG = LoggerFactory.getLogger(EntityREST.class); private static final Logger PERF_LOG = AtlasPerfTracer.getPerfLogger("rest.EntityREST"); public static final String PREFIX_ATTR = "attr:"; - private final AtlasTypeRegistry typeRegistry; - private final AtlasEntityStore entitiesStore; - private final EntityAuditRepository auditRepository; - private final AtlasInstanceConverter instanceConverter; - + private final AtlasTypeRegistry typeRegistry; + private final AtlasEntityStore entitiesStore; @Inject - public EntityREST(AtlasTypeRegistry typeRegistry, AtlasEntityStore entitiesStore, - EntityAuditRepository auditRepository, AtlasInstanceConverter instanceConverter) { - this.typeRegistry = typeRegistry; - this.entitiesStore = entitiesStore; - this.auditRepository = auditRepository; - this.instanceConverter = instanceConverter; + public EntityREST(AtlasTypeRegistry typeRegistry, AtlasEntityStore entitiesStore) { + this.typeRegistry = typeRegistry; + this.entitiesStore = entitiesStore; } /** @@ -104,17 +84,43 @@ public class EntityREST { @Path("/guid/{guid}") @Consumes(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE) - public AtlasEntityWithExtInfo getById(@PathParam("guid") String guid) throws AtlasBaseException { + public AtlasEntityWithExtInfo getById(@PathParam("guid") String guid, @QueryParam("minExtInfo") @DefaultValue("false") boolean minExtInfo) throws AtlasBaseException { Servlets.validateQueryParamLength("guid", guid); AtlasPerfTracer perf = null; try { if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) { - perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.getById(" + guid + ")"); + perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.getById(" + guid + ", " + minExtInfo + " )"); } - return entitiesStore.getById(guid); + return entitiesStore.getById(guid, minExtInfo); + } finally { + AtlasPerfTracer.log(perf); + } + } + + /** + * Get entity header given its GUID. + * @param guid GUID for the entity + * @return AtlasEntity + * @throws AtlasBaseException + */ + @GET + @Path("/guid/{guid}/header") + @Consumes(Servlets.JSON_MEDIA_TYPE) + @Produces(Servlets.JSON_MEDIA_TYPE) + public AtlasEntityHeader getHeaderById(@PathParam("guid") String guid) throws AtlasBaseException { + Servlets.validateQueryParamLength("guid", guid); + + AtlasPerfTracer perf = null; + + try { + if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) { + perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.getHeaderById(" + guid + ")"); + } + + return entitiesStore.getHeaderById(guid); } finally { AtlasPerfTracer.log(perf); } @@ -141,7 +147,7 @@ public class EntityREST { @Path("/uniqueAttribute/type/{typeName}") @Consumes(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE) - public AtlasEntityWithExtInfo getByUniqueAttributes(@PathParam("typeName") String typeName, + public AtlasEntityWithExtInfo getByUniqueAttributes(@PathParam("typeName") String typeName, @QueryParam("minExtInfo") @DefaultValue("false") boolean minExtInfo, @Context HttpServletRequest servletRequest) throws AtlasBaseException { Servlets.validateQueryParamLength("typeName", typeName); @@ -158,7 +164,7 @@ public class EntityREST { validateUniqueAttribute(entityType, attributes); - return entitiesStore.getByUniqueAttributes(entityType, attributes); + return entitiesStore.getByUniqueAttributes(entityType, attributes, minExtInfo); } finally { AtlasPerfTracer.log(perf); } @@ -359,7 +365,7 @@ public class EntityREST { } } - /** + /** * Gets the list of classifications for a given entity represented by a guid. * @param guid globally unique identifier for the entity * @return a list of classifications for the given entity guid @@ -585,7 +591,7 @@ public class EntityREST { @Path("/bulk") @Consumes(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE) - public AtlasEntitiesWithExtInfo getByGuids(@QueryParam("guid") List<String> guids) throws AtlasBaseException { + public AtlasEntitiesWithExtInfo getByGuids(@QueryParam("guid") List<String> guids, @QueryParam("minExtInfo") @DefaultValue("false") boolean minExtInfo) throws AtlasBaseException { if (CollectionUtils.isNotEmpty(guids)) { for (String guid : guids) { Servlets.validateQueryParamLength("guid", guid); @@ -603,7 +609,7 @@ public class EntityREST { throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guids); } - return entitiesStore.getByIds(guids); + return entitiesStore.getByIds(guids, minExtInfo); } finally { AtlasPerfTracer.log(perf); } @@ -623,7 +629,7 @@ public class EntityREST { try { if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) { perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.createOrUpdate(entityCount=" + - (CollectionUtils.isEmpty(entities.getEntities()) ? 0 : entities.getEntities().size()) + ")"); + (CollectionUtils.isEmpty(entities.getEntities()) ? 0 : entities.getEntities().size()) + ")"); } EntityStream entityStream = new AtlasEntityStream(entities); @@ -693,38 +699,6 @@ public class EntityREST { } } - @GET - @Path("{guid}/audit") - @Consumes(Servlets.JSON_MEDIA_TYPE) - @Produces(Servlets.JSON_MEDIA_TYPE) - public List<EntityAuditEventV2> getAuditEvents(@PathParam("guid") String guid, @QueryParam("startKey") String startKey, - @QueryParam("count") @DefaultValue("100") short count) throws AtlasBaseException { - AtlasPerfTracer perf = null; - - try { - if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) { - perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.getAuditEvents(" + guid + ", " + startKey + ", " + count + ")"); - } - - List events = auditRepository.listEvents(guid, startKey, count); - List<EntityAuditEventV2> ret = new ArrayList<>(); - - for (Object event : events) { - if (event instanceof EntityAuditEventV2) { - ret.add((EntityAuditEventV2) event); - } else if (event instanceof EntityAuditEvent) { - ret.add(instanceConverter.toV2AuditEvent((EntityAuditEvent) event)); - } else { - LOG.warn("unknown entity-audit event type {}. Ignored", event != null ? event.getClass().getCanonicalName() : "null"); - } - } - - return ret; - } finally { - AtlasPerfTracer.log(perf); - } - } - private AtlasEntityType ensureEntityType(String typeName) throws AtlasBaseException { AtlasEntityType ret = typeRegistry.getEntityTypeByName(typeName); http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java ---------------------------------------------------------------------- diff --git a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java index 1a19415..ae9c34d 100644 --- a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java +++ b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java @@ -165,7 +165,7 @@ public class TestEntitiesREST { @Test(dependsOnMethods = "testCreateOrUpdateEntities") public void testGetEntities() throws Exception { - final AtlasEntitiesWithExtInfo response = entityREST.getByGuids(createdGuids); + final AtlasEntitiesWithExtInfo response = entityREST.getByGuids(createdGuids, false); final List<AtlasEntity> entities = response.getEntities(); Assert.assertNotNull(entities); http://git-wip-us.apache.org/repos/asf/atlas/blob/ddef7a30/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java ---------------------------------------------------------------------- diff --git a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java index bea86a3..78bd53c 100644 --- a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java +++ b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java @@ -99,7 +99,7 @@ public class TestEntityREST { @Test public void testGetEntityById() throws Exception { createTestEntity(); - AtlasEntityWithExtInfo response = entityREST.getById(dbEntity.getGuid()); + AtlasEntityWithExtInfo response = entityREST.getById(dbEntity.getGuid(), false); Assert.assertNotNull(response); Assert.assertNotNull(response.getEntity()); @@ -183,7 +183,7 @@ public class TestEntityREST { @Test(dependsOnMethods = "testAddAndGetClassification") public void testGetEntityWithAssociations() throws Exception { - AtlasEntityWithExtInfo entity = entityREST.getById(dbEntity.getGuid()); + AtlasEntityWithExtInfo entity = entityREST.getById(dbEntity.getGuid(), false); final List<AtlasClassification> retrievedClassifications = entity.getEntity().getClassifications(); Assert.assertNotNull(retrievedClassifications); @@ -315,7 +315,7 @@ public class TestEntityREST { Assert.assertEquals(response.getEntitiesByOperation(EntityMutations.EntityOperation.PARTIAL_UPDATE).get(0).getGuid(), dbGuid); //Get By unique attribute - AtlasEntityWithExtInfo entity = entityREST.getByUniqueAttributes(TestUtilsV2.DATABASE_TYPE, toHttpServletRequest(TestUtilsV2.NAME, updatedDBName)); + AtlasEntityWithExtInfo entity = entityREST.getByUniqueAttributes(TestUtilsV2.DATABASE_TYPE, false, toHttpServletRequest(TestUtilsV2.NAME, updatedDBName)); Assert.assertNotNull(entity); Assert.assertNotNull(entity.getEntity().getGuid()); Assert.assertEquals(entity.getEntity().getGuid(), dbGuid); @@ -340,7 +340,7 @@ public class TestEntityREST { Assert.assertEquals(response.getEntitiesByOperation(EntityMutations.EntityOperation.PARTIAL_UPDATE).get(0).getGuid(), dbGuid); //Get By unique attribute - AtlasEntityWithExtInfo entity = entityREST.getByUniqueAttributes(TestUtilsV2.DATABASE_TYPE, toHttpServletRequest(TestUtilsV2.NAME, updatedDBName)); + AtlasEntityWithExtInfo entity = entityREST.getByUniqueAttributes(TestUtilsV2.DATABASE_TYPE, false, toHttpServletRequest(TestUtilsV2.NAME, updatedDBName)); Assert.assertNotNull(entity); Assert.assertNotNull(entity.getEntity().getGuid()); Assert.assertEquals(entity.getEntity().getGuid(), dbGuid);
