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 2017/03/01 06:42:39 UTC

incubator-atlas git commit: ATLAS 1607: notify listeners on classification addition/deletion

Repository: incubator-atlas
Updated Branches:
  refs/heads/master 48c10133e -> 0feb60a2f


ATLAS 1607: notify listeners on classification addition/deletion

Signed-off-by: Madhan Neethiraj <ma...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/0feb60a2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/0feb60a2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/0feb60a2

Branch: refs/heads/master
Commit: 0feb60a2f1e70fbc32f765fc67ffeaad6618c997
Parents: 48c1013
Author: Sarath Subramanian <ss...@hortonworks.com>
Authored: Tue Feb 28 18:35:30 2017 -0800
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Tue Feb 28 22:42:27 2017 -0800

----------------------------------------------------------------------
 .../repository/audit/EntityAuditListener.java   | 22 ++++---
 .../graph/v1/AtlasEntityChangeNotifier.java     | 62 ++++++++++++++++++++
 .../store/graph/v1/AtlasEntityStoreV1.java      | 12 +++-
 .../atlas/services/DefaultMetadataService.java  | 14 ++---
 .../service/DefaultMetadataServiceTest.java     |  4 +-
 .../atlas/listener/EntityChangeListener.java    |  8 +--
 .../NotificationEntityChangeListener.java       |  4 +-
 7 files changed, 103 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0feb60a2/repository/src/main/java/org/apache/atlas/repository/audit/EntityAuditListener.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/audit/EntityAuditListener.java b/repository/src/main/java/org/apache/atlas/repository/audit/EntityAuditListener.java
index 01c077a..3f03c50 100644
--- a/repository/src/main/java/org/apache/atlas/repository/audit/EntityAuditListener.java
+++ b/repository/src/main/java/org/apache/atlas/repository/audit/EntityAuditListener.java
@@ -77,18 +77,26 @@ public class EntityAuditListener implements EntityChangeListener {
     }
 
     @Override
-    public void onTraitAdded(ITypedReferenceableInstance entity, IStruct trait) throws AtlasException {
-        EntityAuditEvent event = createEvent(entity, EntityAuditAction.TAG_ADD,
-                                             "Added trait: " + InstanceSerialization.toJson(trait, true));
+    public void onTraitsAdded(ITypedReferenceableInstance entity, Collection<? extends IStruct> traits) throws AtlasException {
+        if (traits != null) {
+            for (IStruct trait : traits) {
+                EntityAuditEvent event = createEvent(entity, EntityAuditAction.TAG_ADD,
+                                                     "Added trait: " + InstanceSerialization.toJson(trait, true));
 
-        auditRepository.putEvents(event);
+                auditRepository.putEvents(event);
+            }
+        }
     }
 
     @Override
-    public void onTraitDeleted(ITypedReferenceableInstance entity, String traitName) throws AtlasException {
-        EntityAuditEvent event = createEvent(entity, EntityAuditAction.TAG_DELETE, "Deleted trait: " + traitName);
+    public void onTraitsDeleted(ITypedReferenceableInstance entity, Collection<String> traitNames) throws AtlasException {
+        if (traitNames != null) {
+            for (String traitName : traitNames) {
+                EntityAuditEvent event = createEvent(entity, EntityAuditAction.TAG_DELETE, "Deleted trait: " + traitName);
 
-        auditRepository.putEvents(event);
+                auditRepository.putEvents(event);
+            }
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0feb60a2/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityChangeNotifier.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityChangeNotifier.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityChangeNotifier.java
index 4ec2a7c..e112b64 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityChangeNotifier.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityChangeNotifier.java
@@ -24,6 +24,7 @@ import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.AtlasException;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.listener.EntityChangeListener;
+import org.apache.atlas.model.instance.AtlasClassification;
 import org.apache.atlas.model.instance.AtlasEntityHeader;
 import org.apache.atlas.model.instance.EntityMutationResponse;
 import org.apache.atlas.model.instance.EntityMutations.EntityOperation;
@@ -32,8 +33,10 @@ import org.apache.atlas.repository.converters.AtlasInstanceConverter;
 import org.apache.atlas.repository.graph.*;
 import org.apache.atlas.repository.graphdb.AtlasVertex;
 import org.apache.atlas.typesystem.ITypedReferenceableInstance;
+import org.apache.atlas.typesystem.ITypedStruct;
 import org.apache.atlas.util.AtlasRepositoryConfiguration;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -105,6 +108,39 @@ public class AtlasEntityChangeNotifier {
         }
     }
 
+    public void onClassificationAddedToEntity(String entityId, List<AtlasClassification> classifications) throws AtlasBaseException {
+        ITypedReferenceableInstance entity = toITypedReferenceable(entityId);
+        List<ITypedStruct>          traits = toITypedStructs(classifications);
+
+        if (entity == null || CollectionUtils.isEmpty(traits)) {
+            return;
+        }
+
+        for (EntityChangeListener listener : entityChangeListeners) {
+            try {
+                listener.onTraitsAdded(entity, traits);
+            } catch (AtlasException e) {
+                throw new AtlasBaseException(AtlasErrorCode.NOTIFICATION_FAILED, e);
+            }
+        }
+    }
+
+    public void onClassificationDeletedFromEntity(String entityId, List<String> traitNames) throws AtlasBaseException {
+        ITypedReferenceableInstance entity = toITypedReferenceable(entityId);
+
+        if (entity == null || CollectionUtils.isEmpty(traitNames)) {
+            return;
+        }
+
+        for (EntityChangeListener listener : entityChangeListeners) {
+            try {
+                listener.onTraitsDeleted(entity, traitNames);
+            } catch (AtlasException e) {
+                throw new AtlasBaseException(AtlasErrorCode.NOTIFICATION_FAILED, e);
+            }
+        }
+    }
+
     private void notifyListeners(List<ITypedReferenceableInstance> typedRefInsts, EntityOperation operation) throws AtlasBaseException {
         for (EntityChangeListener listener : entityChangeListeners) {
             try {
@@ -136,6 +172,32 @@ public class AtlasEntityChangeNotifier {
         return ret;
     }
 
+    private ITypedReferenceableInstance toITypedReferenceable(String entityId) throws AtlasBaseException {
+        ITypedReferenceableInstance ret = null;
+
+        if (StringUtils.isNotEmpty(entityId)) {
+            ret = instanceConverter.getITypedReferenceable(entityId);
+        }
+
+        return ret;
+    }
+
+    private List<ITypedStruct> toITypedStructs(List<AtlasClassification> classifications) throws AtlasBaseException {
+        List<ITypedStruct> ret = null;
+
+        if (classifications != null) {
+            ret = new ArrayList<>(classifications.size());
+
+            for (AtlasClassification classification : classifications) {
+                if (classification != null) {
+                    ret.add(instanceConverter.getTrait(classification));
+                }
+            }
+        }
+
+        return ret;
+    }
+
     private void doFullTextMapping(List<AtlasEntityHeader> atlasEntityHeaders) {
         try {
             if(!AtlasRepositoryConfiguration.isFullTextSearchEnabled()) {

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0feb60a2/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 af1066d..a3d951d 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
@@ -430,6 +430,8 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore {
         EntityGraphMapper graphMapper = new EntityGraphMapper(deleteHandler, typeRegistry);
         graphMapper.addClassifications(new EntityMutationContext(), guid, classifications);
 
+        // notify listeners on classification addition
+        entityChangeNotifier.onClassificationAddedToEntity(guid, classifications);
     }
 
     @Override
@@ -448,8 +450,13 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore {
 
         EntityGraphMapper graphMapper = new EntityGraphMapper(deleteHandler, typeRegistry);
 
+        List<AtlasClassification> classifications = Collections.singletonList(classification);
+
         for (String guid : guids) {
-            graphMapper.addClassifications(new EntityMutationContext(), guid, Collections.singletonList(classification));
+            graphMapper.addClassifications(new EntityMutationContext(), guid, classifications);
+
+            // notify listeners on classification addition
+            entityChangeNotifier.onClassificationAddedToEntity(guid, classifications);
         }
 
     }
@@ -470,6 +477,9 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore {
 
         EntityGraphMapper entityGraphMapper = new EntityGraphMapper(deleteHandler, typeRegistry);
         entityGraphMapper.deleteClassifications(guid, classificationNames);
+
+        // notify listeners on classification deletion
+        entityChangeNotifier.onClassificationDeletedFromEntity(guid, classificationNames);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0feb60a2/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java b/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java
index 993cf61..77db167 100755
--- a/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java
+++ b/repository/src/main/java/org/apache/atlas/services/DefaultMetadataService.java
@@ -72,11 +72,7 @@ import org.codehaus.jettison.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -724,14 +720,18 @@ public class DefaultMetadataService implements MetadataService, ActiveStateChang
     }
 
     private void onTraitAddedToEntity(ITypedReferenceableInstance entity, IStruct trait) throws AtlasException {
+        Collection<IStruct> traits = Collections.singletonList(trait);
+
         for (EntityChangeListener listener : entityChangeListeners) {
-            listener.onTraitAdded(entity, trait);
+            listener.onTraitsAdded(entity, traits);
         }
     }
 
     private void onTraitDeletedFromEntity(ITypedReferenceableInstance entity, String traitName) throws AtlasException {
+        Collection<String> traitNames = Collections.singletonList(traitName);
+
         for (EntityChangeListener listener : entityChangeListeners) {
-            listener.onTraitDeleted(entity, traitName);
+            listener.onTraitsDeleted(entity, traitNames);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0feb60a2/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java b/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java
index 96c2ce5..7e828a1 100644
--- a/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java
+++ b/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java
@@ -1258,12 +1258,12 @@ public class DefaultMetadataServiceTest {
         }
 
         @Override
-        public void onTraitAdded(ITypedReferenceableInstance entity, IStruct trait)
+        public void onTraitsAdded(ITypedReferenceableInstance entity, Collection<? extends IStruct> traits)
             throws AtlasException {
         }
 
         @Override
-        public void onTraitDeleted(ITypedReferenceableInstance entity, String traitName)
+        public void onTraitsDeleted(ITypedReferenceableInstance entity, Collection<String> traitNames)
             throws AtlasException {
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0feb60a2/server-api/src/main/java/org/apache/atlas/listener/EntityChangeListener.java
----------------------------------------------------------------------
diff --git a/server-api/src/main/java/org/apache/atlas/listener/EntityChangeListener.java b/server-api/src/main/java/org/apache/atlas/listener/EntityChangeListener.java
index e9a7d1a..256e839 100644
--- a/server-api/src/main/java/org/apache/atlas/listener/EntityChangeListener.java
+++ b/server-api/src/main/java/org/apache/atlas/listener/EntityChangeListener.java
@@ -52,21 +52,21 @@ public interface EntityChangeListener {
      * This is upon adding a new trait to a typed instance.
      *
      * @param entity        the entity
-     * @param trait     trait that needs to be added to entity
+     * @param traits    trait that needs to be added to entity
      *
      * @throws AtlasException if the listener notification fails
      */
-    void onTraitAdded(ITypedReferenceableInstance entity, IStruct trait) throws AtlasException;
+    void onTraitsAdded(ITypedReferenceableInstance entity, Collection<? extends IStruct> traits) throws AtlasException;
 
     /**
      * This is upon deleting a trait from a typed instance.
      *
      * @param entity        the entity
-     * @param traitName     trait name for the instance that needs to be deleted from entity
+     * @param traitNames    trait name for the instance that needs to be deleted from entity
      *
      * @throws AtlasException if the listener notification fails
      */
-    void onTraitDeleted(ITypedReferenceableInstance entity, String traitName) throws AtlasException;
+    void onTraitsDeleted(ITypedReferenceableInstance entity, Collection<String> traitNames) throws AtlasException;
     
     /**
      * This is upon deleting entities from the repository.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0feb60a2/webapp/src/main/java/org/apache/atlas/notification/NotificationEntityChangeListener.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/notification/NotificationEntityChangeListener.java b/webapp/src/main/java/org/apache/atlas/notification/NotificationEntityChangeListener.java
index 8a1991c..978b21d 100644
--- a/webapp/src/main/java/org/apache/atlas/notification/NotificationEntityChangeListener.java
+++ b/webapp/src/main/java/org/apache/atlas/notification/NotificationEntityChangeListener.java
@@ -87,12 +87,12 @@ public class NotificationEntityChangeListener implements EntityChangeListener {
     }
 
     @Override
-    public void onTraitAdded(ITypedReferenceableInstance entity, IStruct trait) throws AtlasException {
+    public void onTraitsAdded(ITypedReferenceableInstance entity, Collection<? extends IStruct> traits) throws AtlasException {
         notifyOfEntityEvent(Collections.singleton(entity), EntityNotification.OperationType.TRAIT_ADD);
     }
 
     @Override
-    public void onTraitDeleted(ITypedReferenceableInstance entity, String traitName) throws AtlasException {
+    public void onTraitsDeleted(ITypedReferenceableInstance entity, Collection<String> traitNames) throws AtlasException {
         notifyOfEntityEvent(Collections.singleton(entity), EntityNotification.OperationType.TRAIT_DELETE);
     }