ATLAS-2774: enhancement to support parameterized delete-type (hard or soft) per API call
(cherry picked from commit d003ddb33b16a0a67e6b7f7eae29c1638a4d0971) Project: http://git-wip-us.apache.org/repos/asf/atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/daabed13 Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/daabed13 Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/daabed13 Branch: refs/heads/branch-0.8 Commit: daabed1312c73916136eacf09218300d75bb8f9b Parents: 5c9bf7a Author: Madhan Neethiraj <mad...@apache.org> Authored: Wed Nov 14 19:50:56 2018 -0800 Committer: Madhan Neethiraj <mad...@apache.org> Committed: Wed Nov 14 22:16:13 2018 -0800 ---------------------------------------------------------------------- .../org/apache/atlas/AtlasConfiguration.java | 2 + .../java/org/apache/atlas/store/DeleteType.java | 44 ++++ .../graph/GraphBackedMetadataRepository.java | 19 +- .../graph/TypedInstanceToGraphMapper.java | 15 +- .../store/graph/v1/AtlasEntityStoreV1.java | 8 +- .../store/graph/v1/BulkImporterImpl.java | 4 +- .../store/graph/v1/DeleteHandlerDelegate.java | 89 ++++++++ .../store/graph/v1/DeleteHandlerDelegateV1.java | 86 ++++++++ .../store/graph/v1/EntityGraphMapper.java | 28 +-- .../store/graph/v1/HardDeleteHandlerV1.java | 4 - .../store/graph/v1/SoftDeleteHandlerV1.java | 4 - .../test/java/org/apache/atlas/TestModules.java | 31 --- .../AbstractGremlinQueryOptimizerTest.java | 3 +- ...hBackedMetadataRepositoryDeleteTestBase.java | 18 +- .../GraphBackedRepositoryHardDeleteTest.java | 7 +- .../GraphBackedRepositorySoftDeleteTest.java | 7 +- .../ReverseReferenceUpdateHardDeleteTest.java | 7 +- .../ReverseReferenceUpdateSoftDeleteTest.java | 7 +- .../graph/ReverseReferenceUpdateTestBase.java | 10 + .../repository/impexp/ExportImportTestBase.java | 13 -- .../repository/impexp/ExportServiceTest.java | 4 - .../impexp/ExportSkipLineageTest.java | 7 +- .../graph/v1/AtlasDeleteHandlerV1Test.java | 8 + .../store/graph/v1/AtlasEntityStoreV1Test.java | 4 +- .../store/graph/v1/HardDeleteHandlerV1Test.java | 7 +- .../InverseReferenceUpdateHardDeleteV1Test.java | 8 +- .../InverseReferenceUpdateSoftDeleteV1Test.java | 8 +- .../graph/v1/InverseReferenceUpdateV1Test.java | 14 ++ .../store/graph/v1/SoftDeleteHandlerV1Test.java | 8 +- .../store/graph/v1/SoftReferenceTest.java | 13 +- .../java/org/apache/atlas/RequestContext.java | 18 +- .../java/org/apache/atlas/RequestContextV1.java | 28 ++- .../apache/atlas/web/filters/AuditFilter.java | 26 ++- .../web/adapters/TestEntityRESTDelete.java | 208 +++++++++++++++++++ 34 files changed, 629 insertions(+), 138 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/common/src/main/java/org/apache/atlas/AtlasConfiguration.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/atlas/AtlasConfiguration.java b/common/src/main/java/org/apache/atlas/AtlasConfiguration.java index 1b3ce1e..c5357f5 100644 --- a/common/src/main/java/org/apache/atlas/AtlasConfiguration.java +++ b/common/src/main/java/org/apache/atlas/AtlasConfiguration.java @@ -33,6 +33,8 @@ public enum AtlasConfiguration { QUERY_PARAM_MAX_LENGTH("atlas.query.param.max.length", 4*1024), + REST_API_ENABLE_DELETE_TYPE_OVERRIDE("atlas.rest.enable.delete.type.override", false), + NOTIFICATION_HOOK_TOPIC_NAME("atlas.notification.hook.topic.name", "ATLAS_HOOK"), NOTIFICATION_ENTITIES_TOPIC_NAME("atlas.notification.entities.topic.name", "ATLAS_ENTITIES"), http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/intg/src/main/java/org/apache/atlas/store/DeleteType.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/store/DeleteType.java b/intg/src/main/java/org/apache/atlas/store/DeleteType.java new file mode 100644 index 0000000..de5e5e4 --- /dev/null +++ b/intg/src/main/java/org/apache/atlas/store/DeleteType.java @@ -0,0 +1,44 @@ +/** + * 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.store; + +import org.apache.commons.lang.StringUtils; + +public enum DeleteType { + DEFAULT, + SOFT, + HARD; + + public static DeleteType from(String s) { + if(StringUtils.isEmpty(s)) { + return DEFAULT; + } + + switch (s.toLowerCase()) { + case "soft": + return SOFT; + + case "hard": + return HARD; + + default: + return DEFAULT; + } + } +} http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepository.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepository.java b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepository.java index 400a55e..10c7f3e 100755 --- a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepository.java +++ b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepository.java @@ -34,6 +34,7 @@ import org.apache.atlas.repository.graphdb.AtlasGraph; import org.apache.atlas.repository.graphdb.AtlasGraphQuery; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.store.graph.v1.AtlasGraphUtilsV1; +import org.apache.atlas.repository.store.graph.v1.DeleteHandlerDelegate; import org.apache.atlas.typesystem.ITypedReferenceableInstance; import org.apache.atlas.typesystem.ITypedStruct; import org.apache.atlas.typesystem.exception.EntityExistsException; @@ -68,16 +69,16 @@ public class GraphBackedMetadataRepository implements MetadataRepository { private static final GraphHelper graphHelper = GraphHelper.getInstance(); - private DeleteHandler deleteHandler; + private DeleteHandlerDelegate deleteDelegate; private final AtlasGraph atlasGraph; private final GraphToTypedInstanceMapper graphToInstanceMapper; @Inject - public GraphBackedMetadataRepository(DeleteHandler deleteHandler, AtlasGraph atlasGraph) { + public GraphBackedMetadataRepository(DeleteHandlerDelegate deleteDelegate, AtlasGraph atlasGraph) { this.atlasGraph = atlasGraph; this.graphToInstanceMapper = new GraphToTypedInstanceMapper(atlasGraph); - this.deleteHandler = deleteHandler; + this.deleteDelegate = deleteDelegate; } public GraphToTypedInstanceMapper getGraphToInstanceMapper() { @@ -144,7 +145,7 @@ public class GraphBackedMetadataRepository implements MetadataRepository { } try { - TypedInstanceToGraphMapper instanceToGraphMapper = new TypedInstanceToGraphMapper(graphToInstanceMapper, deleteHandler); + TypedInstanceToGraphMapper instanceToGraphMapper = new TypedInstanceToGraphMapper(graphToInstanceMapper, deleteDelegate); instanceToGraphMapper.mapTypedInstanceToGraph(TypedInstanceToGraphMapper.Operation.CREATE, entities); List<String> createdGuids = RequestContext.get().getCreatedEntityIds(); CreateUpdateEntitiesResult result = new CreateUpdateEntitiesResult(); @@ -341,7 +342,7 @@ public class GraphBackedMetadataRepository implements MetadataRepository { // add the trait instance as a new vertex final String typeName = GraphHelper.getTypeName(instanceVertex); - TypedInstanceToGraphMapper instanceToGraphMapper = new TypedInstanceToGraphMapper(graphToInstanceMapper, deleteHandler); + TypedInstanceToGraphMapper instanceToGraphMapper = new TypedInstanceToGraphMapper(graphToInstanceMapper, deleteDelegate); instanceToGraphMapper.mapTraitInstanceToVertex(traitInstance, typeSystem.getDataType(ClassType.class, typeName), instanceVertex); @@ -385,7 +386,7 @@ public class GraphBackedMetadataRepository implements MetadataRepository { String relationshipLabel = GraphHelper.getTraitLabel(entityTypeName, traitNameToBeDeleted); AtlasEdge edge = graphHelper.getEdgeForLabel(instanceVertex, relationshipLabel); if(edge != null) { - deleteHandler.deleteEdgeReference(edge, DataTypes.TypeCategory.TRAIT, false, true); + deleteDelegate.getHandler().deleteEdgeReference(edge, DataTypes.TypeCategory.TRAIT, false, true); } // update the traits in entity once trait removal is successful @@ -418,7 +419,7 @@ public class GraphBackedMetadataRepository implements MetadataRepository { } try { - TypedInstanceToGraphMapper instanceToGraphMapper = new TypedInstanceToGraphMapper(graphToInstanceMapper, deleteHandler); + TypedInstanceToGraphMapper instanceToGraphMapper = new TypedInstanceToGraphMapper(graphToInstanceMapper, deleteDelegate); instanceToGraphMapper.mapTypedInstanceToGraph(TypedInstanceToGraphMapper.Operation.UPDATE_FULL, entitiesUpdated); CreateUpdateEntitiesResult result = new CreateUpdateEntitiesResult(); @@ -440,7 +441,7 @@ public class GraphBackedMetadataRepository implements MetadataRepository { } try { - TypedInstanceToGraphMapper instanceToGraphMapper = new TypedInstanceToGraphMapper(graphToInstanceMapper, deleteHandler); + TypedInstanceToGraphMapper instanceToGraphMapper = new TypedInstanceToGraphMapper(graphToInstanceMapper, deleteDelegate); instanceToGraphMapper.mapTypedInstanceToGraph(TypedInstanceToGraphMapper.Operation.UPDATE_PARTIAL, entity); RequestContext requestContext = RequestContext.get(); CreateUpdateEntitiesResult result = new CreateUpdateEntitiesResult(); @@ -483,7 +484,7 @@ public class GraphBackedMetadataRepository implements MetadataRepository { } try { - deleteHandler.deleteEntities(deletionCandidates); + deleteDelegate.getHandler().deleteEntities(deletionCandidates); } catch (AtlasException e) { throw new RepositoryException(e); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java b/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java index d43e09e..5115403 100644 --- a/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java +++ b/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java @@ -28,6 +28,7 @@ import org.apache.atlas.repository.graphdb.AtlasEdge; import org.apache.atlas.repository.graphdb.AtlasSchemaViolationException; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.store.graph.v1.AtlasGraphUtilsV1; +import org.apache.atlas.repository.store.graph.v1.DeleteHandlerDelegate; import org.apache.atlas.typesystem.IReferenceableInstance; import org.apache.atlas.typesystem.ITypedInstance; import org.apache.atlas.typesystem.ITypedReferenceableInstance; @@ -69,13 +70,13 @@ public final class TypedInstanceToGraphMapper { private final TypeSystem typeSystem = TypeSystem.getInstance(); private static final GraphHelper graphHelper = GraphHelper.getInstance(); - private DeleteHandler deleteHandler; + private DeleteHandlerDelegate deleteDelegate; private GraphToTypedInstanceMapper graphToTypedInstanceMapper; @Inject - public TypedInstanceToGraphMapper(GraphToTypedInstanceMapper graphToTypedInstanceMapper, DeleteHandler deleteHandler) { + public TypedInstanceToGraphMapper(GraphToTypedInstanceMapper graphToTypedInstanceMapper, DeleteHandlerDelegate deleteDelegate) { this.graphToTypedInstanceMapper = graphToTypedInstanceMapper; - this.deleteHandler = deleteHandler; + this.deleteDelegate = deleteDelegate; } private final String SIGNATURE_HASH_PROPERTY_KEY = encodePropertyKey(Constants.INTERNAL_PROPERTY_KEY_PREFIX + "signature"); @@ -243,7 +244,7 @@ public final class TypedInstanceToGraphMapper { attrValue, currentEdge, edgeLabel, operation); if (currentEdge != null && !currentEdge.equals(newEdge)) { - deleteHandler.deleteEdgeReference(currentEdge, attributeInfo.dataType().getTypeCategory(), + deleteDelegate.getHandler().deleteEdgeReference(currentEdge, attributeInfo.dataType().getTypeCategory(), attributeInfo.isComposite, true); } if (attributeInfo.reverseAttributeName != null && newEdge != null) { @@ -481,7 +482,7 @@ public final class TypedInstanceToGraphMapper { if (!cloneElements.isEmpty()) { for (AtlasEdge edge : cloneElements) { - boolean deleted = deleteHandler.deleteEdgeReference(edge, entryType.getTypeCategory(), + boolean deleted = deleteDelegate.getHandler().deleteEdgeReference(edge, entryType.getTypeCategory(), attributeInfo.isComposite, true); if (!deleted) { additionalElements.add(edge); @@ -568,7 +569,7 @@ public final class TypedInstanceToGraphMapper { if (!newMap.values().contains(currentEdge)) { boolean deleted = - deleteHandler.deleteEdgeReference(currentEdge, elementType.getTypeCategory(), attributeInfo.isComposite, true); + deleteDelegate.getHandler().deleteEdgeReference(currentEdge, elementType.getTypeCategory(), attributeInfo.isComposite, true); if (!deleted) { additionalMap.put(currentKey, currentEdge); shouldDeleteKey = false; @@ -914,7 +915,7 @@ public final class TypedInstanceToGraphMapper { case CLASS: if (reverseEdge != null && !reverseEdge.getId().toString().equals(newEdge.getId().toString())) { // Disconnect old reference - deleteHandler.deleteEdgeReference(reverseEdge, reverseAttrInfo.dataType().getTypeCategory(), + deleteDelegate.getHandler().deleteEdgeReference(reverseEdge, reverseAttrInfo.dataType().getTypeCategory(), reverseAttrInfo.isComposite, true); } break; http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java index 5df9295..c98c8c4 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java @@ -64,15 +64,15 @@ import static org.apache.atlas.model.instance.EntityMutations.EntityOperation.UP public class AtlasEntityStoreV1 implements AtlasEntityStore { private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityStoreV1.class); - private final DeleteHandlerV1 deleteHandler; + private final DeleteHandlerDelegateV1 deleteDelegate; private final AtlasTypeRegistry typeRegistry; private final AtlasEntityChangeNotifier entityChangeNotifier; private final EntityGraphMapper entityGraphMapper; @Inject - public AtlasEntityStoreV1(DeleteHandlerV1 deleteHandler, AtlasTypeRegistry typeRegistry, + public AtlasEntityStoreV1(DeleteHandlerDelegateV1 deleteDelegate, AtlasTypeRegistry typeRegistry, AtlasEntityChangeNotifier entityChangeNotifier, EntityGraphMapper entityGraphMapper) { - this.deleteHandler = deleteHandler; + this.deleteDelegate = deleteDelegate; this.typeRegistry = typeRegistry; this.entityChangeNotifier = entityChangeNotifier; this.entityGraphMapper = entityGraphMapper; @@ -671,7 +671,7 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore { private EntityMutationResponse deleteVertices(Collection<AtlasVertex> deletionCandidates) throws AtlasBaseException { EntityMutationResponse response = new EntityMutationResponse(); - deleteHandler.deleteEntities(deletionCandidates); + deleteDelegate.getHandlerV1().deleteEntities(deletionCandidates); RequestContextV1 req = RequestContextV1.get(); for (AtlasObjectId id : req.getDeletedEntities()) { response.addEntity(DELETE, EntityGraphMapper.constructHeader(id)); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/BulkImporterImpl.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/BulkImporterImpl.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/BulkImporterImpl.java index a60636e..2606692 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/BulkImporterImpl.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/BulkImporterImpl.java @@ -101,8 +101,8 @@ public class BulkImporterImpl implements BulkImporter { throw abe; } } finally { - RequestContext.clear(); - RequestContextV1.clear(); + RequestContext.get().clearCache(); + RequestContextV1.get().clearCache(); } } http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerDelegate.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerDelegate.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerDelegate.java new file mode 100644 index 0000000..0838a28 --- /dev/null +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerDelegate.java @@ -0,0 +1,89 @@ +/** + * 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.RequestContextV1; +import org.apache.atlas.repository.graph.DeleteHandler; +import org.apache.atlas.repository.graph.HardDeleteHandler; +import org.apache.atlas.repository.graph.SoftDeleteHandler; +import org.apache.atlas.store.DeleteType; +import org.apache.atlas.typesystem.types.TypeSystem; +import org.apache.atlas.util.AtlasRepositoryConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@Component +public class DeleteHandlerDelegate { + private static final Logger LOG = LoggerFactory.getLogger(DeleteHandlerDelegate.class); + + private final SoftDeleteHandler softDeleteHandler; + private final HardDeleteHandler hardDeleteHandler; + private final DeleteHandler defaultHandler; + + @Inject + public DeleteHandlerDelegate(TypeSystem typeSystem) { + this.softDeleteHandler = new SoftDeleteHandler(typeSystem); + this.hardDeleteHandler = new HardDeleteHandler(typeSystem); + this.defaultHandler = getDefaultConfiguredHandler(typeSystem); + } + + public DeleteHandler getHandler() { + return getHandler(RequestContextV1.get().getDeleteType()); + } + + public DeleteHandler getHandler(DeleteType deleteType) { + if (deleteType == null) { + deleteType = DeleteType.DEFAULT; + } + + switch (deleteType) { + case SOFT: + return softDeleteHandler; + + case HARD: + return hardDeleteHandler; + + default: + return defaultHandler; + } + } + + private DeleteHandler getDefaultConfiguredHandler(TypeSystem typeSystem) { + DeleteHandler ret = null; + + try { + Class handlerFromProperties = AtlasRepositoryConfiguration.getDeleteHandlerImpl(); + + LOG.info("Default delete handler set to: {}", handlerFromProperties.getName()); + + ret = (DeleteHandler) handlerFromProperties.getConstructor(TypeSystem.class).newInstance(typeSystem); + } catch (Exception ex) { + LOG.error("Error instantiating default delete handler. Defaulting to: {}", softDeleteHandler.getClass().getName(), ex); + + ret = softDeleteHandler; + } + + return ret; + } +} http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerDelegateV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerDelegateV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerDelegateV1.java new file mode 100644 index 0000000..3a75915 --- /dev/null +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerDelegateV1.java @@ -0,0 +1,86 @@ +/** + * 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.RequestContextV1; +import org.apache.atlas.store.DeleteType; +import org.apache.atlas.type.AtlasTypeRegistry; +import org.apache.atlas.util.AtlasRepositoryConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@Component +public class DeleteHandlerDelegateV1 { + private static final Logger LOG = LoggerFactory.getLogger(DeleteHandlerDelegateV1.class); + + private final SoftDeleteHandlerV1 softDeleteHandlerV1; + private final HardDeleteHandlerV1 hardDeleteHandlerV1; + private final DeleteHandlerV1 defaultHandlerV1; + + @Inject + public DeleteHandlerDelegateV1(AtlasTypeRegistry typeRegistry) { + this.softDeleteHandlerV1 = new SoftDeleteHandlerV1(typeRegistry); + this.hardDeleteHandlerV1 = new HardDeleteHandlerV1(typeRegistry); + this.defaultHandlerV1 = getDefaultConfiguredHandlerV1(typeRegistry); + } + + public DeleteHandlerV1 getHandlerV1() { + return getHandlerV1(RequestContextV1.get().getDeleteType()); + } + + public DeleteHandlerV1 getHandlerV1(DeleteType deleteType) { + if (deleteType == null) { + deleteType = DeleteType.DEFAULT; + } + + switch (deleteType) { + case SOFT: + return softDeleteHandlerV1; + + case HARD: + return hardDeleteHandlerV1; + + default: + return defaultHandlerV1; + } + } + + private DeleteHandlerV1 getDefaultConfiguredHandlerV1(AtlasTypeRegistry typeRegistry) { + DeleteHandlerV1 ret = null; + + try { + Class handlerFromProperties = AtlasRepositoryConfiguration.getDeleteHandlerV1Impl(); + + LOG.info("Default delete handler set to: {}", handlerFromProperties.getName()); + + ret = (DeleteHandlerV1) handlerFromProperties.getConstructor(AtlasTypeRegistry.class).newInstance(typeRegistry); + } catch (Exception ex) { + LOG.error("Error instantiating default delete handler. Defaulting to: {}", softDeleteHandlerV1.getClass().getName(), ex); + + ret = softDeleteHandlerV1; + } + + return ret; + } +} http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java index 448d167..df987be 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java @@ -75,17 +75,17 @@ public class EntityGraphMapper { private static final String SOFT_REF_FORMAT = "%s:%s"; private static final int INDEXED_STR_SAFE_LEN = AtlasConfiguration.GRAPHSTORE_INDEXED_STRING_SAFE_LENGTH.getInt(); - private final GraphHelper graphHelper = GraphHelper.getInstance(); - private final AtlasGraph graph; - private final DeleteHandlerV1 deleteHandler; - private final AtlasTypeRegistry typeRegistry; + private final GraphHelper graphHelper = GraphHelper.getInstance(); + private final AtlasGraph graph; + private final DeleteHandlerDelegateV1 deleteDelegate; + private final AtlasTypeRegistry typeRegistry; @Inject - public EntityGraphMapper(DeleteHandlerV1 deleteHandler, AtlasTypeRegistry typeRegistry, AtlasGraph atlasGraph) { - this.deleteHandler = deleteHandler; - this.typeRegistry = typeRegistry; - this.graph = atlasGraph; + public EntityGraphMapper(DeleteHandlerDelegateV1 deleteDelegate, AtlasTypeRegistry typeRegistry, AtlasGraph atlasGraph) { + this.deleteDelegate = deleteDelegate; + this.typeRegistry = typeRegistry; + this.graph = atlasGraph; } public AtlasVertex createVertex(AtlasEntity entity) { @@ -302,7 +302,7 @@ public class EntityGraphMapper { AtlasEdge newEdge = mapStructValue(ctx, context); if (currentEdge != null && !currentEdge.equals(newEdge)) { - deleteHandler.deleteEdgeReference(currentEdge, ctx.getAttrType().getTypeCategory(), false, true); + deleteDelegate.getHandlerV1().deleteEdgeReference(currentEdge, ctx.getAttrType().getTypeCategory(), false, true); } return newEdge; @@ -331,7 +331,7 @@ public class EntityGraphMapper { } } if (currentEdge != null && !currentEdge.equals(newEdge)) { - deleteHandler.deleteEdgeReference(currentEdge, ctx.getAttrType().getTypeCategory(), ctx.getAttribute().isOwnedRef(), true); + deleteDelegate.getHandlerV1().deleteEdgeReference(currentEdge, ctx.getAttrType().getTypeCategory(), ctx.getAttribute().isOwnedRef(), true); } return newEdge; @@ -391,7 +391,7 @@ public class EntityGraphMapper { if (inverseEdge != null) { if (!inverseEdge.equals(newEdge)) { // Disconnect old reference - deleteHandler.deleteEdgeReference(inverseEdge, inverseAttribute.getAttributeType().getTypeCategory(), + deleteDelegate.getHandlerV1().deleteEdgeReference(inverseEdge, inverseAttribute.getAttributeType().getTypeCategory(), inverseAttribute.isOwnedRef(), true); } else { @@ -842,7 +842,7 @@ public class EntityGraphMapper { AtlasEdge currentEdge = (AtlasEdge)currentMap.get(currentKey); if (!newMap.values().contains(currentEdge)) { - boolean deleted = deleteHandler.deleteEdgeReference(currentEdge, mapType.getValueType().getTypeCategory(), attribute.isOwnedRef(), true); + boolean deleted = deleteDelegate.getHandlerV1().deleteEdgeReference(currentEdge, mapType.getValueType().getTypeCategory(), attribute.isOwnedRef(), true); if (!deleted) { additionalMap.put(currentKey, currentEdge); @@ -932,7 +932,7 @@ public class EntityGraphMapper { List<AtlasEdge> additionalElements = new ArrayList<>(); for (AtlasEdge edge : edgesToRemove) { - boolean deleted = deleteHandler.deleteEdgeReference(edge, entryType.getTypeCategory(), attribute.isOwnedRef(), true); + boolean deleted = deleteDelegate.getHandlerV1().deleteEdgeReference(edge, entryType.getTypeCategory(), attribute.isOwnedRef(), true); if (!deleted) { additionalElements.add(edge); @@ -1098,7 +1098,7 @@ public class EntityGraphMapper { String relationshipLabel = GraphHelper.getTraitLabel(entityTypeName, classificationName); AtlasEdge edge = graphHelper.getEdgeForLabel(instanceVertex, relationshipLabel); if (edge != null) { - deleteHandler.deleteEdgeReference(edge, TypeCategory.CLASSIFICATION, false, true); + deleteDelegate.getHandlerV1().deleteEdgeReference(edge, TypeCategory.CLASSIFICATION, false, true); // update the traits in entity once trait removal is successful traitNames.remove(classificationName); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1.java index 29518c4..e90fe4c 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1.java @@ -18,17 +18,13 @@ package org.apache.atlas.repository.store.graph.v1; -import org.apache.atlas.annotation.ConditionalOnAtlasProperty; import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.repository.graphdb.AtlasEdge; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.type.AtlasTypeRegistry; -import org.springframework.stereotype.Component; import javax.inject.Inject; -@Component -@ConditionalOnAtlasProperty(property = "atlas.DeleteHandlerV1.impl") public class HardDeleteHandlerV1 extends DeleteHandlerV1 { @Inject http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/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 89f1909..4ba852c 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 @@ -19,13 +19,11 @@ package org.apache.atlas.repository.store.graph.v1; import org.apache.atlas.RequestContextV1; -import org.apache.atlas.annotation.ConditionalOnAtlasProperty; import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.repository.graphdb.AtlasEdge; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.type.AtlasTypeRegistry; -import org.springframework.stereotype.Component; import javax.inject.Inject; @@ -33,8 +31,6 @@ import static org.apache.atlas.repository.Constants.MODIFICATION_TIMESTAMP_PROPE import static org.apache.atlas.repository.Constants.MODIFIED_BY_KEY; import static org.apache.atlas.repository.Constants.STATE_PROPERTY_KEY; -@Component -@ConditionalOnAtlasProperty(property = "atlas.DeleteHandlerV1.impl", isDefault = true) public class SoftDeleteHandlerV1 extends DeleteHandlerV1 { @Inject http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/TestModules.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/TestModules.java b/repository/src/test/java/org/apache/atlas/TestModules.java index 131d3ee..57e42b0 100644 --- a/repository/src/test/java/org/apache/atlas/TestModules.java +++ b/repository/src/test/java/org/apache/atlas/TestModules.java @@ -39,11 +39,8 @@ import org.apache.atlas.listener.TypesChangeListener; import org.apache.atlas.repository.MetadataRepository; import org.apache.atlas.repository.audit.EntityAuditListener; import org.apache.atlas.repository.audit.EntityAuditRepository; -import org.apache.atlas.repository.graph.DeleteHandler; import org.apache.atlas.repository.graph.GraphBackedMetadataRepository; import org.apache.atlas.repository.graph.GraphBackedSearchIndexer; -import org.apache.atlas.repository.graph.HardDeleteHandler; -import org.apache.atlas.repository.graph.SoftDeleteHandler; import org.apache.atlas.repository.graphdb.AtlasGraph; import org.apache.atlas.repository.impexp.ExportService; import org.apache.atlas.repository.store.graph.AtlasEntityStore; @@ -52,10 +49,7 @@ import org.apache.atlas.repository.store.graph.v1.AtlasEntityChangeNotifier; import org.apache.atlas.repository.store.graph.v1.AtlasEntityStoreV1; import org.apache.atlas.repository.store.graph.v1.AtlasTypeDefGraphStoreV1; import org.apache.atlas.repository.store.graph.v1.BulkImporterImpl; -import org.apache.atlas.repository.store.graph.v1.DeleteHandlerV1; import org.apache.atlas.repository.store.graph.v1.EntityGraphMapper; -import org.apache.atlas.repository.store.graph.v1.HardDeleteHandlerV1; -import org.apache.atlas.repository.store.graph.v1.SoftDeleteHandlerV1; import org.apache.atlas.repository.typestore.GraphBackedTypeStore; import org.apache.atlas.repository.typestore.ITypeStore; import org.apache.atlas.repository.typestore.StoreBackedTypeCache; @@ -120,8 +114,6 @@ public class TestModules { bindAuditRepository(binder()); - bindDeleteHandler(binder()); - bind(AtlasGraph.class).toProvider(AtlasGraphProvider.class); // allow for dynamic binding of the metadata repo & graph service @@ -183,11 +175,6 @@ public class TestModules { bind(TypeCache.class).to(AtlasRepositoryConfiguration.getTypeCache()).asEagerSingleton(); } - protected void bindDeleteHandler(Binder binder) { - binder.bind(DeleteHandler.class).to(AtlasRepositoryConfiguration.getDeleteHandlerImpl()).asEagerSingleton(); - binder.bind(DeleteHandlerV1.class).to(AtlasRepositoryConfiguration.getDeleteHandlerV1Impl()).asEagerSingleton(); - } - protected void bindAuditRepository(Binder binder) { Class<? extends EntityAuditRepository> auditRepoImpl = AtlasRepositoryConfiguration.getAuditRepositoryImpl(); @@ -204,24 +191,6 @@ public class TestModules { } } - public static class SoftDeleteModule extends TestOnlyModule { - @Override - protected void bindDeleteHandler(Binder binder) { - bind(DeleteHandler.class).to(SoftDeleteHandler.class).asEagerSingleton(); - bind(DeleteHandlerV1.class).to(SoftDeleteHandlerV1.class).asEagerSingleton(); - bind(AtlasEntityChangeNotifier.class).toProvider(MockNotifier.class); - } - } - - public static class HardDeleteModule extends TestOnlyModule { - @Override - protected void bindDeleteHandler(Binder binder) { - bind(DeleteHandler.class).to(HardDeleteHandler.class).asEagerSingleton(); - bind(DeleteHandlerV1.class).to(HardDeleteHandlerV1.class).asEagerSingleton(); - bind(AtlasEntityChangeNotifier.class).toProvider(MockNotifier.class); - } - } - /** * Guice module which sets TypeCache implementation class configuration property to {@link StoreBackedTypeCache}. * http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/graph/AbstractGremlinQueryOptimizerTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/graph/AbstractGremlinQueryOptimizerTest.java b/repository/src/test/java/org/apache/atlas/repository/graph/AbstractGremlinQueryOptimizerTest.java index 88de2c4..07792e8 100644 --- a/repository/src/test/java/org/apache/atlas/repository/graph/AbstractGremlinQueryOptimizerTest.java +++ b/repository/src/test/java/org/apache/atlas/repository/graph/AbstractGremlinQueryOptimizerTest.java @@ -35,6 +35,7 @@ import org.apache.atlas.repository.RepositoryException; import org.apache.atlas.repository.graphdb.AtlasEdgeDirection; import org.apache.atlas.repository.graphdb.AtlasGraph; import org.apache.atlas.repository.graphdb.GremlinVersion; +import org.apache.atlas.repository.store.graph.v1.DeleteHandlerDelegate; import org.apache.atlas.typesystem.types.AttributeDefinition; import org.apache.atlas.typesystem.types.AttributeInfo; import org.apache.atlas.typesystem.types.DataTypes; @@ -68,7 +69,7 @@ public abstract class AbstractGremlinQueryOptimizerTest implements IAtlasGraphPr GremlinQueryOptimizer.setExpressionFactory(getFactory()); when(STRATEGY.typeAttributeName()).thenReturn(Constants.ENTITY_TYPE_PROPERTY_KEY); when(STRATEGY.superTypeAttributeName()).thenReturn(Constants.SUPER_TYPES_PROPERTY_KEY); - repo = new GraphBackedMetadataRepository(new HardDeleteHandler(TypeSystem.getInstance()), this.get()); + repo = new GraphBackedMetadataRepository(new DeleteHandlerDelegate(TypeSystem.getInstance()), this.get()); } private FieldInfo getTestFieldInfo() throws AtlasException { http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepositoryDeleteTestBase.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepositoryDeleteTestBase.java b/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepositoryDeleteTestBase.java index b3dab51..45e0805 100644 --- a/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepositoryDeleteTestBase.java +++ b/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepositoryDeleteTestBase.java @@ -24,6 +24,7 @@ import org.apache.atlas.AtlasClient; import org.apache.atlas.AtlasException; import org.apache.atlas.CreateUpdateEntitiesResult; import org.apache.atlas.RequestContext; +import org.apache.atlas.RequestContextV1; import org.apache.atlas.TestModules; import org.apache.atlas.TestUtils; import org.apache.atlas.model.legacy.EntityResult; @@ -33,6 +34,8 @@ import org.apache.atlas.repository.RepositoryException; import org.apache.atlas.repository.graphdb.AtlasGraph; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.store.graph.v1.AtlasGraphUtilsV1; +import org.apache.atlas.repository.store.graph.v1.DeleteHandlerDelegate; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.atlas.typesystem.IReferenceableInstance; import org.apache.atlas.typesystem.IStruct; @@ -86,8 +89,17 @@ public abstract class GraphBackedMetadataRepositoryDeleteTestBase { private ClassType compositeMapValueType; @Inject + private DeleteHandlerDelegate deleteHandler; + + private final DeleteType deleteType; + + @Inject AtlasGraph atlasGraph; + protected GraphBackedMetadataRepositoryDeleteTestBase(DeleteType deleteType) { + this.deleteType = deleteType; + } + @BeforeClass public void setUp() throws Exception { @@ -95,7 +107,7 @@ public abstract class GraphBackedMetadataRepositoryDeleteTestBase { typeSystem.reset(); new GraphBackedSearchIndexer(new AtlasTypeRegistry()); - final GraphBackedMetadataRepository delegate = new GraphBackedMetadataRepository(getDeleteHandler(typeSystem), atlasGraph); + final GraphBackedMetadataRepository delegate = new GraphBackedMetadataRepository(deleteHandler, atlasGraph); repositoryService = TestUtils.addTransactionWrapper(delegate); @@ -121,11 +133,11 @@ public abstract class GraphBackedMetadataRepositoryDeleteTestBase { compositeMapValueType = typeSystem.getDataType(ClassType.class, "CompositeMapValue"); } - abstract DeleteHandler getDeleteHandler(TypeSystem typeSystem); - @BeforeMethod public void setupContext() { TestUtils.resetRequestContext(); + + RequestContextV1.get().setDeleteType(deleteType); } @AfterClass http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositoryHardDeleteTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositoryHardDeleteTest.java b/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositoryHardDeleteTest.java index 9c0ef43..c4adfdd 100644 --- a/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositoryHardDeleteTest.java +++ b/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositoryHardDeleteTest.java @@ -23,13 +23,13 @@ import org.apache.atlas.AtlasException; import org.apache.atlas.TestUtils; import org.apache.atlas.repository.Constants; import org.apache.atlas.repository.graphdb.AtlasVertex; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.typesystem.IReferenceableInstance; import org.apache.atlas.typesystem.IStruct; import org.apache.atlas.typesystem.ITypedReferenceableInstance; import org.apache.atlas.typesystem.ITypedStruct; import org.apache.atlas.typesystem.exception.EntityNotFoundException; import org.apache.atlas.typesystem.exception.NullRequiredAttributeException; -import org.apache.atlas.typesystem.types.TypeSystem; import org.testng.Assert; import java.util.List; @@ -43,9 +43,8 @@ import static org.testng.Assert.fail; import static org.testng.AssertJUnit.assertNotNull; public class GraphBackedRepositoryHardDeleteTest extends GraphBackedMetadataRepositoryDeleteTestBase { - @Override - DeleteHandler getDeleteHandler(TypeSystem typeSystem) { - return new HardDeleteHandler(typeSystem); + public GraphBackedRepositoryHardDeleteTest() { + super(DeleteType.HARD); } @Override http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositorySoftDeleteTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositorySoftDeleteTest.java b/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositorySoftDeleteTest.java index 53f8295..20f1b72 100644 --- a/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositorySoftDeleteTest.java +++ b/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedRepositorySoftDeleteTest.java @@ -24,13 +24,13 @@ import org.apache.atlas.TestUtils; import org.apache.atlas.repository.Constants; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.store.graph.v1.AtlasGraphUtilsV1; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.typesystem.IReferenceableInstance; import org.apache.atlas.typesystem.IStruct; import org.apache.atlas.typesystem.ITypedReferenceableInstance; import org.apache.atlas.typesystem.ITypedStruct; import org.apache.atlas.typesystem.persistence.Id; import org.apache.atlas.typesystem.persistence.Id.EntityState; -import org.apache.atlas.typesystem.types.TypeSystem; import org.testng.Assert; import java.util.List; @@ -44,9 +44,8 @@ import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; public class GraphBackedRepositorySoftDeleteTest extends GraphBackedMetadataRepositoryDeleteTestBase { - @Override - DeleteHandler getDeleteHandler(TypeSystem typeSystem) { - return new SoftDeleteHandler(typeSystem); + public GraphBackedRepositorySoftDeleteTest() { + super(DeleteType.SOFT); } @Override http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateHardDeleteTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateHardDeleteTest.java b/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateHardDeleteTest.java index a3207fb..4e036ba 100644 --- a/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateHardDeleteTest.java +++ b/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateHardDeleteTest.java @@ -18,6 +18,7 @@ package org.apache.atlas.repository.graph; import org.apache.atlas.TestModules; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.typesystem.ITypedReferenceableInstance; import org.testng.Assert; import org.testng.annotations.Guice; @@ -29,8 +30,12 @@ import java.util.List; * Run tests in {@link ReverseReferenceUpdateTestBase} with hard delete enabled. * */ -@Guice(modules = TestModules.HardDeleteModule.class) +@Guice(modules = TestModules.TestOnlyModule.class) public class ReverseReferenceUpdateHardDeleteTest extends ReverseReferenceUpdateTestBase { + public ReverseReferenceUpdateHardDeleteTest() { + super(DeleteType.HARD); + } + @Override void assertTestOneToOneReference(Object refValue, ITypedReferenceableInstance expectedValue, ITypedReferenceableInstance referencingInstance) throws Exception { // Verify reference was disconnected http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateSoftDeleteTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateSoftDeleteTest.java b/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateSoftDeleteTest.java index c5eda37..a6f81c5 100644 --- a/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateSoftDeleteTest.java +++ b/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateSoftDeleteTest.java @@ -21,6 +21,7 @@ import org.apache.atlas.TestModules; import org.apache.atlas.repository.Constants; import org.apache.atlas.repository.graphdb.AtlasEdge; import org.apache.atlas.repository.graphdb.AtlasVertex; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.typesystem.ITypedReferenceableInstance; import org.apache.atlas.typesystem.persistence.Id; import org.testng.Assert; @@ -34,8 +35,12 @@ import java.util.List; * Run tests in {@link ReverseReferenceUpdateTestBase} with soft delete enabled. * */ -@Guice(modules = TestModules.SoftDeleteModule.class) +@Guice(modules = TestModules.TestOnlyModule.class) public class ReverseReferenceUpdateSoftDeleteTest extends ReverseReferenceUpdateTestBase { + public ReverseReferenceUpdateSoftDeleteTest() { + super(DeleteType.SOFT); + } + @Override void assertTestOneToOneReference(Object actual, ITypedReferenceableInstance expectedValue, ITypedReferenceableInstance referencingInstance) throws Exception { // Verify reference was not disconnected if soft deletes are enabled. http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateTestBase.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateTestBase.java b/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateTestBase.java index 8518f93..54a0450 100644 --- a/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateTestBase.java +++ b/repository/src/test/java/org/apache/atlas/repository/graph/ReverseReferenceUpdateTestBase.java @@ -21,8 +21,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; import org.apache.atlas.CreateUpdateEntitiesResult; +import org.apache.atlas.RequestContextV1; import org.apache.atlas.TestUtils; import org.apache.atlas.repository.MetadataRepository; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.typesystem.ITypedReferenceableInstance; import org.apache.atlas.typesystem.TypesDef; import org.apache.atlas.typesystem.types.AttributeDefinition; @@ -58,9 +60,15 @@ public abstract class ReverseReferenceUpdateTestBase { protected ClassType typeA; protected ClassType typeB; + private final DeleteType deleteType; + abstract void assertTestOneToOneReference(Object actual, ITypedReferenceableInstance expectedValue, ITypedReferenceableInstance referencingInstance) throws Exception; abstract void assertTestOneToManyReference(Object refValue, ITypedReferenceableInstance referencingInstance) throws Exception; + protected ReverseReferenceUpdateTestBase(DeleteType deleteType) { + this.deleteType = deleteType; + } + @BeforeClass public void setUp() throws Exception { typeSystem = TypeSystem.getInstance(); @@ -92,6 +100,8 @@ public abstract class ReverseReferenceUpdateTestBase { @BeforeMethod public void setupContext() { TestUtils.resetRequestContext(); + + RequestContextV1.get().setDeleteType(deleteType); } @Test http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/impexp/ExportImportTestBase.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ExportImportTestBase.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ExportImportTestBase.java index 37c0443..a11bcdc 100644 --- a/repository/src/test/java/org/apache/atlas/repository/impexp/ExportImportTestBase.java +++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ExportImportTestBase.java @@ -22,14 +22,9 @@ import org.apache.atlas.ApplicationProperties; import org.apache.atlas.AtlasConstants; import org.apache.atlas.AtlasException; import org.apache.atlas.exception.AtlasBaseException; -import org.apache.atlas.model.discovery.AtlasSearchResult; import org.apache.atlas.model.impexp.ExportImportAuditEntry; import org.apache.atlas.model.instance.AtlasEntity; -import org.apache.atlas.model.typedef.AtlasTypesDef; -import org.apache.atlas.repository.store.graph.v1.AtlasEntityChangeNotifier; import org.apache.atlas.repository.store.graph.v1.AtlasEntityStoreV1; -import org.apache.atlas.repository.store.graph.v1.DeleteHandlerV1; -import org.apache.atlas.repository.store.graph.v1.SoftDeleteHandlerV1; import org.apache.atlas.store.AtlasTypeDefStore; import org.apache.atlas.type.AtlasTypeRegistry; import org.testng.SkipException; @@ -42,7 +37,6 @@ import static org.apache.atlas.repository.impexp.ZipFileResourceTestUtils.create import static org.apache.atlas.repository.impexp.ZipFileResourceTestUtils.loadBaseModel; import static org.apache.atlas.repository.impexp.ZipFileResourceTestUtils.loadEntity; import static org.apache.atlas.repository.impexp.ZipFileResourceTestUtils.loadHiveModel; -import static org.mockito.Mockito.mock; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -56,9 +50,6 @@ public class ExportImportTestBase { protected static final String TABLE_VIEW_GUID = "56415119-7cb0-40dd-ace8-1e50efd54991"; protected static final String COLUMN_GUID_HIGH = "f87a5320-1529-4369-8d63-b637ebdf2c1c"; - protected DeleteHandlerV1 deleteHandler = mock(SoftDeleteHandlerV1.class); - protected AtlasEntityChangeNotifier mockChangeNotifier = mock(AtlasEntityChangeNotifier.class); - protected void basicSetup(AtlasTypeDefStore typeDefStore, AtlasTypeRegistry typeRegistry) throws IOException, AtlasBaseException { loadBaseModel(typeDefStore, typeRegistry); loadHiveModel(typeDefStore, typeRegistry); @@ -94,10 +85,6 @@ public class ExportImportTestBase { assertTrue(result.size() > 0); } - private String getCurrentCluster() throws AtlasException { - return ApplicationProperties.get().getString(AtlasConstants.CLUSTER_NAME_KEY, "default"); - } - protected void pauseForIndexCreation() { try { Thread.sleep(5000); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/impexp/ExportServiceTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ExportServiceTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ExportServiceTest.java index a332175..53bc274 100644 --- a/repository/src/test/java/org/apache/atlas/repository/impexp/ExportServiceTest.java +++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ExportServiceTest.java @@ -32,7 +32,6 @@ import org.apache.atlas.repository.graph.AtlasGraphProvider; import org.apache.atlas.repository.store.bootstrap.AtlasTypeDefStoreInitializer; import org.apache.atlas.repository.store.graph.v1.AtlasEntityStoreV1; import org.apache.atlas.repository.store.graph.v1.AtlasEntityStream; -import org.apache.atlas.repository.store.graph.v1.EntityGraphMapper; import org.apache.atlas.store.AtlasTypeDefStore; import org.apache.atlas.type.AtlasType; import org.apache.atlas.type.AtlasTypeRegistry; @@ -67,9 +66,6 @@ public class ExportServiceTest extends ExportImportTestBase { private AtlasTypeDefStore typeDefStore; @Inject - private EntityGraphMapper graphMapper; - - @Inject ExportService exportService; @Inject http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/impexp/ExportSkipLineageTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ExportSkipLineageTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ExportSkipLineageTest.java index c4682b8..524aa1e 100644 --- a/repository/src/test/java/org/apache/atlas/repository/impexp/ExportSkipLineageTest.java +++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ExportSkipLineageTest.java @@ -27,9 +27,8 @@ import org.apache.atlas.model.impexp.AtlasExportRequest; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.repository.store.graph.v1.AtlasEntityChangeNotifier; import org.apache.atlas.repository.store.graph.v1.AtlasEntityStoreV1; -import org.apache.atlas.repository.store.graph.v1.DeleteHandlerV1; +import org.apache.atlas.repository.store.graph.v1.DeleteHandlerDelegateV1; import org.apache.atlas.repository.store.graph.v1.EntityGraphMapper; -import org.apache.atlas.repository.store.graph.v1.SoftDeleteHandlerV1; import org.apache.atlas.store.AtlasTypeDefStore; import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.atlas.utils.TestResourceFileUtils; @@ -65,7 +64,7 @@ public class ExportSkipLineageTest extends ExportImportTestBase { @Inject ExportService exportService; - private DeleteHandlerV1 deleteHandler = mock(SoftDeleteHandlerV1.class); + private DeleteHandlerDelegateV1 deleteDelegate = mock(DeleteHandlerDelegateV1.class); private AtlasEntityChangeNotifier mockChangeNotifier = mock(AtlasEntityChangeNotifier.class); private AtlasEntityStoreV1 entityStore; @@ -74,7 +73,7 @@ public class ExportSkipLineageTest extends ExportImportTestBase { loadBaseModel(typeDefStore, typeRegistry); loadHiveModel(typeDefStore, typeRegistry); - entityStore = new AtlasEntityStoreV1(deleteHandler, typeRegistry, mockChangeNotifier, graphMapper); + entityStore = new AtlasEntityStoreV1(deleteDelegate, typeRegistry, mockChangeNotifier, graphMapper); createEntities(entityStore, ENTITIES_SUB_DIR, new String[]{"db", "table-columns", "table-view", "table-table-lineage"}); final Object[] entityGuids = new Object[]{DB_GUID, TABLE_GUID, TABLE_TABLE_GUID, TABLE_VIEW_GUID}; verifyCreatedEntities(entityStore, entityGuids, 4); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasDeleteHandlerV1Test.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasDeleteHandlerV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasDeleteHandlerV1Test.java index 0f082dc..8664fa1 100644 --- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasDeleteHandlerV1Test.java +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasDeleteHandlerV1Test.java @@ -45,6 +45,7 @@ import org.apache.atlas.repository.store.bootstrap.AtlasTypeDefStoreInitializer; import org.apache.atlas.repository.store.graph.AtlasEntityStore; import org.apache.atlas.services.MetadataService; import org.apache.atlas.store.AtlasTypeDefStore; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.type.AtlasEntityType; import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.atlas.type.AtlasTypeUtil; @@ -98,6 +99,12 @@ public abstract class AtlasDeleteHandlerV1Test { private TypeSystem typeSystem = TypeSystem.getInstance(); + private final DeleteType deleteType; + + protected AtlasDeleteHandlerV1Test(DeleteType deleteType) { + this.deleteType = deleteType; + } + @BeforeClass public void setUp() throws Exception { RequestContextV1.clear(); @@ -146,6 +153,7 @@ public abstract class AtlasDeleteHandlerV1Test { public void init() throws Exception { RequestContextV1.clear(); RequestContextV1.get().setUser(TestUtilsV2.TEST_USER); + RequestContextV1.get().setDeleteType(deleteType); } @AfterClass http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java index 089ff08..b991fd3 100644 --- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java @@ -99,7 +99,7 @@ public class AtlasEntityStoreV1Test { MetadataService metadataService; @Inject - DeleteHandlerV1 deleteHandler; + DeleteHandlerDelegateV1 deleteDelegate; private AtlasEntitiesWithExtInfo deptEntity; private AtlasEntityWithExtInfo dbEntity; @@ -145,7 +145,7 @@ public class AtlasEntityStoreV1Test { @BeforeTest public void init() throws Exception { - entityStore = new AtlasEntityStoreV1(deleteHandler, typeRegistry, mockChangeNotifier, graphMapper); + entityStore = new AtlasEntityStoreV1(deleteDelegate, typeRegistry, mockChangeNotifier, graphMapper); RequestContextV1.clear(); RequestContextV1.get().setUser(TestUtilsV2.TEST_USER); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1Test.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1Test.java index 407ebff..d68d6d6 100644 --- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1Test.java +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/HardDeleteHandlerV1Test.java @@ -29,6 +29,7 @@ import org.apache.atlas.model.instance.AtlasObjectId; import org.apache.atlas.repository.Constants; import org.apache.atlas.repository.graph.GraphHelper; import org.apache.atlas.repository.graphdb.AtlasVertex; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.typesystem.IStruct; import org.apache.atlas.typesystem.ITypedReferenceableInstance; import org.apache.atlas.typesystem.ITypedStruct; @@ -45,9 +46,11 @@ import static org.testng.Assert.assertNull; import static org.testng.Assert.fail; import static org.testng.AssertJUnit.assertNotNull; -@Guice(modules = TestModules.HardDeleteModule.class) +@Guice(modules = TestModules.TestOnlyModule.class) public class HardDeleteHandlerV1Test extends AtlasDeleteHandlerV1Test { - + public HardDeleteHandlerV1Test() { + super(DeleteType.HARD); + } @Override protected void assertTableForTestDeleteReference(String tableId) { http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateHardDeleteV1Test.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateHardDeleteV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateHardDeleteV1Test.java index d54adeb..790450b 100644 --- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateHardDeleteV1Test.java +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateHardDeleteV1Test.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableList; import org.apache.atlas.TestModules; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.instance.AtlasObjectId; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.type.AtlasTypeUtil; import org.testng.annotations.Guice; @@ -30,10 +31,13 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; /** - * Inverse reference update test with {@link HardDeleteHandlerV1} + * Inverse reference update test with HardDeleteHandlerV1 */ -@Guice(modules = TestModules.HardDeleteModule.class) +@Guice(modules = TestModules.TestOnlyModule.class) public class InverseReferenceUpdateHardDeleteV1Test extends InverseReferenceUpdateV1Test { + public InverseReferenceUpdateHardDeleteV1Test() { + super(DeleteType.HARD); + } @Override protected void verify_testInverseReferenceAutoUpdate_NonComposite_OneToMany(AtlasEntity jane) throws Exception { http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateSoftDeleteV1Test.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateSoftDeleteV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateSoftDeleteV1Test.java index 884ab54..b5b68d2 100644 --- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateSoftDeleteV1Test.java +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateSoftDeleteV1Test.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableList; import org.apache.atlas.TestModules; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.instance.AtlasObjectId; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.type.AtlasTypeUtil; import org.testng.annotations.Guice; @@ -31,10 +32,13 @@ import static org.testng.Assert.assertTrue; /** - * Inverse reference update test with {@link SoftDeleteHandlerV1} + * Inverse reference update test with SoftDeleteHandlerV1 */ -@Guice(modules = TestModules.SoftDeleteModule.class) +@Guice(modules = TestModules.TestOnlyModule.class) public class InverseReferenceUpdateSoftDeleteV1Test extends InverseReferenceUpdateV1Test { + public InverseReferenceUpdateSoftDeleteV1Test() { + super(DeleteType.SOFT); + } @Override protected void verify_testInverseReferenceAutoUpdate_NonComposite_OneToMany(AtlasEntity jane) http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateV1Test.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateV1Test.java index 6475639..f33e99b 100644 --- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateV1Test.java +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/InverseReferenceUpdateV1Test.java @@ -19,7 +19,9 @@ package org.apache.atlas.repository.store.graph.v1; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import org.apache.atlas.RequestContext; import org.apache.atlas.RequestContextV1; +import org.apache.atlas.TestModules; import org.apache.atlas.TestUtils; import org.apache.atlas.TestUtilsV2; import org.apache.atlas.model.instance.AtlasEntity; @@ -34,12 +36,14 @@ import org.apache.atlas.repository.store.bootstrap.AtlasTypeDefStoreInitializer; import org.apache.atlas.repository.store.graph.AtlasEntityStore; import org.apache.atlas.services.MetadataService; import org.apache.atlas.store.AtlasTypeDefStore; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.type.AtlasEntityType; import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.atlas.type.AtlasTypeUtil; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Guice; import org.testng.annotations.Test; import javax.inject.Inject; @@ -57,6 +61,7 @@ import static org.testng.Assert.assertTrue; * Test automatic inverse reference updating in V1 (V2?) code path. * */ +@Guice(modules = TestModules.TestOnlyModule.class) public abstract class InverseReferenceUpdateV1Test { @Inject AtlasTypeRegistry typeRegistry; @@ -71,9 +76,14 @@ public abstract class InverseReferenceUpdateV1Test { MetadataService metadataService; private AtlasEntitiesWithExtInfo deptEntity; + private final DeleteType deleteType; protected Map<String, AtlasObjectId> nameIdMap = new HashMap<>(); + protected InverseReferenceUpdateV1Test(DeleteType deleteType) { + this.deleteType = deleteType; + } + @BeforeClass public void setUp() throws Exception { RequestContextV1.clear(); @@ -108,8 +118,12 @@ public abstract class InverseReferenceUpdateV1Test { @BeforeMethod public void init() throws Exception { + RequestContext.clear(); + RequestContext.get().setUser(TestUtilsV2.TEST_USER); + RequestContextV1.clear(); RequestContextV1.get().setUser(TestUtilsV2.TEST_USER); + RequestContextV1.get().setDeleteType(deleteType); } @Test http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1Test.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1Test.java index ddef193..055d05d 100644 --- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1Test.java +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftDeleteHandlerV1Test.java @@ -25,9 +25,9 @@ import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.instance.AtlasEntityHeader; import org.apache.atlas.model.instance.AtlasObjectId; import org.apache.atlas.repository.Constants; -import org.apache.atlas.repository.graph.GraphHelper; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.services.MetadataService; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.typesystem.IReferenceableInstance; import org.apache.atlas.typesystem.IStruct; import org.apache.atlas.typesystem.ITypedReferenceableInstance; @@ -45,12 +45,16 @@ import static org.apache.atlas.TestUtils.NAME; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; -@Guice(modules = TestModules.SoftDeleteModule.class) +@Guice(modules = TestModules.TestOnlyModule.class) public class SoftDeleteHandlerV1Test extends AtlasDeleteHandlerV1Test { @Inject MetadataService metadataService; + public SoftDeleteHandlerV1Test() { + super(DeleteType.SOFT); + } + @Override protected void assertDeletedColumn(final AtlasEntity.AtlasEntityWithExtInfo tableInstance) throws AtlasBaseException { final List<AtlasObjectId> columns = (List<AtlasObjectId>) tableInstance.getEntity().getAttribute(COLUMNS_ATTR_NAME); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftReferenceTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftReferenceTest.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftReferenceTest.java index 95b99f9..5b7c955 100644 --- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftReferenceTest.java +++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/SoftReferenceTest.java @@ -18,7 +18,10 @@ package org.apache.atlas.repository.store.graph.v1; +import org.apache.atlas.RequestContext; +import org.apache.atlas.RequestContextV1; import org.apache.atlas.TestModules; +import org.apache.atlas.TestUtilsV2; import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.instance.AtlasObjectId; @@ -30,10 +33,12 @@ import org.apache.atlas.repository.graphdb.AtlasEdgeDirection; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.store.graph.AtlasEntityStore; import org.apache.atlas.store.AtlasTypeDefStore; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.type.AtlasEntityType; import org.apache.atlas.type.AtlasType; import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.atlas.utils.TestResourceFileUtils; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Guice; import org.testng.annotations.Test; @@ -48,7 +53,7 @@ import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; -@Guice(modules = TestModules.SoftDeleteModule.class) +@Guice(modules = TestModules.TestOnlyModule.class) public class SoftReferenceTest { private static final String TYPE_RDBMS_DB = "rdbms_db"; private static final String RDBMS_DB_FILE = "rdbms-db"; @@ -73,6 +78,12 @@ public class SoftReferenceTest { private String dbGuid; private String storageGuid; + @BeforeMethod + public void init() throws Exception { + RequestContext.get().setUser(TestUtilsV2.TEST_USER); + RequestContextV1.get().setDeleteType(DeleteType.SOFT); + } + @Test public void typeCreationFromFile() throws IOException, AtlasBaseException { String typesDefJson = TestResourceFileUtils.getJson(TYPESDEF_FILE_NAME); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/server-api/src/main/java/org/apache/atlas/RequestContext.java ---------------------------------------------------------------------- diff --git a/server-api/src/main/java/org/apache/atlas/RequestContext.java b/server-api/src/main/java/org/apache/atlas/RequestContext.java index 6775f4d..c751fa8 100644 --- a/server-api/src/main/java/org/apache/atlas/RequestContext.java +++ b/server-api/src/main/java/org/apache/atlas/RequestContext.java @@ -81,13 +81,7 @@ public class RequestContext { RequestContext instance = CURRENT_CONTEXT.get(); if (instance != null) { - instance.createdEntityIds.clear(); - instance.updatedEntityIds.clear(); - instance.deletedEntityIds.clear(); - instance.deletedEntities.clear(); - instance.entityCacheV1.clear(); - instance.entityCache.clear(); - instance.entityExtInfoCache.clear(); + instance.clearCache(); synchronized (ACTIVE_REQUESTS) { ACTIVE_REQUESTS.remove(instance); @@ -97,6 +91,16 @@ public class RequestContext { CURRENT_CONTEXT.remove(); } + public void clearCache() { + this.createdEntityIds.clear(); + this.updatedEntityIds.clear(); + this.deletedEntityIds.clear(); + this.deletedEntities.clear(); + this.entityCacheV1.clear(); + this.entityCache.clear(); + this.entityExtInfoCache.clear(); + } + public static RequestContext createContext() { clear(); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/server-api/src/main/java/org/apache/atlas/RequestContextV1.java ---------------------------------------------------------------------- diff --git a/server-api/src/main/java/org/apache/atlas/RequestContextV1.java b/server-api/src/main/java/org/apache/atlas/RequestContextV1.java index b388018..b85769c 100644 --- a/server-api/src/main/java/org/apache/atlas/RequestContextV1.java +++ b/server-api/src/main/java/org/apache/atlas/RequestContextV1.java @@ -21,6 +21,7 @@ package org.apache.atlas; import org.apache.atlas.metrics.Metrics; import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.instance.AtlasObjectId; +import org.apache.atlas.store.DeleteType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,14 +39,15 @@ public class RequestContextV1 { private static final ThreadLocal<RequestContextV1> CURRENT_CONTEXT = new ThreadLocal<>(); private static final Set<RequestContextV1> ACTIVE_REQUESTS = new HashSet<>(); + private final long requestTime = System.currentTimeMillis(); private final Map<String, AtlasObjectId> updatedEntities = new HashMap<>(); private final Map<String, AtlasObjectId> deletedEntities = new HashMap<>(); private final Map<String, AtlasEntity> entityCacheV2 = new HashMap<>(); private final Metrics metrics = new Metrics(); - private final long requestTime = System.currentTimeMillis(); private List<EntityGuidPair> entityGuidInRequest = null; - private String user; + private String user; + private DeleteType deleteType = DeleteType.DEFAULT; private RequestContextV1() { } @@ -71,13 +73,7 @@ public class RequestContextV1 { RequestContextV1 instance = CURRENT_CONTEXT.get(); if (instance != null) { - instance.updatedEntities.clear(); - instance.deletedEntities.clear(); - instance.entityCacheV2.clear(); - - if (instance.entityGuidInRequest != null) { - instance.entityGuidInRequest.clear(); - } + instance.clearCache(); synchronized (ACTIVE_REQUESTS) { ACTIVE_REQUESTS.remove(instance); @@ -87,6 +83,16 @@ public class RequestContextV1 { CURRENT_CONTEXT.remove(); } + public void clearCache() { + this.updatedEntities.clear(); + this.deletedEntities.clear(); + this.entityCacheV2.clear(); + + if (this.entityGuidInRequest != null) { + this.entityGuidInRequest.clear(); + } + } + public static int getActiveRequestsCount() { return ACTIVE_REQUESTS.size(); } @@ -118,6 +124,10 @@ public class RequestContextV1 { this.user = user; } + public DeleteType getDeleteType() { return deleteType; } + + public void setDeleteType(DeleteType deleteType) { this.deleteType = (deleteType == null) ? DeleteType.DEFAULT : deleteType; } + public void recordEntityUpdate(AtlasObjectId entity) { if (entity != null && entity.getGuid() != null) { updatedEntities.put(entity.getGuid(), entity); http://git-wip-us.apache.org/repos/asf/atlas/blob/daabed13/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java ---------------------------------------------------------------------- diff --git a/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java b/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java index 191388a..c503e41 100755 --- a/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java +++ b/webapp/src/main/java/org/apache/atlas/web/filters/AuditFilter.java @@ -23,10 +23,12 @@ import org.apache.atlas.AtlasException; import org.apache.atlas.RequestContext; import org.apache.atlas.RequestContextV1; import org.apache.atlas.metrics.Metrics; +import org.apache.atlas.store.DeleteType; import org.apache.atlas.util.AtlasRepositoryConfiguration; import org.apache.atlas.web.util.DateTimeHelper; import org.apache.atlas.web.util.Servlets; import org.apache.commons.configuration.Configuration; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -43,6 +45,8 @@ import java.io.IOException; import java.util.Date; import java.util.UUID; +import static org.apache.atlas.AtlasConfiguration.REST_API_ENABLE_DELETE_TYPE_OVERRIDE; + /** * This records audit information as part of the filter after processing the request * and also introduces a UUID into request and response for tracing requests in logs. @@ -53,9 +57,15 @@ public class AuditFilter implements Filter { private static final Logger LOG = LoggerFactory.getLogger(AuditFilter.class); private static final Logger METRICS_LOG = LoggerFactory.getLogger("METRICS"); + private boolean deleteTypeOverrideEnabled = false; + @Override public void init(FilterConfig filterConfig) throws ServletException { LOG.info("AuditFilter initialization started"); + + deleteTypeOverrideEnabled = REST_API_ENABLE_DELETE_TYPE_OVERRIDE.getBoolean(); + + LOG.info("REST_API_ENABLE_DELETE_TYPE_OVERRIDE={}", deleteTypeOverrideEnabled); } @Override @@ -67,12 +77,26 @@ public class AuditFilter implements Filter { final Thread currentThread = Thread.currentThread(); final String oldName = currentThread.getName(); String user = getUserFromRequest(httpRequest); + final String deleteType = httpRequest.getParameter("deleteType"); try { currentThread.setName(formatName(oldName, requestId)); RequestContext requestContext = RequestContext.createContext(); requestContext.setUser(user); - recordAudit(httpRequest, requestTimeISO9601, user); + + RequestContextV1.clear(); + RequestContextV1 requestContextV1 = RequestContextV1.get(); + requestContextV1.setUser(user); + + if (StringUtils.isNotEmpty(deleteType)) { + if (deleteTypeOverrideEnabled) { + requestContextV1.setDeleteType(DeleteType.from(deleteType)); + } else { + LOG.warn("Override of deleteType is not enabled. Ignoring parameter deleteType={}, in request from user={}", deleteType, user); + } + } + + recordAudit(httpRequest, requestTimeISO9601, user); filterChain.doFilter(request, response); } finally { // put the request id into the response so users can trace logs for this request