From 28402fc42f5b4101c345d622868383371c668eb8 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 9 Dec 2014 09:04:16 +0100
Subject: [PATCH] OO-1346: use a query to load a specific message to prevent
 EntityNotFoundException if the message was deleted

---
 .../modules/fo/FilterForUserController.java   |  8 ++++++--
 .../org/olat/modules/fo/ForumController.java  | 10 +++++-----
 .../org/olat/modules/fo/ForumManager.java     | 20 ++++++++-----------
 3 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/src/main/java/org/olat/modules/fo/FilterForUserController.java b/src/main/java/org/olat/modules/fo/FilterForUserController.java
index 08e8c528d5b..26325426c73 100644
--- a/src/main/java/org/olat/modules/fo/FilterForUserController.java
+++ b/src/main/java/org/olat/modules/fo/FilterForUserController.java
@@ -81,6 +81,7 @@ import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter;
 import org.olat.user.DisplayPortraitController;
 import org.olat.user.UserInfoMainController;
 import org.olat.user.UserManager;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -119,12 +120,15 @@ public class FilterForUserController extends BasicController {
 	
 	private final OLATResourceable forumOres;
 	private final String thumbMapper;
+	
+	@Autowired
+	private ForumManager forumManager;
 
 	public FilterForUserController(UserRequest ureq, WindowControl wControl, Forum forum) {
 		super(ureq, wControl);
 		this.forum = forum;
 		
-		msgs = ForumManager.getInstance().getMessagesByForum(forum);
+		msgs = forumManager.getMessagesByForum(forum);
 		forumOres = OresHelper.createOLATResourceableInstance(Forum.class,forum.getKey());
 		
 		mainVC = createVelocityContainer("filter_for_user");
@@ -300,7 +304,7 @@ public class FilterForUserController extends BasicController {
 			Map<String, Object> messageMap = getMessageMapFromCommand(ureq.getIdentity(), command);
 			Long messageId = (Long) messageMap.get("id");
 			
-			Message selectedMessage = ForumManager.getInstance().findMessage(messageId);
+			Message selectedMessage = forumManager.loadMessage(messageId);
 			if (selectedMessage != null) {
 				if (command.startsWith("open_in_thread_")) {
 					fireEvent(ureq, new OpenMessageInThreadEvent(selectedMessage));
diff --git a/src/main/java/org/olat/modules/fo/ForumController.java b/src/main/java/org/olat/modules/fo/ForumController.java
index ee55a1f82a0..63e19f6f82d 100644
--- a/src/main/java/org/olat/modules/fo/ForumController.java
+++ b/src/main/java/org/olat/modules/fo/ForumController.java
@@ -330,7 +330,7 @@ public class ForumController extends BasicController implements GenericEventList
 			Long resId = ores.getResourceableId();
 			if (resId.longValue() != 0) {
 				if (isLogDebugEnabled()) logDebug("messageId=" , ores.getResourceableId().toString());
-				currentMsg = fm.findMessage(ores.getResourceableId());
+				currentMsg = fm.loadMessage(ores.getResourceableId());
 				if (currentMsg != null) {
 					showThreadView(ureq, currentMsg, null);
 					scrollToCurrentMessage();					
@@ -399,7 +399,7 @@ public class ForumController extends BasicController implements GenericEventList
 		
 		Long resId = entries.get(0).getOLATResourceable().getResourceableId();
 		if (resId.longValue() != 0) {
-			currentMsg = fm.findMessage(resId);
+			currentMsg = fm.loadMessage(resId);
 			if (currentMsg != null) {
 				showThreadView(ureq, currentMsg, null);
 				scrollToCurrentMessage();					
@@ -472,7 +472,7 @@ public class ForumController extends BasicController implements GenericEventList
 			Map<String, Object> messageMap = getMessageMapFromCommand(ureq.getIdentity(), command);
 			Long messageId = (Long) messageMap.get("id");
 			
-			Message updatedMessage = fm.findMessage(messageId);
+			Message updatedMessage = fm.loadMessage(messageId);
 			if (updatedMessage!=null) {
 				currentMsg = updatedMessage;
 				// now dispatch the commands
@@ -584,7 +584,7 @@ public class ForumController extends BasicController implements GenericEventList
 					msgEditCtr.persistTempUploadedFiles(currentMsg);
 				} else if (msgEditCtr.getLastEditModus().equals(MessageEditController.EDITMODE_EDITMSG)){
 					// edit done -> save 
-					Message updatedMessage = fm.findMessage(currentMsg.getKey());
+					Message updatedMessage = fm.loadMessage(currentMsg.getKey());
 					if(updatedMessage!=null) {
 					  doEditMessage(ureq);
 					  //file persisting is done already, as a msg-key was known during edit.
@@ -593,7 +593,7 @@ public class ForumController extends BasicController implements GenericEventList
 					}
 				} else if (msgEditCtr.getLastEditModus().equals(MessageEditController.EDITMODE_REPLYMSG)){
 					// reply done -> save
-					Message updatedMessage = fm.findMessage(currentMsg.getKey());
+					Message updatedMessage = fm.loadMessage(currentMsg.getKey());
 				  if(updatedMessage!=null) {	
 					  doReplyMessage(ureq);
 					  msgEditCtr.persistTempUploadedFiles(currentMsg);
diff --git a/src/main/java/org/olat/modules/fo/ForumManager.java b/src/main/java/org/olat/modules/fo/ForumManager.java
index 9123c2a268c..05be5bc980b 100644
--- a/src/main/java/org/olat/modules/fo/ForumManager.java
+++ b/src/main/java/org/olat/modules/fo/ForumManager.java
@@ -395,13 +395,13 @@ public class ForumManager extends BasicManager {
 	 * @return the message with the given messageKey
 	 */
 	public Message loadMessage(Long messageKey) {
-		Message msg = doloadMessage(messageKey);
-		return msg;
-	}
-
-	private Message doloadMessage(Long messageKey) {
-		Message msg = DBFactory.getInstance().loadObject(MessageImpl.class, messageKey);
-		return msg;
+		StringBuilder sb = new StringBuilder();
+		sb.append("select msg from ").append(MessageImpl.class.getName()).append(" msg where msg.key=:messageKey");
+		List<Message> messages = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Message.class)
+				.setParameter("messageKey", messageKey)
+				.getResultList();
+		return messages == null || messages.isEmpty() ? null : messages.get(0);
 	}
 
 	private void saveMessage(Message m) {
@@ -576,10 +576,6 @@ public class ForumManager extends BasicManager {
 		return fContainer;
 	}
 	
-	public Message findMessage(Long messageId) {
-		return DBFactory.getInstance().findObject(MessageImpl.class, messageId);
-	}
-	
 	/**
 	 * Splits the current thread starting from the current message.
 	 * It updates the messages of the selected subthread by setting the Parent and the Threadtop.
@@ -710,7 +706,7 @@ public class ForumManager extends BasicManager {
 	 */
 	public void markAsRead(Identity identity,Message msg) {		
 		//Check if the message was not already deleted
-		Message retrievedMessage = findMessage(msg.getKey());
+		Message retrievedMessage = loadMessage(msg.getKey());
 		if(retrievedMessage!=null) {
 			ReadMessageImpl readMessage = new ReadMessageImpl();
 			readMessage.setIdentity(identity);
-- 
GitLab