http://git-wip-us.apache.org/repos/asf/atlas/blob/4823c8ed/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
----------------------------------------------------------------------
diff --git
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
deleted file mode 100644
index debb441..0000000
---
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
+++ /dev/null
@@ -1,1774 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * 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
- *
- * 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.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.atlas.repository.store.graph.v1;
-
-
-import org.apache.atlas.AtlasErrorCode;
-import org.apache.atlas.RequestContextV1;
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.TimeBoundary;
-import org.apache.atlas.model.TypeCategory;
-import org.apache.atlas.model.instance.AtlasClassification;
-import org.apache.atlas.model.instance.AtlasEntity;
-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.AtlasRelatedObjectId;
-import org.apache.atlas.model.instance.AtlasRelationship;
-import org.apache.atlas.model.instance.AtlasStruct;
-import org.apache.atlas.model.instance.EntityMutationResponse;
-import org.apache.atlas.model.instance.EntityMutations.EntityOperation;
-import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
-import
org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality;
-import org.apache.atlas.repository.Constants;
-import org.apache.atlas.repository.RepositoryException;
-import org.apache.atlas.repository.converters.AtlasInstanceConverter;
-import org.apache.atlas.repository.graph.GraphHelper;
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasGraph;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.repository.store.graph.AtlasRelationshipStore;
-import org.apache.atlas.type.AtlasArrayType;
-import org.apache.atlas.type.AtlasClassificationType;
-import org.apache.atlas.type.AtlasEntityType;
-import org.apache.atlas.type.AtlasMapType;
-import org.apache.atlas.type.AtlasStructType;
-import org.apache.atlas.type.AtlasStructType.AtlasAttribute;
-import
org.apache.atlas.type.AtlasStructType.AtlasAttribute.AtlasRelationshipEdgeDirection;
-import org.apache.atlas.type.AtlasType;
-import org.apache.atlas.type.AtlasTypeRegistry;
-import org.apache.atlas.type.AtlasTypeUtil;
-import org.apache.atlas.utils.AtlasJson;
-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.Component;
-
-import javax.inject.Inject;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static org.apache.atlas.model.TypeCategory.CLASSIFICATION;
-import static org.apache.atlas.model.instance.AtlasEntity.Status.DELETED;
-import static
org.apache.atlas.model.instance.AtlasRelatedObjectId.KEY_RELATIONSHIP_ATTRIBUTES;
-import static
org.apache.atlas.model.instance.EntityMutations.EntityOperation.CREATE;
-import static
org.apache.atlas.model.instance.EntityMutations.EntityOperation.DELETE;
-import static
org.apache.atlas.model.instance.EntityMutations.EntityOperation.PARTIAL_UPDATE;
-import static
org.apache.atlas.model.instance.EntityMutations.EntityOperation.UPDATE;
-import static
org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality.SET;
-import static org.apache.atlas.repository.Constants.ATTRIBUTE_KEY_PROPERTY_KEY;
-import static org.apache.atlas.repository.Constants.CLASSIFICATION_LABEL;
-import static org.apache.atlas.repository.Constants.STATE_PROPERTY_KEY;
-import static org.apache.atlas.repository.Constants.TRAIT_NAMES_PROPERTY_KEY;
-import static
org.apache.atlas.repository.Constants.ATTRIBUTE_INDEX_PROPERTY_KEY;
-import static
org.apache.atlas.repository.graph.GraphHelper.getCollectionElementsUsingRelationship;
-import static
org.apache.atlas.repository.graph.GraphHelper.getClassificationEdge;
-import static
org.apache.atlas.repository.graph.GraphHelper.getClassificationVertex;
-import static
org.apache.atlas.repository.graph.GraphHelper.getMapElementsProperty;
-import static org.apache.atlas.repository.graph.GraphHelper.getStatus;
-import static org.apache.atlas.repository.graph.GraphHelper.getTraitLabel;
-import static org.apache.atlas.repository.graph.GraphHelper.getTraitNames;
-import static org.apache.atlas.repository.graph.GraphHelper.getTypeName;
-import static org.apache.atlas.repository.graph.GraphHelper.getTypeNames;
-import static
org.apache.atlas.repository.graph.GraphHelper.isPropagationEnabled;
-import static org.apache.atlas.repository.graph.GraphHelper.isRelationshipEdge;
-import static org.apache.atlas.repository.graph.GraphHelper.string;
-import static
org.apache.atlas.repository.graph.GraphHelper.updateModificationMetadata;
-import static
org.apache.atlas.repository.store.graph.v1.AtlasGraphUtilsV1.getIdFromVertex;
-import static
org.apache.atlas.repository.store.graph.v1.AtlasGraphUtilsV1.isReference;
-import static
org.apache.atlas.type.AtlasStructType.AtlasAttribute.AtlasRelationshipEdgeDirection.IN;
-import static
org.apache.atlas.type.AtlasStructType.AtlasAttribute.AtlasRelationshipEdgeDirection.OUT;
-
-@Component
-public class EntityGraphMapper {
- private static final Logger LOG =
LoggerFactory.getLogger(EntityGraphMapper.class);
-
- private final GraphHelper graphHelper =
GraphHelper.getInstance();
- private final AtlasGraph graph;
- private final DeleteHandlerV1 deleteHandler;
- private final AtlasTypeRegistry typeRegistry;
- private final AtlasRelationshipStore relationshipStore;
- private final AtlasEntityChangeNotifier entityChangeNotifier;
- private final AtlasInstanceConverter instanceConverter;
- private final EntityGraphRetriever entityRetriever;
-
- @Inject
- public EntityGraphMapper(DeleteHandlerV1 deleteHandler, AtlasTypeRegistry
typeRegistry, AtlasGraph atlasGraph,
- AtlasRelationshipStore relationshipStore,
AtlasEntityChangeNotifier entityChangeNotifier,
- AtlasInstanceConverter instanceConverter) {
- this.deleteHandler = deleteHandler;
- this.typeRegistry = typeRegistry;
- this.graph = atlasGraph;
- this.relationshipStore = relationshipStore;
- this.entityChangeNotifier = entityChangeNotifier;
- this.instanceConverter = instanceConverter;
- this.entityRetriever = new EntityGraphRetriever(typeRegistry);
- }
-
- public AtlasVertex createVertex(AtlasEntity entity) {
- final String guid = UUID.randomUUID().toString();
- return createVertexWithGuid(entity, guid);
- }
-
- public AtlasVertex createVertexWithGuid(AtlasEntity entity, String guid) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> createVertex({})", entity.getTypeName());
- }
-
- AtlasEntityType entityType =
typeRegistry.getEntityTypeByName(entity.getTypeName());
-
- AtlasVertex ret = createStructVertex(entity);
-
- for (String superTypeName : entityType.getAllSuperTypes()) {
- AtlasGraphUtilsV1.addProperty(ret,
Constants.SUPER_TYPES_PROPERTY_KEY, superTypeName);
- }
-
- AtlasGraphUtilsV1.setProperty(ret, Constants.GUID_PROPERTY_KEY, guid);
- AtlasGraphUtilsV1.setProperty(ret, Constants.VERSION_PROPERTY_KEY,
getEntityVersion(entity));
-
- return ret;
- }
-
- public void updateSystemAttributes(AtlasVertex vertex, AtlasEntity entity)
{
- if (entity.getStatus() != null) {
- AtlasGraphUtilsV1.setProperty(vertex,
Constants.STATE_PROPERTY_KEY, entity.getStatus().name());
- }
-
- if (entity.getCreateTime() != null) {
- AtlasGraphUtilsV1.setProperty(vertex,
Constants.TIMESTAMP_PROPERTY_KEY, entity.getCreateTime().getTime());
- }
-
- if (entity.getUpdateTime() != null) {
- AtlasGraphUtilsV1.setProperty(vertex,
Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY,
entity.getUpdateTime().getTime());
- }
-
- if (StringUtils.isNotEmpty(entity.getCreatedBy())) {
- AtlasGraphUtilsV1.setProperty(vertex, Constants.CREATED_BY_KEY,
entity.getCreatedBy());
- }
-
- if (StringUtils.isNotEmpty(entity.getUpdatedBy())) {
- AtlasGraphUtilsV1.setProperty(vertex, Constants.MODIFIED_BY_KEY,
entity.getUpdatedBy());
- }
- }
-
- public EntityMutationResponse
mapAttributesAndClassifications(EntityMutationContext context, final boolean
isPartialUpdate, final boolean replaceClassifications) throws
AtlasBaseException {
- EntityMutationResponse resp = new EntityMutationResponse();
-
- Collection<AtlasEntity> createdEntities = context.getCreatedEntities();
- Collection<AtlasEntity> updatedEntities = context.getUpdatedEntities();
-
- if (CollectionUtils.isNotEmpty(createdEntities)) {
- for (AtlasEntity createdEntity : createdEntities) {
- String guid = createdEntity.getGuid();
- AtlasVertex vertex = context.getVertex(guid);
- AtlasEntityType entityType = context.getType(guid);
-
- compactAttributes(createdEntity);
-
- mapRelationshipAttributes(createdEntity, vertex, CREATE,
context);
-
- mapAttributes(createdEntity, vertex, CREATE, context);
-
- resp.addEntity(CREATE, constructHeader(createdEntity,
entityType, vertex));
- addClassifications(context, guid,
createdEntity.getClassifications());
- }
- }
-
- if (CollectionUtils.isNotEmpty(updatedEntities)) {
- for (AtlasEntity updatedEntity : updatedEntities) {
- String guid = updatedEntity.getGuid();
- AtlasVertex vertex = context.getVertex(guid);
- AtlasEntityType entityType = context.getType(guid);
-
- compactAttributes(updatedEntity);
-
- mapRelationshipAttributes(updatedEntity, vertex, UPDATE,
context);
-
- mapAttributes(updatedEntity, vertex, UPDATE, context);
-
- if (isPartialUpdate) {
- resp.addEntity(PARTIAL_UPDATE,
constructHeader(updatedEntity, entityType, vertex));
- } else {
- resp.addEntity(UPDATE, constructHeader(updatedEntity,
entityType, vertex));
- }
-
- if ( replaceClassifications ) {
- deleteClassifications(guid);
- addClassifications(context, guid,
updatedEntity.getClassifications());
- }
- }
- }
-
- RequestContextV1 req = RequestContextV1.get();
-
- for (AtlasObjectId entity : req.getDeletedEntities()) {
- resp.addEntity(DELETE, entity);
- }
-
- for (AtlasObjectId entity : req.getUpdatedEntities()) {
- if (isPartialUpdate) {
- resp.addEntity(PARTIAL_UPDATE, entity);
- }
- else {
- resp.addEntity(UPDATE, entity);
- }
- }
-
- return resp;
- }
-
- private AtlasVertex createStructVertex(AtlasStruct struct) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> createStructVertex({})", struct.getTypeName());
- }
-
- final AtlasVertex ret = graph.addVertex();
-
- AtlasGraphUtilsV1.setProperty(ret, Constants.ENTITY_TYPE_PROPERTY_KEY,
struct.getTypeName());
- AtlasGraphUtilsV1.setProperty(ret, Constants.STATE_PROPERTY_KEY,
AtlasEntity.Status.ACTIVE.name());
- AtlasGraphUtilsV1.setProperty(ret, Constants.TIMESTAMP_PROPERTY_KEY,
RequestContextV1.get().getRequestTime());
- AtlasGraphUtilsV1.setProperty(ret,
Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY,
RequestContextV1.get().getRequestTime());
- AtlasGraphUtilsV1.setProperty(ret, Constants.CREATED_BY_KEY,
RequestContextV1.get().getUser());
- GraphHelper.setProperty(ret, Constants.MODIFIED_BY_KEY,
RequestContextV1.get().getUser());
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== createStructVertex({})", struct.getTypeName());
- }
-
- return ret;
- }
-
- private AtlasVertex createClassificationVertex(AtlasClassification
classification) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> createVertex({})", classification.getTypeName());
- }
-
- AtlasClassificationType classificationType =
typeRegistry.getClassificationTypeByName(classification.getTypeName());
-
- AtlasVertex ret = createStructVertex(classification);
-
- AtlasGraphUtilsV1.addProperty(ret, Constants.SUPER_TYPES_PROPERTY_KEY,
classificationType.getAllSuperTypes());
- AtlasGraphUtilsV1.setProperty(ret,
Constants.CLASSIFICATION_ENTITY_GUID, classification.getEntityGuid());
-
- return ret;
- }
-
-
- private void mapAttributes(AtlasStruct struct, AtlasVertex vertex,
EntityOperation op, EntityMutationContext context) throws AtlasBaseException {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> mapAttributes({}, {})", op, struct.getTypeName());
- }
-
- if (MapUtils.isNotEmpty(struct.getAttributes())) {
- AtlasStructType structType = getStructType(struct.getTypeName());
-
- if (op.equals(CREATE)) {
- for (AtlasAttribute attribute :
structType.getAllAttributes().values()) {
- Object attrValue =
struct.getAttribute(attribute.getName());
-
- mapAttribute(attribute, attrValue, vertex, op, context);
- }
-
- } else if (op.equals(UPDATE)) {
- for (String attrName : struct.getAttributes().keySet()) {
- AtlasAttribute attribute =
structType.getAttribute(attrName);
-
- if (attribute != null) {
- Object attrValue = struct.getAttribute(attrName);
-
- mapAttribute(attribute, attrValue, vertex, op,
context);
- } else {
- LOG.warn("mapAttributes(): invalid attribute {}.{}.
Ignored..", struct.getTypeName(), attrName);
- }
- }
- }
-
- updateModificationMetadata(vertex);
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== mapAttributes({}, {})", op, struct.getTypeName());
- }
- }
-
- private void mapRelationshipAttributes(AtlasEntity entity, AtlasVertex
vertex, EntityOperation op,
- EntityMutationContext context)
throws AtlasBaseException {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> mapRelationshipAttributes({}, {})", op,
entity.getTypeName());
- }
-
- if (MapUtils.isNotEmpty(entity.getRelationshipAttributes())) {
- AtlasEntityType entityType = getEntityType(entity.getTypeName());
-
- if (op.equals(CREATE)) {
- for (AtlasAttribute attribute :
entityType.getRelationshipAttributes().values()) {
- Object attrValue =
entity.getRelationshipAttribute(attribute.getName());
-
- mapAttribute(attribute, attrValue, vertex, op, context);
- }
-
- } else if (op.equals(UPDATE)) {
- // relationship attributes mapping
- for (AtlasAttribute attribute :
entityType.getRelationshipAttributes().values()) {
- if (attribute != null &&
entity.hasRelationshipAttribute(attribute.getName())) {
- Object attrValue =
entity.getRelationshipAttribute(attribute.getName());
-
- mapAttribute(attribute, attrValue, vertex, op,
context);
- }
- }
- }
-
- updateModificationMetadata(vertex);
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== mapRelationshipAttributes({}, {})", op,
entity.getTypeName());
- }
- }
-
- private void mapAttribute(AtlasAttribute attribute, Object attrValue,
AtlasVertex vertex, EntityOperation op, EntityMutationContext context) throws
AtlasBaseException {
- if (attrValue == null) {
- AtlasAttributeDef attributeDef = attribute.getAttributeDef();
- AtlasType attrType = attribute.getAttributeType();
- if (attrType.getTypeCategory() == TypeCategory.PRIMITIVE) {
- if (attributeDef.getDefaultValue() != null) {
- attrValue =
attrType.createDefaultValue(attributeDef.getDefaultValue());
- } else {
- if (attribute.getAttributeDef().getIsOptional()) {
- attrValue = attrType.createOptionalDefaultValue();
- } else {
- attrValue = attrType.createDefaultValue();
- }
- }
- }
- }
-
- AttributeMutationContext ctx = new AttributeMutationContext(op,
vertex, attribute, attrValue);
-
- mapToVertexByTypeCategory(ctx, context);
- }
-
- private Object mapToVertexByTypeCategory(AttributeMutationContext ctx,
EntityMutationContext context) throws AtlasBaseException {
- if (ctx.getOp() == CREATE && ctx.getValue() == null) {
- return null;
- }
-
- switch (ctx.getAttrType().getTypeCategory()) {
- case PRIMITIVE:
- case ENUM:
- return mapPrimitiveValue(ctx);
-
- case STRUCT: {
- String edgeLabel =
AtlasGraphUtilsV1.getEdgeLabel(ctx.getVertexProperty());
- AtlasEdge currentEdge =
graphHelper.getEdgeForLabel(ctx.getReferringVertex(), edgeLabel);
- AtlasEdge edge = currentEdge != null ? currentEdge :
null;
-
- ctx.setExistingEdge(edge);
-
- AtlasEdge newEdge = mapStructValue(ctx, context);
-
- if (currentEdge != null && !currentEdge.equals(newEdge)) {
- deleteHandler.deleteEdgeReference(currentEdge,
ctx.getAttrType().getTypeCategory(), false, true, ctx.getReferringVertex());
- }
-
- return newEdge;
- }
-
- case OBJECT_ID_TYPE: {
- AtlasRelationshipEdgeDirection edgeDirection =
ctx.getAttribute().getRelationshipEdgeDirection();
- String edgeLabel =
ctx.getAttribute().getRelationshipEdgeLabel();
-
- // if relationshipDefs doesn't exist, use legacy way of
finding edge label.
- if (StringUtils.isEmpty(edgeLabel)) {
- edgeLabel =
AtlasGraphUtilsV1.getEdgeLabel(ctx.getVertexProperty());
- }
-
- String relationshipGuid =
getRelationshipGuid(ctx.getValue());
- AtlasEdge currentEdge;
-
- // if relationshipGuid is assigned in AtlasRelatedObjectId use
it to fetch existing AtlasEdge
- if (StringUtils.isNotEmpty(relationshipGuid) &&
!context.isImport()) {
- currentEdge = graphHelper.getEdgeForGUID(relationshipGuid);
- } else {
- currentEdge =
graphHelper.getEdgeForLabel(ctx.getReferringVertex(), edgeLabel, edgeDirection);
- }
-
- AtlasEdge newEdge = null;
-
- if (ctx.getValue() != null) {
- AtlasEntityType instanceType =
getInstanceType(ctx.getValue());
- AtlasEdge edge = currentEdge != null ?
currentEdge : null;
-
- ctx.setElementType(instanceType);
- ctx.setExistingEdge(edge);
-
- newEdge = mapObjectIdValueUsingRelationship(ctx, context);
-
- // legacy case update inverse attribute
- if (ctx.getAttribute().getInverseRefAttribute() != null) {
- // Update the inverse reference using relationship on
the target entity
- addInverseReference(context,
ctx.getAttribute().getInverseRefAttribute(), newEdge,
getRelationshipAttributes(ctx.getValue()));
- }
- }
-
- // created new relationship,
- // record entity update on both vertices of the new
relationship
- if (currentEdge == null && newEdge != null) {
-
- // based on relationship edge direction record update only
on attribute vertex
- if (edgeDirection == IN) {
- recordEntityUpdate(newEdge.getOutVertex());
-
- } else {
- recordEntityUpdate(newEdge.getInVertex());
- }
- }
-
- // update references, if current and new edge don't match
- // record entity update on new reference and delete(edge) old
reference.
- if (currentEdge != null && !currentEdge.equals(newEdge)) {
-
- //record entity update on new edge
- if (isRelationshipEdge(newEdge)) {
- AtlasVertex attrVertex =
context.getDiscoveryContext().getResolvedEntityVertex(getGuid(ctx.getValue()));
-
- recordEntityUpdate(attrVertex);
- }
-
- //delete old reference
- deleteHandler.deleteEdgeReference(currentEdge,
ctx.getAttrType().getTypeCategory(), ctx.getAttribute().isOwnedRef(),
- true,
ctx.getAttribute().getRelationshipEdgeDirection(), ctx.getReferringVertex());
- }
-
- return newEdge;
- }
-
- case MAP:
- return mapMapValue(ctx, context);
-
- case ARRAY:
- return mapArrayValue(ctx, context);
-
- default:
- throw new
AtlasBaseException(AtlasErrorCode.TYPE_CATEGORY_INVALID,
ctx.getAttrType().getTypeCategory().name());
- }
- }
-
- private void addInverseReference(EntityMutationContext context,
AtlasAttribute inverseAttribute, AtlasEdge edge, Map<String, Object>
relationshipAttributes) throws AtlasBaseException {
- AtlasStructType inverseType = inverseAttribute.getDefinedInType();
- AtlasVertex inverseVertex = edge.getInVertex();
- String inverseEdgeLabel =
inverseAttribute.getRelationshipEdgeLabel();
- AtlasEdge inverseEdge =
graphHelper.getEdgeForLabel(inverseVertex, inverseEdgeLabel);
- String propertyName =
AtlasGraphUtilsV1.getQualifiedAttributePropertyKey(inverseType,
inverseAttribute.getName());
-
- // create new inverse reference
- AtlasEdge newEdge = createInverseReferenceUsingRelationship(context,
inverseAttribute, edge, relationshipAttributes);
-
- boolean inverseUpdated = true;
- switch (inverseAttribute.getAttributeType().getTypeCategory()) {
- case OBJECT_ID_TYPE:
- if (inverseEdge != null) {
- if (!inverseEdge.equals(newEdge)) {
- // Disconnect old reference
- deleteHandler.deleteEdgeReference(inverseEdge,
inverseAttribute.getAttributeType().getTypeCategory(),
-
inverseAttribute.isOwnedRef(), true, inverseVertex);
- }
- else {
- // Edge already exists for this attribute between these
vertices.
- inverseUpdated = false;
- }
- }
- break;
- case ARRAY:
- // Add edge ID to property value
- List<String> elements = inverseVertex.getProperty(propertyName,
List.class);
- if (newEdge != null && elements == null) {
- elements = new ArrayList<>();
- elements.add(newEdge.getId().toString());
- inverseVertex.setProperty(propertyName, elements);
- }
- else {
- if (newEdge != null &&
!elements.contains(newEdge.getId().toString())) {
- elements.add(newEdge.getId().toString());
- inverseVertex.setProperty(propertyName, elements);
- }
- else {
- // Property value list already contains the edge ID.
- inverseUpdated = false;
- }
- }
- break;
- default:
- break;
- }
-
- if (inverseUpdated) {
- RequestContextV1 requestContext = RequestContextV1.get();
-
- if
(!requestContext.isDeletedEntity(GraphHelper.getGuid(inverseVertex))) {
- updateModificationMetadata(inverseVertex);
-
-
requestContext.recordEntityUpdate(entityRetriever.toAtlasObjectId(inverseVertex));
- }
- }
- }
-
- private AtlasEdge
createInverseReferenceUsingRelationship(EntityMutationContext context,
AtlasAttribute inverseAttribute, AtlasEdge edge, Map<String, Object>
relationshipAttributes) throws AtlasBaseException {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> createInverseReferenceUsingRelationship()");
- }
-
- String inverseAttributeName = inverseAttribute.getName();
- AtlasType inverseAttributeType =
inverseAttribute.getDefinedInType();
- AtlasVertex inverseVertex = edge.getInVertex();
- AtlasVertex vertex = edge.getOutVertex();
- AtlasEdge ret;
-
- if (inverseAttributeType instanceof AtlasEntityType) {
- AtlasEntityType entityType = (AtlasEntityType)
inverseAttributeType;
-
- if (entityType.hasRelationshipAttribute(inverseAttributeName)) {
- String relationshipName =
graphHelper.getRelationshipDefName(inverseVertex, entityType,
inverseAttributeName);
-
- ret = getOrCreateRelationship(inverseVertex, vertex,
relationshipName, relationshipAttributes);
-
- } else {
- if (LOG.isDebugEnabled()) {
- LOG.debug("No RelationshipDef defined between {} and {} on
attribute: {}", inverseAttributeType,
-
AtlasGraphUtilsV1.getTypeName(vertex), inverseAttributeName);
- }
- // if no RelationshipDef found, use legacy way to create edges
- ret = createInverseReference(inverseAttribute,
(AtlasStructType) inverseAttributeType, inverseVertex, vertex);
- }
- } else {
- // inverseAttribute not of type AtlasEntityType, use legacy way to
create edges
- ret = createInverseReference(inverseAttribute, (AtlasStructType)
inverseAttributeType, inverseVertex, vertex);
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== createInverseReferenceUsingRelationship()");
- }
-
- updateRelationshipGuidForImport(context, inverseAttributeName,
inverseVertex, ret);
-
- return ret;
- }
-
- private void updateRelationshipGuidForImport(EntityMutationContext
context, String inverseAttributeName, AtlasVertex inverseVertex, AtlasEdge
edge) throws AtlasBaseException {
- if (!context.isImport()) {
- return;
- }
-
- String parentGuid = GraphHelper.getGuid(inverseVertex);
- if(StringUtils.isEmpty(parentGuid)) {
- return;
- }
-
- AtlasEntity entity = context.getCreatedOrUpdatedEntity(parentGuid);
- if(entity == null) {
- return;
- }
-
- String parentRelationshipGuid =
getRelationshipGuid(entity.getRelationshipAttribute(inverseAttributeName));
- if(StringUtils.isEmpty(parentRelationshipGuid)) {
- return;
- }
-
- AtlasGraphUtilsV1.setProperty(edge,
Constants.RELATIONSHIP_GUID_PROPERTY_KEY, parentRelationshipGuid);
- }
-
- // legacy method to create edges for inverse reference
- private AtlasEdge createInverseReference(AtlasAttribute inverseAttribute,
AtlasStructType inverseAttributeType,
- AtlasVertex inverseVertex,
AtlasVertex vertex) throws AtlasBaseException {
-
- String propertyName =
AtlasGraphUtilsV1.getQualifiedAttributePropertyKey(inverseAttributeType,
inverseAttribute.getName());
- String inverseEdgeLabel = AtlasGraphUtilsV1.getEdgeLabel(propertyName);
- AtlasEdge ret;
-
- try {
- ret = graphHelper.getOrCreateEdge(inverseVertex, vertex,
inverseEdgeLabel);
-
- } catch (RepositoryException e) {
- throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, e);
- }
-
- return ret;
- }
-
- private Object mapPrimitiveValue(AttributeMutationContext ctx) {
- AtlasGraphUtilsV1.setProperty(ctx.getReferringVertex(),
ctx.getVertexProperty(), ctx.getValue());
-
- return ctx.getValue();
- }
-
- private AtlasEdge mapStructValue(AttributeMutationContext ctx,
EntityMutationContext context) throws AtlasBaseException {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> mapStructValue({})", ctx);
- }
-
- AtlasEdge ret = null;
-
- if (ctx.getCurrentEdge() != null) {
- AtlasStruct structVal = null;
- if (ctx.getValue() instanceof AtlasStruct) {
- structVal = (AtlasStruct)ctx.getValue();
- } else if (ctx.getValue() instanceof Map) {
- structVal = new AtlasStruct(ctx.getAttrType().getTypeName(),
(Map) AtlasTypeUtil.toStructAttributes((Map)ctx.getValue()));
- }
-
- if (structVal != null) {
- updateVertex(structVal, ctx.getCurrentEdge().getInVertex(),
context);
- }
-
- ret = ctx.getCurrentEdge();
- } else if (ctx.getValue() != null) {
- String edgeLabel =
AtlasGraphUtilsV1.getEdgeLabel(ctx.getVertexProperty());
-
- AtlasStruct structVal = null;
- if (ctx.getValue() instanceof AtlasStruct) {
- structVal = (AtlasStruct) ctx.getValue();
- } else if (ctx.getValue() instanceof Map) {
- structVal = new AtlasStruct(ctx.getAttrType().getTypeName(),
(Map) AtlasTypeUtil.toStructAttributes((Map)ctx.getValue()));
- }
-
- if (structVal != null) {
- ret = createVertex(structVal, ctx.getReferringVertex(),
edgeLabel, context);
- }
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== mapStructValue({})", ctx);
- }
-
- return ret;
- }
-
- private AtlasEdge mapObjectIdValue(AttributeMutationContext ctx,
EntityMutationContext context) throws AtlasBaseException {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> mapObjectIdValue({})", ctx);
- }
-
- AtlasEdge ret = null;
-
- String guid = getGuid(ctx.getValue());
-
- AtlasVertex entityVertex =
context.getDiscoveryContext().getResolvedEntityVertex(guid);
-
- if (entityVertex == null) {
- AtlasObjectId objId = getObjectId(ctx.getValue());
-
- if (objId != null) {
- entityVertex =
context.getDiscoveryContext().getResolvedEntityVertex(objId);
- }
- }
-
- if (entityVertex == null) {
- throw new AtlasBaseException(AtlasErrorCode.INVALID_OBJECT_ID,
(ctx.getValue() == null ? null : ctx.getValue().toString()));
- }
-
- if (ctx.getCurrentEdge() != null) {
- ret = updateEdge(ctx.getAttributeDef(), ctx.getValue(),
ctx.getCurrentEdge(), entityVertex);
- } else if (ctx.getValue() != null) {
- String edgeLabel =
AtlasGraphUtilsV1.getEdgeLabel(ctx.getVertexProperty());
-
- try {
- ret = graphHelper.getOrCreateEdge(ctx.getReferringVertex(),
entityVertex, edgeLabel);
- } catch (RepositoryException e) {
- throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, e);
- }
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== mapObjectIdValue({})", ctx);
- }
-
- return ret;
- }
-
- private AtlasEdge
mapObjectIdValueUsingRelationship(AttributeMutationContext ctx,
EntityMutationContext context) throws AtlasBaseException {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> mapObjectIdValueUsingRelationship({})", ctx);
- }
-
- AtlasVertex attributeVertex =
context.getDiscoveryContext().getResolvedEntityVertex(getGuid(ctx.getValue()));
- AtlasVertex entityVertex = ctx.getReferringVertex();
- AtlasEdge ret;
-
- if (attributeVertex == null) {
- AtlasObjectId objectId = getObjectId(ctx.getValue());
-
- attributeVertex = (objectId != null) ?
context.getDiscoveryContext().getResolvedEntityVertex(objectId) : null;
- }
-
- if (attributeVertex == null) {
- if(context.isImport()) {
- return null;
- }
-
- throw new AtlasBaseException(AtlasErrorCode.INVALID_OBJECT_ID,
(ctx.getValue() == null ? null : ctx.getValue().toString()));
- }
-
- String attributeName = ctx.getAttribute().getName();
- AtlasType type =
typeRegistry.getType(AtlasGraphUtilsV1.getTypeName(entityVertex));
-
- AtlasRelationshipEdgeDirection edgeDirection =
ctx.getAttribute().getRelationshipEdgeDirection();
- String edgeLabel =
ctx.getAttribute().getRelationshipEdgeLabel();
-
- if (type instanceof AtlasEntityType) {
- AtlasEntityType entityType = (AtlasEntityType) type;
-
- // use relationship to create/update edges
- if (entityType.hasRelationshipAttribute(attributeName)) {
- Map<String, Object> relationshipAttributes =
getRelationshipAttributes(ctx.getValue());
-
- if (ctx.getCurrentEdge() != null) {
- ret = updateRelationship(ctx.getCurrentEdge(),
entityVertex, attributeVertex, edgeDirection, relationshipAttributes);
-
- } else {
- String relationshipName =
graphHelper.getRelationshipDefName(entityVertex, entityType, attributeName);
- AtlasVertex fromVertex;
- AtlasVertex toVertex;
-
- if (edgeDirection == IN) {
- fromVertex = attributeVertex;
- toVertex = entityVertex;
-
- } else {
- fromVertex = entityVertex;
- toVertex = attributeVertex;
- }
- boolean relationshipExists =
isRelationshipExists(fromVertex, toVertex, edgeLabel);
-
- ret = getOrCreateRelationship(fromVertex, toVertex,
relationshipName, relationshipAttributes);
-
- // for import use the relationship guid provided
- if (context.isImport()) {
- String relationshipGuid =
getRelationshipGuid(ctx.getValue());
- if(!StringUtils.isEmpty(relationshipGuid)) {
- AtlasGraphUtilsV1.setProperty(ret,
Constants.RELATIONSHIP_GUID_PROPERTY_KEY, relationshipGuid);
- }
- }
-
- // if relationship did not exist before and new
relationship was created
- // record entity update on both relationship vertices
- if (!relationshipExists) {
- recordEntityUpdate(attributeVertex);
- }
- }
- } else {
- // use legacy way to create/update edges
- if (LOG.isDebugEnabled()) {
- LOG.debug("No RelationshipDef defined between {} and {} on
attribute: {}", getTypeName(entityVertex),
- getTypeName(attributeVertex), attributeName);
- }
-
- ret = mapObjectIdValue(ctx, context);
- }
-
- } else {
- // if type is StructType having objectid as attribute
- ret = mapObjectIdValue(ctx, context);
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== mapObjectIdValueUsingRelationship({})", ctx);
- }
-
- return ret;
- }
-
- private Map<String, Object> mapMapValue(AttributeMutationContext ctx,
EntityMutationContext context) throws AtlasBaseException {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> mapMapValue({})", ctx);
- }
-
- Map<Object, Object> newVal = (Map<Object, Object>) ctx.getValue();
- Map<String, Object> newMap = new HashMap<>();
- AtlasMapType mapType = (AtlasMapType) ctx.getAttrType();
- AtlasAttribute attribute = ctx.getAttribute();
- Map<String, Object> currentMap = getMapElementsProperty(mapType,
ctx.getReferringVertex(), ctx.getVertexProperty(), attribute);
- boolean isReference = isReference(mapType.getValueType());
-
- if (MapUtils.isNotEmpty(newVal)) {
- String propertyName = ctx.getVertexProperty();
-
- if (isReference) {
- for (Map.Entry<Object, Object> entry : newVal.entrySet()) {
- String key = entry.getKey().toString();
- AtlasEdge existingEdge = getEdgeIfExists(mapType,
currentMap, key);
-
- AttributeMutationContext mapCtx = new
AttributeMutationContext(ctx.getOp(), ctx.getReferringVertex(), attribute,
entry.getValue(),
-
propertyName, mapType.getValueType(), existingEdge);
- // Add/Update/Remove property value
- Object newEntry = mapCollectionElementsToVertex(mapCtx,
context);
-
- if (newEntry instanceof AtlasEdge) {
- AtlasEdge edge = (AtlasEdge) newEntry;
-
- edge.setProperty(ATTRIBUTE_KEY_PROPERTY_KEY, key);
-
- // If value type indicates this attribute is a
reference, and the attribute has an inverse reference attribute,
- // update the inverse reference value.
- AtlasAttribute inverseRefAttribute =
attribute.getInverseRefAttribute();
-
- if (inverseRefAttribute != null) {
- addInverseReference(context, inverseRefAttribute,
edge, getRelationshipAttributes(ctx.getValue()));
- }
-
- updateInConsistentOwnedMapVertices(ctx, mapType,
newEntry);
-
- newMap.put(key, newEntry);
- }
- }
-
- Map<String, Object> finalMap =
removeUnusedMapEntries(attribute, ctx.getReferringVertex(), currentMap, newMap);
- newMap.putAll(finalMap);
- } else {
- // primitive type map
- ctx.getReferringVertex().setProperty(propertyName, new
HashMap<>(newVal));
-
- newVal.forEach((key, value) -> newMap.put(key.toString(),
value));
- }
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== mapMapValue({})", ctx);
- }
-
- return newMap;
- }
-
- public List mapArrayValue(AttributeMutationContext ctx,
EntityMutationContext context) throws AtlasBaseException {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> mapArrayValue({})", ctx);
- }
-
- AtlasAttribute attribute = ctx.getAttribute();
- List newElements = (List) ctx.getValue();
- AtlasArrayType arrType = (AtlasArrayType)
attribute.getAttributeType();
- AtlasType elementType = arrType.getElementType();
- boolean isReference = isReference(elementType);
- AtlasAttribute inverseRefAttribute =
attribute.getInverseRefAttribute();
- Cardinality cardinality =
attribute.getAttributeDef().getCardinality();
- List<Object> newElementsCreated = new ArrayList<>();
- List<Object> currentElements;
-
- if (isReference) {
- currentElements = (List)
getCollectionElementsUsingRelationship(ctx.getReferringVertex(), attribute);
- } else {
- currentElements = (List) getArrayElementsProperty(elementType,
ctx.getReferringVertex(), ctx.getVertexProperty());
- }
-
- if (CollectionUtils.isNotEmpty(newElements)) {
- if (cardinality == SET) {
- newElements = (List)
newElements.stream().distinct().collect(Collectors.toList());
- }
-
- for (int index = 0; index < newElements.size(); index++) {
- AtlasEdge existingEdge =
getEdgeAt(currentElements, index, elementType);
- AttributeMutationContext arrCtx = new
AttributeMutationContext(ctx.getOp(), ctx.getReferringVertex(),
ctx.getAttribute(), newElements.get(index),
-
ctx.getVertexProperty(), elementType, existingEdge);
-
- Object newEntry = mapCollectionElementsToVertex(arrCtx,
context);
-
- if (isReference && newEntry != null && newEntry instanceof
AtlasEdge && inverseRefAttribute != null) {
- // Update the inverse reference value.
- AtlasEdge newEdge = (AtlasEdge) newEntry;
-
- addInverseReference(context, inverseRefAttribute, newEdge,
getRelationshipAttributes(ctx.getValue()));
- }
-
- if(newEntry != null) {
- newElementsCreated.add(newEntry);
- }
- }
- }
-
- if (isReference) {
- List<AtlasEdge> additionalEdges =
removeUnusedArrayEntries(attribute, (List) currentElements, (List)
newElementsCreated, ctx.getReferringVertex());
- newElementsCreated.addAll(additionalEdges);
- }
-
- // add index to attributes of array type
- for (int index = 0; index < newElementsCreated.size(); index++) {
- Object element = newElementsCreated.get(index);
-
- if (element instanceof AtlasEdge) {
- AtlasGraphUtilsV1.setProperty((AtlasEdge) element,
ATTRIBUTE_INDEX_PROPERTY_KEY, index);
- }
- }
-
- // for dereference on way out
- setArrayElementsProperty(elementType, ctx.getReferringVertex(),
ctx.getVertexProperty(), newElementsCreated);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== mapArrayValue({})", ctx);
- }
-
- return newElementsCreated;
- }
-
- private AtlasEdge createVertex(AtlasStruct struct, AtlasVertex
referringVertex, String edgeLabel, EntityMutationContext context) throws
AtlasBaseException {
- AtlasVertex vertex = createStructVertex(struct);
-
- mapAttributes(struct, vertex, CREATE, context);
-
- try {
- //TODO - Map directly in AtlasGraphUtilsV1
- return graphHelper.getOrCreateEdge(referringVertex, vertex,
edgeLabel);
- } catch (RepositoryException e) {
- throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, e);
- }
- }
-
- private void updateVertex(AtlasStruct struct, AtlasVertex vertex,
EntityMutationContext context) throws AtlasBaseException {
- mapAttributes(struct, vertex, UPDATE, context);
- }
-
- private Long getEntityVersion(AtlasEntity entity) {
- Long ret = entity != null ? entity.getVersion() : null;
- return (ret != null) ? ret : 0;
- }
-
- private AtlasStructType getStructType(String typeName) throws
AtlasBaseException {
- AtlasType objType = typeRegistry.getType(typeName);
-
- if (!(objType instanceof AtlasStructType)) {
- throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID,
typeName);
- }
-
- return (AtlasStructType)objType;
- }
-
- private AtlasEntityType getEntityType(String typeName) throws
AtlasBaseException {
- AtlasType objType = typeRegistry.getType(typeName);
-
- if (!(objType instanceof AtlasEntityType)) {
- throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID,
typeName);
- }
-
- return (AtlasEntityType)objType;
- }
-
- private Object mapCollectionElementsToVertex(AttributeMutationContext ctx,
EntityMutationContext context) throws AtlasBaseException {
- switch(ctx.getAttrType().getTypeCategory()) {
- case PRIMITIVE:
- case ENUM:
- case MAP:
- case ARRAY:
- return ctx.getValue();
-
- case STRUCT:
- return mapStructValue(ctx, context);
-
- case OBJECT_ID_TYPE:
- AtlasEntityType instanceType = getInstanceType(ctx.getValue());
- ctx.setElementType(instanceType);
- return mapObjectIdValueUsingRelationship(ctx, context);
-
- default:
- throw new
AtlasBaseException(AtlasErrorCode.TYPE_CATEGORY_INVALID,
ctx.getAttrType().getTypeCategory().name());
- }
- }
-
- private static AtlasObjectId getObjectId(Object val) throws
AtlasBaseException {
- if (val != null) {
- if ( val instanceof AtlasObjectId) {
- return ((AtlasObjectId) val);
- } else if (val instanceof Map) {
- AtlasObjectId ret = new AtlasObjectId((Map)val);
-
- if (AtlasTypeUtil.isValid(ret)) {
- return ret;
- }
- }
-
- throw new AtlasBaseException(AtlasErrorCode.INVALID_OBJECT_ID,
val.toString());
- }
-
- return null;
- }
-
- private static String getGuid(Object val) throws AtlasBaseException {
- if (val != null) {
- if ( val instanceof AtlasObjectId) {
- return ((AtlasObjectId) val).getGuid();
- } else if (val instanceof Map) {
- Object guidVal = ((Map)val).get(AtlasObjectId.KEY_GUID);
-
- return guidVal != null ? guidVal.toString() : null;
- }
- }
-
- return null;
- }
-
- private static Map<String, Object> getRelationshipAttributes(Object val)
throws AtlasBaseException {
- if (val instanceof AtlasRelatedObjectId) {
- AtlasStruct relationshipStruct = ((AtlasRelatedObjectId)
val).getRelationshipAttributes();
-
- return (relationshipStruct != null) ?
relationshipStruct.getAttributes() : null;
- } else if (val instanceof Map) {
- Object relationshipStruct = ((Map)
val).get(KEY_RELATIONSHIP_ATTRIBUTES);
-
- if (relationshipStruct instanceof Map) {
- return AtlasTypeUtil.toStructAttributes(((Map)
relationshipStruct));
- }
- }
-
- return null;
- }
-
- private static String getRelationshipGuid(Object val) throws
AtlasBaseException {
- if (val instanceof AtlasRelatedObjectId) {
- return ((AtlasRelatedObjectId) val).getRelationshipGuid();
- } else if (val instanceof Map) {
- Object relationshipGuidVal = ((Map)
val).get(AtlasRelatedObjectId.KEY_RELATIONSHIP_GUID);
-
- return relationshipGuidVal != null ?
relationshipGuidVal.toString() : null;
- }
-
- return null;
- }
-
- private AtlasEntityType getInstanceType(Object val) throws
AtlasBaseException {
- AtlasEntityType ret = null;
-
- if (val != null) {
- String typeName = null;
-
- if (val instanceof AtlasObjectId) {
- typeName = ((AtlasObjectId)val).getTypeName();
- } else if (val instanceof Map) {
- Object typeNameVal =
((Map)val).get(AtlasObjectId.KEY_TYPENAME);
-
- if (typeNameVal != null) {
- typeName = typeNameVal.toString();
- }
- }
-
- ret = typeName != null ?
typeRegistry.getEntityTypeByName(typeName) : null;
-
- if (ret == null) {
- throw new AtlasBaseException(AtlasErrorCode.INVALID_OBJECT_ID,
val.toString());
- }
- }
-
- return ret;
- }
-
- //Remove unused entries for reference map
- private Map<String, Object> removeUnusedMapEntries(AtlasAttribute
attribute, AtlasVertex vertex, Map<String, Object> currentMap,
- Map<String, Object>
newMap) throws AtlasBaseException {
- Map<String, Object> additionalMap = new HashMap<>();
- AtlasMapType mapType = (AtlasMapType)
attribute.getAttributeType();
-
- for (String currentKey : currentMap.keySet()) {
- //Delete the edge reference if its not part of new edges
created/updated
- AtlasEdge currentEdge = (AtlasEdge) currentMap.get(currentKey);
-
- if (!newMap.values().contains(currentEdge)) {
- boolean deleted =
deleteHandler.deleteEdgeReference(currentEdge,
mapType.getValueType().getTypeCategory(), attribute.isOwnedRef(), true, vertex);
-
- if (!deleted) {
- additionalMap.put(currentKey, currentEdge);
- }
- }
- }
-
- return additionalMap;
- }
-
- private static AtlasEdge getEdgeIfExists(AtlasMapType mapType, Map<String,
Object> currentMap, String keyStr) {
- AtlasEdge ret = null;
-
- if (isReference(mapType.getValueType())) {
- Object val = currentMap.get(keyStr);
-
- if (val != null) {
- ret = (AtlasEdge) val;
- }
- }
-
- return ret;
- }
-
- private AtlasEdge updateEdge(AtlasAttributeDef attributeDef, Object value,
AtlasEdge currentEdge, final AtlasVertex entityVertex) throws
AtlasBaseException {
-
- LOG.debug("Updating entity reference {} for reference attribute {}",
attributeDef.getName());
- // Update edge if it exists
-
- AtlasVertex currentVertex = currentEdge.getInVertex();
- String currentEntityId = getIdFromVertex(currentVertex);
- String newEntityId = getIdFromVertex(entityVertex);
-
- AtlasEdge newEdge = currentEdge;
- if (!currentEntityId.equals(newEntityId)) {
- // add an edge to the class vertex from the instance
- if (entityVertex != null) {
- try {
- newEdge =
graphHelper.getOrCreateEdge(currentEdge.getOutVertex(), entityVertex,
currentEdge.getLabel());
- } catch (RepositoryException e) {
- throw new
AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, e);
- }
-
- }
- }
- return newEdge;
- }
-
-
- private AtlasEdge updateRelationship(AtlasEdge currentEdge, final
AtlasVertex parentEntityVertex, final AtlasVertex newEntityVertex,
- AtlasRelationshipEdgeDirection
edgeDirection, Map<String, Object> relationshipAttributes)
- throws AtlasBaseException {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Updating entity reference using relationship {} for
reference attribute {}", getTypeName(newEntityVertex));
- }
-
- // Max's manager updated from Jane to Julius (Max.manager -->
Jane.subordinates)
- // manager attribute (OUT direction), current manager vertex (Jane)
(IN vertex)
-
- // Max's mentor updated from John to Jane (John.mentee --> Max.mentor)
- // mentor attribute (IN direction), current mentee vertex (John) (OUT
vertex)
- String currentEntityId;
-
- if (edgeDirection == IN) {
- currentEntityId = getIdFromOutVertex(currentEdge);
- } else if (edgeDirection == OUT) {
- currentEntityId = getIdFromInVertex(currentEdge);
- } else {
- currentEntityId = getIdFromBothVertex(currentEdge,
parentEntityVertex);
- }
-
- String newEntityId = getIdFromVertex(newEntityVertex);
- AtlasEdge ret = currentEdge;
-
- if (!currentEntityId.equals(newEntityId)) {
- // create a new relationship edge to the new attribute vertex from
the instance
- String relationshipName =
AtlasGraphUtilsV1.getTypeName(currentEdge);
-
- if (relationshipName == null) {
- relationshipName = currentEdge.getLabel();
- }
-
- if (edgeDirection == IN) {
- ret = getOrCreateRelationship(newEntityVertex,
currentEdge.getInVertex(), relationshipName, relationshipAttributes);
-
- } else if (edgeDirection == OUT) {
- ret = getOrCreateRelationship(currentEdge.getOutVertex(),
newEntityVertex, relationshipName, relationshipAttributes);
- } else {
- ret = getOrCreateRelationship(newEntityVertex,
parentEntityVertex, relationshipName, relationshipAttributes);
- }
-
- //record entity update on new relationship vertex
- recordEntityUpdate(newEntityVertex);
- }
-
- return ret;
- }
-
- public static List<Object> getArrayElementsProperty(AtlasType elementType,
AtlasVertex vertex, String vertexPropertyName) {
- if (isReference(elementType)) {
- return (List)vertex.getListProperty(vertexPropertyName,
AtlasEdge.class);
- }
- else {
- return (List)vertex.getListProperty(vertexPropertyName);
- }
- }
-
- private AtlasEdge getEdgeAt(List<Object> currentElements, int index,
AtlasType elemType) {
- AtlasEdge ret = null;
-
- if (isReference(elemType)) {
- if (currentElements != null && index < currentElements.size()) {
- ret = (AtlasEdge) currentElements.get(index);
- }
- }
-
- return ret;
- }
-
- //Removes unused edges from the old collection, compared to the new
collection
-
- private List<AtlasEdge> removeUnusedArrayEntries(AtlasAttribute attribute,
List<AtlasEdge> currentEntries, List<AtlasEdge> newEntries, AtlasVertex
entityVertex) throws AtlasBaseException {
- if (CollectionUtils.isNotEmpty(currentEntries)) {
- AtlasType entryType = ((AtlasArrayType)
attribute.getAttributeType()).getElementType();
-
- if (isReference(entryType)) {
- Collection<AtlasEdge> edgesToRemove =
CollectionUtils.subtract(currentEntries, newEntries);
-
- if (CollectionUtils.isNotEmpty(edgesToRemove)) {
- List<AtlasEdge> additionalElements = new ArrayList<>();
-
- for (AtlasEdge edge : edgesToRemove) {
- boolean deleted =
deleteHandler.deleteEdgeReference(edge, entryType.getTypeCategory(),
attribute.isOwnedRef(),
-
true, attribute.getRelationshipEdgeDirection(), entityVertex);
-
- if (!deleted) {
- additionalElements.add(edge);
- }
- }
-
- return additionalElements;
- }
- }
- }
-
- return Collections.emptyList();
- }
- private void setArrayElementsProperty(AtlasType elementType, AtlasVertex
vertex, String vertexPropertyName, List<Object> values) {
- if (!isReference(elementType)) {
- GraphHelper.setProperty(vertex, vertexPropertyName, values);
- }
- }
-
- private AtlasEntityHeader constructHeader(AtlasEntity entity, final
AtlasEntityType type, AtlasVertex vertex) {
- AtlasEntityHeader header = new AtlasEntityHeader(entity.getTypeName());
-
- header.setGuid(getIdFromVertex(vertex));
-
- for (AtlasAttribute attribute : type.getUniqAttributes().values()) {
- header.setAttribute(attribute.getName(),
entity.getAttribute(attribute.getName()));
- }
-
- return header;
- }
-
- public static AtlasEntityHeader constructHeader(AtlasObjectId id) {
- return new AtlasEntityHeader(id.getTypeName(), id.getGuid(),
id.getUniqueAttributes());
- }
-
- private void updateInConsistentOwnedMapVertices(AttributeMutationContext
ctx, AtlasMapType mapType, Object val) {
- if (mapType.getValueType().getTypeCategory() ==
TypeCategory.OBJECT_ID_TYPE) {
- AtlasEdge edge = (AtlasEdge) val;
-
- if (ctx.getAttribute().isOwnedRef() && getStatus(edge) == DELETED
&& getStatus(edge.getInVertex()) == DELETED) {
-
- //Resurrect the vertex and edge to ACTIVE state
- GraphHelper.setProperty(edge, STATE_PROPERTY_KEY,
AtlasEntity.Status.ACTIVE.name());
- GraphHelper.setProperty(edge.getInVertex(),
STATE_PROPERTY_KEY, AtlasEntity.Status.ACTIVE.name());
- }
- }
- }
-
- public void addClassifications(final EntityMutationContext context, String
guid, List<AtlasClassification> classifications) throws AtlasBaseException {
- if (CollectionUtils.isNotEmpty(classifications)) {
- AtlasVertex entityVertex = AtlasGraphUtilsV1.findByGuid(guid);
-
- if (entityVertex == null) {
- throw new
AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
- }
-
- final String entityTypeName
= AtlasGraphUtilsV1.getTypeName(entityVertex);
- final AtlasEntityType entityType
= typeRegistry.getEntityTypeByName(entityTypeName);
- List<AtlasVertex> entitiesToPropagateTo
= null;
- Map<AtlasVertex, List<AtlasClassification>> propagations
= null;
- List<AtlasClassification> addClassifications
= new ArrayList<>(classifications.size());
-
- for (AtlasClassification c : classifications) {
- AtlasClassification classification = new
AtlasClassification(c);
- String classificationName =
classification.getTypeName();
- Boolean propagateTags =
classification.isPropagate();
-
- if (propagateTags != null && propagateTags &&
- classification.getEntityGuid() != null &&
- !StringUtils.equals(classification.getEntityGuid(),
guid)) {
- continue;
- }
-
- if (propagateTags == null) {
- if(context.isImport()) {
- propagateTags = false;
- classification.setPropagate(propagateTags);
- } else {
- propagateTags = true;
- }
- }
-
- // set associated entity id to classification
- if (classification.getEntityGuid() == null) {
- classification.setEntityGuid(guid);
- }
-
- // ignore propagated classifications
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Adding classification [{}] to [{}] using edge
label: [{}]", classificationName, entityTypeName,
getTraitLabel(classificationName));
- }
-
- GraphHelper.addProperty(entityVertex,
TRAIT_NAMES_PROPERTY_KEY, classificationName);
-
- // add a new AtlasVertex for the struct or trait instance
- AtlasVertex classificationVertex =
createClassificationVertex(classification);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("created vertex {} for trait {}",
string(classificationVertex), classificationName);
- }
-
- // add the attributes for the trait instance
- mapClassification(EntityOperation.CREATE, context,
classification, entityType, entityVertex, classificationVertex);
-
- if (propagateTags) {
- // compute propagatedEntityVertices only once
- if (entitiesToPropagateTo == null) {
- entitiesToPropagateTo =
graphHelper.getImpactedVertices(guid);
- }
-
- if (CollectionUtils.isNotEmpty(entitiesToPropagateTo)) {
- if (propagations == null) {
- propagations = new
HashMap<>(entitiesToPropagateTo.size());
-
- for (AtlasVertex entityToPropagateTo :
entitiesToPropagateTo) {
- propagations.put(entityToPropagateTo, new
ArrayList<>());
- }
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Propagating tag: [{}][{}] to {}",
classificationName, entityTypeName, getTypeNames(entitiesToPropagateTo));
- }
-
- List<AtlasVertex> entitiesPropagatedTo =
deleteHandler.addTagPropagation(classificationVertex, entitiesToPropagateTo);
-
- if (entitiesPropagatedTo != null) {
- for (AtlasVertex entityPropagatedTo :
entitiesPropagatedTo) {
-
propagations.get(entityPropagatedTo).add(classification);
- }
- }
- } else {
- if (LOG.isDebugEnabled()) {
- LOG.debug(" --> Not propagating classification:
[{}][{}] - no entities found to propagate to.",
getTypeName(classificationVertex), entityTypeName);
- }
- }
- } else {
- if (LOG.isDebugEnabled()) {
- LOG.debug(" --> Not propagating classification:
[{}][{}] - propagation is disabled.", getTypeName(classificationVertex),
entityTypeName);
- }
- }
-
- addClassifications.add(classification);
- }
-
- // notify listeners on classification addition
- List<AtlasVertex> notificationVertices = new
ArrayList<AtlasVertex>() {{ add(entityVertex); }};
-
- if (CollectionUtils.isNotEmpty(entitiesToPropagateTo)) {
- notificationVertices.addAll(entitiesToPropagateTo);
- }
-
- for (AtlasVertex vertex : notificationVertices) {
- String entityGuid =
GraphHelper.getGuid(vertex);
- AtlasEntityWithExtInfo entityWithExtInfo =
instanceConverter.getAndCacheEntity(entityGuid);
- AtlasEntity entity =
(entityWithExtInfo != null) ? entityWithExtInfo.getEntity() : null;
- List<AtlasClassification> addedClassifications =
StringUtils.equals(entityGuid, guid) ? addClassifications :
propagations.get(vertex);
-
- if (CollectionUtils.isNotEmpty(addedClassifications)) {
- entityChangeNotifier.onClassificationAddedToEntity(entity,
addedClassifications);
- }
- }
- }
- }
-
- public void deleteClassifications(String entityGuid, List<String>
classificationNames) throws AtlasBaseException {
- if (CollectionUtils.isEmpty(classificationNames)) {
- throw new
AtlasBaseException(AtlasErrorCode.INVALID_CLASSIFICATION_PARAMS, "delete",
entityGuid);
- }
-
- AtlasVertex entityVertex = AtlasGraphUtilsV1.findByGuid(entityGuid);
-
- if (entityVertex == null) {
- throw new
AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, entityGuid);
- }
-
- List<String> traitNames = getTraitNames(entityVertex);
-
- if (CollectionUtils.isEmpty(traitNames)) {
- throw new
AtlasBaseException(AtlasErrorCode.NO_CLASSIFICATIONS_FOUND_FOR_ENTITY,
entityGuid);
- }
-
- validateClassificationExists(traitNames, classificationNames);
-
- Map<AtlasVertex, List<AtlasClassification>> removedClassifications =
new HashMap<>();
-
- for (String classificationName : classificationNames) {
- AtlasVertex classificationVertex =
getClassificationVertex(entityVertex, classificationName);
- AtlasClassification classification =
entityRetriever.toAtlasClassification(classificationVertex);
-
- // remove classification from propagated entities if propagation
is turned on
- if (isPropagationEnabled(classificationVertex)) {
- List<AtlasVertex> propagatedEntityVertices =
deleteHandler.removeTagPropagation(classificationVertex);
-
- // add propagated entities and deleted classification details
to removeClassifications map
- if (CollectionUtils.isNotEmpty(propagatedEntityVertices)) {
- for (AtlasVertex propagatedEntityVertex :
propagatedEntityVertices) {
- List<AtlasClassification> classifications =
removedClassifications.get(propagatedEntityVertex);
-
- if (classifications == null) {
- classifications = new ArrayList<>();
-
- removedClassifications.put(propagatedEntityVertex,
classifications);
- }
-
- classifications.add(classification);
- }
- }
- }
-
- // add associated entity and deleted classification details to
removeClassifications map
- List<AtlasClassification> classifications =
removedClassifications.get(entityVertex);
-
- if (classifications == null) {
- classifications = new ArrayList<>();
-
- removedClassifications.put(entityVertex, classifications);
- }
-
- classifications.add(classification);
-
- // remove classifications from associated entity
- if (LOG.isDebugEnabled()) {
- LOG.debug("Removing classification: [{}] from: [{}][{}] with
edge label: [{}]", classificationName,
- getTypeName(entityVertex), entityGuid,
CLASSIFICATION_LABEL);
- }
-
- AtlasEdge edge = getClassificationEdge(entityVertex,
classificationVertex);
-
- deleteHandler.deleteEdgeReference(edge, CLASSIFICATION, false,
true, entityVertex);
-
- traitNames.remove(classificationName);
- }
-
- updateTraitNamesProperty(entityVertex, traitNames);
-
- updateModificationMetadata(entityVertex);
-
- for (Map.Entry<AtlasVertex, List<AtlasClassification>> entry :
removedClassifications.entrySet()) {
- String guid =
GraphHelper.getGuid(entry.getKey());
- List<AtlasClassification> deletedClassificationNames =
entry.getValue();
- AtlasEntityWithExtInfo entityWithExtInfo =
instanceConverter.getAndCacheEntity(guid);
- AtlasEntity entity =
(entityWithExtInfo != null) ? entityWithExtInfo.getEntity() : null;
-
- entityChangeNotifier.onClassificationDeletedFromEntity(entity,
deletedClassificationNames);
- }
- }
-
- public void updateClassifications(EntityMutationContext context, String
guid, List<AtlasClassification> classifications) throws AtlasBaseException {
- if (CollectionUtils.isEmpty(classifications)) {
- throw new
AtlasBaseException(AtlasErrorCode.INVALID_CLASSIFICATION_PARAMS, "update",
guid);
- }
-
- AtlasVertex entityVertex = AtlasGraphUtilsV1.findByGuid(guid);
-
- if (entityVertex == null) {
- throw new
AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
- }
-
- String entityTypeName =
AtlasGraphUtilsV1.getTypeName(entityVertex);
- AtlasEntityType entityType =
typeRegistry.getEntityTypeByName(entityTypeName);
- List<AtlasClassification> updatedClassifications = new ArrayList<>();
- List<AtlasVertex> entitiesToPropagateTo = new ArrayList<>();
-
- Map<AtlasVertex, List<AtlasClassification>> addedPropagations = null;
- Map<AtlasVertex, List<AtlasClassification>> removedPropagations = null;
-
- for (AtlasClassification classification : classifications) {
- String classificationName = classification.getTypeName();
- String classificationEntityGuid = classification.getEntityGuid();
-
- if (StringUtils.isEmpty(classificationEntityGuid)) {
- classification.setEntityGuid(guid);
- }
-
- if (StringUtils.isNotEmpty(classificationEntityGuid) &&
!StringUtils.equalsIgnoreCase(guid, classificationEntityGuid)) {
- throw new
AtlasBaseException(AtlasErrorCode.CLASSIFICATION_UPDATE_FROM_PROPAGATED_ENTITY,
classificationName);
- }
-
- AtlasVertex classificationVertex =
getClassificationVertex(entityVertex, classificationName);
-
- if (classificationVertex == null) {
- throw new
AtlasBaseException(AtlasErrorCode.CLASSIFICATION_NOT_ASSOCIATED_WITH_ENTITY,
classificationName);
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Updating classification {} for entity {}",
classification, guid);
- }
-
- AtlasClassification currentClassification =
entityRetriever.toAtlasClassification(classificationVertex);
-
- validateAndNormalizeForUpdate(classification);
-
- boolean isClassificationUpdated = false;
-
- // check for attribute update
- Map<String, Object> updatedAttributes =
classification.getAttributes();
-
- if (MapUtils.isNotEmpty(updatedAttributes)) {
- for (String attributeName : updatedAttributes.keySet()) {
- currentClassification.setAttribute(attributeName,
updatedAttributes.get(attributeName));
- }
-
- isClassificationUpdated = true;
- }
-
- // check for validity period update
- List<TimeBoundary> currentValidityPeriods =
currentClassification.getValidityPeriods();
- List<TimeBoundary> updatedValidityPeriods =
classification.getValidityPeriods();
-
- if (!Objects.equals(currentValidityPeriods,
updatedValidityPeriods)) {
-
currentClassification.setValidityPeriods(updatedValidityPeriods);
-
- isClassificationUpdated = true;
- }
-
- if (isClassificationUpdated &&
CollectionUtils.isEmpty(entitiesToPropagateTo)) {
- entitiesToPropagateTo =
graphHelper.getImpactedVerticesWithRestrictions(guid,
classificationVertex.getIdForDisplay());
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("updating vertex {} for trait {}",
string(classificationVertex), classificationName);
- }
-
- mapClassification(EntityOperation.UPDATE, context, classification,
entityType, entityVertex, classificationVertex);
-
- // handle update of 'propagate' flag
- Boolean currentTagPropagation =
currentClassification.isPropagate();
- Boolean updatedTagPropagation = classification.isPropagate();
-
- // compute propagatedEntityVertices once and use it for subsequent
iterations and notifications
- if (updatedTagPropagation != null && currentTagPropagation !=
updatedTagPropagation) {
- if (updatedTagPropagation) {
- if (CollectionUtils.isEmpty(entitiesToPropagateTo)) {
- entitiesToPropagateTo =
graphHelper.getImpactedVerticesWithRestrictions(guid,
classificationVertex.getIdForDisplay());
- }
-
- if (CollectionUtils.isNotEmpty(entitiesToPropagateTo)) {
- if (addedPropagations == null) {
- addedPropagations = new
HashMap<>(entitiesToPropagateTo.size());
-
- for (AtlasVertex entityToPropagateTo :
entitiesToPropagateTo) {
- addedPropagations.put(entityToPropagateTo, new
ArrayList<>());
- }
- }
-
- List<AtlasVertex> entitiesPropagatedTo =
deleteHandler.addTagPropagation(classificationVertex, entitiesToPropagateTo);
-
- if (entitiesPropagatedTo != null) {
- for (AtlasVertex entityPropagatedTo :
entitiesPropagatedTo) {
-
addedPropagations.get(entityPropagatedTo).add(classification);
- }
- }
- }
- } else {
- List<AtlasVertex> impactedVertices =
deleteHandler.removeTagPropagation(classificationVertex);
-
- if (CollectionUtils.isNotEmpty(impactedVertices)) {
- if (removedPropagations == null) {
- removedPropagations = new HashMap<>();
-
- for (AtlasVertex impactedVertex :
impactedVertices) {
- List<AtlasClassification>
removedClassifications = removedPropagations.get(impactedVertex);
-
- if (removedClassifications == null) {
- removedClassifications = new ArrayList<>();
-
- removedPropagations.put(impactedVertex,
removedClassifications);
- }
-
- removedClassifications.add(classification);
- }
- }
- }
- }
- }
-
- updatedClassifications.add(currentClassification);
- }
-
- // notify listeners on classification update
- List<AtlasVertex> notificationVertices = new ArrayList<AtlasVertex>()
{{ add(entityVertex); }};
-
- if (CollectionUtils.isNotEmpty(entitiesToPropagateTo)) {
- notificationVertices.addAll(entitiesToPropagateTo);
- }
-
- for (AtlasVertex vertex : notificationVertices) {
- String entityGuid =
GraphHelper.getGuid(vertex);
- AtlasEntityWithExtInfo entityWithExtInfo =
instanceConverter.getAndCacheEntity(entityGuid);
- AtlasEntity entity = (entityWithExtInfo
!= null) ? entityWithExtInfo.getEntity() : null;
-
- entityChangeNotifier.onClassificationUpdatedToEntity(entity,
updatedClassifications);
- }
-
- if (removedPropagations != null) {
- for (Map.Entry<AtlasVertex, List<AtlasClassification>> entry :
removedPropagations.entrySet()) {
- AtlasVertex vertex =
entry.getKey();
- List<AtlasClassification> removedClassifications =
entry.getValue();
- String entityGuid =
GraphHelper.getGuid(vertex);
- AtlasEntityWithExtInfo entityWithExtInfo =
instanceConverter.getAndCacheEntity(entityGuid);
- AtlasEntity entity =
(entityWithExtInfo != null) ? entityWithExtInfo.getEntity() : null;
-
- entityChangeNotifier.onClassificationDeletedFromEntity(entity,
removedClassifications);
- }
- }
- }
-
- private AtlasEdge mapClassification(EntityOperation operation, final
EntityMutationContext context, AtlasClassification classification,
- AtlasEntityType entityType,
AtlasVertex parentInstanceVertex, AtlasVertex traitInstanceVertex)
- throws AtlasBaseException {
- if (classification.getValidityPeriods() != null) {
- String strValidityPeriods =
AtlasJson.toJson(classification.getValidityPeriods());
-
- AtlasGraphUtilsV1.setProperty(traitInstanceVertex,
Constants.CLASSIFICATION_VALIDITY_PERIODS_KEY, strValidityPeriods);
- } else {
- // if 'null', don't update existing value in the classification
- }
-
- if (classification.isPropagate() != null) {
- AtlasGraphUtilsV1.setProperty(traitInstanceVertex,
Constants.CLASSIFICATION_VERTEX_PROPAGATE_KEY, classification.isPropagate());
- }
-
- // map all the attributes to this newly created AtlasVertex
- mapAttributes(classification, traitInstanceVertex, operation, context);
-
- AtlasEdge ret = getClassificationEdge(parentInstanceVertex,
traitInstanceVertex);
-
- if (ret == null) {
- ret = graphHelper.addClassificationEdge(parentInstanceVertex,
traitInstanceVertex, false);
- }
-
- return ret;
- }
-
- public void deleteClassifications(String guid) throws AtlasBaseException {
- AtlasVertex instanceVertex = AtlasGraphUtilsV1.findByGuid(guid);
-
- if (instanceVertex == null) {
- throw new
AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
- }
-
- List<String> traitNames = getTraitNames(instanceVertex);
-
- if (CollectionUtils.isNotEmpty(traitNames)) {
- deleteClassifications(guid, traitNames);
- }
- }
-
- private void updateTraitNamesProperty(AtlasVertex entityVertex,
List<String> traitNames) {
- if (entityVertex != null) {
- entityVertex.removeProperty(TRAIT_NAMES_PROPERTY_KEY);
-
- for (String traitName : traitNames) {
- GraphHelper.addProperty(entityVertex,
TRAIT_NAMES_PROPERTY_KEY, traitName);
- }
- }
- }
-
- private void validateClassificationExists(List<String>
existingClassifications, List<String> suppliedClassifications) throws
AtlasBaseException {
- Set<String> existingNames = new HashSet<>(existingClassifications);
- for (String classificationName : suppliedClassifications) {
- if (!existingNames.contains(classificationName)) {
- throw new
AtlasBaseException(AtlasErrorCode.CLASSIFICATION_NOT_ASSOCIATED_WITH_ENTITY,
classificationName);
- }
- }
- }
-
- private AtlasEdge getOrCreateRelationship(AtlasVertex end1Vertex,
AtlasVertex end2Vertex, String relationshipName,
- Map<String, Object>
relationshipAttributes) throws AtlasBaseException {
- return relationshipStore.getOrCreate(end1Vertex, end2Vertex, new
AtlasRelationship(relationshipName, relationshipAttributes));
- }
-
- private boolean isRelationshipExists(AtlasVertex fromVertex, AtlasVertex
toVertex, String edgeLabel) {
- boolean ret = false;
- Iterator<AtlasEdge> edges =
graphHelper.getOutGoingEdgesByLabel(fromVertex, edgeLabel);
-
- while (edges != null && edges.hasNext()) {
- AtlasEdge edge = edges.next();
- AtlasVertex inVertex = edge.getInVertex();
-
- if (inVertex != null &&
StringUtils.equals(getIdFromVertex(inVertex), getIdFromVertex(toVertex))) {
- ret = true;
- }
- }
-
- return ret;
- }
-
- private void recordEntityUpdate(AtlasVertex vertex) throws
AtlasBaseException {
- RequestContextV1 req = RequestContextV1.get();
-
- if (!req.isUpdatedEntity(GraphHelper.getGuid(vertex))) {
- updateModificationMetadata(vertex);
-
- req.recordEntityUpdate(entityRetriever.toAtlasObjectId(vertex));
- }
- }
-
- private static void compactAttributes(AtlasEntity entity) {
- if (entity != null) {
- Map<String, Object> relationshipAttributes =
entity.getRelationshipAttributes();
- Map<String, Object> attributes = entity.getAttributes();
-
- if (MapUtils.isNotEmpty(relationshipAttributes) &&
MapUtils.isNotEmpty(attributes)) {
- for (String attrName : relationshipAttributes.keySet()) {
- if (attributes.containsKey(attrName)) {
- entity.removeAttribute(attrName);
- }
- }
- }
- }
- }
-
- private String getIdFromInVertex(AtlasEdge edge) {
- return getIdFromVertex(edge.getInVertex());
- }
-
- private String getIdFromOutVertex(AtlasEdge edge) {
- return getIdFromVertex(edge.getOutVertex());
- }
-
- private String getIdFromBothVertex(AtlasEdge currentEdge, AtlasVertex
parentEntityVertex) {
- String parentEntityId = getIdFromVertex(parentEntityVertex);
- String currentEntityId = getIdFromVertex(currentEdge.getInVertex());
-
- if (StringUtils.equals(currentEntityId, parentEntityId)) {
- currentEntityId = getIdFromOutVertex(currentEdge);
- }
-
-
- return currentEntityId;
- }
-
- public void validateAndNormalizeForUpdate(AtlasClassification
classification) throws AtlasBaseException {
- AtlasClassificationType type =
typeRegistry.getClassificationTypeByName(classification.getTypeName());
-
- if (type == null) {
- throw new
AtlasBaseException(AtlasErrorCode.CLASSIFICATION_NOT_FOUND,
classification.getTypeName());
- }
-
- List<String> messages = new ArrayList<>();
-
- type.validateValueForUpdate(classification,
classification.getTypeName(), messages);
-
- if (!messages.isEmpty()) {
- throw new AtlasBaseException(AtlasErrorCode.INVALID_PARAMETERS,
messages);
- }
-
- type.getNormalizedValueForUpdate(classification);
- }
-}