You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2018/11/15 07:33:35 UTC

[2/2] atlas git commit: ATLAS-2774: enhancement to support parameterized delete-type (hard or soft) per API call

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 <ma...@apache.org>
Authored: Wed Nov 14 19:50:56 2018 -0800
Committer: Madhan Neethiraj <ma...@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