From 2bd05a87e7b51dce975e72f2d41b5f1eeda5ad11 Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Tue, 13 Mar 2018 15:26:16 +0100
Subject: [PATCH] Add "prepare" methods for DefaultEntityServiceImpl

These methods allow to perform actions based on the entity before the
CRUD operation is executed.
---
 .../services/DefaultEntityServiceImpl.java    | 41 +++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java b/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java
index 0027ffa0a..45ef03c2b 100644
--- a/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java
@@ -69,19 +69,39 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 			throw new IllegalArgumentException("Entity is not new.");
 		}
 		entity.setCreationTimestamp(new Date());
+		prepareCreate(entity);
 
 		return repository.save(entity);
 	}
 
+	/**
+	 * This method can be overridden by subclasses to modify the entity before creation.
+	 *
+	 * @param entity The entity to be created
+	 */
+	protected void prepareCreate(final T entity) {
+
+	}
+
 	@Override
 	@PreAuthorize("hasPermission(#oldEntity, 'update')")
 	public T update(final T oldEntity, final T newEntity) {
 		newEntity.setId(oldEntity.getId());
 		newEntity.setUpdateTimestamp(new Date());
+		prepareUpdate(newEntity);
 
 		return repository.save(newEntity);
 	}
 
+	/**
+	 * This method can be overridden by subclasses to modify the entity before updating.
+	 *
+	 * @param entity The entity to be updated
+	 */
+	protected void prepareUpdate(final T entity) {
+
+	}
+
 	@Override
 	public T patch(final T entity, final Map<String, Object> changes) throws IOException {
 		return patch(entity, changes, Function.identity());
@@ -96,6 +116,7 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		JsonNode tree = objectMapper.valueToTree(changes);
 		reader.readValue(tree);
 		entity.setUpdateTimestamp(new Date());
+		preparePatch(entity);
 
 		return repository.save(entity);
 	}
@@ -115,17 +136,37 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 			ObjectReader reader = objectMapper.readerForUpdating(obj).withView(View.Public.class);
 			reader.readValue(tree);
 			entity.setUpdateTimestamp(new Date());
+			preparePatch(entity);
 		}
 
 		return repository.save(entities);
 	}
 
+	/**
+	 * This method can be overridden by subclasses to modify the entity before patching. By default, the implementation
+	 * of {@link #prepareUpdate} is used.
+	 *
+	 * @param entity The entity to be patched
+	 */
+	protected void preparePatch(final T entity) {
+		prepareUpdate(entity);
+	}
+
 	@Override
 	@PreAuthorize("hasPermission(#entity, 'delete')")
 	public void delete(final T entity) {
 		repository.delete(entity);
 	}
 
+	/**
+	 * This method can be overridden by subclasses to do additional entity related actions before deletion.
+	 *
+	 * @param entity The entity to be deleted
+	 */
+	protected void prepareDelete(final T entity) {
+
+	}
+
 	public String getTypeName() {
 		return type.getSimpleName().toLowerCase();
 	}
-- 
GitLab