From 78f600543ee940b0cd267e67d146d96aabe4f112 Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Mon, 12 Nov 2018 12:01:56 +0100
Subject: [PATCH] Use publishing class as source for CrudEvents

The entity is now stored in a separate property.
---
 .../thm/arsnova/event/AfterCreationEvent.java  |  4 ++--
 .../thm/arsnova/event/AfterDeletionEvent.java  |  4 ++--
 .../de/thm/arsnova/event/AfterPatchEvent.java  |  4 ++--
 .../de/thm/arsnova/event/AfterUpdateEvent.java |  4 ++--
 .../thm/arsnova/event/BeforeCreationEvent.java |  4 ++--
 .../thm/arsnova/event/BeforeDeletionEvent.java |  4 ++--
 .../de/thm/arsnova/event/BeforePatchEvent.java |  4 ++--
 .../thm/arsnova/event/BeforeUpdateEvent.java   |  4 ++--
 .../java/de/thm/arsnova/event/CrudEvent.java   | 10 ++++++----
 .../thm/arsnova/service/AnswerServiceImpl.java |  8 ++++----
 .../arsnova/service/CommentServiceImpl.java    |  4 ++--
 .../arsnova/service/ContentServiceImpl.java    |  8 ++++----
 .../service/DefaultEntityServiceImpl.java      | 18 +++++++++---------
 .../thm/arsnova/service/RoomServiceImpl.java   |  4 ++--
 .../score/ScoreCalculatorFactoryImpl.java      |  8 ++++----
 .../websocket/ArsnovaSocketioServerImpl.java   | 14 +++++++-------
 16 files changed, 54 insertions(+), 52 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/event/AfterCreationEvent.java b/src/main/java/de/thm/arsnova/event/AfterCreationEvent.java
index 6f99fd855..5267b6d2e 100644
--- a/src/main/java/de/thm/arsnova/event/AfterCreationEvent.java
+++ b/src/main/java/de/thm/arsnova/event/AfterCreationEvent.java
@@ -3,7 +3,7 @@ package de.thm.arsnova.event;
 import de.thm.arsnova.model.Entity;
 
 public class AfterCreationEvent<E extends Entity> extends CrudEvent<E> {
-	public AfterCreationEvent(final E source) {
-		super(source);
+	public AfterCreationEvent(final Object source, final E entity) {
+		super(source, entity);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/AfterDeletionEvent.java b/src/main/java/de/thm/arsnova/event/AfterDeletionEvent.java
index 67893207a..34115a744 100644
--- a/src/main/java/de/thm/arsnova/event/AfterDeletionEvent.java
+++ b/src/main/java/de/thm/arsnova/event/AfterDeletionEvent.java
@@ -3,7 +3,7 @@ package de.thm.arsnova.event;
 import de.thm.arsnova.model.Entity;
 
 public class AfterDeletionEvent<E extends Entity> extends CrudEvent<E> {
-	public AfterDeletionEvent(final E source) {
-		super(source);
+	public AfterDeletionEvent(final Object source, final E entity) {
+		super(source, entity);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java b/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
index 263821074..4b73660d3 100644
--- a/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
+++ b/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
@@ -3,7 +3,7 @@ package de.thm.arsnova.event;
 import de.thm.arsnova.model.Entity;
 
 public class AfterPatchEvent<E extends Entity> extends AfterUpdateEvent<E> {
-	public AfterPatchEvent(final E source) {
-		super(source);
+	public AfterPatchEvent(final Object source, final E entity) {
+		super(source, entity);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java b/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
index b30f3958a..702173630 100644
--- a/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
+++ b/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
@@ -3,7 +3,7 @@ package de.thm.arsnova.event;
 import de.thm.arsnova.model.Entity;
 
 public class AfterUpdateEvent<E extends Entity> extends CrudEvent<E> {
-	public AfterUpdateEvent(final E source) {
-		super(source);
+	public AfterUpdateEvent(final Object source, final E entity) {
+		super(source, entity);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/BeforeCreationEvent.java b/src/main/java/de/thm/arsnova/event/BeforeCreationEvent.java
index 42d5524f3..7235cb4c7 100644
--- a/src/main/java/de/thm/arsnova/event/BeforeCreationEvent.java
+++ b/src/main/java/de/thm/arsnova/event/BeforeCreationEvent.java
@@ -3,7 +3,7 @@ package de.thm.arsnova.event;
 import de.thm.arsnova.model.Entity;
 
 public class BeforeCreationEvent<E extends Entity> extends CrudEvent<E> {
-	public BeforeCreationEvent(final E source) {
-		super(source);
+	public BeforeCreationEvent(final Object source, final E entity) {
+		super(source, entity);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/BeforeDeletionEvent.java b/src/main/java/de/thm/arsnova/event/BeforeDeletionEvent.java
index 0a13bef26..fac150106 100644
--- a/src/main/java/de/thm/arsnova/event/BeforeDeletionEvent.java
+++ b/src/main/java/de/thm/arsnova/event/BeforeDeletionEvent.java
@@ -3,7 +3,7 @@ package de.thm.arsnova.event;
 import de.thm.arsnova.model.Entity;
 
 public class BeforeDeletionEvent<E extends Entity> extends CrudEvent<E> {
-	public BeforeDeletionEvent(final E source) {
-		super(source);
+	public BeforeDeletionEvent(final Object source, final E entity) {
+		super(source, entity);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java b/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
index 871dc6bfd..82eee8540 100644
--- a/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
+++ b/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
@@ -3,7 +3,7 @@ package de.thm.arsnova.event;
 import de.thm.arsnova.model.Entity;
 
 public class BeforePatchEvent<E extends Entity> extends BeforeUpdateEvent<E> {
-	public BeforePatchEvent(final E source) {
-		super(source);
+	public BeforePatchEvent(final Object source, final E entity) {
+		super(source, entity);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java b/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
index 81c74e675..65fc96e10 100644
--- a/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
+++ b/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
@@ -3,7 +3,7 @@ package de.thm.arsnova.event;
 import de.thm.arsnova.model.Entity;
 
 public class BeforeUpdateEvent<E extends Entity> extends CrudEvent<E> {
-	public BeforeUpdateEvent(final E source) {
-		super(source);
+	public BeforeUpdateEvent(final Object source, final E entity) {
+		super(source, entity);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/CrudEvent.java b/src/main/java/de/thm/arsnova/event/CrudEvent.java
index 07d3bbb6f..e95cdea65 100644
--- a/src/main/java/de/thm/arsnova/event/CrudEvent.java
+++ b/src/main/java/de/thm/arsnova/event/CrudEvent.java
@@ -6,13 +6,15 @@ import org.springframework.core.ResolvableType;
 import org.springframework.core.ResolvableTypeProvider;
 
 public abstract class CrudEvent<E extends Entity> extends ApplicationEvent implements ResolvableTypeProvider {
-	public CrudEvent(final E source) {
+	private E entity;
+
+	public CrudEvent(final Object source, final E entity) {
 		super(source);
+		this.entity = entity;
 	}
 
-	@Override
-	public E getSource() {
-		return (E) super.getSource();
+	public E getEntity() {
+		return entity;
 	}
 
 	@Override
diff --git a/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java b/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java
index fdbe22ff3..bc0b146cb 100644
--- a/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java
@@ -96,11 +96,11 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer> implemen
 		}
 		try {
 			for (AnswerQueueElement e : elements) {
-				this.eventPublisher.publishEvent(new BeforeCreationEvent<>(e.getAnswer()));
+				this.eventPublisher.publishEvent(new BeforeCreationEvent<>(this, e.getAnswer()));
 			}
 			answerRepository.saveAll(answerList);
 			for (AnswerQueueElement e : elements) {
-				this.eventPublisher.publishEvent(new AfterCreationEvent<>(e.getAnswer()));
+				this.eventPublisher.publishEvent(new AfterCreationEvent<>(this, e.getAnswer()));
 			}
 		} catch (final DbAccessException e) {
 			logger.error("Could not bulk save answers from queue.", e);
@@ -375,9 +375,9 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer> implemen
 		answer.setCreatorId(user.getId());
 		answer.setContentId(content.getId());
 		answer.setRoomId(room.getId());
-		this.eventPublisher.publishEvent(new BeforeCreationEvent<>(realAnswer));
+		this.eventPublisher.publishEvent(new BeforeCreationEvent<>(this, realAnswer));
 		answerRepository.save(realAnswer);
-		this.eventPublisher.publishEvent(new AfterCreationEvent<>(realAnswer));
+		this.eventPublisher.publishEvent(new AfterCreationEvent<>(this, realAnswer));
 
 		return answer;
 	}
diff --git a/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java b/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java
index 48f055635..91e7708ef 100644
--- a/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java
@@ -65,9 +65,9 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 		if (comment == null) {
 			throw new NotFoundException();
 		}
-		eventPublisher.publishEvent(new BeforeDeletionEvent<>(comment));
+		eventPublisher.publishEvent(new BeforeDeletionEvent<>(this, comment));
 		commentRepository.delete(comment);
-		eventPublisher.publishEvent(new AfterDeletionEvent<>(comment));
+		eventPublisher.publishEvent(new AfterDeletionEvent<>(this, comment));
 	}
 
 	@Override
diff --git a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
index f905d2b1a..fab8488d6 100644
--- a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
@@ -194,9 +194,9 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 			newGroup.setContentIds(newContentIds);
 			room.getContentGroups().add(newGroup);
 		}
-		eventPublisher.publishEvent(new BeforeCreationEvent<>(content));
+		eventPublisher.publishEvent(new BeforeCreationEvent<>(this, content));
 		roomRepository.save(room);
-		eventPublisher.publishEvent(new AfterCreationEvent<>(content));
+		eventPublisher.publishEvent(new AfterCreationEvent<>(this, content));
 	}
 
 	@Override
@@ -289,9 +289,9 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 
 		try {
 			final int count = answerRepository.deleteByContentId(contentId);
-			eventPublisher.publishEvent(new BeforeDeletionEvent<>(content));
+			eventPublisher.publishEvent(new BeforeDeletionEvent<>(this, content));
 			contentRepository.deleteById(contentId);
-			eventPublisher.publishEvent(new AfterDeletionEvent<>(content));
+			eventPublisher.publishEvent(new AfterDeletionEvent<>(this, content));
 			dbLogger.log("delete", "type", "content", "answerCount", count);
 		} catch (final IllegalArgumentException e) {
 			logger.error("Could not delete content {}.", contentId, e);
diff --git a/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java b/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
index 3e1ab7746..7767771a5 100644
--- a/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
@@ -92,9 +92,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		entity.setCreationTimestamp(new Date());
 
 		prepareCreate(entity);
-		eventPublisher.publishEvent(new BeforeCreationEvent<>(entity));
+		eventPublisher.publishEvent(new BeforeCreationEvent<>(this, entity));
 		final T createdEntity = repository.save(entity);
-		eventPublisher.publishEvent(new AfterCreationEvent<>(createdEntity));
+		eventPublisher.publishEvent(new AfterCreationEvent<>(this, createdEntity));
 		finalizeCreate(entity);
 
 		return createdEntity;
@@ -129,9 +129,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		newEntity.setUpdateTimestamp(new Date());
 
 		prepareUpdate(newEntity);
-		eventPublisher.publishEvent(new BeforeUpdateEvent<>(newEntity));
+		eventPublisher.publishEvent(new BeforeUpdateEvent<>(this, newEntity));
 		final T updatedEntity = repository.save(newEntity);
-		eventPublisher.publishEvent(new AfterUpdateEvent<>(updatedEntity));
+		eventPublisher.publishEvent(new AfterUpdateEvent<>(this, updatedEntity));
 		finalizeUpdate(updatedEntity);
 
 		return updatedEntity;
@@ -170,9 +170,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		reader.readValue(tree);
 		entity.setUpdateTimestamp(new Date());
 		preparePatch(entity);
-		eventPublisher.publishEvent(new BeforePatchEvent<>(entity));
+		eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity));
 		final T patchedEntity = repository.save(entity);
-		eventPublisher.publishEvent(new AfterPatchEvent<>(entity));
+		eventPublisher.publishEvent(new AfterPatchEvent<>(this, entity));
 
 		return patchedEntity;
 	}
@@ -193,7 +193,7 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 			reader.readValue(tree);
 			entity.setUpdateTimestamp(new Date());
 			preparePatch(entity);
-			eventPublisher.publishEvent(new BeforePatchEvent<>(entity));
+			eventPublisher.publishEvent(new BeforePatchEvent<>(this, entity));
 		}
 
 		return repository.saveAll(entities);
@@ -212,9 +212,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 	@Override
 	@PreAuthorize("hasPermission(#entity, 'delete')")
 	public void delete(final T entity) {
-		eventPublisher.publishEvent(new BeforeDeletionEvent<>(entity));
+		eventPublisher.publishEvent(new BeforeDeletionEvent<>(this, entity));
 		repository.delete(entity);
-		eventPublisher.publishEvent(new AfterUpdateEvent<>(entity));
+		eventPublisher.publishEvent(new AfterUpdateEvent<>(this, entity));
 	}
 
 	/**
diff --git a/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java b/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
index 9f7de91a1..83b06681b 100644
--- a/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
@@ -455,9 +455,9 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 		count[2] = commentRepository.deleteByRoomId(room.getId());
 		count[1] = answerRepository.deleteByContentIds(contentIds);
 		count[0] = contentRepository.deleteByRoomId(room.getId());
-		this.eventPublisher.publishEvent(new BeforeDeletionEvent<>(room));
+		this.eventPublisher.publishEvent(new BeforeDeletionEvent<>(this, room));
 		roomRepository.delete(room);
-		this.eventPublisher.publishEvent(new AfterDeletionEvent<>(room));
+		this.eventPublisher.publishEvent(new AfterDeletionEvent<>(this, room));
 		logger.debug("Deleted room document {} and related data.", room.getId());
 		dbLogger.log("delete", "type", "session", "id", room.getId());
 
diff --git a/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorFactoryImpl.java b/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorFactoryImpl.java
index 46a50546d..4f29f03e7 100644
--- a/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorFactoryImpl.java
+++ b/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorFactoryImpl.java
@@ -56,7 +56,7 @@ public class ScoreCalculatorFactoryImpl implements ScoreCalculatorFactory, Appli
 	@CacheEvict(value = "score", key = "#event.Room")
 	@EventListener
 	public void handleAfterContentCreation(AfterCreationEvent<Content> event) {
-		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getSource().getRoomId()));
+		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getEntity().getRoomId()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
@@ -86,19 +86,19 @@ public class ScoreCalculatorFactoryImpl implements ScoreCalculatorFactory, Appli
 	@CacheEvict(value = "score", key = "#event.Room")
 	@EventListener
 	public void handleNewAnswer(AfterCreationEvent<Answer> event) {
-		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getSource().getRoomId()));
+		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getEntity().getRoomId()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
 	@EventListener
 	public void handleDeleteAnswer(AfterDeletionEvent<Answer> event) {
-		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getSource().getRoomId()));
+		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getEntity().getRoomId()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
 	@EventListener
 	public void handleDeleteQuestion(AfterDeletionEvent<Content> event) {
-		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getSource().getRoomId()));
+		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getEntity().getRoomId()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
diff --git a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
index 8ec0ac075..8e99eca9e 100644
--- a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
+++ b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
@@ -493,7 +493,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer {
 
 	@EventListener
 	public void handleAfterContentCreation(AfterCreationEvent<de.thm.arsnova.model.Content> event) {
-		this.reportContentAvailable(event.getSource().getId(), Collections.singletonList(event.getSource()));
+		this.reportContentAvailable(event.getEntity().getId(), Collections.singletonList(event.getEntity()));
 	}
 
 	@EventListener
@@ -518,16 +518,16 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer {
 
 	@EventListener
 	public void handleAfterCommentCreation(AfterCreationEvent<Comment> event) {
-		this.reportCommentAvailable(event.getSource().getId(), event.getSource().getId());
+		this.reportCommentAvailable(event.getEntity().getId(), event.getEntity().getId());
 	}
 
 	@Async
 	@EventListener
 	@Timed
 	public void handleNewAnswer(AfterCreationEvent<Answer> event) {
-		final String roomId = event.getSource().getRoomId();
-		this.reportAnswersToContentAvailable(event.getSource().getRoomId(), event.getSource().getContentId());
-		broadcastInRoom(roomId, "countQuestionAnswersByQuestionId", answerService.countAnswersAndAbstentionsInternal(event.getSource().getContentId()));
+		final String roomId = event.getEntity().getRoomId();
+		this.reportAnswersToContentAvailable(event.getEntity().getRoomId(), event.getEntity().getContentId());
+		broadcastInRoom(roomId, "countQuestionAnswersByQuestionId", answerService.countAnswersAndAbstentionsInternal(event.getEntity().getContentId()));
 		/* FIXME: Content variant is ignored for now */
 		broadcastInRoom(roomId, "countLectureQuestionAnswers", answerService.countTotalAnswersByRoomId(roomId));
 		broadcastInRoom(roomId, "countPreparationQuestionAnswers", answerService.countTotalAnswersByRoomId(roomId));
@@ -546,8 +546,8 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer {
 	@EventListener
 	@Timed
 	public void handleAfterAnswerDeletion(AfterDeletionEvent<Answer> event) {
-		final String roomId = event.getSource().getRoomId();
-		this.reportAnswersToContentAvailable(event.getSource().getRoomId(), event.getSource().getContentId());
+		final String roomId = event.getEntity().getRoomId();
+		this.reportAnswersToContentAvailable(event.getEntity().getRoomId(), event.getEntity().getContentId());
 		// We do not know which user's answer was deleted, so we can't update his 'unanswered' list of questions...
 		/* FIXME: Content variant is ignored for now */
 		broadcastInRoom(roomId, "countLectureQuestionAnswers", answerService.countTotalAnswersByRoomId(roomId));
-- 
GitLab