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