http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java deleted file mode 100644 index 0f9f877..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphRetriever.java +++ /dev/null @@ -1,1104 +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 com.fasterxml.jackson.core.type.TypeReference; -import org.apache.atlas.AtlasErrorCode; -import org.apache.atlas.exception.AtlasBaseException; -import org.apache.atlas.model.TimeBoundary; -import org.apache.atlas.model.glossary.enums.AtlasTermAssignmentStatus; -import org.apache.atlas.model.glossary.relations.AtlasTermAssignmentHeader; -import org.apache.atlas.model.instance.AtlasClassification; -import org.apache.atlas.model.instance.AtlasEntity; -import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo; -import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityExtInfo; -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.AtlasRelationship.AtlasRelationshipWithExtInfo; -import org.apache.atlas.model.instance.AtlasStruct; -import org.apache.atlas.model.typedef.AtlasRelationshipDef; -import org.apache.atlas.model.typedef.AtlasRelationshipEndDef; -import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef; -import org.apache.atlas.repository.Constants; -import org.apache.atlas.repository.graph.GraphHelper; -import org.apache.atlas.repository.graphdb.AtlasEdge; -import org.apache.atlas.repository.graphdb.AtlasEdgeDirection; -import org.apache.atlas.repository.graphdb.AtlasElement; -import org.apache.atlas.repository.graphdb.AtlasVertex; -import org.apache.atlas.type.AtlasArrayType; -import org.apache.atlas.type.AtlasEntityType; -import org.apache.atlas.type.AtlasMapType; -import org.apache.atlas.type.AtlasRelationshipType; -import org.apache.atlas.type.AtlasStructType; -import org.apache.atlas.type.AtlasStructType.AtlasAttribute; -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 java.math.BigDecimal; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import static org.apache.atlas.glossary.GlossaryUtils.TERM_ASSIGNMENT_ATTR_CONFIDENCE; -import static org.apache.atlas.glossary.GlossaryUtils.TERM_ASSIGNMENT_ATTR_CREATED_BY; -import static org.apache.atlas.glossary.GlossaryUtils.TERM_ASSIGNMENT_ATTR_DESCRIPTION; -import static org.apache.atlas.glossary.GlossaryUtils.TERM_ASSIGNMENT_ATTR_EXPRESSION; -import static org.apache.atlas.glossary.GlossaryUtils.TERM_ASSIGNMENT_ATTR_SOURCE; -import static org.apache.atlas.glossary.GlossaryUtils.TERM_ASSIGNMENT_ATTR_STATUS; -import static org.apache.atlas.glossary.GlossaryUtils.TERM_ASSIGNMENT_ATTR_STEWARD; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BIGDECIMAL; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BOOLEAN; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BYTE; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_DATE; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_DOUBLE; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_FLOAT; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_INT; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_LONG; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_SHORT; -import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_STRING; -import static org.apache.atlas.repository.Constants.CLASSIFICATION_ENTITY_GUID; -import static org.apache.atlas.repository.Constants.CLASSIFICATION_LABEL; -import static org.apache.atlas.repository.Constants.CLASSIFICATION_VALIDITY_PERIODS_KEY; -import static org.apache.atlas.repository.Constants.TERM_ASSIGNMENT_LABEL; -import static org.apache.atlas.repository.graph.GraphHelper.EDGE_LABEL_PREFIX; -import static org.apache.atlas.repository.graph.GraphHelper.getAdjacentEdgesByLabel; -import static org.apache.atlas.repository.graph.GraphHelper.getAllClassificationEdges; -import static org.apache.atlas.repository.graph.GraphHelper.getAllTraitNames; -import static org.apache.atlas.repository.graph.GraphHelper.getBlockedClassificationIds; -import static org.apache.atlas.repository.graph.GraphHelper.getArrayElementsProperty; -import static org.apache.atlas.repository.graph.GraphHelper.getClassificationVertices; -import static org.apache.atlas.repository.graph.GraphHelper.getGuid; -import static org.apache.atlas.repository.graph.GraphHelper.getIncomingEdgesByLabel; -import static org.apache.atlas.repository.graph.GraphHelper.getPrimitiveMap; -import static org.apache.atlas.repository.graph.GraphHelper.getReferenceMap; -import static org.apache.atlas.repository.graph.GraphHelper.getOutGoingEdgesByLabel; -import static org.apache.atlas.repository.graph.GraphHelper.getPropagateTags; -import static org.apache.atlas.repository.graph.GraphHelper.getRelationshipGuid; -import static org.apache.atlas.repository.graph.GraphHelper.getTypeName; -import static org.apache.atlas.repository.graph.GraphHelper.isPropagationEnabled; -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; -import static org.apache.atlas.type.AtlasStructType.AtlasAttribute.AtlasRelationshipEdgeDirection.BOTH; -import static org.apache.atlas.type.AtlasStructType.AtlasAttribute.AtlasRelationshipEdgeDirection.IN; -import static org.apache.atlas.type.AtlasStructType.AtlasAttribute.AtlasRelationshipEdgeDirection.OUT; - - -public final class EntityGraphRetriever { - private static final Logger LOG = LoggerFactory.getLogger(EntityGraphRetriever.class); - - private static final String TERM_RELATION_NAME = "AtlasGlossarySemanticAssignment"; - private static final String GLOSSARY_TERM_DISPLAY_NAME_ATTR = "AtlasGlossaryTerm.displayName"; - - public static final String NAME = "name"; - public static final String DISPLAY_NAME = "displayName"; - public static final String DESCRIPTION = "description"; - public static final String OWNER = "owner"; - public static final String CREATE_TIME = "createTime"; - public static final String QUALIFIED_NAME = "qualifiedName"; - - private static final TypeReference<List<TimeBoundary>> TIME_BOUNDARIES_LIST_TYPE = new TypeReference<List<TimeBoundary>>() {}; - private static final GraphHelper graphHelper = GraphHelper.getInstance(); - - private final AtlasTypeRegistry typeRegistry; - - public EntityGraphRetriever(AtlasTypeRegistry typeRegistry) { - this.typeRegistry = typeRegistry; - } - - public AtlasEntity toAtlasEntity(String guid) throws AtlasBaseException { - return toAtlasEntity(getEntityVertex(guid)); - } - - public AtlasEntity toAtlasEntity(AtlasObjectId objId) throws AtlasBaseException { - return toAtlasEntity(getEntityVertex(objId)); - } - - public AtlasEntity toAtlasEntity(AtlasVertex entityVertex) throws AtlasBaseException { - return mapVertexToAtlasEntity(entityVertex, null); - } - - public AtlasEntityWithExtInfo toAtlasEntityWithExtInfo(String guid) throws AtlasBaseException { - return toAtlasEntityWithExtInfo(getEntityVertex(guid)); - } - - public AtlasEntityWithExtInfo toAtlasEntityWithExtInfo(AtlasObjectId objId) throws AtlasBaseException { - return toAtlasEntityWithExtInfo(getEntityVertex(objId)); - } - - public AtlasEntityWithExtInfo toAtlasEntityWithExtInfo(AtlasVertex entityVertex) throws AtlasBaseException { - AtlasEntityExtInfo entityExtInfo = new AtlasEntityExtInfo(); - AtlasEntity entity = mapVertexToAtlasEntity(entityVertex, entityExtInfo); - AtlasEntityWithExtInfo ret = new AtlasEntityWithExtInfo(entity, entityExtInfo); - - ret.compact(); - - return ret; - } - - 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; - } - - public AtlasEntityHeader toAtlasEntityHeader(String guid) throws AtlasBaseException { - return toAtlasEntityHeader(getEntityVertex(guid)); - } - - public AtlasEntityHeader toAtlasEntityHeader(AtlasVertex entityVertex) throws AtlasBaseException { - return toAtlasEntityHeader(entityVertex, Collections.<String>emptySet()); - } - - public AtlasEntityHeader toAtlasEntityHeader(AtlasVertex atlasVertex, Set<String> attributes) throws AtlasBaseException { - return atlasVertex != null ? mapVertexToAtlasEntityHeader(atlasVertex, attributes) : null; - } - - public AtlasEntityHeader toAtlasEntityHeaderWithClassifications(String guid) throws AtlasBaseException { - return toAtlasEntityHeaderWithClassifications(getEntityVertex(guid), Collections.emptySet()); - } - - public AtlasEntityHeader toAtlasEntityHeaderWithClassifications(AtlasVertex entityVertex) throws AtlasBaseException { - return toAtlasEntityHeaderWithClassifications(entityVertex, Collections.emptySet()); - } - - public AtlasEntityHeader toAtlasEntityHeaderWithClassifications(AtlasVertex entityVertex, Set<String> attributes) throws AtlasBaseException { - AtlasEntityHeader ret = toAtlasEntityHeader(entityVertex, attributes); - - ret.setClassifications(getAllClassifications(entityVertex)); - - return ret; - } - - public AtlasEntityHeader toAtlasEntityHeader(AtlasEntity entity) { - AtlasEntityHeader ret = null; - String typeName = entity.getTypeName(); - AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName); - - if (entityType != null) { - Map<String, Object> uniqueAttributes = new HashMap<>(); - - for (AtlasAttribute attribute : entityType.getUniqAttributes().values()) { - Object attrValue = entity.getAttribute(attribute.getName()); - - if (attrValue != null) { - uniqueAttributes.put(attribute.getName(), attrValue); - } - } - - ret = new AtlasEntityHeader(entity.getTypeName(), entity.getGuid(), uniqueAttributes); - - if (CollectionUtils.isNotEmpty(entity.getClassifications())) { - List<AtlasClassification> classifications = new ArrayList<>(entity.getClassifications().size()); - List<String> classificationNames = new ArrayList<>(entity.getClassifications().size()); - - for (AtlasClassification classification : entity.getClassifications()) { - classifications.add(classification); - classificationNames.add(classification.getTypeName()); - } - - ret.setClassifications(classifications); - ret.setClassificationNames(classificationNames); - } - - if (CollectionUtils.isNotEmpty(entity.getMeanings())) { - ret.setMeanings(entity.getMeanings()); - ret.setMeaningNames(entity.getMeanings().stream().map(AtlasTermAssignmentHeader::getDisplayText).collect(Collectors.toList())); - } - } - - return ret; - } - - public AtlasObjectId toAtlasObjectId(AtlasVertex entityVertex) throws AtlasBaseException { - AtlasObjectId ret = null; - String typeName = entityVertex.getProperty(Constants.TYPE_NAME_PROPERTY_KEY, String.class); - AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName); - - if (entityType != null) { - Map<String, Object> uniqueAttributes = new HashMap<>(); - - for (AtlasAttribute attribute : entityType.getUniqAttributes().values()) { - Object attrValue = getVertexAttribute(entityVertex, attribute); - - if (attrValue != null) { - uniqueAttributes.put(attribute.getName(), attrValue); - } - } - - ret = new AtlasObjectId(entityVertex.getProperty(Constants.GUID_PROPERTY_KEY, String.class), typeName, uniqueAttributes); - } - - return ret; - } - - public AtlasClassification toAtlasClassification(AtlasVertex classificationVertex) throws AtlasBaseException { - AtlasClassification ret = new AtlasClassification(getTypeName(classificationVertex)); - - ret.setEntityGuid(AtlasGraphUtilsV1.getProperty(classificationVertex, CLASSIFICATION_ENTITY_GUID, String.class)); - ret.setPropagate(isPropagationEnabled(classificationVertex)); - - String strValidityPeriods = AtlasGraphUtilsV1.getProperty(classificationVertex, CLASSIFICATION_VALIDITY_PERIODS_KEY, String.class); - - if (strValidityPeriods != null) { - ret.setValidityPeriods(AtlasJson.fromJson(strValidityPeriods, TIME_BOUNDARIES_LIST_TYPE)); - } - - mapAttributes(classificationVertex, ret, null); - - return ret; - } - - public AtlasVertex getReferencedEntityVertex(AtlasEdge edge, AtlasRelationshipEdgeDirection relationshipDirection, AtlasVertex parentVertex) throws AtlasBaseException { - AtlasVertex entityVertex = null; - - if (relationshipDirection == OUT) { - entityVertex = edge.getInVertex(); - } else if (relationshipDirection == IN) { - entityVertex = edge.getOutVertex(); - } else if (relationshipDirection == BOTH){ - // since relationship direction is BOTH, edge direction can be inward or outward - // compare with parent entity vertex and pick the right reference vertex - if (StringUtils.equals(GraphHelper.getGuid(parentVertex), GraphHelper.getGuid(edge.getOutVertex()))) { - entityVertex = edge.getInVertex(); - } else { - entityVertex = edge.getOutVertex(); - } - } - - return entityVertex; - } - - public AtlasVertex getEntityVertex(String guid) throws AtlasBaseException { - AtlasVertex ret = AtlasGraphUtilsV1.findByGuid(guid); - - if (ret == null) { - throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid); - } - - return ret; - } - - private AtlasVertex getEntityVertex(AtlasObjectId objId) throws AtlasBaseException { - AtlasVertex ret = null; - - if (! AtlasTypeUtil.isValid(objId)) { - throw new AtlasBaseException(AtlasErrorCode.INVALID_OBJECT_ID, objId.toString()); - } - - if (AtlasTypeUtil.isAssignedGuid(objId)) { - ret = AtlasGraphUtilsV1.findByGuid(objId.getGuid()); - } else { - AtlasEntityType entityType = typeRegistry.getEntityTypeByName(objId.getTypeName()); - Map<String, Object> uniqAttributes = objId.getUniqueAttributes(); - - ret = AtlasGraphUtilsV1.getVertexByUniqueAttributes(entityType, uniqAttributes); - } - - if (ret == null) { - throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, objId.toString()); - } - - return ret; - } - - private AtlasEntity mapVertexToAtlasEntity(AtlasVertex entityVertex, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException { - String guid = getGuid(entityVertex); - AtlasEntity entity = entityExtInfo != null ? entityExtInfo.getEntity(guid) : null; - - if (entity == null) { - if (LOG.isDebugEnabled()) { - LOG.debug("Mapping graph vertex to atlas entity for guid {}", guid); - } - - entity = new AtlasEntity(); - - if (entityExtInfo != null) { - entityExtInfo.addReferredEntity(guid, entity); - } - - mapSystemAttributes(entityVertex, entity); - - mapAttributes(entityVertex, entity, entityExtInfo); - - mapRelationshipAttributes(entityVertex, entity); - - mapClassifications(entityVertex, entity); - } - - return entity; - } - - private AtlasEntityHeader mapVertexToAtlasEntityHeader(AtlasVertex entityVertex) throws AtlasBaseException { - return mapVertexToAtlasEntityHeader(entityVertex, Collections.<String>emptySet()); - } - - private AtlasEntityHeader mapVertexToAtlasEntityHeader(AtlasVertex entityVertex, Set<String> attributes) throws AtlasBaseException { - AtlasEntityHeader ret = new AtlasEntityHeader(); - - String typeName = entityVertex.getProperty(Constants.TYPE_NAME_PROPERTY_KEY, String.class); - String guid = entityVertex.getProperty(Constants.GUID_PROPERTY_KEY, String.class); - - ret.setTypeName(typeName); - ret.setGuid(guid); - ret.setStatus(GraphHelper.getStatus(entityVertex)); - ret.setClassificationNames(getAllTraitNames(entityVertex)); - - List<AtlasTermAssignmentHeader> termAssignmentHeaders = mapAssignedTerms(entityVertex); - ret.setMeanings(termAssignmentHeaders); - ret.setMeaningNames(termAssignmentHeaders.stream().map(AtlasTermAssignmentHeader::getDisplayText).collect(Collectors.toList())); - - AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName); - - if (entityType != null) { - for (AtlasAttribute uniqueAttribute : entityType.getUniqAttributes().values()) { - Object attrValue = getVertexAttribute(entityVertex, uniqueAttribute); - - if (attrValue != null) { - ret.setAttribute(uniqueAttribute.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 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()); - } - - if (CollectionUtils.isNotEmpty(attributes)) { - for (String attrName : attributes) { - String nonQualifiedAttrName = toNonQualifiedName(attrName); - if (ret.hasAttribute(attrName)) { - continue; - } - - Object attrValue = getVertexAttribute(entityVertex, entityType.getAttribute(nonQualifiedAttrName)); - - if (attrValue != null) { - ret.setAttribute(nonQualifiedAttrName, attrValue); - } - } - } - - } - - return ret; - } - - private String toNonQualifiedName(String attrName) { - String ret; - if (attrName.contains(".")) { - String[] attributeParts = attrName.split("\\."); - ret = attributeParts[attributeParts.length - 1]; - } else { - ret = attrName; - } - return ret; - } - - private AtlasEntity mapSystemAttributes(AtlasVertex entityVertex, AtlasEntity entity) { - if (LOG.isDebugEnabled()) { - LOG.debug("Mapping system attributes for type {}", entity.getTypeName()); - } - - entity.setGuid(getGuid(entityVertex)); - entity.setTypeName(getTypeName(entityVertex)); - entity.setStatus(GraphHelper.getStatus(entityVertex)); - entity.setVersion(GraphHelper.getVersion(entityVertex)); - - entity.setCreatedBy(GraphHelper.getCreatedByAsString(entityVertex)); - entity.setUpdatedBy(GraphHelper.getModifiedByAsString(entityVertex)); - - entity.setCreateTime(new Date(GraphHelper.getCreatedTime(entityVertex))); - entity.setUpdateTime(new Date(GraphHelper.getModifiedTime(entityVertex))); - - return entity; - } - - private void mapAttributes(AtlasVertex entityVertex, AtlasStruct struct, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException { - AtlasType objType = typeRegistry.getType(struct.getTypeName()); - - if (!(objType instanceof AtlasStructType)) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, struct.getTypeName()); - } - - AtlasStructType structType = (AtlasStructType) objType; - - for (AtlasAttribute attribute : structType.getAllAttributes().values()) { - Object attrValue = mapVertexToAttribute(entityVertex, attribute, entityExtInfo); - - struct.setAttribute(attribute.getName(), attrValue); - } - } - - public List<AtlasClassification> getAllClassifications(AtlasVertex entityVertex) throws AtlasBaseException { - List<AtlasClassification> ret = new ArrayList<>(); - Iterable edges = entityVertex.query().direction(AtlasEdgeDirection.OUT).label(CLASSIFICATION_LABEL).edges(); - - if (edges != null) { - Iterator<AtlasEdge> iterator = edges.iterator(); - - while (iterator.hasNext()) { - AtlasEdge edge = iterator.next(); - - if (edge != null) { - ret.add(toAtlasClassification(edge.getInVertex())); - } - } - } - - return ret; - } - - public List<AtlasTermAssignmentHeader> mapAssignedTerms(AtlasVertex entityVertex) throws AtlasBaseException { - List<AtlasTermAssignmentHeader> ret = new ArrayList<>(); - - Iterable edges = entityVertex.query().direction(AtlasEdgeDirection.IN).label(TERM_ASSIGNMENT_LABEL).edges(); - - if (edges != null) { - for (final AtlasEdge edge : (Iterable<AtlasEdge>) edges) { - if (edge != null && GraphHelper.getStatus(edge) != AtlasEntity.Status.DELETED) { - ret.add(toTermAssignmentHeader(edge)); - } - } - } - - return ret; - } - - private AtlasTermAssignmentHeader toTermAssignmentHeader(final AtlasEdge edge) { - AtlasTermAssignmentHeader ret = new AtlasTermAssignmentHeader(); - - AtlasVertex termVertex = edge.getOutVertex(); - - String guid = GraphHelper.getGuid(termVertex); - if (guid != null) { - ret.setTermGuid(guid); - } - - String relationGuid = edge.getProperty(Constants.RELATIONSHIP_GUID_PROPERTY_KEY, String.class); - if (relationGuid != null) { - ret.setRelationGuid(relationGuid); - } - - Object displayName = GraphHelper.getProperty(termVertex, GLOSSARY_TERM_DISPLAY_NAME_ATTR); - if (displayName instanceof String) { - ret.setDisplayText((String) displayName); - } - - String description = edge.getProperty(TERM_ASSIGNMENT_ATTR_DESCRIPTION, String.class); - if (description != null) { - ret.setDescription(description); - } - - String expression = edge.getProperty(TERM_ASSIGNMENT_ATTR_EXPRESSION, String.class); - if (expression != null) { - ret.setExpression(expression); - } - - String status = edge.getProperty(TERM_ASSIGNMENT_ATTR_STATUS, String.class); - if (status != null) { - AtlasTermAssignmentStatus assignmentStatus = AtlasTermAssignmentStatus.valueOf(status); - ret.setStatus(assignmentStatus); - } - - Integer confidence = edge.getProperty(TERM_ASSIGNMENT_ATTR_CONFIDENCE, Integer.class); - if (confidence != null) { - ret.setConfidence(confidence); - } - - String createdBy = edge.getProperty(TERM_ASSIGNMENT_ATTR_CREATED_BY, String.class); - if (createdBy != null) { - ret.setCreatedBy(createdBy); - } - - String steward = edge.getProperty(TERM_ASSIGNMENT_ATTR_STEWARD, String.class); - if (steward != null) { - ret.setSteward(steward); - } - - String source = edge.getProperty(TERM_ASSIGNMENT_ATTR_SOURCE, String.class); - if (source != null) { - ret.setSource(source); - } - - return ret; - } - - private void mapClassifications(AtlasVertex entityVertex, AtlasEntity entity) throws AtlasBaseException { - List<AtlasEdge> edges = getAllClassificationEdges(entityVertex); - - if (CollectionUtils.isNotEmpty(edges)) { - List<AtlasClassification> allClassifications = new ArrayList<>(); - - for (AtlasEdge edge : edges) { - AtlasVertex classificationVertex = edge.getInVertex(); - - allClassifications.add(toAtlasClassification(classificationVertex)); - } - - entity.setClassifications(allClassifications); - } - } - - private Object mapVertexToAttribute(AtlasVertex entityVertex, AtlasAttribute attribute, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException { - Object ret = null; - AtlasType attrType = attribute.getAttributeType(); - String vertexPropertyName = attribute.getQualifiedName(); - String edgeLabel = EDGE_LABEL_PREFIX + vertexPropertyName; - boolean isOwnedAttribute = attribute.isOwnedRef(); - AtlasRelationshipEdgeDirection edgeDirection = attribute.getRelationshipEdgeDirection(); - - if (LOG.isDebugEnabled()) { - LOG.debug("Mapping vertex {} to atlas entity {}.{}", entityVertex, attribute.getDefinedInDef().getName(), attribute.getName()); - } - - switch (attrType.getTypeCategory()) { - case PRIMITIVE: - ret = mapVertexToPrimitive(entityVertex, vertexPropertyName, attribute.getAttributeDef()); - break; - case ENUM: - ret = GraphHelper.getProperty(entityVertex, vertexPropertyName); - break; - case STRUCT: - ret = mapVertexToStruct(entityVertex, edgeLabel, null, entityExtInfo); - break; - case OBJECT_ID_TYPE: - ret = mapVertexToObjectId(entityVertex, edgeLabel, null, entityExtInfo, isOwnedAttribute, edgeDirection); - break; - case ARRAY: - ret = mapVertexToArray(entityVertex, entityExtInfo, isOwnedAttribute, attribute); - break; - case MAP: - ret = mapVertexToMap(entityVertex, vertexPropertyName, entityExtInfo, isOwnedAttribute, attribute); - break; - case CLASSIFICATION: - // do nothing - break; - } - - return ret; - } - - private Map<String, Object> mapVertexToMap(AtlasVertex entityVertex, final String propertyName, AtlasEntityExtInfo entityExtInfo, - boolean isOwnedAttribute, AtlasAttribute attribute) throws AtlasBaseException { - - Map<String, Object> ret = null; - AtlasMapType mapType = (AtlasMapType) attribute.getAttributeType(); - AtlasType mapValueType = mapType.getValueType(); - - if (LOG.isDebugEnabled()) { - LOG.debug("Mapping map attribute {} for vertex {}", mapType.getTypeName(), entityVertex); - } - - if (isReference(mapValueType)) { - Map<String, Object> currentMap = getReferenceMap(entityVertex, attribute); - - if (MapUtils.isNotEmpty(currentMap)) { - ret = new HashMap<>(); - - for (Map.Entry<String, Object> entry : currentMap.entrySet()) { - String mapKey = entry.getKey(); - Object keyValue = entry.getValue(); - Object mapValue = mapVertexToCollectionEntry(entityVertex, mapValueType, keyValue, attribute.getRelationshipEdgeLabel(), - entityExtInfo, isOwnedAttribute, attribute.getRelationshipEdgeDirection()); - if (mapValue != null) { - ret.put(mapKey, mapValue); - } - } - } - } else { - ret = getPrimitiveMap(entityVertex, propertyName); - } - - if (MapUtils.isEmpty(ret)) { - ret = null; - } - - return ret; - } - - private List<Object> mapVertexToArray(AtlasVertex entityVertex, AtlasEntityExtInfo entityExtInfo, - boolean isOwnedAttribute, AtlasAttribute attribute) throws AtlasBaseException { - - AtlasArrayType arrayType = (AtlasArrayType) attribute.getAttributeType(); - AtlasType arrayElementType = arrayType.getElementType(); - List<Object> arrayElements = getArrayElementsProperty(arrayElementType, entityVertex, attribute); - - if (CollectionUtils.isEmpty(arrayElements)) { - return null; - } - - if (LOG.isDebugEnabled()) { - LOG.debug("Mapping array attribute {} for vertex {}", arrayElementType.getTypeName(), entityVertex); - } - - List arrValues = new ArrayList(arrayElements.size()); - String edgeLabel = attribute.getRelationshipEdgeLabel(); - AtlasRelationshipEdgeDirection edgeDirection = attribute.getRelationshipEdgeDirection(); - - for (Object element : arrayElements) { - // When internal types are deleted, sometimes the collection type attribute will contain a null value - // Graph layer does erroneous mapping of the null element, hence avoiding the processing of the null element - if (element == null) { - LOG.debug("Skipping null arrayElement"); - continue; - } - - Object arrValue = mapVertexToCollectionEntry(entityVertex, arrayElementType, element, edgeLabel, - entityExtInfo, isOwnedAttribute, edgeDirection); - - if (arrValue != null) { - arrValues.add(arrValue); - } - } - - return arrValues; - } - - private Object mapVertexToCollectionEntry(AtlasVertex entityVertex, AtlasType arrayElement, Object value, - String edgeLabel, AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute, - AtlasRelationshipEdgeDirection edgeDirection) throws AtlasBaseException { - Object ret = null; - - switch (arrayElement.getTypeCategory()) { - case PRIMITIVE: - case ENUM: - case ARRAY: - case MAP: - ret = value; - break; - - case CLASSIFICATION: - break; - - case STRUCT: - ret = mapVertexToStruct(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo); - break; - - case OBJECT_ID_TYPE: - ret = mapVertexToObjectId(entityVertex, edgeLabel, (AtlasEdge) value, entityExtInfo, isOwnedAttribute, edgeDirection); - break; - - default: - break; - } - - return ret; - } - - public Object mapVertexToPrimitive(AtlasElement entityVertex, final String vertexPropertyName, AtlasAttributeDef attrDef) { - Object ret = null; - - if (GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Object.class) == null) { - return null; - } - - switch (attrDef.getTypeName().toLowerCase()) { - case ATLAS_TYPE_STRING: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, String.class); - break; - case ATLAS_TYPE_SHORT: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Short.class); - break; - case ATLAS_TYPE_INT: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Integer.class); - break; - case ATLAS_TYPE_BIGINTEGER: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, BigInteger.class); - break; - case ATLAS_TYPE_BOOLEAN: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Boolean.class); - break; - case ATLAS_TYPE_BYTE: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Byte.class); - break; - case ATLAS_TYPE_LONG: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Long.class); - break; - case ATLAS_TYPE_FLOAT: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Float.class); - break; - case ATLAS_TYPE_DOUBLE: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Double.class); - break; - case ATLAS_TYPE_BIGDECIMAL: - ret = GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, BigDecimal.class); - break; - case ATLAS_TYPE_DATE: - ret = new Date(GraphHelper.getSingleValuedProperty(entityVertex, vertexPropertyName, Long.class)); - break; - default: - break; - } - - return ret; - } - - private AtlasObjectId mapVertexToObjectId(AtlasVertex entityVertex, String edgeLabel, AtlasEdge edge, - AtlasEntityExtInfo entityExtInfo, boolean isOwnedAttribute, - AtlasRelationshipEdgeDirection edgeDirection) throws AtlasBaseException { - AtlasObjectId ret = null; - - if (edge == null) { - edge = graphHelper.getEdgeForLabel(entityVertex, edgeLabel, edgeDirection); - } - - if (GraphHelper.elementExists(edge)) { - AtlasVertex referenceVertex = edge.getInVertex(); - - if (StringUtils.equals(getIdFromVertex(referenceVertex), getIdFromVertex(entityVertex))) { - referenceVertex = edge.getOutVertex(); - } - - if (referenceVertex != null) { - if (entityExtInfo != null && isOwnedAttribute) { - AtlasEntity entity = mapVertexToAtlasEntity(referenceVertex, entityExtInfo); - - if (entity != null) { - ret = AtlasTypeUtil.getAtlasObjectId(entity); - } - } else { - ret = new AtlasObjectId(getGuid(referenceVertex), getTypeName(referenceVertex)); - } - } - } - - return ret; - } - - private AtlasStruct mapVertexToStruct(AtlasVertex entityVertex, String edgeLabel, AtlasEdge edge, AtlasEntityExtInfo entityExtInfo) throws AtlasBaseException { - AtlasStruct ret = null; - - if (edge == null) { - edge = graphHelper.getEdgeForLabel(entityVertex, edgeLabel); - } - - if (GraphHelper.elementExists(edge)) { - final AtlasVertex referenceVertex = edge.getInVertex(); - ret = new AtlasStruct(getTypeName(referenceVertex)); - - mapAttributes(referenceVertex, ret, entityExtInfo); - } - - return ret; - } - - private Object getVertexAttribute(AtlasVertex vertex, AtlasAttribute attribute) throws AtlasBaseException { - return vertex != null && attribute != null ? mapVertexToAttribute(vertex, attribute, null) : null; - } - - private void mapRelationshipAttributes(AtlasVertex entityVertex, AtlasEntity entity) throws AtlasBaseException { - AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entity.getTypeName()); - - if (entityType == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, entity.getTypeName()); - } - - for (AtlasAttribute attribute : entityType.getRelationshipAttributes().values()) { - Object attrValue = mapVertexToRelationshipAttribute(entityVertex, entityType, attribute); - - entity.setRelationshipAttribute(attribute.getName(), attrValue); - } - } - - private Object mapVertexToRelationshipAttribute(AtlasVertex entityVertex, AtlasEntityType entityType, AtlasAttribute attribute) throws AtlasBaseException { - Object ret = null; - AtlasRelationshipDef relationshipDef = graphHelper.getRelationshipDef(entityVertex, entityType, attribute.getName()); - - if (relationshipDef == null) { - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_INVALID, "relationshipDef is null"); - } - - AtlasRelationshipEndDef endDef1 = relationshipDef.getEndDef1(); - AtlasRelationshipEndDef endDef2 = relationshipDef.getEndDef2(); - AtlasEntityType endDef1Type = typeRegistry.getEntityTypeByName(endDef1.getType()); - AtlasEntityType endDef2Type = typeRegistry.getEntityTypeByName(endDef2.getType()); - AtlasRelationshipEndDef attributeEndDef = null; - - if (endDef1Type.isTypeOrSuperTypeOf(entityType.getTypeName()) && StringUtils.equals(endDef1.getName(), attribute.getName())) { - attributeEndDef = endDef1; - } else if (endDef2Type.isTypeOrSuperTypeOf(entityType.getTypeName()) && StringUtils.equals(endDef2.getName(), attribute.getName())) { - attributeEndDef = endDef2; - } - - if (attributeEndDef == null) { - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_INVALID, relationshipDef.toString()); - } - - switch (attributeEndDef.getCardinality()) { - case SINGLE: - ret = mapRelatedVertexToObjectId(entityVertex, attribute); - break; - - case LIST: - case SET: - ret = mapRelationshipArrayAttribute(entityVertex, attribute); - break; - } - - return ret; - } - - private AtlasObjectId mapRelatedVertexToObjectId(AtlasVertex entityVertex, AtlasAttribute attribute) throws AtlasBaseException { - AtlasEdge edge = graphHelper.getEdgeForLabel(entityVertex, attribute.getRelationshipEdgeLabel(), attribute.getRelationshipEdgeDirection()); - - return mapVertexToRelatedObjectId(entityVertex, edge); - } - - private List<AtlasRelatedObjectId> mapRelationshipArrayAttribute(AtlasVertex entityVertex, AtlasAttribute attribute) throws AtlasBaseException { - List<AtlasRelatedObjectId> ret = new ArrayList<>(); - Iterator<AtlasEdge> edges = null; - - if (attribute.getRelationshipEdgeDirection() == IN) { - edges = getIncomingEdgesByLabel(entityVertex, attribute.getRelationshipEdgeLabel()); - } else if (attribute.getRelationshipEdgeDirection() == OUT) { - edges = getOutGoingEdgesByLabel(entityVertex, attribute.getRelationshipEdgeLabel()); - } else if (attribute.getRelationshipEdgeDirection() == BOTH) { - edges = getAdjacentEdgesByLabel(entityVertex, AtlasEdgeDirection.BOTH, attribute.getRelationshipEdgeLabel()); - } - - if (edges != null) { - while (edges.hasNext()) { - AtlasEdge relationshipEdge = edges.next(); - - AtlasRelatedObjectId relatedObjectId = mapVertexToRelatedObjectId(entityVertex, relationshipEdge); - - ret.add(relatedObjectId); - } - } - - return ret; - } - - private AtlasRelatedObjectId mapVertexToRelatedObjectId(AtlasVertex entityVertex, AtlasEdge edge) throws AtlasBaseException { - AtlasRelatedObjectId ret = null; - - if (GraphHelper.elementExists(edge)) { - AtlasVertex referenceVertex = edge.getInVertex(); - - if (StringUtils.equals(getIdFromVertex(referenceVertex), getIdFromVertex(entityVertex))) { - referenceVertex = edge.getOutVertex(); - } - - if (referenceVertex != null) { - String entityTypeName = getTypeName(referenceVertex); - String entityGuid = getGuid(referenceVertex); - AtlasRelationship relationship = mapEdgeToAtlasRelationship(edge); - - ret = new AtlasRelatedObjectId(entityGuid, entityTypeName, - relationship.getGuid(), relationship.getStatus(), - new AtlasStruct(relationship.getTypeName(), relationship.getAttributes())); - - Object displayText = getDisplayText(referenceVertex, entityTypeName); - - if (displayText != null) { - ret.setDisplayText(displayText.toString()); - } - } - } - - return ret; - } - - private Object getDisplayText(AtlasVertex entityVertex, String entityTypeName) throws AtlasBaseException { - AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entityTypeName); - Object ret = null; - - if (entityType != null) { - ret = getVertexAttribute(entityVertex, entityType.getAttribute(NAME)); - - if (ret == null) { - ret = getVertexAttribute(entityVertex, entityType.getAttribute(DISPLAY_NAME)); - } - - if (ret == null) { - ret = getVertexAttribute(entityVertex, entityType.getAttribute(QUALIFIED_NAME)); - } - } - - return ret; - } - - public AtlasRelationship mapEdgeToAtlasRelationship(AtlasEdge edge) throws AtlasBaseException { - return mapEdgeToAtlasRelationship(edge, false).getRelationship(); - } - - public AtlasRelationshipWithExtInfo mapEdgeToAtlasRelationshipWithExtInfo(AtlasEdge edge) throws AtlasBaseException { - return mapEdgeToAtlasRelationship(edge, true); - } - - public AtlasRelationshipWithExtInfo mapEdgeToAtlasRelationship(AtlasEdge edge, boolean extendedInfo) throws AtlasBaseException { - AtlasRelationshipWithExtInfo ret = new AtlasRelationshipWithExtInfo(); - - mapSystemAttributes(edge, ret, extendedInfo); - - mapAttributes(edge, ret); - - return ret; - } - - private AtlasRelationshipWithExtInfo mapSystemAttributes(AtlasEdge edge, AtlasRelationshipWithExtInfo relationshipWithExtInfo, boolean extendedInfo) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("Mapping system attributes for relationship"); - } - - AtlasRelationship relationship = relationshipWithExtInfo.getRelationship(); - - if (relationship == null) { - relationship = new AtlasRelationship(); - - relationshipWithExtInfo.setRelationship(relationship); - } - - relationship.setGuid(getRelationshipGuid(edge)); - relationship.setTypeName(getTypeName(edge)); - - relationship.setCreatedBy(GraphHelper.getCreatedByAsString(edge)); - relationship.setUpdatedBy(GraphHelper.getModifiedByAsString(edge)); - - relationship.setCreateTime(new Date(GraphHelper.getCreatedTime(edge))); - relationship.setUpdateTime(new Date(GraphHelper.getModifiedTime(edge))); - - Long version = GraphHelper.getVersion(edge); - - if (version == null) { - version = Long.valueOf(1L); - } - - relationship.setVersion(version); - relationship.setStatus(GraphHelper.getEdgeStatus(edge)); - - AtlasVertex end1Vertex = edge.getOutVertex(); - AtlasVertex end2Vertex = edge.getInVertex(); - - relationship.setEnd1(new AtlasObjectId(getGuid(end1Vertex), getTypeName(end1Vertex))); - relationship.setEnd2(new AtlasObjectId(getGuid(end2Vertex), getTypeName(end2Vertex))); - - relationship.setLabel(edge.getLabel()); - relationship.setPropagateTags(getPropagateTags(edge)); - - if (extendedInfo) { - addToReferredEntities(relationshipWithExtInfo, end1Vertex); - addToReferredEntities(relationshipWithExtInfo, end2Vertex); - } - - // set propagated and blocked propagated classifications - readClassificationsFromEdge(edge, relationshipWithExtInfo, extendedInfo); - - return relationshipWithExtInfo; - } - - private void readClassificationsFromEdge(AtlasEdge edge, AtlasRelationshipWithExtInfo relationshipWithExtInfo, boolean extendedInfo) throws AtlasBaseException { - List<AtlasVertex> classificationVertices = getClassificationVertices(edge); - List<String> blockedClassificationIds = getBlockedClassificationIds(edge); - AtlasRelationship relationship = relationshipWithExtInfo.getRelationship(); - Set<AtlasClassification> propagatedClassifications = new HashSet<>(); - Set<AtlasClassification> blockedClassifications = new HashSet<>(); - - for (AtlasVertex classificationVertex : classificationVertices) { - String classificationId = classificationVertex.getIdForDisplay(); - AtlasClassification classification = toAtlasClassification(classificationVertex); - String entityGuid = classification.getEntityGuid(); - - if (blockedClassificationIds.contains(classificationId)) { - blockedClassifications.add(classification); - } else { - propagatedClassifications.add(classification); - } - - // add entity headers to referred entities - if (extendedInfo) { - addToReferredEntities(relationshipWithExtInfo, entityGuid); - } - } - - relationship.setPropagatedClassifications(propagatedClassifications); - relationship.setBlockedPropagatedClassifications(blockedClassifications); - } - - private void addToReferredEntities(AtlasRelationshipWithExtInfo relationshipWithExtInfo, String guid) throws AtlasBaseException { - if (!relationshipWithExtInfo.referredEntitiesContains(guid)) { - addToReferredEntities(relationshipWithExtInfo, getEntityVertex(guid)); - } - } - - private void addToReferredEntities(AtlasRelationshipWithExtInfo relationshipWithExtInfo, AtlasVertex entityVertex) throws AtlasBaseException { - String entityGuid = getGuid(entityVertex); - - if (!relationshipWithExtInfo.referredEntitiesContains(entityGuid)) { - relationshipWithExtInfo.addReferredEntity(entityGuid, toAtlasEntityHeader(entityVertex)); - } - } - - private void mapAttributes(AtlasEdge edge, AtlasRelationshipWithExtInfo relationshipWithExtInfo) throws AtlasBaseException { - AtlasRelationship relationship = relationshipWithExtInfo.getRelationship(); - AtlasType objType = typeRegistry.getType(relationship.getTypeName()); - - if (!(objType instanceof AtlasRelationshipType)) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, relationship.getTypeName()); - } - - AtlasRelationshipType relationshipType = (AtlasRelationshipType) objType; - - for (AtlasAttribute attribute : relationshipType.getAllAttributes().values()) { - // mapping only primitive attributes - Object attrValue = mapVertexToPrimitive(edge, attribute.getQualifiedName(), attribute.getAttributeDef()); - - relationship.setAttribute(attribute.getName(), attrValue); - } - } -}
http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityImportStream.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityImportStream.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityImportStream.java deleted file mode 100644 index d4b6c55..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityImportStream.java +++ /dev/null @@ -1,34 +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.model.instance.AtlasEntity.AtlasEntityWithExtInfo; - -public interface EntityImportStream extends EntityStream { - - int size(); - void setPosition(int position); - int getPosition(); - - void setPositionUsingEntityGuid(String guid); - - AtlasEntityWithExtInfo getNextEntityWithExtInfo(); - - void onImportComplete(String guid); -} http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityMutationContext.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityMutationContext.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityMutationContext.java deleted file mode 100644 index e3f7121..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityMutationContext.java +++ /dev/null @@ -1,155 +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 - * <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. - * 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.model.instance.AtlasEntity; - -import org.apache.atlas.repository.graphdb.AtlasVertex; -import org.apache.atlas.repository.store.graph.EntityGraphDiscoveryContext; -import org.apache.atlas.type.AtlasEntityType; -import org.apache.commons.lang.StringUtils; - -import java.util.*; - -public class EntityMutationContext { - private EntityGraphDiscoveryContext context = null; - private final List<AtlasEntity> entitiesCreated = new ArrayList<>(); - private final List<AtlasEntity> entitiesUpdated = new ArrayList<>(); - private final Map<String, AtlasEntityType> entityVsType = new HashMap<>(); - private final Map<String, AtlasVertex> entityVsVertex = new HashMap<>(); - private final Map<String, String> guidAssignments = new HashMap<>(); - - public EntityMutationContext(final EntityGraphDiscoveryContext context) { - this.context = context; - } - - public EntityMutationContext() { - } - - public void addCreated(String internalGuid, AtlasEntity entity, AtlasEntityType type, AtlasVertex atlasVertex) { - entitiesCreated.add(entity); - entityVsType.put(entity.getGuid(), type); - entityVsVertex.put(entity.getGuid(), atlasVertex); - - if (!StringUtils.equals(internalGuid, entity.getGuid())) { - guidAssignments.put(internalGuid, entity.getGuid()); - entityVsVertex.put(internalGuid, atlasVertex); - } - } - - public void addUpdated(String internalGuid, AtlasEntity entity, AtlasEntityType type, AtlasVertex atlasVertex) { - if (!entityVsVertex.containsKey(internalGuid)) { // if the entity was already created/updated - entitiesUpdated.add(entity); - entityVsType.put(entity.getGuid(), type); - entityVsVertex.put(entity.getGuid(), atlasVertex); - - if (!StringUtils.equals(internalGuid, entity.getGuid())) { - guidAssignments.put(internalGuid, entity.getGuid()); - entityVsVertex.put(internalGuid, atlasVertex); - } - } - } - - public EntityGraphDiscoveryContext getDiscoveryContext() { - return this.context; - } - - public Collection<AtlasEntity> getCreatedEntities() { - return entitiesCreated; - } - - public Collection<AtlasEntity> getUpdatedEntities() { - return entitiesUpdated; - } - - public Map<String, String> getGuidAssignments() { - return guidAssignments; - } - - public AtlasEntityType getType(String guid) { - return entityVsType.get(guid); - } - - public AtlasVertex getVertex(String guid) { return entityVsVertex.get(guid); } - - public boolean isImport() { - return (context != null) && context.getEntityStream() instanceof EntityImportStream; - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - final EntityMutationContext that = (EntityMutationContext) o; - - return Objects.equals(context, that.context) && - Objects.equals(entitiesCreated, that.entitiesCreated) && - Objects.equals(entitiesUpdated, that.entitiesUpdated) && - Objects.equals(entityVsType, that.entityVsType) && - Objects.equals(entityVsVertex, that.entityVsVertex); - } - - @Override - public int hashCode() { - int result = (context != null ? context.hashCode() : 0); - result = 31 * result + entitiesCreated.hashCode(); - result = 31 * result + entitiesUpdated.hashCode(); - result = 31 * result + entityVsType.hashCode(); - result = 31 * result + entityVsVertex.hashCode(); - return result; - } - - @Override - public String toString() { - return "EntityMutationContext{" + - "context=" + context + - ", entitiesCreated=" + entitiesCreated + - ", entitiesUpdated=" + entitiesUpdated + - ", entityVsType=" + entityVsType + - ", entityVsVertex=" + entityVsVertex + - '}'; - } - - public AtlasEntity getCreatedEntity(String parentGuid) { - return getFromCollection(parentGuid, getCreatedEntities()); - } - - public AtlasEntity getUpdatedEntity(String parentGuid) { - return getFromCollection(parentGuid, getUpdatedEntities()); - } - - private AtlasEntity getFromCollection(String parentGuid, Collection<AtlasEntity> coll) { - for (AtlasEntity e : coll) { - if(e.getGuid().equalsIgnoreCase(parentGuid)) { - return e; - } - } - - return null; - } - - public AtlasEntity getCreatedOrUpdatedEntity(String parentGuid) { - AtlasEntity e = getCreatedEntity(parentGuid); - if(e == null) { - return getUpdatedEntity(parentGuid); - } - - return e; - } -} http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityStream.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityStream.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityStream.java deleted file mode 100644 index 3444bfd..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityStream.java +++ /dev/null @@ -1,31 +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.model.instance.AtlasEntity; - -public interface EntityStream { - - boolean hasNext(); - - AtlasEntity next(); - - void reset(); - - AtlasEntity getByGuid(String guid); -} http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/IDBasedEntityResolver.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/IDBasedEntityResolver.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/IDBasedEntityResolver.java deleted file mode 100644 index 8b7ac8b..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/IDBasedEntityResolver.java +++ /dev/null @@ -1,83 +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.exception.AtlasBaseException; -import org.apache.atlas.model.TypeCategory; -import org.apache.atlas.model.instance.AtlasEntity; -import org.apache.atlas.repository.graphdb.AtlasVertex; -import org.apache.atlas.repository.store.graph.EntityGraphDiscoveryContext; -import org.apache.atlas.repository.store.graph.EntityResolver; -import org.apache.atlas.type.AtlasEntityType; -import org.apache.atlas.type.AtlasTypeRegistry; -import org.apache.atlas.type.AtlasTypeUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class IDBasedEntityResolver implements EntityResolver { - private static final Logger LOG = LoggerFactory.getLogger(IDBasedEntityResolver.class); - - private final AtlasTypeRegistry typeRegistry; - - public IDBasedEntityResolver(AtlasTypeRegistry typeRegistry) { - this.typeRegistry = typeRegistry; - } - - public EntityGraphDiscoveryContext resolveEntityReferences(EntityGraphDiscoveryContext context) throws AtlasBaseException { - if (context == null) { - throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, "IDBasedEntityResolver.resolveEntityReferences(): context is null"); - } - - EntityStream entityStream = context.getEntityStream(); - - for (String guid : context.getReferencedGuids()) { - boolean isAssignedGuid = AtlasTypeUtil.isAssignedGuid(guid); - AtlasVertex vertex = isAssignedGuid ? AtlasGraphUtilsV1.findByGuid(guid) : null; - - if (vertex == null && !(entityStream instanceof EntityImportStream)) { // if not found in the store, look if the entity is present in the stream - AtlasEntity entity = entityStream.getByGuid(guid); - - if (entity != null) { // look for the entity in the store using unique-attributes - AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entity.getTypeName()); - - if (entityType == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), entity.getTypeName()); - } - - vertex = AtlasGraphUtilsV1.findByUniqueAttributes(entityType, entity.getAttributes()); - } else if (!isAssignedGuid) { // for local-guids, entity must be in the stream - throw new AtlasBaseException(AtlasErrorCode.REFERENCED_ENTITY_NOT_FOUND, guid); - } - } - - if (vertex != null) { - context.addResolvedGuid(guid, vertex); - } else { - if (isAssignedGuid && !(entityStream instanceof EntityImportStream)) { - throw new AtlasBaseException(AtlasErrorCode.REFERENCED_ENTITY_NOT_FOUND, guid); - } else { - context.addLocalGuidReference(guid); - } - } - } - - return context; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/InMemoryMapEntityStream.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/InMemoryMapEntityStream.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/InMemoryMapEntityStream.java deleted file mode 100644 index 68d7f11..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/InMemoryMapEntityStream.java +++ /dev/null @@ -1,55 +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.model.instance.AtlasEntity; - -import java.util.Iterator; -import java.util.Map; - -public class InMemoryMapEntityStream implements EntityStream { - - private final Map<String, AtlasEntity> entities; - private Iterator<Map.Entry<String, AtlasEntity>> iterator; - - public InMemoryMapEntityStream(Map<String, AtlasEntity> entities) { - this.entities = entities; - this.iterator = entities.entrySet().iterator(); - } - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public AtlasEntity next() { - return iterator.hasNext() ? iterator.next().getValue() : null; - } - - @Override - public void reset() { - iterator = entities.entrySet().iterator(); - } - - @Override - public AtlasEntity getByGuid(final String guid) { - return entities.get(guid); - } -} http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/InstanceGraphMapper.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/InstanceGraphMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/InstanceGraphMapper.java deleted file mode 100644 index 3cae8a5..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/InstanceGraphMapper.java +++ /dev/null @@ -1,32 +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.exception.AtlasBaseException; - -public interface InstanceGraphMapper<T> { - - /** - * Map the given type instance to the graph - * - * @param ctx - * @return the value that was mapped to the vertex - * @throws AtlasBaseException - */ - T toGraph(AttributeMutationContext ctx, EntityMutationContext context) throws AtlasBaseException; -} http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1.java index 2c921fc..41e65d4 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1.java @@ -18,13 +18,14 @@ package org.apache.atlas.repository.store.graph.v1; -import org.apache.atlas.RequestContextV1; +import org.apache.atlas.RequestContext; import org.apache.atlas.annotation.ConditionalOnAtlasProperty; import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.repository.graph.GraphHelper; import org.apache.atlas.repository.graphdb.AtlasEdge; import org.apache.atlas.repository.graphdb.AtlasVertex; +import org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2; import org.apache.atlas.type.AtlasTypeRegistry; import org.springframework.stereotype.Component; @@ -52,12 +53,12 @@ public class SoftDeleteHandlerV1 extends DeleteHandlerV1 { if (force) { graphHelper.removeVertex(instanceVertex); } else { - AtlasEntity.Status state = AtlasGraphUtilsV1.getState(instanceVertex); + AtlasEntity.Status state = AtlasGraphUtilsV2.getState(instanceVertex); if (state != AtlasEntity.Status.DELETED) { GraphHelper.setProperty(instanceVertex, STATE_PROPERTY_KEY, AtlasEntity.Status.DELETED.name()); - GraphHelper.setProperty(instanceVertex, MODIFICATION_TIMESTAMP_PROPERTY_KEY, RequestContextV1.get().getRequestTime()); - GraphHelper.setProperty(instanceVertex, MODIFIED_BY_KEY, RequestContextV1.get().getUser()); + GraphHelper.setProperty(instanceVertex, MODIFICATION_TIMESTAMP_PROPERTY_KEY, RequestContext.get().getRequestTime()); + GraphHelper.setProperty(instanceVertex, MODIFIED_BY_KEY, RequestContext.get().getUser()); } } } @@ -74,12 +75,12 @@ public class SoftDeleteHandlerV1 extends DeleteHandlerV1 { if (force) { graphHelper.removeEdge(edge); } else { - AtlasEntity.Status state = AtlasGraphUtilsV1.getState(edge); + AtlasEntity.Status state = AtlasGraphUtilsV2.getState(edge); if (state != AtlasEntity.Status.DELETED) { GraphHelper.setProperty(edge, STATE_PROPERTY_KEY, AtlasEntity.Status.DELETED.name()); - GraphHelper.setProperty(edge, MODIFICATION_TIMESTAMP_PROPERTY_KEY, RequestContextV1.get().getRequestTime()); - GraphHelper.setProperty(edge, MODIFIED_BY_KEY, RequestContextV1.get().getUser()); + GraphHelper.setProperty(edge, MODIFICATION_TIMESTAMP_PROPERTY_KEY, RequestContext.get().getRequestTime()); + GraphHelper.setProperty(edge, MODIFIED_BY_KEY, RequestContext.get().getUser()); } } } http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/UniqAttrBasedEntityResolver.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/UniqAttrBasedEntityResolver.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/UniqAttrBasedEntityResolver.java deleted file mode 100644 index 50eee72..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/UniqAttrBasedEntityResolver.java +++ /dev/null @@ -1,75 +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.exception.AtlasBaseException; -import org.apache.atlas.model.TypeCategory; -import org.apache.atlas.model.instance.AtlasObjectId; -import org.apache.atlas.repository.graphdb.AtlasVertex; -import org.apache.atlas.repository.store.graph.EntityGraphDiscoveryContext; -import org.apache.atlas.repository.store.graph.EntityResolver; -import org.apache.atlas.type.AtlasEntityType; -import org.apache.atlas.type.AtlasTypeRegistry; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.List; - - -public class UniqAttrBasedEntityResolver implements EntityResolver { - private static final Logger LOG = LoggerFactory.getLogger(UniqAttrBasedEntityResolver.class); - - private final AtlasTypeRegistry typeRegistry; - - public UniqAttrBasedEntityResolver(AtlasTypeRegistry typeRegistry) { - this.typeRegistry = typeRegistry; - } - - @Override - public EntityGraphDiscoveryContext resolveEntityReferences(EntityGraphDiscoveryContext context) throws AtlasBaseException { - if (context == null) { - throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, "UniqAttrBasedEntityResolver.resolveEntityReferences(): context is null"); - } - - //Resolve attribute references - List<AtlasObjectId> resolvedReferences = new ArrayList<>(); - - for (AtlasObjectId objId : context.getReferencedByUniqAttribs()) { - //query in graph repo that given unique attribute - check for deleted also? - AtlasEntityType entityType = typeRegistry.getEntityTypeByName(objId.getTypeName()); - - if (entityType == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), objId.getTypeName()); - } - - AtlasVertex vertex = AtlasGraphUtilsV1.findByUniqueAttributes(entityType, objId.getUniqueAttributes()); - - if (vertex != null) { - context.addResolvedIdByUniqAttribs(objId, vertex); - resolvedReferences.add(objId); - } else { - throw new AtlasBaseException(AtlasErrorCode.REFERENCED_ENTITY_NOT_FOUND, objId.toString()); - } - } - - return context; - } -} - http://git-wip-us.apache.org/repos/asf/atlas/blob/3d5b4880/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java new file mode 100644 index 0000000..2cb2b47 --- /dev/null +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java @@ -0,0 +1,112 @@ +/** + * 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.v2; + +import org.apache.atlas.ApplicationProperties; +import org.apache.atlas.AtlasErrorCode; +import org.apache.atlas.AtlasException; +import org.apache.atlas.exception.AtlasBaseException; +import org.apache.atlas.model.typedef.AtlasBaseTypeDef; +import org.apache.atlas.model.typedef.AtlasStructDef; +import org.apache.atlas.query.AtlasDSL; +import org.apache.atlas.repository.graphdb.AtlasVertex; +import org.apache.atlas.repository.store.graph.AtlasDefStore; +import org.apache.atlas.type.AtlasTypeRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * Abstract typedef-store for v1 format. + */ + abstract class AtlasAbstractDefStoreV2<T extends AtlasBaseTypeDef> implements AtlasDefStore<T> { + private static final Logger LOG = LoggerFactory.getLogger(AtlasAbstractDefStoreV2.class); + + protected final AtlasTypeDefGraphStoreV2 typeDefStore; + protected final AtlasTypeRegistry typeRegistry; + + private static final String NAME_REGEX = "[a-zA-Z][a-zA-Z0-9_ ]*"; + private static final String INTERNAL_NAME_REGEX = "__" + NAME_REGEX; + private static final Pattern NAME_PATTERN = Pattern.compile(NAME_REGEX); + private static final Pattern INTERNAL_NAME_PATTERN = Pattern.compile(INTERNAL_NAME_REGEX); + + public static final String ALLOW_RESERVED_KEYWORDS = "atlas.types.allowReservedKeywords"; + + public AtlasAbstractDefStoreV2(AtlasTypeDefGraphStoreV2 typeDefStore, AtlasTypeRegistry typeRegistry) { + this.typeDefStore = typeDefStore; + this.typeRegistry = typeRegistry; + } + + public void validateType(AtlasBaseTypeDef typeDef) throws AtlasBaseException { + if (!isValidName(typeDef.getName())) { + throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID_FORMAT, typeDef.getName(), typeDef.getCategory().name()); + } + + try { + final boolean allowReservedKeywords = ApplicationProperties.get().getBoolean(ALLOW_RESERVED_KEYWORDS, true); + + if (!allowReservedKeywords && typeDef instanceof AtlasStructDef) { + final List<AtlasStructDef.AtlasAttributeDef> attributeDefs = ((AtlasStructDef) typeDef).getAttributeDefs(); + for (AtlasStructDef.AtlasAttributeDef attrDef : attributeDefs) { + if (AtlasDSL.Parser.isKeyword(attrDef.getName())) { + throw new AtlasBaseException(AtlasErrorCode.ATTRIBUTE_NAME_INVALID, attrDef.getName(), typeDef.getCategory().name()); + } + } + } + } catch (AtlasException e) { + LOG.error("Exception while loading configuration ", e); + throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, "Could not load configuration"); + } + } + + public boolean isValidName(String typeName) { + return NAME_PATTERN.matcher(typeName).matches() || INTERNAL_NAME_PATTERN.matcher(typeName).matches(); + } + + @Override + public void deleteByName(String name, AtlasVertex preDeleteResult) throws AtlasBaseException { + if (LOG.isDebugEnabled()) { + LOG.debug("==> AtlasAbstractDefStoreV1.deleteByName({}, {})", name, preDeleteResult); + } + + AtlasVertex vertex = (preDeleteResult == null) ? preDeleteByName(name) : preDeleteResult; + + typeDefStore.deleteTypeVertex(vertex); + + if (LOG.isDebugEnabled()) { + LOG.debug("<== AtlasAbstractDefStoreV1.deleteByName({}, {})", name, preDeleteResult); + } + } + + @Override + public void deleteByGuid(String guid, AtlasVertex preDeleteResult) throws AtlasBaseException { + if (LOG.isDebugEnabled()) { + LOG.debug("==> AtlasAbstractDefStoreV1.deleteByGuid({}, {})", guid, preDeleteResult); + } + + AtlasVertex vertex = (preDeleteResult == null) ? preDeleteByGuid(guid) : preDeleteResult; + + typeDefStore.deleteTypeVertex(vertex); + + if (LOG.isDebugEnabled()) { + LOG.debug("<== AtlasAbstractDefStoreV1.deleteByGuid({}, {})", guid, preDeleteResult); + } + } +}