diff --git a/notification/src/main/java/org/apache/atlas/notification/entity/NotificationEntityChangeListener.java b/notification/src/main/java/org/apache/atlas/notification/entity/NotificationEntityChangeListener.java index a660bf9..23a6d69 100644 --- a/notification/src/main/java/org/apache/atlas/notification/entity/NotificationEntityChangeListener.java +++ b/notification/src/main/java/org/apache/atlas/notification/entity/NotificationEntityChangeListener.java @@ -18,14 +18,22 @@ package org.apache.atlas.notification.entity; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; import org.apache.atlas.AtlasException; import org.apache.atlas.listener.EntityChangeListener; import org.apache.atlas.notification.NotificationInterface; +import org.apache.atlas.typesystem.IReferenceableInstance; import org.apache.atlas.typesystem.IStruct; import org.apache.atlas.typesystem.ITypedReferenceableInstance; import org.apache.atlas.typesystem.Referenceable; +import org.apache.atlas.typesystem.json.InstanceSerialization; import org.apache.atlas.typesystem.types.TypeSystem; +import java.lang.reflect.Type; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; @@ -36,9 +44,11 @@ import java.util.List; */ public class NotificationEntityChangeListener implements EntityChangeListener { + private static final Gson GSON = new GsonBuilder(). + registerTypeAdapter(Referenceable.class, new ReferencableSerializer()).create(); + private final NotificationInterface notificationInterface; private final TypeSystem typeSystem; - private final Gson gson = new Gson(); // ----- Constructors ------------------------------------------------------ @@ -78,23 +88,37 @@ public class NotificationEntityChangeListener implements EntityChangeListener { } - // ----- helper methods ---------------------------------------------------- + // ----- helper methods ------------------------------------------------- // send notification of entity change private void notifyOfEntityEvent(Collection<ITypedReferenceableInstance> entityDefinitions, EntityNotification.OperationType operationType) throws AtlasException { List<String> messages = new LinkedList<>(); - for (ITypedReferenceableInstance entityDefinition : entityDefinitions) { + for (IReferenceableInstance entityDefinition : entityDefinitions) { Referenceable entity = new Referenceable(entityDefinition); EntityNotificationImpl notification = new EntityNotificationImpl(entity, operationType, typeSystem); - messages.add(gson.toJson(notification)); + messages.add(GSON.toJson(notification)); } notificationInterface.send(NotificationInterface.NotificationType.ENTITIES, messages.toArray(new String[messages.size()])); } + + + // ----- inner class : ReferencableSerializer --------------------------- + + private static class ReferencableSerializer implements JsonSerializer<Referenceable> { + + public static final JsonParser JSON_PARSER = new JsonParser(); + + @Override + public JsonElement serialize(Referenceable referenceable, Type type, + JsonSerializationContext jsonSerializationContext) { + return JSON_PARSER.parse(InstanceSerialization.toJson(referenceable, true)).getAsJsonObject(); + } + } } diff --git a/release-log.txt b/release-log.txt index c70df12..adeef31 100644 --- a/release-log.txt +++ b/release-log.txt @@ -9,6 +9,7 @@ ATLAS-54 Rename configs in hive hook (shwethags) ATLAS-3 Mixed Index creation fails with Date types (sumasai via shwethags) ALL CHANGES: +ATLAS-296 IllegalArgumentException during hive HiveHookIT integration tests (tbeerbower via shwethags) ATLAS-158 Provide Atlas Entity Change Notification (tbeerbower via shwethags) ATALS-238 atlas_start.py- the Atlas server won’t restart after improper shutdown(ndjouri via sumasai) ATLAS-293 UI Requires Internet Access For UI Facelift (darshankumar89 via shwethags) diff --git a/typesystem/src/main/java/org/apache/atlas/typesystem/Referenceable.java b/typesystem/src/main/java/org/apache/atlas/typesystem/Referenceable.java index 6102427..aaf0aa4 100755 --- a/typesystem/src/main/java/org/apache/atlas/typesystem/Referenceable.java +++ b/typesystem/src/main/java/org/apache/atlas/typesystem/Referenceable.java @@ -42,7 +42,7 @@ public class Referenceable extends Struct implements IReferenceableInstance { super(typeName); id = new Id(typeName); this.traitNames = ImmutableList.copyOf(traitNames); - ImmutableMap.Builder<String, IStruct> b = new ImmutableMap.Builder<String, IStruct>(); + ImmutableMap.Builder<String, IStruct> b = new ImmutableMap.Builder<>(); for (String t : traitNames) { b.put(t, new Struct(t)); } @@ -65,9 +65,9 @@ public class Referenceable extends Struct implements IReferenceableInstance { /** * Not public - only use during deserialization - * @param guid - * @param typeName - * @param values + * @param guid the unique id + * @param typeName the type name + * @param values the entity attribute values */ @InterfaceAudience.Private public Referenceable(String guid, String typeName, Map<String, Object> values, List<String> _traitNames, @@ -79,13 +79,13 @@ public class Referenceable extends Struct implements IReferenceableInstance { } /** - * Construct a Referenceable from the given ITypedReferenceableInstance. + * Construct a Referenceable from the given IReferenceableInstance. * - * @param instance the typed referenceable instance to copy + * @param instance the referenceable instance to copy * * @throws AtlasException if the referenceable can not be created */ - public Referenceable(ITypedReferenceableInstance instance) throws AtlasException { + public Referenceable(IReferenceableInstance instance) throws AtlasException { this(instance.getId()._getId(), instance.getTypeName(), instance.getValuesMap(), instance.getTraits(), getTraits(instance)); } @@ -114,11 +114,10 @@ public class Referenceable extends Struct implements IReferenceableInstance { return traits.get(typeName); } - private static Map<String, IStruct> getTraits(ITypedReferenceableInstance instance) { + private static Map<String, IStruct> getTraits(IReferenceableInstance instance) throws AtlasException { Map<String, IStruct> traits = new HashMap<>(); - for (String traitName : instance.getTraits() ) { - traits.put(traitName, instance.getTrait(traitName)); + traits.put(traitName, new Struct(traitName, instance.getTrait(traitName).getValuesMap())); } return traits; }