diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep00.java b/src/main/java/org/olat/admin/user/imp/ImportStep00.java index 02f121360592ea4de9f340c40bc2e4b8805de202..7201261ec9fb161371933cf91b602ddf8f629442 100644 --- a/src/main/java/org/olat/admin/user/imp/ImportStep00.java +++ b/src/main/java/org/olat/admin/user/imp/ImportStep00.java @@ -348,7 +348,8 @@ class ImportStep00 extends BasicStep { } } // check that no user with same email is already in list - if (thisKey.equals(UserConstants.EMAIL) && userModule.isEmailUnique()) { + if (thisKey.equals(UserConstants.EMAIL) && StringHelper.containsNonWhitespace(thisValue) + && userModule.isEmailUnique()) { // check that no user with same email is already in list Integer mailPos = importedEmails.indexOf(thisValue); boolean duplicate = mailPos != -1; diff --git a/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java b/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java index 0d273eb3a127ede08693c9b84281885d8834d9c8..b4521c18aaed6fa8ec8f9d84df19902f4cf1d199 100644 --- a/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java +++ b/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java @@ -34,7 +34,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import org.olat.core.CoreSpringFactory; import org.olat.core.commons.services.image.ImageService; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; @@ -51,12 +50,12 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.translator.Translator; -import org.olat.core.id.OLATResourceable; import org.olat.core.logging.AssertException; import org.olat.core.util.ArrayHelper; 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.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; @@ -70,7 +69,12 @@ import org.olat.course.config.ui.courselayout.attribs.AbstractLayoutAttribute; import org.olat.course.config.ui.courselayout.attribs.PreviewLA; import org.olat.course.config.ui.courselayout.attribs.SpecialAttributeFormItemHandler; import org.olat.course.config.ui.courselayout.elements.AbstractLayoutElement; +import org.olat.course.run.RunMainController; import org.olat.course.run.environment.CourseEnvironment; +import org.olat.repository.RepositoryEntry; +import org.olat.resource.OLATResource; +import org.olat.user.UserManager; +import org.springframework.beans.factory.annotation.Autowired; /** * Description:<br> @@ -89,7 +93,6 @@ public class CourseLayoutGeneratorController extends FormBasicController { private FileElement logoUpl; private FormLayoutContainer previewImgFlc; private FormLayoutContainer styleFlc; - private CustomConfigManager customCMgr; private LinkedHashMap<String, Map<String, FormItem>> guiWrapper; private Map<String, Map<String, Object>> persistedCustomConfig; private FormLayoutContainer logoImgFlc; @@ -97,25 +100,55 @@ public class CourseLayoutGeneratorController extends FormBasicController { private boolean elWithErrorExists = false; private final boolean editable; - private final OLATResourceable courseOres; + private LockResult lockEntry; private CourseConfig courseConfig; + private final RepositoryEntry courseEntry; private CourseEnvironment courseEnvironment; + + @Autowired + private UserManager userManager; + @Autowired + private CustomConfigManager customCMgr; - public CourseLayoutGeneratorController(UserRequest ureq, WindowControl wControl, OLATResourceable courseOres, CourseConfig courseConfig, + public CourseLayoutGeneratorController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry, CourseConfig courseConfig, CourseEnvironment courseEnvironment, boolean editable) { super(ureq, wControl); - - this.editable = editable; - this.courseOres = courseOres; + + this.courseEntry = entry; this.courseConfig = courseConfig; this.courseEnvironment = courseEnvironment; - customCMgr = (CustomConfigManager) CoreSpringFactory.getBean("courseConfigManager"); + lockEntry = CoordinatorManager.getInstance().getCoordinator().getLocker() + .acquireLock(entry.getOlatResource(), getIdentity(), CourseFactory.COURSE_EDITOR_LOCK); + this.editable = (lockEntry != null && lockEntry.isSuccess()) && editable; + // stack the translator to get attribs/elements - Translator pt = Util.createPackageTranslator(AbstractLayoutAttribute.class, ureq.getLocale(), getTranslator()); - pt = Util.createPackageTranslator(AbstractLayoutElement.class, ureq.getLocale(), pt); + Translator pt = Util.createPackageTranslator(AbstractLayoutAttribute.class, getLocale(), getTranslator()); + pt = Util.createPackageTranslator(AbstractLayoutElement.class, getLocale(), pt); + pt = Util.createPackageTranslator(RunMainController.class, getLocale(), pt); setTranslator(pt); + persistedCustomConfig = customCMgr.getCustomConfig(courseEnvironment); initForm(ureq); + + if(lockEntry != null && !lockEntry.isSuccess()) { + String lockerName = "???"; + if(lockEntry.getOwner() != null) { + lockerName = userManager.getUserDisplayName(lockEntry.getOwner()); + } + showWarning("error.editoralreadylocked", new String[] { lockerName }); + } + } + + + /** + * @see org.olat.core.gui.control.DefaultController#doDispose() + */ + @Override + protected void doDispose() { + if (lockEntry != null && lockEntry.isSuccess()) { + CoordinatorManager.getInstance().getCoordinator().getLocker().releaseLock(lockEntry); + lockEntry = null; + } } /** @@ -125,9 +158,9 @@ public class CourseLayoutGeneratorController extends FormBasicController { protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { setFormTitle("tab.layout.title"); - ArrayList<String> keys = new ArrayList<String>(); - ArrayList<String> vals = new ArrayList<String>(); - ArrayList<String> csss = new ArrayList<String>(); + List<String> keys = new ArrayList<String>(); + List<String> vals = new ArrayList<String>(); + List<String> csss = new ArrayList<String>(); String actualCSSSettings = courseConfig.getCssLayoutRef(); @@ -372,9 +405,15 @@ public class CourseLayoutGeneratorController extends FormBasicController { */ @Override protected void formOK(UserRequest ureq) { + OLATResource courseRes = courseEntry.getOlatResource(); + if(CourseFactory.isCourseEditSessionOpen(courseRes.getResourceableId())) { + showWarning("error.editoralreadylocked", new String[] { "???" }); + return; + } + String selection = styleSel.getSelectedKey(); - ICourse course = CourseFactory.openCourseEditSession(courseOres.getResourceableId()); + ICourse course = CourseFactory.openCourseEditSession(courseRes.getResourceableId()); courseEnvironment = course.getCourseEnvironment(); courseConfig = courseEnvironment.getCourseConfig(); courseConfig.setCssLayoutRef(selection); @@ -457,15 +496,4 @@ public class CourseLayoutGeneratorController extends FormBasicController { } styleFlc.contextPut("guiWrapper", guiWrapper); } - - - /** - * @see org.olat.core.gui.control.DefaultController#doDispose() - */ - @Override - protected void doDispose() { - // nothing to dispose - } - - } diff --git a/src/main/java/org/olat/course/config/ui/courselayout/CustomConfigManager.java b/src/main/java/org/olat/course/config/ui/courselayout/CustomConfigManager.java index f6a672c35cdb30c313695a21e57e3783176fa45e..80fb5b9ffe4ba2ffeca1532fc10f9276baeb568f 100644 --- a/src/main/java/org/olat/course/config/ui/courselayout/CustomConfigManager.java +++ b/src/main/java/org/olat/course/config/ui/courselayout/CustomConfigManager.java @@ -29,7 +29,8 @@ import java.util.Map.Entry; import javax.imageio.ImageIO; -import org.olat.core.manager.BasicManager; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.core.util.FileUtils; import org.olat.core.util.vfs.LocalFileImpl; import org.olat.core.util.vfs.VFSContainer; @@ -52,7 +53,9 @@ import com.thoughtworks.xstream.XStream; * Initial Date: 04.02.2011 <br> * @author Roman Haag, roman.haag@frentix.com, http://www.frentix.com */ -public class CustomConfigManager extends BasicManager { +public class CustomConfigManager { + + private static final OLog log = Tracing.createLoggerFor(CustomConfigManager.class); private static final String IFRAME_CSS = "iframe.css"; private static final String MAIN_CSS = "main.css"; @@ -156,7 +159,7 @@ public class CustomConfigManager extends BasicManager { return null; } } catch (IOException e) { - logError("Problem reading uploaded image", e); + log.error("Problem reading uploaded image", e); return null; } return new int[] { width, height }; diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index 89192a05bf730fb93aad7052914d3671bb956a2c..93167fa40f99bf0a99a3c9de208ff5510869b91c 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -1338,7 +1338,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); boolean managedLayout = RepositoryEntryManagedFlag.isManaged(getRepositoryEntry(), RepositoryEntryManagedFlag.layout); CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig().clone(); - CourseLayoutGeneratorController ctrl = new CourseLayoutGeneratorController(ureq, getWindowControl(), course, courseConfig, + CourseLayoutGeneratorController ctrl = new CourseLayoutGeneratorController(ureq, getWindowControl(), getRepositoryEntry(), courseConfig, course.getCourseEnvironment(), !managedLayout); listenTo(ctrl); courseLayoutCtrl = pushController(ureq, translate("command.layout"), ctrl); diff --git a/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java b/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java index d56ce8d7a52d8590dc6c16d00f9b53bce215d387..84d3ac2af299090b98fccc2edb76efcab6095a70 100644 --- a/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java +++ b/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java @@ -95,7 +95,7 @@ public class CertificatesManagerTest extends OlatTestCase { @Test public void createCertificate() throws URISyntaxException { Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-1"); - RepositoryEntry entry = JunitTestHelper.deployDemoCourse(identity); + RepositoryEntry entry = JunitTestHelper.deployBasicCourse(identity); dbInstance.commitAndCloseSession(); CertificateInfos certificateInfos = new CertificateInfos(identity, null, null); @@ -118,7 +118,7 @@ public class CertificatesManagerTest extends OlatTestCase { @Test public void loadCertificate() { Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-1"); - RepositoryEntry entry = JunitTestHelper.deployDemoCourse(identity); + RepositoryEntry entry = JunitTestHelper.deployBasicCourse(identity); dbInstance.commitAndCloseSession(); CertificateInfos certificateInfos = new CertificateInfos(identity, 5.0f, Boolean.TRUE); @@ -158,7 +158,7 @@ public class CertificatesManagerTest extends OlatTestCase { @Test public void loadLastCertificate() { Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-1"); - RepositoryEntry entry = JunitTestHelper.deployDemoCourse(identity); + RepositoryEntry entry = JunitTestHelper.deployBasicCourse(identity); dbInstance.commitAndCloseSession(); CertificateInfos certificateInfos = new CertificateInfos(identity, 5.0f, Boolean.TRUE); @@ -188,7 +188,7 @@ public class CertificatesManagerTest extends OlatTestCase { Identity coach = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-3"); Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-4"); Identity participant2 = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-4"); - RepositoryEntry entry = JunitTestHelper.deployDemoCourse(owner); + RepositoryEntry entry = JunitTestHelper.deployBasicCourse(owner); repositoryEntryRelationDao.addRole(coach, entry, GroupRoles.coach.name()); repositoryEntryRelationDao.addRole(participant1, entry, GroupRoles.participant.name()); repositoryEntryRelationDao.addRole(participant2, entry, GroupRoles.participant.name()); @@ -228,7 +228,7 @@ public class CertificatesManagerTest extends OlatTestCase { Identity coach = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-6"); Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-7"); Identity participant2 = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-8"); - RepositoryEntry entry = JunitTestHelper.deployDemoCourse(owner); + RepositoryEntry entry = JunitTestHelper.deployBasicCourse(owner); BusinessGroup group = businessGroupService.createBusinessGroup(null, "certified-group", "Group with certification", null, null, false, false, entry); businessGroupRelationDao.addRole(coach, group, GroupRoles.coach.name()); businessGroupRelationDao.addRole(participant1, group, GroupRoles.participant.name()); @@ -247,8 +247,11 @@ public class CertificatesManagerTest extends OlatTestCase { waitCertificate(certificate1.getKey()); waitCertificate(certificate2.getKey()); + dbInstance.commitAndCloseSession(); + sleep(2000); + Calendar lastestNews = Calendar.getInstance(); - lastestNews.add(Calendar.HOUR_OF_DAY, -1); + lastestNews.add(Calendar.DATE, -1); //check the notifications of the coach List<Certificate> coachNotifications = certificatesManager.getCertificatesForNotifications(coach, entry, lastestNews.getTime()); @@ -265,7 +268,7 @@ public class CertificatesManagerTest extends OlatTestCase { @Test public void uploadCertificate() throws URISyntaxException { Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-1"); - RepositoryEntry entry = JunitTestHelper.deployDemoCourse(identity); + RepositoryEntry entry = JunitTestHelper.deployBasicCourse(identity); dbInstance.commitAndCloseSession(); Calendar cal = Calendar.getInstance(); @@ -360,7 +363,7 @@ public class CertificatesManagerTest extends OlatTestCase { public void deleteCourse() throws URISyntaxException { //create a course with a certificate Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-del-2"); - RepositoryEntry entry = JunitTestHelper.deployDemoCourse(identity); + RepositoryEntry entry = JunitTestHelper.deployBasicCourse(identity); dbInstance.commitAndCloseSession(); Long resourceKey = entry.getOlatResource().getKey(); @@ -399,8 +402,8 @@ public class CertificatesManagerTest extends OlatTestCase { public void deleteCourse_paranoiaCheck() throws URISyntaxException { //create a course with a certificate Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("cer-del-3"); - RepositoryEntry entryToDelete = JunitTestHelper.deployDemoCourse(identity); - RepositoryEntry entry = JunitTestHelper.deployDemoCourse(identity); + RepositoryEntry entryToDelete = JunitTestHelper.deployBasicCourse(identity); + RepositoryEntry entry = JunitTestHelper.deployBasicCourse(identity); dbInstance.commitAndCloseSession(); Long resourceKeyToDelete = entryToDelete.getOlatResource().getKey(); Long resourceKey = entry.getOlatResource().getKey(); diff --git a/src/test/java/org/olat/course/statistic/WeeklyStatisticUpdateManagerTest.java b/src/test/java/org/olat/course/statistic/WeeklyStatisticUpdateManagerTest.java index 4bfe692994a741531ecc90cee6767385a62749a9..6b47e5cc6591801e52f469302e4b6f92f4e148cd 100644 --- a/src/test/java/org/olat/course/statistic/WeeklyStatisticUpdateManagerTest.java +++ b/src/test/java/org/olat/course/statistic/WeeklyStatisticUpdateManagerTest.java @@ -44,7 +44,9 @@ import org.olat.test.JunitTestHelper; */ public class WeeklyStatisticUpdateManagerTest extends AbstractStatisticUpdateManagerTest { - private final SimpleDateFormat weeklyFormat = new SimpleDateFormat("yyyy-ww"); + private final SimpleDateFormat weeklyFormat = new SimpleDateFormat("yyyy-w"); + private final SimpleDateFormat weeklyMySQLFormat = new SimpleDateFormat("yyyy-ww"); + private final WeeklyStatisticManager weeklyStatisticManager = new WeeklyStatisticManager(); @Test @@ -124,6 +126,10 @@ public class WeeklyStatisticUpdateManagerTest extends AbstractStatisticUpdateMan cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); + + if(dbInstance.isMySQL()) { + return weeklyMySQLFormat.format(cal.getTime()); + } return weeklyFormat.format(cal.getTime()); }