From 72d09c3e8ea0e98fa496abe06c74d7bd11752057 Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Mon, 12 Nov 2018 13:52:50 +0100
Subject: [PATCH] Store old entity or Map of changes with update and change
 events

A new event for full updates has been added.
---
 .../thm/arsnova/event/AfterFullUpdateEvent.java  | 16 ++++++++++++++++
 .../de/thm/arsnova/event/AfterPatchEvent.java    | 11 ++++++++++-
 .../de/thm/arsnova/event/AfterUpdateEvent.java   |  2 +-
 .../thm/arsnova/event/BeforeFullUpdateEvent.java | 16 ++++++++++++++++
 .../de/thm/arsnova/event/BeforePatchEvent.java   | 11 ++++++++++-
 .../de/thm/arsnova/event/BeforeUpdateEvent.java  |  2 +-
 .../service/DefaultEntityServiceImpl.java        | 14 +++++++-------
 7 files changed, 61 insertions(+), 11 deletions(-)
 create mode 100644 src/main/java/de/thm/arsnova/event/AfterFullUpdateEvent.java
 create mode 100644 src/main/java/de/thm/arsnova/event/BeforeFullUpdateEvent.java

diff --git a/src/main/java/de/thm/arsnova/event/AfterFullUpdateEvent.java b/src/main/java/de/thm/arsnova/event/AfterFullUpdateEvent.java
new file mode 100644
index 000000000..3d944d51c
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/AfterFullUpdateEvent.java
@@ -0,0 +1,16 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class AfterFullUpdateEvent<E extends Entity> extends AfterUpdateEvent<E> {
+	private final E oldEntity;
+
+	public AfterFullUpdateEvent(final Object source, final E entity, final E oldEntity) {
+		super(source, entity);
+		this.oldEntity = oldEntity;
+	}
+
+	public E getOldEntity() {
+		return oldEntity;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java b/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
index 4b73660d3..847bca9e9 100644
--- a/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
+++ b/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
@@ -2,8 +2,17 @@ package de.thm.arsnova.event;
 
 import de.thm.arsnova.model.Entity;
 
+import java.util.Map;
+
 public class AfterPatchEvent<E extends Entity> extends AfterUpdateEvent<E> {
-	public AfterPatchEvent(final Object source, final E entity) {
+	private final Map<String, Object> changes;
+
+	public AfterPatchEvent(final Object source, final E entity, final Map<String, Object> changes) {
 		super(source, entity);
+		this.changes = changes;
+	}
+
+	public Map<String, Object> getChanges() {
+		return changes;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java b/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
index 702173630..7920b79d2 100644
--- a/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
+++ b/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
@@ -2,7 +2,7 @@ package de.thm.arsnova.event;
 
 import de.thm.arsnova.model.Entity;
 
-public class AfterUpdateEvent<E extends Entity> extends CrudEvent<E> {
+public abstract class AfterUpdateEvent<E extends Entity> extends CrudEvent<E> {
 	public AfterUpdateEvent(final Object source, final E entity) {
 		super(source, entity);
 	}
diff --git a/src/main/java/de/thm/arsnova/event/BeforeFullUpdateEvent.java b/src/main/java/de/thm/arsnova/event/BeforeFullUpdateEvent.java
new file mode 100644
index 000000000..851416339
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/BeforeFullUpdateEvent.java
@@ -0,0 +1,16 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class BeforeFullUpdateEvent<E extends Entity> extends BeforeUpdateEvent<E> {
+	private final E oldEntity;
+
+	public BeforeFullUpdateEvent(final Object source, final E entity, final E oldEntity) {
+		super(source, entity);
+		this.oldEntity = oldEntity;
+	}
+
+	public E getOldEntity() {
+		return oldEntity;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java b/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
index 82eee8540..717d14f98 100644
--- a/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
+++ b/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
@@ -2,8 +2,17 @@ package de.thm.arsnova.event;
 
 import de.thm.arsnova.model.Entity;
 
+import java.util.Map;
+
 public class BeforePatchEvent<E extends Entity> extends BeforeUpdateEvent<E> {
-	public BeforePatchEvent(final Object source, final E entity) {
+	private final Map<String, Object> changes;
+
+	public BeforePatchEvent(final Object source, final E entity, final Map<String, Object> changes) {
 		super(source, entity);
+		this.changes = changes;
+	}
+
+	public Map<String, Object> getChanges() {
+		return changes;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java b/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
index 65fc96e10..f5964dce9 100644
--- a/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
+++ b/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
@@ -2,7 +2,7 @@ package de.thm.arsnova.event;
 
 import de.thm.arsnova.model.Entity;
 
-public class BeforeUpdateEvent<E extends Entity> extends CrudEvent<E> {
+public abstract class BeforeUpdateEvent<E extends Entity> extends CrudEvent<E> {
 	public BeforeUpdateEvent(final Object source, final E entity) {
 		super(source, entity);
 	}
diff --git a/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java b/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
index e2f2d0272..114c0be10 100644
--- a/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
@@ -22,12 +22,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectReader;
 import de.thm.arsnova.event.AfterCreationEvent;
 import de.thm.arsnova.event.AfterDeletionEvent;
+import de.thm.arsnova.event.AfterFullUpdateEvent;
 import de.thm.arsnova.event.AfterPatchEvent;
-import de.thm.arsnova.event.AfterUpdateEvent;
 import de.thm.arsnova.event.BeforeCreationEvent;
 import de.thm.arsnova.event.BeforeDeletionEvent;
+import de.thm.arsnova.event.BeforeFullUpdateEvent;
 import de.thm.arsnova.event.BeforePatchEvent;
-import de.thm.arsnova.event.BeforeUpdateEvent;
 import de.thm.arsnova.model.Entity;
 import de.thm.arsnova.model.serialization.View;
 import de.thm.arsnova.persistence.CrudRepository;
@@ -130,9 +130,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		newEntity.setUpdateTimestamp(new Date());
 
 		prepareUpdate(newEntity);
-		eventPublisher.publishEvent(new BeforeUpdateEvent<>(this, newEntity));
+		eventPublisher.publishEvent(new BeforeFullUpdateEvent<>(this, newEntity, oldEntity));
 		final T updatedEntity = repository.save(newEntity);
-		eventPublisher.publishEvent(new AfterUpdateEvent<>(this, updatedEntity));
+		eventPublisher.publishEvent(new AfterFullUpdateEvent<>(this, updatedEntity, oldEntity));
 		finalizeUpdate(updatedEntity);
 
 		return updatedEntity;
@@ -171,9 +171,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		reader.readValue(tree);
 		entity.setUpdateTimestamp(new Date());
 		preparePatch(entity);
-		eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity));
+		eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity, changes));
 		final T patchedEntity = repository.save(entity);
-		eventPublisher.publishEvent(new AfterPatchEvent<>(this, patchedEntity));
+		eventPublisher.publishEvent(new AfterPatchEvent<>(this, patchedEntity, changes));
 
 		return patchedEntity;
 	}
@@ -194,7 +194,7 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 			reader.readValue(tree);
 			entity.setUpdateTimestamp(new Date());
 			preparePatch(entity);
-			eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity));
+			eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity, changes));
 		}
 
 		return repository.saveAll(entities);
-- 
GitLab