http://git-wip-us.apache.org/repos/asf/atlas/blob/4823c8ed/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStream.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStream.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStream.java deleted file mode 100644 index d6d6272..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStream.java +++ /dev/null @@ -1,88 +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.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo; -import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo; - -import java.util.Iterator; - -public class AtlasEntityStream implements EntityStream { - protected final AtlasEntitiesWithExtInfo entitiesWithExtInfo; - protected final EntityStream entityStream; - private Iterator<AtlasEntity> iterator; - - - public AtlasEntityStream(AtlasEntity entity) { - this(new AtlasEntitiesWithExtInfo(entity)); - } - - public AtlasEntityStream(AtlasEntityWithExtInfo entityWithExtInfo) { - this(new AtlasEntitiesWithExtInfo(entityWithExtInfo)); - } - - public AtlasEntityStream(AtlasEntitiesWithExtInfo entitiesWithExtInfo) { - this.entitiesWithExtInfo = entitiesWithExtInfo; - this.iterator = this.entitiesWithExtInfo.getEntities().iterator(); - this.entityStream = null; - } - - public AtlasEntityStream(AtlasEntity entity, EntityStream entityStream) { - this.entitiesWithExtInfo = new AtlasEntitiesWithExtInfo(entity); - this.iterator = this.entitiesWithExtInfo.getEntities().iterator(); - this.entityStream = entityStream; - } - - public AtlasEntityStream(AtlasEntityWithExtInfo entityWithExtInfo, EntityStream entityStream) { - this.entitiesWithExtInfo = new AtlasEntitiesWithExtInfo(entityWithExtInfo); - this.iterator = this.entitiesWithExtInfo.getEntities().iterator(); - this.entityStream = entityStream; - } - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public AtlasEntity next() { - return iterator.hasNext() ? iterator.next() : null; - } - - @Override - public void reset() { - this.iterator = entitiesWithExtInfo.getEntities().iterator(); - } - - @Override - public AtlasEntity getByGuid(String guid) { - return entityStream != null ? entityStream.getByGuid(guid) : entitiesWithExtInfo.getEntity(guid); - } - - @Override - public String toString() { - StringBuffer sb = new StringBuffer("AtlasEntityStream{"); - - sb.append("entitiesWithExtInfo=").append(entitiesWithExtInfo); - sb.append(", iterator=").append(iterator); - sb.append('}'); - - return sb.toString(); - } -}
http://git-wip-us.apache.org/repos/asf/atlas/blob/4823c8ed/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStreamForImport.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStreamForImport.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStreamForImport.java deleted file mode 100644 index 90ae15d..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStreamForImport.java +++ /dev/null @@ -1,72 +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.model.instance.AtlasEntity.AtlasEntityWithExtInfo; - -public class AtlasEntityStreamForImport extends AtlasEntityStream implements EntityImportStream { - private int currentPosition = 0; - - public AtlasEntityStreamForImport(AtlasEntityWithExtInfo entityWithExtInfo, EntityStream entityStream) { - super(entityWithExtInfo, entityStream); - } - - @Override - public AtlasEntityWithExtInfo getNextEntityWithExtInfo() { - currentPosition++; - AtlasEntity entity = next(); - - return entity != null ? new AtlasEntityWithExtInfo(entity, super.entitiesWithExtInfo) : null; - } - - @Override - public AtlasEntity getByGuid(String guid) { - AtlasEntity ent = super.entitiesWithExtInfo.getEntity(guid); - - if(ent == null && entityStream != null) { - return entityStream.getByGuid(guid); - } - - return ent; - } - - @Override - public int size() { - return 1; - } - - @Override - public void setPosition(int position) { - // not applicable for a single entity stream - } - - @Override - public int getPosition() { - return currentPosition; - } - - @Override - public void setPositionUsingEntityGuid(String guid) { - } - - @Override - public void onImportComplete(String guid) { - - } -} http://git-wip-us.apache.org/repos/asf/atlas/blob/4823c8ed/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEnumDefStoreV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEnumDefStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEnumDefStoreV1.java deleted file mode 100644 index dcb36dd..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEnumDefStoreV1.java +++ /dev/null @@ -1,325 +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.typedef.AtlasEnumDef; -import org.apache.atlas.model.typedef.AtlasEnumDef.AtlasEnumElementDef; -import org.apache.atlas.repository.Constants; -import org.apache.atlas.repository.graphdb.AtlasVertex; -import org.apache.atlas.type.AtlasTypeRegistry; -import org.apache.atlas.typesystem.types.DataTypes.TypeCategory; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.atlas.authorize.AtlasPrivilege; -import org.apache.atlas.authorize.AtlasTypeAccessRequest; -import org.apache.atlas.authorize.AtlasAuthorizationUtils; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * EnumDef store in v1 format. - */ -class AtlasEnumDefStoreV1 extends AtlasAbstractDefStoreV1<AtlasEnumDef> { - private static final Logger LOG = LoggerFactory.getLogger(AtlasEnumDefStoreV1.class); - - public AtlasEnumDefStoreV1(AtlasTypeDefGraphStoreV1 typeDefStore, AtlasTypeRegistry typeRegistry) { - super(typeDefStore, typeRegistry); - } - - @Override - public AtlasVertex preCreate(AtlasEnumDef enumDef) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasEnumDefStoreV1.preCreate({})", enumDef); - } - - validateType(enumDef); - - AtlasVertex vertex = typeDefStore.findTypeVertexByName(enumDef.getName()); - - if (vertex != null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_ALREADY_EXISTS, enumDef.getName()); - } - - vertex = typeDefStore.createTypeVertex(enumDef); - - toVertex(enumDef, vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasEnumDefStoreV1.preCreate({}): {}", enumDef, vertex); - } - - return vertex; - } - - @Override - public AtlasEnumDef create(AtlasEnumDef enumDef, AtlasVertex preCreateResult) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasEnumDefStoreV1.create({}, {})", enumDef, preCreateResult); - } - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_CREATE, enumDef), "create enum-def ", enumDef.getName()); - - AtlasVertex vertex = (preCreateResult == null) ? preCreate(enumDef) : preCreateResult; - - AtlasEnumDef ret = toEnumDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasEntityDefStoreV1.create({}, {}): {}", enumDef, preCreateResult, ret); - } - - return ret; - } - - @Override - public List<AtlasEnumDef> getAll() throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasEnumDefStoreV1.getAll()"); - } - - List<AtlasEnumDef> ret = new ArrayList<>(); - - Iterator<AtlasVertex> vertices = typeDefStore.findTypeVerticesByCategory(TypeCategory.ENUM); - while (vertices.hasNext()) { - ret.add(toEnumDef(vertices.next())); - } - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasEnumDefStoreV1.getAll(): count={}", ret.size()); - } - - return ret; - } - - @Override - public AtlasEnumDef getByName(String name) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasEnumDefStoreV1.getByName({})", name); - } - - AtlasVertex vertex = typeDefStore.findTypeVertexByNameAndCategory(name, TypeCategory.ENUM); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_NOT_FOUND, name); - } - - vertex.getProperty(Constants.TYPE_CATEGORY_PROPERTY_KEY, TypeCategory.class); - - AtlasEnumDef ret = toEnumDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasEnumDefStoreV1.getByName({}): {}", name, ret); - } - - return ret; - } - - @Override - public AtlasEnumDef getByGuid(String guid) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasEnumDefStoreV1.getByGuid({})", guid); - } - - AtlasVertex vertex = typeDefStore.findTypeVertexByGuidAndCategory(guid, TypeCategory.ENUM); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_GUID_NOT_FOUND, guid); - } - - AtlasEnumDef ret = toEnumDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasEnumDefStoreV1.getByGuid({}): {}", guid, ret); - } - - return ret; - } - - @Override - public AtlasEnumDef update(AtlasEnumDef enumDef) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasEnumDefStoreV1.update({})", enumDef); - } - - validateType(enumDef); - - AtlasEnumDef ret = StringUtils.isNotBlank(enumDef.getGuid()) ? updateByGuid(enumDef.getGuid(), enumDef) - : updateByName(enumDef.getName(), enumDef); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasEnumDefStoreV1.update({}): {}", enumDef, ret); - } - - return ret; - } - - @Override - public AtlasEnumDef updateByName(String name, AtlasEnumDef enumDef) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasEnumDefStoreV1.updateByName({}, {})", name, enumDef); - } - - AtlasEnumDef existingDef = typeRegistry.getEnumDefByName(name); - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_UPDATE, existingDef), "update enum-def ", name); - - validateType(enumDef); - - AtlasVertex vertex = typeDefStore.findTypeVertexByNameAndCategory(name, TypeCategory.ENUM); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_NOT_FOUND, name); - } - - typeDefStore.updateTypeVertex(enumDef, vertex); - - toVertex(enumDef, vertex); - - AtlasEnumDef ret = toEnumDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasEnumDefStoreV1.updateByName({}, {}): {}", name, enumDef, ret); - } - - return ret; - } - - @Override - public AtlasEnumDef updateByGuid(String guid, AtlasEnumDef enumDef) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasEnumDefStoreV1.updateByGuid({})", guid); - } - - AtlasEnumDef existingDef = typeRegistry.getEnumDefByGuid(guid); - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_UPDATE, existingDef), "update enum-def ", (existingDef != null ? existingDef.getName() : guid)); - - validateType(enumDef); - - AtlasVertex vertex = typeDefStore.findTypeVertexByGuidAndCategory(guid, TypeCategory.ENUM); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_GUID_NOT_FOUND, guid); - } - - typeDefStore.updateTypeVertex(enumDef, vertex); - - toVertex(enumDef, vertex); - - AtlasEnumDef ret = toEnumDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasEnumDefStoreV1.updateByGuid({}): {}", guid, ret); - } - - return ret; - } - - @Override - public AtlasVertex preDeleteByName(String name) throws AtlasBaseException { - AtlasVertex vertex = typeDefStore.findTypeVertexByNameAndCategory(name, TypeCategory.ENUM); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_NOT_FOUND, name); - } - - AtlasEnumDef existingDef = typeRegistry.getEnumDefByName(name); - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_DELETE, existingDef), "delete enum-def ", (existingDef != null ? existingDef.getName() : name)); - - return vertex; - } - - @Override - public AtlasVertex preDeleteByGuid(String guid) throws AtlasBaseException { - AtlasVertex vertex = typeDefStore.findTypeVertexByGuidAndCategory(guid, TypeCategory.ENUM); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_GUID_NOT_FOUND, guid); - } - - AtlasEnumDef existingDef = typeRegistry.getEnumDefByGuid(guid); - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_DELETE, existingDef), "delete enum-def ", (existingDef != null ? existingDef.getName() : guid)); - - return vertex; - } - - private void toVertex(AtlasEnumDef enumDef, AtlasVertex vertex) throws AtlasBaseException { - if (CollectionUtils.isEmpty(enumDef.getElementDefs())) { - throw new AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE, enumDef.getName(), "values"); - } - - List<String> values = new ArrayList<>(enumDef.getElementDefs().size()); - - for (AtlasEnumElementDef element : enumDef.getElementDefs()) { - // Validate the enum element - if (StringUtils.isEmpty(element.getValue()) || null == element.getOrdinal()) { - throw new AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE, enumDef.getName(), "elementValue"); - } - - String elemKey = AtlasGraphUtilsV1.getTypeDefPropertyKey(enumDef, element.getValue()); - - AtlasGraphUtilsV1.setProperty(vertex, elemKey, element.getOrdinal()); - - if (StringUtils.isNotBlank(element.getDescription())) { - String descKey = AtlasGraphUtilsV1.getTypeDefPropertyKey(elemKey, "description"); - - AtlasGraphUtilsV1.setProperty(vertex, descKey, element.getDescription()); - } - - values.add(element.getValue()); - } - AtlasGraphUtilsV1.setProperty(vertex, AtlasGraphUtilsV1.getTypeDefPropertyKey(enumDef), values); - } - - private AtlasEnumDef toEnumDef(AtlasVertex vertex) { - AtlasEnumDef ret = null; - - if (vertex != null && typeDefStore.isTypeVertex(vertex, TypeCategory.ENUM)) { - ret = toEnumDef(vertex, new AtlasEnumDef(), typeDefStore); - } - - return ret; - } - - private static AtlasEnumDef toEnumDef(AtlasVertex vertex, AtlasEnumDef enumDef, AtlasTypeDefGraphStoreV1 typeDefStore) { - AtlasEnumDef ret = enumDef != null ? enumDef : new AtlasEnumDef(); - - typeDefStore.vertexToTypeDef(vertex, ret); - - List<AtlasEnumElementDef> elements = new ArrayList<>(); - List<String> elemValues = vertex.getProperty(AtlasGraphUtilsV1.getTypeDefPropertyKey(ret), List.class); - for (String elemValue : elemValues) { - String elemKey = AtlasGraphUtilsV1.getTypeDefPropertyKey(ret, elemValue); - String descKey = AtlasGraphUtilsV1.getTypeDefPropertyKey(elemKey, "description"); - - Integer ordinal = AtlasGraphUtilsV1.getProperty(vertex, elemKey, Integer.class); - String desc = AtlasGraphUtilsV1.getProperty(vertex, descKey, String.class); - - elements.add(new AtlasEnumElementDef(elemValue, desc, ordinal)); - } - ret.setElementDefs(elements); - - return ret; - } -} http://git-wip-us.apache.org/repos/asf/atlas/blob/4823c8ed/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java deleted file mode 100644 index 3e6f819..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java +++ /dev/null @@ -1,514 +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.ApplicationProperties; -import org.apache.atlas.AtlasErrorCode; -import org.apache.atlas.SortOrder; -import org.apache.atlas.discovery.SearchProcessor; -import org.apache.atlas.exception.AtlasBaseException; -import org.apache.atlas.model.TypeCategory; -import org.apache.atlas.model.instance.AtlasEntity; -import org.apache.atlas.model.typedef.AtlasBaseTypeDef; -import org.apache.atlas.repository.Constants; -import org.apache.atlas.repository.graph.AtlasGraphProvider; -import org.apache.atlas.repository.graph.GraphHelper; -import org.apache.atlas.repository.graphdb.AtlasEdge; -import org.apache.atlas.repository.graphdb.AtlasElement; -import org.apache.atlas.repository.graphdb.AtlasGraphQuery; -import org.apache.atlas.repository.graphdb.AtlasIndexQuery; -import org.apache.atlas.repository.graphdb.AtlasVertex; -import org.apache.atlas.type.AtlasEntityType; -import org.apache.atlas.type.AtlasStructType; -import org.apache.atlas.type.AtlasStructType.AtlasAttribute; -import org.apache.atlas.type.AtlasType; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static org.apache.atlas.repository.Constants.INDEX_SEARCH_VERTEX_PREFIX_DEFAULT; -import static org.apache.atlas.repository.Constants.INDEX_SEARCH_VERTEX_PREFIX_PROPERTY; -import static org.apache.atlas.repository.graphdb.AtlasGraphQuery.SortOrder.*; - -/** - * Utility methods for Graph. - */ -public class AtlasGraphUtilsV1 { - private static final Logger LOG = LoggerFactory.getLogger(AtlasGraphUtilsV1.class); - - public static final String PROPERTY_PREFIX = Constants.INTERNAL_PROPERTY_KEY_PREFIX + "type."; - public static final String SUPERTYPE_EDGE_LABEL = PROPERTY_PREFIX + ".supertype"; - public static final String ENTITYTYPE_EDGE_LABEL = PROPERTY_PREFIX + ".entitytype"; - public static final String RELATIONSHIPTYPE_EDGE_LABEL = PROPERTY_PREFIX + ".relationshipType"; - public static final String VERTEX_TYPE = "typeSystem"; - - private static boolean USE_INDEX_QUERY_TO_FIND_ENTITY_BY_UNIQUE_ATTRIBUTES = false; - private static String INDEX_SEARCH_PREFIX; - - static { - try { - Configuration conf = ApplicationProperties.get(); - - USE_INDEX_QUERY_TO_FIND_ENTITY_BY_UNIQUE_ATTRIBUTES = conf.getBoolean("atlas.use.index.query.to.find.entity.by.unique.attributes", USE_INDEX_QUERY_TO_FIND_ENTITY_BY_UNIQUE_ATTRIBUTES); - INDEX_SEARCH_PREFIX = conf.getString(INDEX_SEARCH_VERTEX_PREFIX_PROPERTY, INDEX_SEARCH_VERTEX_PREFIX_DEFAULT); - } catch (Exception excp) { - LOG.error("Error reading configuration", excp); - } finally { - LOG.info("atlas.use.index.query.to.find.entity.by.unique.attributes=" + USE_INDEX_QUERY_TO_FIND_ENTITY_BY_UNIQUE_ATTRIBUTES); - } - } - - public static String getTypeDefPropertyKey(AtlasBaseTypeDef typeDef) { - return getTypeDefPropertyKey(typeDef.getName()); - } - - public static String getTypeDefPropertyKey(AtlasBaseTypeDef typeDef, String child) { - return getTypeDefPropertyKey(typeDef.getName(), child); - } - - public static String getTypeDefPropertyKey(String typeName) { - return PROPERTY_PREFIX + typeName; - } - - public static String getTypeDefPropertyKey(String typeName, String child) { - return PROPERTY_PREFIX + typeName + "." + child; - } - - public static String getIdFromVertex(AtlasVertex vertex) { - return vertex.getProperty(Constants.GUID_PROPERTY_KEY, String.class); - } - - public static String getIdFromEdge(AtlasEdge edge) { - return edge.getProperty(Constants.GUID_PROPERTY_KEY, String.class); - } - - public static String getTypeName(AtlasElement element) { - return element.getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY, String.class); - } - - public static String getEdgeLabel(String fromNode, String toNode) { - return PROPERTY_PREFIX + "edge." + fromNode + "." + toNode; - } - - public static String getEdgeLabel(String property) { - return GraphHelper.EDGE_LABEL_PREFIX + property; - } - - public static String getAttributeEdgeLabel(AtlasStructType fromType, String attributeName) throws AtlasBaseException { - return getEdgeLabel(getQualifiedAttributePropertyKey(fromType, attributeName)); - } - - public static String getQualifiedAttributePropertyKey(AtlasStructType fromType, String attributeName) throws AtlasBaseException { - switch (fromType.getTypeCategory()) { - case ENTITY: - case STRUCT: - case CLASSIFICATION: - return fromType.getQualifiedAttributeName(attributeName); - default: - throw new AtlasBaseException(AtlasErrorCode.UNKNOWN_TYPE, fromType.getTypeCategory().name()); - } - } - - public static boolean isEntityVertex(AtlasVertex vertex) { - return StringUtils.isNotEmpty(getIdFromVertex(vertex)) && StringUtils.isNotEmpty(getTypeName(vertex)); - } - - public static boolean isReference(AtlasType type) { - return isReference(type.getTypeCategory()); - } - - public static boolean isReference(TypeCategory typeCategory) { - return typeCategory == TypeCategory.STRUCT || - typeCategory == TypeCategory.ENTITY || - typeCategory == TypeCategory.OBJECT_ID_TYPE; - } - - public static String encodePropertyKey(String key) { - String ret = AtlasStructType.AtlasAttribute.encodePropertyKey(key); - - return ret; - } - - public static String decodePropertyKey(String key) { - String ret = AtlasStructType.AtlasAttribute.decodePropertyKey(key); - - return ret; - } - - /** - * Adds an additional value to a multi-property. - * - * @param propertyName - * @param value - */ - public static AtlasVertex addProperty(AtlasVertex vertex, String propertyName, Object value) { - if (LOG.isDebugEnabled()) { - LOG.debug("==> addProperty({}, {}, {})", toString(vertex), propertyName, value); - } - propertyName = encodePropertyKey(propertyName); - vertex.addProperty(propertyName, value); - return vertex; - } - - public static <T extends AtlasElement> void setProperty(T element, String propertyName, Object value) { - if (LOG.isDebugEnabled()) { - LOG.debug("==> setProperty({}, {}, {})", toString(element), propertyName, value); - } - - propertyName = encodePropertyKey(propertyName); - - Object existingValue = element.getProperty(propertyName, Object.class); - - if (value == null || (value instanceof Collection && ((Collection)value).isEmpty())) { - if (existingValue != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("Removing property {} from {}", propertyName, toString(element)); - } - - element.removeProperty(propertyName); - } - } else { - if (!value.equals(existingValue)) { - if (LOG.isDebugEnabled()) { - LOG.debug("Setting property {} in {}", propertyName, toString(element)); - } - - if ( value instanceof Date) { - Long encodedValue = ((Date) value).getTime(); - element.setProperty(propertyName, encodedValue); - } else { - element.setProperty(propertyName, value); - } - } - } - } - - public static <T extends AtlasElement, O> O getProperty(T element, String propertyName, Class<O> returnType) { - Object property = element.getProperty(encodePropertyKey(propertyName), returnType); - - if (LOG.isDebugEnabled()) { - LOG.debug("getProperty({}, {}) ==> {}", toString(element), propertyName, returnType.cast(property)); - } - - return returnType.cast(property); - } - - public static AtlasVertex getVertexByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> attrValues) throws AtlasBaseException { - AtlasVertex vertex = findByUniqueAttributes(entityType, attrValues); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.INSTANCE_BY_UNIQUE_ATTRIBUTE_NOT_FOUND, entityType.getTypeName(), - attrValues.toString()); - } - - return vertex; - } - - public static String getGuidByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> attrValues) throws AtlasBaseException { - AtlasVertex vertexByUniqueAttributes = getVertexByUniqueAttributes(entityType, attrValues); - return getIdFromVertex(vertexByUniqueAttributes); - } - - public static AtlasVertex findByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> attrValues) { - AtlasVertex vertex = null; - - final Map<String, AtlasAttribute> uniqueAttributes = entityType.getUniqAttributes(); - - if (MapUtils.isNotEmpty(uniqueAttributes) && MapUtils.isNotEmpty(attrValues)) { - for (AtlasAttribute attribute : uniqueAttributes.values()) { - Object attrValue = attrValues.get(attribute.getName()); - - if (attrValue == null) { - continue; - } - - if (canUseIndexQuery(entityType, attribute.getName())) { - vertex = AtlasGraphUtilsV1.getAtlasVertexFromIndexQuery(entityType, attribute, attrValue); - } else { - vertex = AtlasGraphUtilsV1.findByTypeAndPropertyName(entityType.getTypeName(), attribute.getVertexPropertyName(), attrValue); - - // if no instance of given typeName is found, try to find an instance of type's sub-type - if (vertex == null && !entityType.getAllSubTypes().isEmpty()) { - vertex = AtlasGraphUtilsV1.findBySuperTypeAndPropertyName(entityType.getTypeName(), attribute.getVertexPropertyName(), attrValue); - } - } - - if (vertex != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("findByUniqueAttributes(type={}, attrName={}, attrValue={}: found vertex {}", - entityType.getTypeName(), attribute.getName(), attrValue, vertex); - } - - break; - } - } - } - - return vertex; - } - - public static AtlasVertex findByGuid(String guid) { - AtlasGraphQuery query = AtlasGraphProvider.getGraphInstance().query() - .has(Constants.GUID_PROPERTY_KEY, guid); - - Iterator<AtlasVertex> results = query.vertices().iterator(); - - AtlasVertex vertex = results.hasNext() ? results.next() : null; - - return vertex; - } - - public static String getTypeNameFromGuid(String guid) { - String ret = null; - - if (StringUtils.isNotEmpty(guid)) { - AtlasVertex vertex = AtlasGraphUtilsV1.findByGuid(guid); - - ret = (vertex != null) ? AtlasGraphUtilsV1.getTypeName(vertex) : null; - } - - return ret; - } - - public static boolean typeHasInstanceVertex(String typeName) throws AtlasBaseException { - AtlasGraphQuery query = AtlasGraphProvider.getGraphInstance() - .query() - .has(Constants.TYPE_NAME_PROPERTY_KEY, AtlasGraphQuery.ComparisionOperator.EQUAL, typeName); - - Iterator<AtlasVertex> results = query.vertices().iterator(); - - boolean hasInstanceVertex = results != null && results.hasNext(); - - if (LOG.isDebugEnabled()) { - LOG.debug("typeName {} has instance vertex {}", typeName, hasInstanceVertex); - } - - return hasInstanceVertex; - } - - public static AtlasVertex findByTypeAndPropertyName(String typeName, String propertyName, Object attrVal) { - AtlasGraphQuery query = AtlasGraphProvider.getGraphInstance().query() - .has(Constants.ENTITY_TYPE_PROPERTY_KEY, typeName) - .has(Constants.STATE_PROPERTY_KEY, AtlasEntity.Status.ACTIVE.name()) - .has(propertyName, attrVal); - - Iterator<AtlasVertex> results = query.vertices().iterator(); - - AtlasVertex vertex = results.hasNext() ? results.next() : null; - - return vertex; - } - - public static AtlasVertex findBySuperTypeAndPropertyName(String typeName, String propertyName, Object attrVal) { - AtlasGraphQuery query = AtlasGraphProvider.getGraphInstance().query() - .has(Constants.SUPER_TYPES_PROPERTY_KEY, typeName) - .has(Constants.STATE_PROPERTY_KEY, AtlasEntity.Status.ACTIVE.name()) - .has(propertyName, attrVal); - - Iterator<AtlasVertex> results = query.vertices().iterator(); - - AtlasVertex vertex = results.hasNext() ? results.next() : null; - - return vertex; - } - - public static List<String> findEntityGUIDsByType(String typename, SortOrder sortOrder) { - AtlasGraphQuery query = AtlasGraphProvider.getGraphInstance().query() - .has(Constants.ENTITY_TYPE_PROPERTY_KEY, typename); - if (sortOrder != null) { - AtlasGraphQuery.SortOrder qrySortOrder = sortOrder == SortOrder.ASCENDING ? ASC : DESC; - query.orderBy(Constants.QUALIFIED_NAME, qrySortOrder); - } - - Iterator<AtlasVertex> results = query.vertices().iterator(); - ArrayList<String> ret = new ArrayList<>(); - - if (!results.hasNext()) { - return Collections.emptyList(); - } - - while (results.hasNext()) { - ret.add(getIdFromVertex(results.next())); - } - - return ret; - } - - public static List<String> findEntityGUIDsByType(String typename) { - return findEntityGUIDsByType(typename, null); - } - - public static boolean relationshipTypeHasInstanceEdges(String typeName) throws AtlasBaseException { - AtlasGraphQuery query = AtlasGraphProvider.getGraphInstance() - .query() - .has(Constants.TYPE_NAME_PROPERTY_KEY, AtlasGraphQuery.ComparisionOperator.EQUAL, typeName); - - Iterator<AtlasEdge> results = query.edges().iterator(); - - boolean hasInstanceEdges = results != null && results.hasNext(); - - if (LOG.isDebugEnabled()) { - LOG.debug("relationshipType {} has instance edges {}", typeName, hasInstanceEdges); - } - - return hasInstanceEdges; - } - - private static String toString(AtlasElement element) { - if (element instanceof AtlasVertex) { - return toString((AtlasVertex) element); - } else if (element instanceof AtlasEdge) { - return toString((AtlasEdge)element); - } - - return element.toString(); - } - - public static String toString(AtlasVertex vertex) { - if(vertex == null) { - return "vertex[null]"; - } else { - if (LOG.isDebugEnabled()) { - return getVertexDetails(vertex); - } else { - return String.format("vertex[id=%s]", vertex.getId().toString()); - } - } - } - - - public static String toString(AtlasEdge edge) { - if(edge == null) { - return "edge[null]"; - } else { - if (LOG.isDebugEnabled()) { - return getEdgeDetails(edge); - } else { - return String.format("edge[id=%s]", edge.getId().toString()); - } - } - } - - public static String getVertexDetails(AtlasVertex vertex) { - return String.format("vertex[id=%s type=%s guid=%s]", - vertex.getId().toString(), getTypeName(vertex), getIdFromVertex(vertex)); - } - - public static String getEdgeDetails(AtlasEdge edge) { - return String.format("edge[id=%s label=%s from %s -> to %s]", edge.getId(), edge.getLabel(), - toString(edge.getOutVertex()), toString(edge.getInVertex())); - } - - public static AtlasEntity.Status getState(AtlasElement element) { - String state = getStateAsString(element); - return state == null ? null : AtlasEntity.Status.valueOf(state); - } - - public static String getStateAsString(AtlasElement element) { - return element.getProperty(Constants.STATE_PROPERTY_KEY, String.class); - } - - private static boolean canUseIndexQuery(AtlasEntityType entityType, String attributeName) { - boolean ret = false; - - if (USE_INDEX_QUERY_TO_FIND_ENTITY_BY_UNIQUE_ATTRIBUTES) { - final String typeAndSubTypesQryStr = entityType.getTypeAndAllSubTypesQryStr(); - - ret = typeAndSubTypesQryStr.length() <= SearchProcessor.MAX_QUERY_STR_LENGTH_TYPES; - - if (ret) { - Set<String> indexSet = AtlasGraphProvider.getGraphInstance().getVertexIndexKeys(); - try { - ret = indexSet.contains(entityType.getQualifiedAttributeName(attributeName)); - } - catch (AtlasBaseException ex) { - ret = false; - } - } - } - - return ret; - } - - private static AtlasVertex getAtlasVertexFromIndexQuery(AtlasEntityType entityType, AtlasAttribute attribute, Object attrVal) { - String propertyName = attribute.getVertexPropertyName(); - AtlasIndexQuery query = getIndexQuery(entityType, propertyName, attrVal.toString()); - - for (Iterator<AtlasIndexQuery.Result> iter = query.vertices(); iter.hasNext(); ) { - AtlasIndexQuery.Result result = iter.next(); - AtlasVertex vertex = result.getVertex(); - - // skip non-entity vertices, if any got returned - if (vertex == null || !vertex.getPropertyKeys().contains(Constants.GUID_PROPERTY_KEY)) { - continue; - } - - // verify the typeName - String typeNameInVertex = getTypeName(vertex); - - if (!entityType.getTypeAndAllSubTypes().contains(typeNameInVertex)) { - LOG.warn("incorrect vertex type from index-query: expected='{}'; found='{}'", entityType.getTypeName(), typeNameInVertex); - - continue; - } - - if (attrVal.getClass() == String.class) { - String s = (String) attrVal; - String vertexVal = vertex.getProperty(propertyName, String.class); - - if (!s.equalsIgnoreCase(vertexVal)) { - LOG.warn("incorrect match from index-query for property {}: expected='{}'; found='{}'", propertyName, s, vertexVal); - - continue; - } - } - - return vertex; - } - - return null; - } - - private static AtlasIndexQuery getIndexQuery(AtlasEntityType entityType, String propertyName, String value) { - StringBuilder sb = new StringBuilder(); - - sb.append(INDEX_SEARCH_PREFIX + "\"").append(Constants.TYPE_NAME_PROPERTY_KEY).append("\":").append(entityType.getTypeAndAllSubTypesQryStr()) - .append(" AND ") - .append(INDEX_SEARCH_PREFIX + "\"").append(propertyName).append("\":").append(AtlasAttribute.escapeIndexQueryValue(value)) - .append(" AND ") - .append(INDEX_SEARCH_PREFIX + "\"").append(Constants.STATE_PROPERTY_KEY).append("\":ACTIVE"); - - return AtlasGraphProvider.getGraphInstance().indexQuery(Constants.VERTEX_INDEX, sb.toString()); - } - - public static String getIndexSearchPrefix() { - return INDEX_SEARCH_PREFIX; - } -} http://git-wip-us.apache.org/repos/asf/atlas/blob/4823c8ed/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipDefStoreV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipDefStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipDefStoreV1.java deleted file mode 100644 index e287c0d..0000000 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipDefStoreV1.java +++ /dev/null @@ -1,508 +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.ApplicationProperties; -import org.apache.atlas.AtlasErrorCode; -import org.apache.atlas.AtlasException; -import org.apache.atlas.exception.AtlasBaseException; -import org.apache.atlas.model.typedef.AtlasRelationshipDef; -import org.apache.atlas.model.typedef.AtlasRelationshipDef.RelationshipCategory; -import org.apache.atlas.model.typedef.AtlasRelationshipDef.PropagateTags; -import org.apache.atlas.model.typedef.AtlasRelationshipEndDef; -import org.apache.atlas.query.AtlasDSL; -import org.apache.atlas.repository.Constants; -import org.apache.atlas.repository.graphdb.AtlasEdge; -import org.apache.atlas.repository.graphdb.AtlasVertex; -import org.apache.atlas.type.AtlasRelationshipType; -import org.apache.atlas.type.AtlasType; -import org.apache.atlas.type.AtlasTypeRegistry; -import org.apache.atlas.typesystem.types.DataTypes.TypeCategory; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.atlas.authorize.AtlasPrivilege; -import org.apache.atlas.authorize.AtlasTypeAccessRequest; -import org.apache.atlas.authorize.AtlasAuthorizationUtils; -import javax.inject.Inject; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * RelationshipDef store in v1 format. - */ -public class AtlasRelationshipDefStoreV1 extends AtlasAbstractDefStoreV1<AtlasRelationshipDef> { - private static final Logger LOG = LoggerFactory.getLogger(AtlasRelationshipDefStoreV1.class); - - @Inject - public AtlasRelationshipDefStoreV1(AtlasTypeDefGraphStoreV1 typeDefStore, AtlasTypeRegistry typeRegistry) { - super(typeDefStore, typeRegistry); - } - - @Override - public AtlasVertex preCreate(AtlasRelationshipDef relationshipDef) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.preCreate({})", relationshipDef); - } - - validateType(relationshipDef); - - AtlasType type = typeRegistry.getType(relationshipDef.getName()); - - if (type.getTypeCategory() != org.apache.atlas.model.TypeCategory.RELATIONSHIP) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_MATCH_FAILED, relationshipDef.getName(), TypeCategory.RELATIONSHIP.name()); - } - - AtlasVertex relationshipDefVertex = typeDefStore.findTypeVertexByName(relationshipDef.getName()); - - if (relationshipDefVertex != null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_ALREADY_EXISTS, relationshipDef.getName()); - } - - relationshipDefVertex = typeDefStore.createTypeVertex(relationshipDef); - - updateVertexPreCreate(relationshipDef, (AtlasRelationshipType) type, relationshipDefVertex); - - final AtlasRelationshipEndDef endDef1 = relationshipDef.getEndDef1(); - final AtlasRelationshipEndDef endDef2 = relationshipDef.getEndDef2(); - final String type1 = endDef1.getType(); - final String type2 = endDef2.getType(); - final String name1 = endDef1.getName(); - final String name2 = endDef2.getName(); - final AtlasVertex end1TypeVertex = typeDefStore.findTypeVertexByName(type1); - final AtlasVertex end2TypeVertex = typeDefStore.findTypeVertexByName(type2); - - if (end1TypeVertex == null) { - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_END_TYPE_NAME_NOT_FOUND, relationshipDef.getName(), type1); - } - - if (end2TypeVertex == null) { - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_END_TYPE_NAME_NOT_FOUND, relationshipDef.getName(), type2); - } - - // create an edge between the relationshipDef and each of the entityDef vertices. - AtlasEdge edge1 = typeDefStore.getOrCreateEdge(relationshipDefVertex, end1TypeVertex, AtlasGraphUtilsV1.RELATIONSHIPTYPE_EDGE_LABEL); - - /* - Where edge1 and edge2 have the same names and types we do not need a second edge. - We are not invoking the equals method on the AtlasRelationshipedDef, as we only want 1 edge even if propagateTags or other properties are different. - */ - - if (type1.equals(type2) && name1.equals(name2)) { - if (LOG.isDebugEnabled()) { - LOG.debug("AtlasRelationshipDefStoreV1.preCreate({}): created relationshipDef vertex {}," + - " and one edge as {}, because end1 and end2 have the same type and name", relationshipDef, relationshipDefVertex, edge1); - } - - } else { - AtlasEdge edge2 = typeDefStore.getOrCreateEdge(relationshipDefVertex, end2TypeVertex, AtlasGraphUtilsV1.RELATIONSHIPTYPE_EDGE_LABEL); - if (LOG.isDebugEnabled()) { - LOG.debug("AtlasRelationshipDefStoreV1.preCreate({}): created relationshipDef vertex {}," + - " edge1 as {}, edge2 as {} ", relationshipDef, relationshipDefVertex, edge1, edge2); - } - - } - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.preCreate({}): {}", relationshipDef, relationshipDefVertex); - } - return relationshipDefVertex; - } - - @Override - public AtlasRelationshipDef create(AtlasRelationshipDef relationshipDef, AtlasVertex preCreateResult) - throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.create({}, {})", relationshipDef, preCreateResult); - } - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_CREATE, relationshipDef), "create relationship-def ", relationshipDef.getName()); - - AtlasVertex vertex = (preCreateResult == null) ? preCreate(relationshipDef) : preCreateResult; - - AtlasRelationshipDef ret = toRelationshipDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.create({}, {}): {}", relationshipDef, preCreateResult, ret); - } - - return ret; - } - - @Override - public List<AtlasRelationshipDef> getAll() throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.getAll()"); - } - - List<AtlasRelationshipDef> ret = new ArrayList<>(); - Iterator<AtlasVertex> vertices = typeDefStore.findTypeVerticesByCategory(TypeCategory.RELATIONSHIP); - - while (vertices.hasNext()) { - ret.add(toRelationshipDef(vertices.next())); - } - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.getAll(): count={}", ret.size()); - } - - return ret; - } - - @Override - public AtlasRelationshipDef getByName(String name) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.getByName({})", name); - } - - AtlasVertex vertex = typeDefStore.findTypeVertexByNameAndCategory(name, TypeCategory.RELATIONSHIP); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_NOT_FOUND, name); - } - - vertex.getProperty(Constants.TYPE_CATEGORY_PROPERTY_KEY, TypeCategory.class); - - AtlasRelationshipDef ret = toRelationshipDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.getByName({}): {}", name, ret); - } - - return ret; - } - - @Override - public AtlasRelationshipDef getByGuid(String guid) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.getByGuid({})", guid); - } - - AtlasVertex vertex = typeDefStore.findTypeVertexByGuidAndCategory(guid, TypeCategory.RELATIONSHIP); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_GUID_NOT_FOUND, guid); - } - - AtlasRelationshipDef ret = toRelationshipDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.getByGuid({}): {}", guid, ret); - } - - return ret; - } - - @Override - public AtlasRelationshipDef update(AtlasRelationshipDef relationshipDef) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.update({})", relationshipDef); - } - - validateType(relationshipDef); - - AtlasRelationshipDef ret = StringUtils.isNotBlank(relationshipDef.getGuid()) - ? updateByGuid(relationshipDef.getGuid(), relationshipDef) - : updateByName(relationshipDef.getName(), relationshipDef); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.update({}): {}", relationshipDef, ret); - } - - return ret; - } - - @Override - public AtlasRelationshipDef updateByName(String name, AtlasRelationshipDef relationshipDef) - throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.updateByName({}, {})", name, relationshipDef); - } - - AtlasRelationshipDef existingDef = typeRegistry.getRelationshipDefByName(name); - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_UPDATE, existingDef), "update relationship-def ", name); - - validateType(relationshipDef); - - AtlasType type = typeRegistry.getType(relationshipDef.getName()); - - if (type.getTypeCategory() != org.apache.atlas.model.TypeCategory.RELATIONSHIP) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_MATCH_FAILED, relationshipDef.getName(), TypeCategory.RELATIONSHIP.name()); - } - - AtlasVertex vertex = typeDefStore.findTypeVertexByNameAndCategory(name, TypeCategory.RELATIONSHIP); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_NOT_FOUND, name); - } - - preUpdateCheck(relationshipDef, (AtlasRelationshipType) type, vertex); - - AtlasRelationshipDef ret = toRelationshipDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.updateByName({}, {}): {}", name, relationshipDef, ret); - } - - return ret; - } - - @Override - public AtlasRelationshipDef updateByGuid(String guid, AtlasRelationshipDef relationshipDef) - throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.updateByGuid({})", guid); - } - - AtlasRelationshipDef existingDef = typeRegistry.getRelationshipDefByGuid(guid); - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_UPDATE, existingDef), "update relationship-Def ", (existingDef != null ? existingDef.getName() : guid)); - - validateType(relationshipDef); - - AtlasType type = typeRegistry.getTypeByGuid(guid); - - if (type.getTypeCategory() != org.apache.atlas.model.TypeCategory.RELATIONSHIP) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_MATCH_FAILED, relationshipDef.getName(), TypeCategory.RELATIONSHIP.name()); - } - - AtlasVertex vertex = typeDefStore.findTypeVertexByGuidAndCategory(guid, TypeCategory.RELATIONSHIP); - - if (vertex == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_GUID_NOT_FOUND, guid); - } - - preUpdateCheck(relationshipDef, (AtlasRelationshipType) type, vertex); - // updates should not effect the edges between the types as we do not allow updates that change the endpoints. - - AtlasRelationshipDef ret = toRelationshipDef(vertex); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.updateByGuid({}): {}", guid, ret); - } - - return ret; - } - - @Override - public AtlasVertex preDeleteByName(String name) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.preDeleteByName({})", name); - } - - AtlasRelationshipDef existingDef = typeRegistry.getRelationshipDefByName(name); - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_DELETE, existingDef), "delete relationship-def ", name); - - AtlasVertex ret = typeDefStore.findTypeVertexByNameAndCategory(name, TypeCategory.RELATIONSHIP); - - if (ret == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_NOT_FOUND, name); - } - - if (AtlasGraphUtilsV1.relationshipTypeHasInstanceEdges(name)) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_HAS_REFERENCES, name); - } - - typeDefStore.deleteTypeVertexOutEdges(ret); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.preDeleteByName({}): {}", name, ret); - } - - return ret; - } - - @Override - public AtlasVertex preDeleteByGuid(String guid) throws AtlasBaseException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> AtlasRelationshipDefStoreV1.preDeleteByGuid({})", guid); - } - - AtlasRelationshipDef existingDef = typeRegistry.getRelationshipDefByGuid(guid); - - AtlasAuthorizationUtils.verifyAccess(new AtlasTypeAccessRequest(AtlasPrivilege.TYPE_DELETE, existingDef), "delete relationship-def ", (existingDef != null ? existingDef.getName() : guid)); - - AtlasVertex ret = typeDefStore.findTypeVertexByGuidAndCategory(guid, TypeCategory.RELATIONSHIP); - - if (ret == null) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_GUID_NOT_FOUND, guid); - } - - String typeName = AtlasGraphUtilsV1.getProperty(ret, Constants.TYPENAME_PROPERTY_KEY, String.class); - - if (AtlasGraphUtilsV1.relationshipTypeHasInstanceEdges(typeName)) { - throw new AtlasBaseException(AtlasErrorCode.TYPE_HAS_REFERENCES, typeName); - } - - typeDefStore.deleteTypeVertexOutEdges(ret); - - if (LOG.isDebugEnabled()) { - LOG.debug("<== AtlasRelationshipDefStoreV1.preDeleteByGuid({}): {}", guid, ret); - } - - return ret; - } - - private void updateVertexPreCreate(AtlasRelationshipDef relationshipDef, AtlasRelationshipType relationshipType, - AtlasVertex vertex) throws AtlasBaseException { - AtlasRelationshipEndDef end1 = relationshipDef.getEndDef1(); - AtlasRelationshipEndDef end2 = relationshipDef.getEndDef2(); - - // check whether the names added on the relationship Ends are reserved if required. - final boolean allowReservedKeywords; - try { - allowReservedKeywords = ApplicationProperties.get().getBoolean(ALLOW_RESERVED_KEYWORDS, true); - } catch (AtlasException e) { - throw new AtlasBaseException(e); - } - - if (!allowReservedKeywords) { - if (AtlasDSL.Parser.isKeyword(end1.getName())) { - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_END1_NAME_INVALID, end1.getName()); - } - - if (AtlasDSL.Parser.isKeyword(end2.getName())) { - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_END2_NAME_INVALID, end2.getName()); - } - } - - AtlasStructDefStoreV1.updateVertexPreCreate(relationshipDef, relationshipType, vertex, typeDefStore); - // Update ends - setVertexPropertiesFromRelationshipDef(relationshipDef, vertex); - } - - private void preUpdateCheck(AtlasRelationshipDef newRelationshipDef, AtlasRelationshipType relationshipType, - AtlasVertex vertex) throws AtlasBaseException { - // We will not support an update to endpoints or category key - AtlasRelationshipDef existingRelationshipDef = toRelationshipDef(vertex); - - preUpdateCheck(newRelationshipDef, existingRelationshipDef); - // we do allow change to tag propagation and the addition of new attributes. - - AtlasStructDefStoreV1.updateVertexPreUpdate(newRelationshipDef, relationshipType, vertex, typeDefStore); - - setVertexPropertiesFromRelationshipDef(newRelationshipDef, vertex); - } - - /** - * Check ends are the same and relationshipCategory is the same. - * - * We do this by comparing 2 relationshipDefs to avoid exposing the AtlasVertex to unit testing. - * - * @param newRelationshipDef - * @param existingRelationshipDef - * @throws AtlasBaseException - */ - public static void preUpdateCheck(AtlasRelationshipDef newRelationshipDef, AtlasRelationshipDef existingRelationshipDef) throws AtlasBaseException { - // do not allow renames of the Def. - String existingName = existingRelationshipDef.getName(); - String newName = newRelationshipDef.getName(); - - if (!existingName.equals(newName)) { - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_INVALID_NAME_UPDATE, - newRelationshipDef.getGuid(),existingName, newName); - } - - RelationshipCategory existingRelationshipCategory = existingRelationshipDef.getRelationshipCategory(); - RelationshipCategory newRelationshipCategory = newRelationshipDef.getRelationshipCategory(); - - if ( !existingRelationshipCategory.equals(newRelationshipCategory)){ - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_INVALID_CATEGORY_UPDATE, - newRelationshipDef.getName(),newRelationshipCategory.name(), - existingRelationshipCategory.name() ); - } - - AtlasRelationshipEndDef existingEnd1 = existingRelationshipDef.getEndDef1(); - AtlasRelationshipEndDef newEnd1 = newRelationshipDef.getEndDef1(); - - if ( !newEnd1.equals(existingEnd1) ) { - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_INVALID_END1_UPDATE, - newRelationshipDef.getName(), newEnd1.toString(), existingEnd1.toString()); - } - - AtlasRelationshipEndDef existingEnd2 = existingRelationshipDef.getEndDef2(); - AtlasRelationshipEndDef newEnd2 = newRelationshipDef.getEndDef2(); - - if ( !newEnd2.equals(existingEnd2) ) { - throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_INVALID_END2_UPDATE, - newRelationshipDef.getName(), newEnd2.toString(), existingEnd2.toString()); - } - } - - public static void setVertexPropertiesFromRelationshipDef(AtlasRelationshipDef relationshipDef, AtlasVertex vertex) { - vertex.setProperty(Constants.RELATIONSHIPTYPE_END1_KEY, AtlasType.toJson(relationshipDef.getEndDef1())); - vertex.setProperty(Constants.RELATIONSHIPTYPE_END2_KEY, AtlasType.toJson(relationshipDef.getEndDef2())); - // default the relationship category to association if it has not been specified. - String relationshipCategory = RelationshipCategory.ASSOCIATION.name(); - if (relationshipDef.getRelationshipCategory()!=null) { - relationshipCategory =relationshipDef.getRelationshipCategory().name(); - } - // Update RelationshipCategory - vertex.setProperty(Constants.RELATIONSHIPTYPE_CATEGORY_KEY, relationshipCategory); - - if (relationshipDef.getPropagateTags() == null) { - vertex.setProperty(Constants.RELATIONSHIPTYPE_TAG_PROPAGATION_KEY, AtlasRelationshipDef.PropagateTags.NONE.name()); - } else { - vertex.setProperty(Constants.RELATIONSHIPTYPE_TAG_PROPAGATION_KEY, relationshipDef.getPropagateTags().name()); - } - } - - private AtlasRelationshipDef toRelationshipDef(AtlasVertex vertex) throws AtlasBaseException { - AtlasRelationshipDef ret = null; - - if (vertex != null && typeDefStore.isTypeVertex(vertex, TypeCategory.RELATIONSHIP)) { - String name = vertex.getProperty(Constants.TYPENAME_PROPERTY_KEY, String.class); - String description = vertex.getProperty(Constants.TYPEDESCRIPTION_PROPERTY_KEY, String.class); - String version = vertex.getProperty(Constants.TYPEVERSION_PROPERTY_KEY, String.class); - String end1Str = vertex.getProperty(Constants.RELATIONSHIPTYPE_END1_KEY, String.class); - String end2Str = vertex.getProperty(Constants.RELATIONSHIPTYPE_END2_KEY, String.class); - String relationStr = vertex.getProperty(Constants.RELATIONSHIPTYPE_CATEGORY_KEY, String.class); - String propagateStr = vertex.getProperty(Constants.RELATIONSHIPTYPE_TAG_PROPAGATION_KEY, String.class); - - // set the ends - AtlasRelationshipEndDef endDef1 = AtlasType.fromJson(end1Str, AtlasRelationshipEndDef.class); - AtlasRelationshipEndDef endDef2 = AtlasType.fromJson(end2Str, AtlasRelationshipEndDef.class); - - // set the relationship Category - RelationshipCategory relationshipCategory = null; - for (RelationshipCategory value : RelationshipCategory.values()) { - if (value.name().equals(relationStr)) { - relationshipCategory = value; - } - } - - // set the propagateTags - PropagateTags propagateTags = null; - for (PropagateTags value : PropagateTags.values()) { - if (value.name().equals(propagateStr)) { - propagateTags = value; - } - } - - ret = new AtlasRelationshipDef(name, description, version, relationshipCategory, propagateTags, endDef1, endDef2); - - // add in the attributes - AtlasStructDefStoreV1.toStructDef(vertex, ret, typeDefStore); - } - - return ret; - } - -}
