Skip to content
Snippets Groups Projects
Commit 0b0221c9 authored by srosse's avatar srosse
Browse files

OO-1854: handle concurrent edit / delete of a parent message

parent 289ed4ed
No related branches found
No related tags found
No related merge requests found
...@@ -321,6 +321,19 @@ public class ForumManager { ...@@ -321,6 +321,19 @@ public class ForumManager {
return threadList; return threadList;
} }
public boolean existsMessageById(Long messageKey) {
StringBuilder query = new StringBuilder();
query.append("select msg.key from fomessage as msg")
.append(" where msg.key=:messageKey");
List<Long> messages = dbInstance.getCurrentEntityManager()
.createQuery(query.toString(), Long.class)
.setParameter("messageKey", messageKey)
.getResultList();
return messages == null || messages.isEmpty() || messages.get(0) == null
? false : messages.get(0).longValue() > -1;
}
public Message getMessageById(Long messageKey) { public Message getMessageById(Long messageKey) {
StringBuilder query = new StringBuilder(); StringBuilder query = new StringBuilder();
query.append("select msg from fomessage as msg") query.append("select msg from fomessage as msg")
......
...@@ -27,6 +27,8 @@ import java.util.Collections; ...@@ -27,6 +27,8 @@ import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import javax.persistence.PersistenceException;
import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurity;
import org.olat.basesecurity.IdentityShort; import org.olat.basesecurity.IdentityShort;
import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.modules.bc.FolderConfig;
...@@ -52,6 +54,7 @@ import org.olat.core.gui.control.generic.modal.DialogBoxController; ...@@ -52,6 +54,7 @@ import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.logging.AssertException; import org.olat.core.logging.AssertException;
import org.olat.core.logging.DBRuntimeException;
import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.CodeHelper; import org.olat.core.util.CodeHelper;
import org.olat.core.util.FileUtils; import org.olat.core.util.FileUtils;
...@@ -70,6 +73,7 @@ import org.olat.modules.fo.ForumChangedEvent; ...@@ -70,6 +73,7 @@ import org.olat.modules.fo.ForumChangedEvent;
import org.olat.modules.fo.ForumLoggingAction; import org.olat.modules.fo.ForumLoggingAction;
import org.olat.modules.fo.Message; import org.olat.modules.fo.Message;
import org.olat.modules.fo.manager.ForumManager; import org.olat.modules.fo.manager.ForumManager;
import org.olat.modules.fo.ui.events.ErrorEditMessage;
import org.olat.user.DisplayPortraitController; import org.olat.user.DisplayPortraitController;
import org.olat.util.logging.activity.LoggingResourceable; import org.olat.util.logging.activity.LoggingResourceable;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -363,6 +367,17 @@ public class MessageEditController extends FormBasicController { ...@@ -363,6 +367,17 @@ public class MessageEditController extends FormBasicController {
*/ */
@Override @Override
protected void formOK(UserRequest ureq) { protected void formOK(UserRequest ureq) {
try {
commitMessage(ureq);
fireEvent(ureq, Event.DONE_EVENT);
} catch(DBRuntimeException | PersistenceException e) {
DBFactory.getInstance().rollback();
logError("", e);
fireEvent(ureq, new ErrorEditMessage());
}
}
private void commitMessage(UserRequest ureq) {
// if msg exist -> persist uploads directly to final dest // if msg exist -> persist uploads directly to final dest
if (message.getKey() != null) { if (message.getKey() != null) {
message = fm.loadMessage(message.getKey()); message = fm.loadMessage(message.getKey());
...@@ -432,8 +447,6 @@ public class MessageEditController extends FormBasicController { ...@@ -432,8 +447,6 @@ public class MessageEditController extends FormBasicController {
ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_REPLY_MESSAGE_CREATE, getClass(), ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_REPLY_MESSAGE_CREATE, getClass(),
LoggingResourceable.wrap(message)); LoggingResourceable.wrap(message));
} }
fireEvent(ureq, Event.DONE_EVENT);
} }
private void notifiySubscription() { private void notifiySubscription() {
......
...@@ -88,6 +88,7 @@ import org.olat.modules.fo.manager.ForumManager; ...@@ -88,6 +88,7 @@ import org.olat.modules.fo.manager.ForumManager;
import org.olat.modules.fo.ui.MessageEditController.EditMode; import org.olat.modules.fo.ui.MessageEditController.EditMode;
import org.olat.modules.fo.ui.events.DeleteMessageEvent; import org.olat.modules.fo.ui.events.DeleteMessageEvent;
import org.olat.modules.fo.ui.events.DeleteThreadEvent; import org.olat.modules.fo.ui.events.DeleteThreadEvent;
import org.olat.modules.fo.ui.events.ErrorEditMessage;
import org.olat.modules.fo.ui.events.SelectMessageEvent; import org.olat.modules.fo.ui.events.SelectMessageEvent;
import org.olat.portfolio.EPUIFactory; import org.olat.portfolio.EPUIFactory;
import org.olat.portfolio.manager.EPFrontendManager; import org.olat.portfolio.manager.EPFrontendManager;
...@@ -748,22 +749,30 @@ public class MessageListController extends BasicController implements GenericEve ...@@ -748,22 +749,30 @@ public class MessageListController extends BasicController implements GenericEve
} }
} else if(editMessageCtrl == source) { } else if(editMessageCtrl == source) {
// edit done -> save // edit done -> save
Message message = editMessageCtrl.getMessage(); if(event instanceof ErrorEditMessage) {
if(message != null) { handleEditError(ureq);
if(thread != null && thread.getKey().equals(message.getKey())) {
thread = message;
}
reloadModel(ureq, message);
} else { } else {
showInfo("header.cannoteditmessage"); Message message = editMessageCtrl.getMessage();
if(message != null) {
if(thread != null && thread.getKey().equals(message.getKey())) {
thread = message;
}
reloadModel(ureq, message);
} else {
showInfo("header.cannoteditmessage");
}
} }
cmc.deactivate(); cmc.deactivate();
} else if(replyMessageCtrl == source) { } else if(replyMessageCtrl == source) {
Message reply = replyMessageCtrl.getMessage(); if(event instanceof ErrorEditMessage) {
if(reply != null) { handleEditError(ureq);
reloadModel(ureq, reply);
} else { } else {
showInfo("header.cannotsavemessage"); Message reply = replyMessageCtrl.getMessage();
if(reply != null) {
reloadModel(ureq, reply);
} else {
showInfo("header.cannotsavemessage");
}
} }
cmc.deactivate(); cmc.deactivate();
} else if(messageTableCtrl == source) { } else if(messageTableCtrl == source) {
...@@ -796,6 +805,19 @@ public class MessageListController extends BasicController implements GenericEve ...@@ -796,6 +805,19 @@ public class MessageListController extends BasicController implements GenericEve
editMessageCtrl = null; editMessageCtrl = null;
cmc = null; cmc = null;
} }
private void handleEditError(UserRequest ureq) {
if(thread == null) {
fireEvent(ureq, Event.BACK_EVENT);
showWarning("error.message.deleted");
} else if(forumManager.existsMessageById(thread.getKey())) {
reloadModel(ureq, null);
showWarning("error.message.deleted");
} else {
fireEvent(ureq, Event.BACK_EVENT);
showWarning("error.message.deleted");
}
}
private void doReply(UserRequest ureq, MessageView parent, boolean quote) { private void doReply(UserRequest ureq, MessageView parent, boolean quote) {
// user has clicked on button 'reply' // user has clicked on button 'reply'
......
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.modules.fo.ui.events;
import org.olat.core.gui.control.Event;
/**
*
* This error is send from MessageEditController if
* a database error occur.
*
* Initial date: 01.03.2016<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class ErrorEditMessage extends Event {
private static final long serialVersionUID = 8096812282751520199L;
public static final String CMD = "db-error";
public ErrorEditMessage() {
super(CMD);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment