Skip to content
Snippets Groups Projects
Commit 78c054df authored by srosse's avatar srosse
Browse files

OO-4805: show a warning if assessed identity is locked

parent 56979f30
No related branches found
No related tags found
No related merge requests found
...@@ -162,6 +162,16 @@ public class ClusterLocker implements Locker, GenericEventListener { ...@@ -162,6 +162,16 @@ public class ClusterLocker implements Locker, GenericEventListener {
final String asset = OresHelper.createStringRepresenting(ores, locksubkey); final String asset = OresHelper.createStringRepresenting(ores, locksubkey);
return clusterLockManager.isLocked(asset); return clusterLockManager.isLocked(asset);
} }
@Override
public LockEntry getLockEntry(OLATResourceable ores, String locksubkey) {
final String asset = OresHelper.createStringRepresenting(ores, locksubkey);
LockImpl li = clusterLockManager.findLock(asset);
if(li == null) {
return null;
}
return new LockEntry(li.getAsset(), li.getCreationDate().getTime(), li.getOwner());
}
@Override @Override
public Identity getLockedBy(OLATResourceable ores, String locksubkey) { public Identity getLockedBy(OLATResourceable ores, String locksubkey) {
......
...@@ -37,6 +37,7 @@ import org.olat.core.logging.AssertException; ...@@ -37,6 +37,7 @@ import org.olat.core.logging.AssertException;
import org.olat.core.util.Formatter; import org.olat.core.util.Formatter;
import org.olat.core.util.StringHelper; import org.olat.core.util.StringHelper;
import org.olat.core.util.Util; import org.olat.core.util.Util;
import org.olat.core.util.coordinate.LockEntry;
import org.olat.core.util.coordinate.LockResult; import org.olat.core.util.coordinate.LockResult;
import org.olat.user.UserManager; import org.olat.user.UserManager;
...@@ -117,10 +118,7 @@ public class DialogBoxUIFactory { ...@@ -117,10 +118,7 @@ public class DialogBoxUIFactory {
if(lockEntry.isSuccess()){ if(lockEntry.isSuccess()){
throw new AssertException("do not create a 'is locked message' if lock was succesfull! concerns lock:"+lockEntry.getOwner()); throw new AssertException("do not create a 'is locked message' if lock was succesfull! concerns lock:"+lockEntry.getOwner());
} }
String fullName = CoreSpringFactory.getImpl(UserManager.class).getUserDisplayName(lockEntry.getOwner()); String lockMsg = getLockedMessage(ureq, lockEntry.getLockEntry(), i18nLockMsgKey, translator);
String[] i18nParams = new String[] { StringHelper.escapeHtml(fullName),
Formatter.getInstance(ureq.getLocale()).formatTime(new Date(lockEntry.getLockAquiredTime())) };
String lockMsg = translator.translate(i18nLockMsgKey, i18nParams);
Translator trans = Util.createPackageTranslator(DialogBoxUIFactory.class, ureq.getLocale()); Translator trans = Util.createPackageTranslator(DialogBoxUIFactory.class, ureq.getLocale());
List<String> okButton = new ArrayList<>(); List<String> okButton = new ArrayList<>();
...@@ -131,6 +129,13 @@ public class DialogBoxUIFactory { ...@@ -131,6 +129,13 @@ public class DialogBoxUIFactory {
return ctrl; return ctrl;
} }
public static String getLockedMessage(UserRequest ureq, LockEntry lockEntry, String i18nLockMsgKey, Translator translator) {
String fullName = CoreSpringFactory.getImpl(UserManager.class).getUserDisplayName(lockEntry.getOwner());
String[] i18nParams = new String[] { StringHelper.escapeHtml(fullName),
Formatter.getInstance(ureq.getLocale()).formatTime(new Date(lockEntry.getLockAquiredTime())) };
return translator.translate(i18nLockMsgKey, i18nParams);
}
/** /**
* checks if this event from a OkCancel Dialog is an OK event. * checks if this event from a OkCancel Dialog is an OK event.
......
...@@ -74,7 +74,14 @@ public interface Locker { ...@@ -74,7 +74,14 @@ public interface Locker {
* @return The identity which lock the resource or null. * @return The identity which lock the resource or null.
*/ */
public Identity getLockedBy(OLATResourceable ores, String locksubkey); public Identity getLockedBy(OLATResourceable ores, String locksubkey);
/**
*
* @param ores
* @param locksubkey
* @return
*/
public LockEntry getLockEntry(OLATResourceable ores, String locksubkey);
/** /**
* *
......
...@@ -22,6 +22,7 @@ package org.olat.course.assessment.ui.tool; ...@@ -22,6 +22,7 @@ package org.olat.course.assessment.ui.tool;
import java.util.List; import java.util.List;
import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurity;
import org.olat.basesecurity.IdentityRef;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component; import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.stack.TooledStackedPanel;
...@@ -30,7 +31,6 @@ import org.olat.core.gui.control.Controller; ...@@ -30,7 +31,6 @@ import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event; import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.controller.BasicController;
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.id.IdentityEnvironment; import org.olat.core.id.IdentityEnvironment;
...@@ -74,7 +74,6 @@ public class AssessmentIdentityCourseNodeController extends BasicController impl ...@@ -74,7 +74,6 @@ public class AssessmentIdentityCourseNodeController extends BasicController impl
private Controller identityInfosCtrl; private Controller identityInfosCtrl;
private Controller subDetailsController; private Controller subDetailsController;
private Controller detailsEditController; private Controller detailsEditController;
private DialogBoxController alreadyLockedDialogController;
private LockResult lockEntry; private LockResult lockEntry;
private final CourseNode courseNode; private final CourseNode courseNode;
...@@ -106,20 +105,19 @@ public class AssessmentIdentityCourseNodeController extends BasicController impl ...@@ -106,20 +105,19 @@ public class AssessmentIdentityCourseNodeController extends BasicController impl
identityAssessmentVC = createVelocityContainer("identity_personal_node_infos"); identityAssessmentVC = createVelocityContainer("identity_personal_node_infos");
initDetails(); initDetails();
identityInfosCtrl = new AssessedIdentityLargeInfosController(ureq, wControl, assessedIdentity, course);
listenTo(identityInfosCtrl);
identityAssessmentVC.put("identityInfos", identityInfosCtrl.getInitialComponent());
//acquire lock and show dialog box on failure. //acquire lock and show dialog box on failure.
String lockSubKey = "AssessmentLock-NID::" + courseNode.getIdent() + "-IID::" + assessedIdentity.getKey(); String lockSubKey = lockKey(courseNode, assessedIdentity);
lockEntry = CoordinatorManager.getInstance().getCoordinator().getLocker().acquireLock(course, ureq.getIdentity(), lockSubKey); lockEntry = CoordinatorManager.getInstance().getCoordinator().getLocker().acquireLock(course, ureq.getIdentity(), lockSubKey);
if(!lockEntry.isSuccess()) { if(!lockEntry.isSuccess()) {
alreadyLockedDialogController = DialogBoxUIFactory.createResourceLockedMessage(ureq, wControl, lockEntry, "assessmentLock", getTranslator()); String msg = DialogBoxUIFactory.getLockedMessage(ureq, lockEntry.getLockEntry(), "assessmentLock", getTranslator());
listenTo(alreadyLockedDialogController); getWindowControl().setWarning(msg);
alreadyLockedDialogController.activate();
} else if(courseNode instanceof AssessableCourseNode) { } else if(courseNode instanceof AssessableCourseNode) {
AssessableCourseNode aCourseNode = (AssessableCourseNode)courseNode; AssessableCourseNode aCourseNode = (AssessableCourseNode)courseNode;
identityInfosCtrl = new AssessedIdentityLargeInfosController(ureq, wControl, assessedIdentity, course);
listenTo(identityInfosCtrl);
identityAssessmentVC.put("identityInfos", identityInfosCtrl.getInitialComponent());
// Add the users details controller // Add the users details controller
if (aCourseNode.hasDetails() && courseNodeDetails) { if (aCourseNode.hasDetails() && courseNodeDetails) {
...@@ -140,6 +138,10 @@ public class AssessmentIdentityCourseNodeController extends BasicController impl ...@@ -140,6 +138,10 @@ public class AssessmentIdentityCourseNodeController extends BasicController impl
putInitialPanel(identityAssessmentVC); putInitialPanel(identityAssessmentVC);
} }
public static String lockKey(CourseNode node, IdentityRef identity) {
return "AssessmentLock-NID::" + node.getIdent() + "-IID::" + identity.getKey();
}
public UserCourseEnvironment getCoachCourseEnvironment() { public UserCourseEnvironment getCoachCourseEnvironment() {
return coachCourseEnv; return coachCourseEnv;
} }
......
...@@ -59,6 +59,7 @@ import org.olat.core.gui.control.WindowControl; ...@@ -59,6 +59,7 @@ import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController; import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.gui.control.generic.dtabs.Activateable2;
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.id.IdentityEnvironment; import org.olat.core.id.IdentityEnvironment;
import org.olat.core.id.OLATResourceable; import org.olat.core.id.OLATResourceable;
...@@ -68,6 +69,7 @@ import org.olat.core.id.context.StateEntry; ...@@ -68,6 +69,7 @@ import org.olat.core.id.context.StateEntry;
import org.olat.core.util.StringHelper; import org.olat.core.util.StringHelper;
import org.olat.core.util.Util; import org.olat.core.util.Util;
import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.CoordinatorManager;
import org.olat.core.util.coordinate.LockEntry;
import org.olat.core.util.event.GenericEventListener; import org.olat.core.util.event.GenericEventListener;
import org.olat.core.util.resource.OresHelper; import org.olat.core.util.resource.OresHelper;
import org.olat.course.CourseFactory; import org.olat.course.CourseFactory;
...@@ -777,12 +779,42 @@ public class IdentityListCourseNodeController extends FormBasicController ...@@ -777,12 +779,42 @@ public class IdentityListCourseNodeController extends FormBasicController
private void doSelect(UserRequest ureq, Identity assessedIdentity) { private void doSelect(UserRequest ureq, Identity assessedIdentity) {
List<AssessedIdentityElementRow> rows = usersTableModel.getObjects(); List<AssessedIdentityElementRow> rows = usersTableModel.getObjects();
AssessedIdentityElementRow selectedRow = null;
for(AssessedIdentityElementRow row:rows) { for(AssessedIdentityElementRow row:rows) {
if(assessedIdentity.getKey().equals(row.getIdentityKey())) { if(assessedIdentity.getKey().equals(row.getIdentityKey())) {
doSelect(ureq, row); selectedRow = row;
break; break;
} }
} }
if(selectedRow != null && !isAssessedIdentityLocked(ureq, assessedIdentity)) {
doSelect(ureq, selectedRow);
}
}
/**
* Preventive check if the identity is already locked by an other
* user and show a warning message if needed.
*
* @param ureq The user request
* @param assessedIdentity The identity to assess
* @return
*/
private boolean isAssessedIdentityLocked(UserRequest ureq, Identity assessedIdentity) {
if(courseNode.getParent() == null) return false;
ICourse course = CourseFactory.loadCourse(courseEntry);
String locksubkey = AssessmentIdentityCourseNodeController.lockKey(courseNode, assessedIdentity);
if(CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(course, locksubkey)) {
LockEntry lock = CoordinatorManager.getInstance().getCoordinator().getLocker().getLockEntry(course, locksubkey);
if(lock != null && lock.getOwner() != null && !lock.getOwner().equals(getIdentity())) {
String msg = DialogBoxUIFactory.getLockedMessage(ureq, lock, "assessmentLock", getTranslator());
getWindowControl().setWarning(msg);
return true;
}
}
return false;
} }
private Controller doSelect(UserRequest ureq, AssessedIdentityElementRow row) { private Controller doSelect(UserRequest ureq, AssessedIdentityElementRow row) {
......
...@@ -121,8 +121,8 @@ public abstract class AbstractToolsController extends BasicController { ...@@ -121,8 +121,8 @@ public abstract class AbstractToolsController extends BasicController {
} }
lastLink = link; lastLink = link;
} }
if(links.size() > 0 && "-".equals(links.get(links.size() - 1))) { if(!links.isEmpty() && "-".equals(links.get(links.size() - 1))) {
links.remove(links.size() -1);//no trialing separator links.remove(links.size() -1);//no trailing separator
} }
mainVC.contextPut("links", links); mainVC.contextPut("links", links);
......
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