From f8dd2f094af1f2ce10aca02feba8b25fed4f97c7 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Wed, 15 Jun 2016 20:12:05 +0200
Subject: [PATCH] OO-2053: apply the same lock on the certification options as
 for the course editor

---
 .../ui/CertificatesOptionsController.java     | 49 +++++++++++++++----
 1 file changed, 39 insertions(+), 10 deletions(-)

diff --git a/src/main/java/org/olat/course/certificate/ui/CertificatesOptionsController.java b/src/main/java/org/olat/course/certificate/ui/CertificatesOptionsController.java
index 225c859cc7c..781465e94c8 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificatesOptionsController.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificatesOptionsController.java
@@ -61,6 +61,7 @@ import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Util;
 import org.olat.core.util.coordinate.CoordinatorManager;
+import org.olat.core.util.coordinate.LockResult;
 import org.olat.core.util.event.EventBus;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSMediaResource;
@@ -75,9 +76,11 @@ import org.olat.course.config.CourseConfig;
 import org.olat.course.config.CourseConfigEvent;
 import org.olat.course.config.CourseConfigEvent.CourseConfigType;
 import org.olat.course.config.ui.CourseOptionsController;
+import org.olat.course.run.RunMainController;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryManager;
+import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -119,7 +122,10 @@ public class CertificatesOptionsController extends FormBasicController {
 	};
 	
 	private final String mapperUrl;
+	private LockResult lockEntry;
 
+	@Autowired
+	private UserManager userManager;
 	@Autowired
 	private CertificatesManager certificatesManager;
 	
@@ -131,13 +137,32 @@ public class CertificatesOptionsController extends FormBasicController {
 			RepositoryEntry entry, CourseConfig courseConfig, boolean editable) {
 		super(ureq, wControl);
 		setTranslator(Util.createPackageTranslator(CourseOptionsController.class, getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(RunMainController.class, getLocale(), getTranslator()));
 		this.courseConfig = courseConfig;
 		this.entry = entry;
-		this.editable = editable;
 		
 		mapperUrl = registerMapper(ureq, new TemplateMapper());
-		
+		lockEntry = CoordinatorManager.getInstance().getCoordinator().getLocker()
+				.acquireLock(entry.getOlatResource(), getIdentity(), CourseFactory.COURSE_EDITOR_LOCK);
+		this.editable = (lockEntry != null && lockEntry.isSuccess()) && editable;
+
 		initForm (ureq);
+		
+		if(lockEntry != null && !lockEntry.isSuccess()) {
+			String lockerName = "???";
+			if(lockEntry.getOwner() != null) {
+				lockerName = userManager.getUserDisplayName(lockEntry.getOwner());
+			}
+			showWarning("error.editoralreadylocked", new String[] { lockerName });
+		}
+	}
+	
+	@Override
+	protected void doDispose() {
+		if (lockEntry != null && lockEntry.isSuccess()) {
+			CoordinatorManager.getInstance().getCoordinator().getLocker().releaseLock(lockEntry);
+			lockEntry = null;
+		}
 	}
 	
 	@Override
@@ -174,6 +199,7 @@ public class CertificatesOptionsController extends FormBasicController {
 		templateCont.setLabel("pdf.certificates.template", null);
 
 		selectTemplateLink = uifactory.addFormLink("select", templateCont, Link.BUTTON);
+		selectTemplateLink.setEnabled(editable);
 		Long templateId = courseConfig.getCertificateTemplate();
 		boolean hasTemplate = templateId != null && templateId.longValue() > 0;
 		if(hasTemplate) {
@@ -193,6 +219,7 @@ public class CertificatesOptionsController extends FormBasicController {
 		boolean reCertificationEnabled = courseConfig.isRecertificationEnabled();
 		reCertificationEl = uifactory.addCheckboxesHorizontal("recertification", formLayout, new String[]{ "xx" }, new String[]{ "" });
 		reCertificationEl.addActionListener(FormEvent.ONCHANGE);
+		reCertificationEl.setEnabled(editable);
 		if(reCertificationEnabled) {
 			reCertificationEl.select("xx", true);
 		}
@@ -206,6 +233,7 @@ public class CertificatesOptionsController extends FormBasicController {
 		reCertificationTimelapseEl = uifactory.addIntegerElement("timelapse", null, timelapse, recertificationCont);
 		reCertificationTimelapseEl.setDomReplacementWrapperRequired(false);
 		reCertificationTimelapseEl.setDisplaySize(4);
+		reCertificationTimelapseEl.setEnabled(editable);
 		
 		String[] timelapseUnitValues = new String[] {
 			translate("recertification.day"), translate("recertification.week"),
@@ -214,6 +242,7 @@ public class CertificatesOptionsController extends FormBasicController {
 		RecertificationTimeUnit timelapseUnit = courseConfig.getRecertificationTimelapseUnit();
 		reCertificationTimelapseUnitEl = uifactory.addDropdownSingleselect("timelapse.unit", null, recertificationCont, timelapseUnitKeys, timelapseUnitValues, null);
 		reCertificationTimelapseUnitEl.setDomReplacementWrapperRequired(false);
+		reCertificationTimelapseUnitEl.setEnabled(editable);
 		if(timelapseUnit != null) {
 			reCertificationTimelapseUnitEl.select(timelapseUnit.name(), true);
 		} else {
@@ -234,7 +263,7 @@ public class CertificatesOptionsController extends FormBasicController {
 		boolean none = !pdfCertificatesEl.isAtLeastSelected(1);
 		
 		templateCont.setVisible(!none);
-		selectTemplateLink.setEnabled(!none);
+		selectTemplateLink.setEnabled(!none && editable);
 		if(none || selectedTemplate == null) {
 			templateCont.contextPut("templateName", translate("default.template"));
 			previewTemplateLink.setEnabled(false);
@@ -247,13 +276,8 @@ public class CertificatesOptionsController extends FormBasicController {
 		
 		boolean enableRecertification = !none && reCertificationEl.isAtLeastSelected(1);
 		recertificationCont.setVisible(enableRecertification);
-		reCertificationTimelapseEl.setEnabled(enableRecertification);
-		reCertificationTimelapseUnitEl.setEnabled(enableRecertification);
-	}
-
-	@Override
-	protected void doDispose() {
-		//
+		reCertificationTimelapseEl.setEnabled(enableRecertification && editable);
+		reCertificationTimelapseUnitEl.setEnabled(enableRecertification && editable);
 	}
 
 	@Override
@@ -352,6 +376,11 @@ public class CertificatesOptionsController extends FormBasicController {
 	
 	private void doChangeConfig(UserRequest ureq) {
 		OLATResourceable courseOres = entry.getOlatResource();
+		if(CourseFactory.isCourseEditSessionOpen(courseOres.getResourceableId())) {
+			showWarning("error.editoralreadylocked", new String[] { "???" });
+			return;
+		}
+		
 		ICourse course = CourseFactory.openCourseEditSession(courseOres.getResourceableId());
 		courseConfig = course.getCourseEnvironment().getCourseConfig();
 		
-- 
GitLab