diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties index 8e4d32bf1ddaf951d11c821189f6c1fb52c59c47..6c967d9c14102943d112d1bc56e076e59a466f88 100644 --- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties @@ -28,10 +28,10 @@ GUIDemoSiteDef=GUI Demo courseSiteForbiddenAlt=Forbidden ctrl. adminSiteSecurityCallback=Systemadmins -defaultSiteSecurityCallback=Alle ausser eP-Einladung +defaultSiteSecurityCallback=Alle inklusive Gäste und eP-Einladung disabledSiteSecurityCallback=Deaktiviert managersSiteSecurityCallback=Alle Verwalter -registredSiteSecurityCallback=Registrierte Benutzer +registredSiteSecurityCallback=Registrierte Benutzer ohne Gäste/eP-Einladung restrictToAuthorSiteSecurityCallback=Autoren restrictToUserManagerSiteSecurityCallback=Benutzerverwalter restrictToGroupManagerSiteSecurityCallback=Gruppenverwalter diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties index b99c4e8f717332fb2b0d649c42bae4c050fe4c46..a9210c55ae80a4f54c814caa34701e23d0d2e7bc 100644 --- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties @@ -27,10 +27,10 @@ GUIDemoSiteDef=GUI Demo courseSiteForbiddenAlt=Forbidden ctrl. adminSiteSecurityCallback=Admins only -defaultSiteSecurityCallback=All but invitee +defaultSiteSecurityCallback=All, including guests and invitee disabledSiteSecurityCallback=Disabled managersSiteSecurityCallback=Managers -registredSiteSecurityCallback=Registered users +registredSiteSecurityCallback=Registered users without guests/invitee restrictToAuthorSiteSecurityCallback=Authors only restrictToUserManagerSiteSecurityCallback=User managers restrictToGroupManagerSiteSecurityCallback=Group managers diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties index e81f992d368d4062caf67ebec7d1efcdb0af0fed..1e0fc06ac0e869175add4c62b476f86ba545dc67 100644 --- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties @@ -13,11 +13,11 @@ admin.menu.title=Sites admin.menu.title.alt=Configurer les sites adminSiteSecurityCallback=Administrateurs syst\u00E8me courseSiteForbiddenAlt=Acc\u00E8s interdit -defaultSiteSecurityCallback=Tous sauf les invitations eP +defaultSiteSecurityCallback=Tous y compris les invité et les invitations eP disabledSiteSecurityCallback=D\u00E9sactiv\u00E9 down=En bas managersSiteSecurityCallback=Tous les administrateurs -registredSiteSecurityCallback=Utilisateurs enregistr\u00E9s +registredSiteSecurityCallback=Utilisateurs enregistr\u00E9s sauf les invité / les invitations eP restrictToAuthorSiteSecurityCallback=Auteurs restrictToGroupManagerSiteSecurityCallback=Administrateurs de groupes restrictToPoolAdminSiteSecurityCallback=Administrateur banque de questions diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties index d32b18719f52420acec12730ead9b22a1070786b..ec3cc0b86d174ccd0121e85a57b0841e152a0019 100644 --- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties @@ -13,7 +13,7 @@ admin.menu.title=Sites admin.menu.title.alt=Configura\u00E7\u00E3o de Sites adminSiteSecurityCallback=Administradores de sistema courseSiteForbiddenAlt=Ctrl Proibido. -defaultSiteSecurityCallback=Todos, exceto convidados +defaultSiteSecurityCallback=Todos disabledSiteSecurityCallback=Inativo down=Para baixo managersSiteSecurityCallback=Gestores diff --git a/src/main/java/org/olat/core/dispatcher/mapper/MapperDispatcher.java b/src/main/java/org/olat/core/dispatcher/mapper/MapperDispatcher.java index d72ee487b72daec9436e8461192d7ffd42ce1568..697795bf5ff84547b05ebf1e7fab19abe9ca38fd 100644 --- a/src/main/java/org/olat/core/dispatcher/mapper/MapperDispatcher.java +++ b/src/main/java/org/olat/core/dispatcher/mapper/MapperDispatcher.java @@ -98,11 +98,13 @@ public class MapperDispatcher extends LogDelegator implements Dispatcher { UserSession usess = CoreSpringFactory.getImpl(UserSessionManager.class).getUserSession(hreq); Mapper m = CoreSpringFactory.getImpl(MapperService.class).getMapperById(usess, smappath); if (m == null) { - logWarn( - "Call to mapped resource, but mapper does not exist for path::" - + pathInfo, null); - DispatcherModule.sendNotFound(pathInfo, hres); - return; + //an anonymous mapper? + m = CoreSpringFactory.getImpl(MapperService.class).getMapperById(null, smappath); + if(m == null) { + logWarn("Call to mapped resource, but mapper does not exist for path::" + smappath, null); + DispatcherModule.sendNotFound(pathInfo, hres); + return; + } } String mod = slashPos > 0 ? subInfo.substring(slashPos) : ""; if (mod.indexOf("..") != -1) { diff --git a/src/main/java/org/olat/core/gui/control/controller/BasicController.java b/src/main/java/org/olat/core/gui/control/controller/BasicController.java index ee448da46341b243b285a3bb2dec66e32b4205fa..44cd1645eb6804deaaf37b247ab62a7c1cac67b1 100644 --- a/src/main/java/org/olat/core/gui/control/controller/BasicController.java +++ b/src/main/java/org/olat/core/gui/control/controller/BasicController.java @@ -49,6 +49,7 @@ import org.olat.core.id.Identity; import org.olat.core.logging.AssertException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; +import org.olat.core.util.UserSession; import org.olat.core.util.Util; /** @@ -230,12 +231,13 @@ public abstract class BasicController extends DefaultController { if (mappers == null) { mappers = new ArrayList<Mapper>(2); } - String mapperBaseURL; + String mapperBaseURL; + UserSession usess = ureq == null ? null : ureq.getUserSession(); if (cacheableMapperID == null) { // use non cacheable as fallback - mapperBaseURL = CoreSpringFactory.getImpl(MapperService.class).register(ureq.getUserSession(), m); + mapperBaseURL = CoreSpringFactory.getImpl(MapperService.class).register(usess, m); } else { - mapperBaseURL = CoreSpringFactory.getImpl(MapperService.class).register(ureq.getUserSession(), cacheableMapperID, m, expirationTime); + mapperBaseURL = CoreSpringFactory.getImpl(MapperService.class).register(usess, cacheableMapperID, m, expirationTime); } // registration was successful, add to our mapper list mappers.add(m); diff --git a/src/main/java/org/olat/core/util/WebappHelper.java b/src/main/java/org/olat/core/util/WebappHelper.java index 2b69d1d52c344ca69301d40ff9f85bbe7599bb9a..70379fe535dd49ec6e2885a882b924faead544e6 100644 --- a/src/main/java/org/olat/core/util/WebappHelper.java +++ b/src/main/java/org/olat/core/util/WebappHelper.java @@ -47,6 +47,7 @@ import org.olat.core.logging.OLog; import org.olat.core.logging.StartupException; import org.olat.core.logging.Tracing; import org.olat.core.util.i18n.I18nModule; +import org.springframework.beans.factory.BeanInitializationException; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.web.context.ServletContextAware; @@ -71,6 +72,7 @@ public class WebappHelper implements Initializable, Destroyable, ServletContextA private static String instanceId; private static String userDataRoot; private static String defaultCharset; + private static boolean enforceUtf8Filesystem; private static Map<String, String> mailConfig = new HashMap<String, String>(6); private static long timeOfServerStartup = System.currentTimeMillis(); @@ -375,6 +377,14 @@ public class WebappHelper implements Initializable, Destroyable, ServletContextA WebappHelper.defaultCharset = defaultCharset; } + /** + * [spring] + * @param enforceUtf8Filesystem + */ + public void setEnforceUtf8Filesystem(boolean enforceUtf8Filesystem) { + WebappHelper.enforceUtf8Filesystem = enforceUtf8Filesystem; + } + /** * key="mailhost" * key="mailTimeout" @@ -432,13 +442,20 @@ public class WebappHelper implements Initializable, Destroyable, ServletContextA } else { // test failed log.warn("No UTF-8 capable filesystem found! Could not read / write UTF-8 characters from / to filesystem! " - + "You probably misconfigured your system, try setting your LC_HOME variable to a correct value."); + + "You probably misconfigured your system, try setting your LANG variable to a correct value."); log.warn("Your current file encoding configuration: java.nio.charset.Charset.defaultCharset().name()::" + java.nio.charset.Charset.defaultCharset().name() + " (the one used) and your system property file.encoding::" + System.getProperty("file.encoding") + " (the one configured)"); } // try to delete file anyway writeFile.delete(); + + if (!foundUtf8File && WebappHelper.enforceUtf8Filesystem) { + throw new BeanInitializationException( + "System startup aborted to to file system missconfiguration. See previous warnings in logfile and fix your " + + "Java environment. This check can be disabled by setting enforce.utf8.filesystem=false, but be aware that the " + + "decision to use a certain encoding on the filesystem is a one-time decision. You can not cange to UTF-8 later!"); + } } /** diff --git a/src/main/java/org/olat/core/util/_spring/utilCorecontext.xml b/src/main/java/org/olat/core/util/_spring/utilCorecontext.xml index 4da324be0f92a92e26fc00855e640e294a83758f..7ebd4bdbaa2af32ff5d135f61bdf3beb1e9b17ab 100644 --- a/src/main/java/org/olat/core/util/_spring/utilCorecontext.xml +++ b/src/main/java/org/olat/core/util/_spring/utilCorecontext.xml @@ -40,6 +40,7 @@ </map> </property> <property name="defaultCharset" value="${defaultcharset}" /> + <property name="enforceUtf8Filesystem" value="${enforce.utf8.filesystem}" /> <property name="version" value="${build.version}" /> <property name="applicationName" value="${application.name}" /> <property name="mobileContext" value="${mobile.context}" /> diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java index 9f577b04a4157fcd544b61c488022cb4ba1a021c..038742de4d2cbeeae14049597d7a92512dd8acca 100644 --- a/src/main/java/org/olat/course/CourseFactory.java +++ b/src/main/java/org/olat/course/CourseFactory.java @@ -224,7 +224,11 @@ public class CourseFactory extends BasicManager { OLATResourceable olatResource, CourseNode selectedNode) { ICourse course = loadCourse(olatResource); EditorMainController emc = new EditorMainController(ureq, wControl, course, stack, selectedNode); - if (!emc.getLockEntry().isSuccess()) { + if (emc.getLockEntry() == null) { + Translator translator = Util.createPackageTranslator(RunMainController.class, ureq.getLocale()); + wControl.setWarning(translator.translate("error.editoralreadylocked", new String[] { "?" })); + return null; + } else if(!emc.getLockEntry().isSuccess()) { // get i18n from the course runmaincontroller to say that this editor is // already locked by another person @@ -1124,6 +1128,10 @@ public class CourseFactory extends BasicManager { return course; } + public static boolean isCourseEditSessionOpen(Long resourceableId) { + return courseEditSessionMap.containsKey(resourceableId); + } + /** * Provides the currently edited course object with this id. <br/> * It guarantees that the returned value is never null if the openCourseEditSession was called first. <br/> diff --git a/src/main/java/org/olat/course/archiver/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/archiver/_i18n/LocalStrings_fr.properties index 7ff743af22e9af5be797638d9996aa614298e0a6..5ed7f63ca492cf457569d2d5a2eabf569da10302 100644 --- a/src/main/java/org/olat/course/archiver/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/course/archiver/_i18n/LocalStrings_fr.properties @@ -1,4 +1,4 @@ -#Wed Apr 02 08:16:23 CEST 2014 +#Fri Apr 04 16:30:37 CEST 2014 chelp.arch-logf.title=Analyse des fichiers log chelp.ass=Evaluation chelp.cont=Contexte de groupe @@ -81,6 +81,7 @@ logfilechooserform.loguser=Fichier log d'administrateur (personnalis\u00E9) menu.archivelogfiles=Fichiers log menu.archivelogfiles.alt=Fichiers log d'administrateur, de cours et d'utilisateurs menu.checklist=Listes de contr\u00F4le +menu.checklist.alt=Listes de contr\u00F4le menu.dialogs=Fichier discut\u00E9s menu.dialogs.alt=Archiver les fichiers discut\u00E9s menu.forums=Forums diff --git a/src/main/java/org/olat/course/editor/EditorMainController.java b/src/main/java/org/olat/course/editor/EditorMainController.java index b1d39c1d20509a6da9e8cd56625ce195714b650c..248c7cc702298c5a149fccd95d01c3ed5e26efdd 100644 --- a/src/main/java/org/olat/course/editor/EditorMainController.java +++ b/src/main/java/org/olat/course/editor/EditorMainController.java @@ -234,6 +234,13 @@ public class EditorMainController extends MainLayoutBasicController implements G getUserActivityLogger().setStickyActionType(ActionType.admin); addLoggingResourceable(LoggingResourceable.wrap(CourseFactory.loadCourse(ores))); + if(CourseFactory.isCourseEditSessionOpen(ores.getResourceableId())) { + Panel empty = new Panel("empty");// empty panel set as "menu" and "tool" + Controller emptyCtrl = new LayoutMain3ColsController(ureq, wControl, empty, empty, empty, "opened-course"); + putInitialPanel(emptyCtrl.getInitialComponent()); + return; + } + // try to acquire edit lock for this course. lockEntry = CoordinatorManager.getInstance().getCoordinator().getLocker().acquireLock(ores, ureq.getIdentity(), CourseFactory.COURSE_EDITOR_LOCK); OLATResourceable lockEntryOres = OresHelper.createOLATResourceableInstance(LockEntry.class, 0l); @@ -242,7 +249,12 @@ public class EditorMainController extends MainLayoutBasicController implements G try { ThreadLocalUserActivityLogger.log(CourseLoggingAction.COURSE_EDITOR_OPEN, getClass()); - if (lockEntry.isSuccess()) { + if (!lockEntry.isSuccess()) { + Panel empty = new Panel("empty");// empty panel set as "menu" and "tool" + Controller emptyCtrl = new LayoutMain3ColsController(ureq, wControl, empty, empty, empty, "opened-course"); + putInitialPanel(emptyCtrl.getInitialComponent()); + return; + } else { ICourse course = CourseFactory.openCourseEditSession(ores.getResourceableId()); main = createVelocityContainer("index"); @@ -369,7 +381,7 @@ public class EditorMainController extends MainLayoutBasicController implements G } } catch (RuntimeException e) { log.warn(RELEASE_LOCK_AT_CATCH_EXCEPTION+" [in <init>]", e); - this.dispose(); + dispose(); throw e; } } diff --git a/src/main/java/org/olat/course/nodes/CPCourseNode.java b/src/main/java/org/olat/course/nodes/CPCourseNode.java index dd456e84c457160ed5b44072f58ebee60e771962..91e77a8ae673b0be6e13d9401fcaa2beac21c0f7 100644 --- a/src/main/java/org/olat/course/nodes/CPCourseNode.java +++ b/src/main/java/org/olat/course/nodes/CPCourseNode.java @@ -37,6 +37,8 @@ import org.olat.core.gui.control.generic.iframe.DeliveryOptions; import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.core.util.Util; import org.olat.core.util.resource.OresHelper; import org.olat.course.ICourse; @@ -178,14 +180,19 @@ public class CPCourseNode extends AbstractAccessableCourseNode { * previous behaviour */ public void updateModuleConfigDefaults(boolean isNewNode) { + int CURRENTVERSION = 7; ModuleConfiguration config = getModuleConfiguration(); if (isNewNode) { // use defaults for new course building blocks config.setBooleanEntry(NodeEditController.CONFIG_STARTPAGE, Boolean.FALSE.booleanValue()); config.setBooleanEntry(NodeEditController.CONFIG_COMPONENT_MENU, Boolean.TRUE.booleanValue()); - //fxdiff VCRP-13: cp navigation + // cp navigation config.setBooleanEntry(CPEditController.CONFIG_SHOWNAVBUTTONS, Boolean.TRUE.booleanValue()); - config.setConfigurationVersion(2); + // how to render files (include jquery etc) + DeliveryOptions nodeDeliveryOptions = DeliveryOptions.defaultWithGlossary(); + nodeDeliveryOptions.setInherit(Boolean.TRUE); + config.set(CPEditController.CONFIG_DELIVERYOPTIONS, nodeDeliveryOptions); + config.setConfigurationVersion(CURRENTVERSION); } else { config.remove(NodeEditController.CONFIG_INTEGRATION); if (config.getConfigurationVersion() < 2) { @@ -209,47 +216,65 @@ public class CPCourseNode extends AbstractAccessableCourseNode { config.setBooleanEntry(CPEditController.CONFIG_SHOWNAVBUTTONS, Boolean.TRUE.booleanValue()); config.setConfigurationVersion(4); } - - if(config.getConfigurationVersion() < 5) { + // Version 5 was ineffective since the delivery options were not set. We have to redo this and + // save it as version 6 + if(config.getConfigurationVersion() < 7) { String contentEncoding = (String)config.get(NodeEditController.CONFIG_CONTENT_ENCODING); + if (contentEncoding != null && contentEncoding.equals("auto")) { + contentEncoding = null; // new style for auto + } String jsEncoding = (String)config.get(NodeEditController.CONFIG_JS_ENCODING); + if (jsEncoding != null && jsEncoding.equals("auto")) { + jsEncoding = null; // new style for auto + } + CPPackageConfig reConfig = null; - DeliveryOptions nodeDeliveryOptions = new DeliveryOptions(); - RepositoryEntry re = getReferencedRepositoryEntry(); - if(re != null) { - reConfig = CPManager.getInstance().getCPPackageConfig(re.getOlatResource()); - - //move the settings from the node to the repo - if(reConfig == null || reConfig.getDeliveryOptions() == null) { + DeliveryOptions nodeDeliveryOptions = (DeliveryOptions)config.get(CPEditController.CONFIG_DELIVERYOPTIONS); + if (nodeDeliveryOptions == null) { + // Update missing delivery options now, inherit from repo by default + nodeDeliveryOptions = DeliveryOptions.defaultWithGlossary(); + nodeDeliveryOptions.setInherit(Boolean.TRUE); + + RepositoryEntry re = getReferencedRepositoryEntry(); + // Check if delivery options are set for repo entry, if not create default + if(re != null) { + reConfig = CPManager.getInstance().getCPPackageConfig(re.getOlatResource()); if(reConfig == null) { reConfig = new CPPackageConfig(); } - reConfig.setDeliveryOptions(new DeliveryOptions()); - nodeDeliveryOptions.setInherit(Boolean.TRUE); - nodeDeliveryOptions.setStandardMode(Boolean.TRUE); - reConfig.getDeliveryOptions().setStandardMode(Boolean.TRUE); - reConfig.getDeliveryOptions().setContentEncoding(contentEncoding); - reConfig.getDeliveryOptions().setJavascriptEncoding(jsEncoding); - CPManager.getInstance().setCPPackageConfig(re.getOlatResource(), reConfig); - } else { DeliveryOptions repoDeliveryOptions = reConfig.getDeliveryOptions(); - if(((contentEncoding == null && repoDeliveryOptions.getContentEncoding() == null) || (contentEncoding != null && contentEncoding.equals(repoDeliveryOptions.getContentEncoding()))) - && ((jsEncoding == null && repoDeliveryOptions.getJavascriptEncoding() == null) || (jsEncoding != null && jsEncoding.equals(repoDeliveryOptions.getJavascriptEncoding())))) { - nodeDeliveryOptions.setInherit(Boolean.TRUE); + if (repoDeliveryOptions == null) { + // migrate existing config back to repo entry using the default as a base + repoDeliveryOptions = DeliveryOptions.defaultWithGlossary(); + reConfig.setDeliveryOptions(repoDeliveryOptions); + repoDeliveryOptions.setContentEncoding(contentEncoding); + repoDeliveryOptions.setJavascriptEncoding(jsEncoding); + CPManager.getInstance().setCPPackageConfig(re.getOlatResource(), reConfig); } else { - nodeDeliveryOptions.setInherit(Boolean.FALSE); - nodeDeliveryOptions.setContentEncoding(contentEncoding); - nodeDeliveryOptions.setJavascriptEncoding(jsEncoding); + // see if we have any different settings than the repo. if so, don't use inherit mode + if(contentEncoding != repoDeliveryOptions.getContentEncoding() || jsEncoding != repoDeliveryOptions.getJavascriptEncoding()) { + nodeDeliveryOptions.setInherit(Boolean.FALSE); + nodeDeliveryOptions.setContentEncoding(contentEncoding); + nodeDeliveryOptions.setJavascriptEncoding(jsEncoding); + } } } + // remove old config parameters + config.remove(NodeEditController.CONFIG_CONTENT_ENCODING); + config.remove(NodeEditController.CONFIG_JS_ENCODING); + // replace with new delivery options + config.set(CPEditController.CONFIG_DELIVERYOPTIONS, nodeDeliveryOptions); } - - config.setConfigurationVersion(5); + config.setConfigurationVersion(7); } // else node is up-to-date - nothing to do } + if (config.getConfigurationVersion() != CURRENTVERSION) { + OLog logger = Tracing.createLoggerFor(CPCourseNode.class); + logger.error("CP course node version not updated to lastest version::" + CURRENTVERSION + ", was::" + config.getConfigurationVersion() + ". Check the code, programming error."); + } } /** diff --git a/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java b/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java index 72f267d33ce491f4c4258e7af59f9c359bc31139..28545a91a2822fd1bb90fc190446fad1e0acd582 100644 --- a/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java +++ b/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java @@ -115,15 +115,13 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode { if (!admin) { RepositoryManager rm = RepositoryManager.getInstance(); - if(roles.isInstitutionalResourceManager() || roles.isAuthor()) { - if (re != null) { - admin = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re) - || rm.isInstitutionalRessourceManagerFor(ureq.getIdentity(), roles, re); - } + if (re != null) { + admin = rm.isOwnerOfRepositoryEntry(ureq.getIdentity(), re) + || rm.isInstitutionalRessourceManagerFor(ureq.getIdentity(), roles, re); + moderator = admin + || rm.isIdentityInTutorSecurityGroup(ureq.getIdentity(), re) + || isCoach(re, ureq.getIdentity()); } - moderator = admin - || rm.isIdentityInTutorSecurityGroup(ureq.getIdentity(), re) - || isCoach(re, ureq.getIdentity()); } // create run controller diff --git a/src/main/java/org/olat/course/nodes/bc/BCWebService.java b/src/main/java/org/olat/course/nodes/bc/BCWebService.java index 07949de5b5c864c554fef6786a8d1bc49c1d7d0b..158cf382c06e88fa38c8604b002ac154d86bd338 100644 --- a/src/main/java/org/olat/course/nodes/bc/BCWebService.java +++ b/src/main/java/org/olat/course/nodes/bc/BCWebService.java @@ -70,6 +70,7 @@ import org.olat.resource.accesscontrol.ACService; import org.olat.resource.accesscontrol.AccessResult; import org.olat.restapi.repository.course.AbstractCourseNodeWebService; import org.olat.restapi.repository.course.CourseWebService; +import org.olat.restapi.repository.course.CoursesWebService; import org.olat.restapi.support.vo.FolderVO; import org.olat.restapi.support.vo.FolderVOes; @@ -102,7 +103,7 @@ public class BCWebService extends AbstractCourseNodeWebService { @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getFolders(@PathParam("courseId") Long courseId, @Context HttpServletRequest httpRequest) { - final ICourse course = CourseWebService.loadCourse(courseId); + final ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (!CourseWebService.isCourseAccessible(course, false, httpRequest)) { @@ -267,7 +268,7 @@ public class BCWebService extends AbstractCourseNodeWebService { @Path("{nodeId}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getFolder(@PathParam("courseId") Long courseId, @PathParam("nodeId") String nodeId, @Context HttpServletRequest httpRequest) { - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (!CourseWebService.isCourseAccessible(course, false, httpRequest)) { @@ -311,7 +312,7 @@ public class BCWebService extends AbstractCourseNodeWebService { public VFSWebservice getVFSWebService(@PathParam("courseId") Long courseId, @PathParam("nodeId") String nodeId, @Context HttpServletRequest request) { boolean author = isAuthor(request); - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { throw new WebApplicationException( Response.serverError().status(Status.NOT_FOUND).build()); } else if (!author && !CourseWebService.isCourseAccessible(course, false, request)) { diff --git a/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_fr.properties index c2cd689b49eedcc563e219e0be5813a8cc424d38..c98792200168fc598102074e4e2c929cb77f6e5d 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_fr.properties @@ -1,16 +1,45 @@ -#Wed Apr 02 08:19:34 CEST 2014 +#Fri Apr 04 17:39:42 CEST 2014 add.checkbox=Ajouter une case \u00E0 cocher assessment=Evaluation +assessment.checkbox.description=Modifier en fonction de la case \u00E0 cocher\: modifier la case \u00E0 cocher s\u00E9lectionner gr\u00E2ce au filtre de tous les participants. +award.point.on=Points attribu\u00E9s lors de la s\u00E9lection box.assessment=Editer par case \u00E0 cocher +box.check=S\u00E9lectionn\u00E9 box.points=Points box.points.info=({0} points) checkbox.title=Titre checklist=Listes de contr\u00F4le checklist.point.example=Points (min.\: {0} / max.\: {1}) +checklist.update.assessment=Mettre \u00E0 jour les \u00E9valuations de tous les participants. +checklist.update.efficiencystatements=Mettre \u00E0 jour les certificats de tous les utilisateurs. +chelp.assessment.checkbox.1=Acc\u00E9dez aux participants du cours que vous supervisez et filtr\u00E9 en fonction de la case \u00E0 cocher. Cela permet de r\u00E9duire le taux d'erreur de mani\u00E8re significative, en particulier pour les grandes listes de contr\u00F4le avec de nombreuses cases \u00E0 cocher. +chelp.assessment.checkbox.2=La pr\u00E9s\u00E9lection des groupes permet de filter le tableau de listes de contr\u00F4le. Vous pouvez trier le tableau par pr\u00E9nom ou nom de famille, afin de permettre une comparaison plus ais\u00E9e entre la liste des participants et les listes de contr\u00F4le. +chelp.checkbox.1=Ici, vous pouvez cr\u00E9er et \u00E9diter les cases \u00E0 cocher de la liste de contr\u00F4le que vous avez pr\u00E9alablement configur\u00E9e. Dans le tableau, vous trouverez les cases \u00E0 cocher existant d\u00E9j\u00E0 dans cette liste de contr\u00F4le. Cliquez "Ajouter une case \u00E0 cocher" pour cr\u00E9er \u00E0 une nouvelle case \u00E0 cocher. Cela ouvre un nouvel formulaire. +chelp.checkbox.2=<strong>$\:checkbox.title</strong>\: saisissez un titre court mais descriptif pour la nouvelle case \u00E0 cocher. +chelp.checkbox.3=<strong>$\:release</strong>\: d\u00E9fini qui peut effectivement s\u00E9lectionn\u00E9 la case. Pour "Participant et entra\u00EEneur", tous deux peuvent cocher la case. Si "Entra\u00EEneur" est choisi, les participants verront la case, mais ne seront pas en mesure de la s\u00E9lectionner. +coach.desc=Dans la liste ci-dessous vous trouverez tous les participants du cours que vous supervisez. S\u00E9lectionnez "$\:table.header.edit.checkbox" pour changer les cases \u00E0 cocher ou le score d'un participant. +coach.due.date.desc=S'il vous pla\u00EEt noter que cette liste de contr\u00F4le fixe un d\u00E9lai. En tant que coach, vous ne devez effectuer des changements qu'apr\u00E8s la date limite d'expiration. comment.nocomment=$org.olat.course.nodes.ms\:comment.nocomment comment.title=$org.olat.course.nodes.ms\:comment.title condition.accessibility.title=Acc\u00E8s +config.checkbox.description=Clicuez "$\:add.checkbox" pour cr\u00E9er une nouvelle case \u00E0 cocher ou s\u00E9lectionnez "$org.olat.core\:edit" pour configurer une case \u00E0 cocher existante. config.checkbox.title=$\:pane.tab.checkbox config.comment=Commentaire individuel +config.cutvalue=Points \u00E0 obtenir pour 'r\u00E9ussi' +config.description=Choisissez si une date limite doit s'appliquer \u00E0 la liste de contr\u00F4le, apr\u00E8s quoi elle sera verrouill\u00E9 pour les utilisateurs. Des informations sur l'\u00E9tat 'r\u00E9ussi' ou le score peut \u00EAtre activ\u00E9 ici. +config.due.date=Date d'\u00E9ch\u00E9ance +config.due.date.on=Verrouiller la liste de contr\u00F4le pour les utilisateurs apr\u00E8s le d\u00E9lai +config.output=Type d'affichage +config.output.coach=Manuellement par le coach +config.output.cutvalue=Automatiquement par valeur limite +config.output.sum=Automatiquement par nombre de cases coch\u00E9es +config.passed=Afficher r\u00E9ussi/pas r\u00E9ussi +config.points=Distribuer points +config.points.max=Maximum de points r\u00E9alisables +config.points.min=Minimum de points r\u00E9alisables +config.points.on=Total des cases \u00E0 cocher +config.tip.coach=Indication pour les coaches +config.tip.user=Indication pour tous les utilisateurs +config.title=Configuration des listes de contr\u00F4le description=Description done.by=Compl\u00E9t\u00E9 par\: diff --git a/src/main/java/org/olat/course/nodes/cp/CPRunController.java b/src/main/java/org/olat/course/nodes/cp/CPRunController.java index a669636ee36a5750d37419ddf941e1ba38db6de2..232bd81dede3aa35ed82d3527a63d2f8271936f7 100644 --- a/src/main/java/org/olat/course/nodes/cp/CPRunController.java +++ b/src/main/java/org/olat/course/nodes/cp/CPRunController.java @@ -162,7 +162,7 @@ public class CPRunController extends BasicController implements ControllerEventL } @Override - //fxdiff BAKS-7 Resume function + // Resume function public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(entries == null || entries.isEmpty()) return; @@ -205,8 +205,8 @@ public class CPRunController extends BasicController implements ControllerEventL //fxdiff VCRP-13: cp navigation boolean navButtons = isNavButtonConfigured(); cpDispC = CPUIFactory.getInstance().createContentOnlyCPDisplayController(ureq, getWindowControl(), new LocalFolderImpl(cpRoot), activateFirstPage, navButtons, deliveryOptions, nodecmd, courseResource); - cpDispC.setContentEncoding(getContentEncoding()); - cpDispC.setJSEncoding(getJSEncoding()); + cpDispC.setContentEncoding(deliveryOptions.getContentEncoding()); + cpDispC.setJSEncoding(deliveryOptions.getJavascriptEncoding()); cpDispC.addControllerListener(this); main.setContent(cpDispC.getInitialComponent()); @@ -232,29 +232,15 @@ public class CPRunController extends BasicController implements ControllerEventL private boolean isExternalMenuConfigured() { return (config.getBooleanEntry(NodeEditController.CONFIG_COMPONENT_MENU).booleanValue()); } - - //fxdiff VCRP-13: cp navigation + + /** + * @return true: show next-previous buttons; false: hide next-previous buttons + */ private boolean isNavButtonConfigured() { Boolean navButton = config.getBooleanEntry(CPEditController.CONFIG_SHOWNAVBUTTONS); return navButton == null ? true : navButton.booleanValue(); } - private String getContentEncoding() { - String encoding = (String)config.get(NodeEditController.CONFIG_CONTENT_ENCODING); - if(!encoding.equals(NodeEditController.CONFIG_CONTENT_ENCODING_AUTO)) { - return encoding; - } - return null; - } - - private String getJSEncoding() { - String encoding = (String)config.get(NodeEditController.CONFIG_JS_ENCODING); - if(!encoding.equals(NodeEditController.CONFIG_JS_ENCODING_AUTO)) { - return encoding; - } - return null; - } - /** * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) */ diff --git a/src/main/java/org/olat/course/nodes/en/ENWebService.java b/src/main/java/org/olat/course/nodes/en/ENWebService.java index 73d3c50505362e939d93a499ba0bfb55dba5a7e3..edb037c859b79bb92dbaa1efa03b7447e6d0c3cf 100644 --- a/src/main/java/org/olat/course/nodes/en/ENWebService.java +++ b/src/main/java/org/olat/course/nodes/en/ENWebService.java @@ -52,7 +52,7 @@ import org.olat.group.BusinessGroupService; import org.olat.group.BusinessGroupShort; import org.olat.modules.ModuleConfiguration; import org.olat.restapi.repository.course.AbstractCourseNodeWebService; -import org.olat.restapi.repository.course.CourseWebService; +import org.olat.restapi.repository.course.CoursesWebService; import org.olat.restapi.support.vo.GroupVO; /** @@ -163,7 +163,7 @@ public class ENWebService extends AbstractCourseNodeWebService { if(!isAuthor(httpRequest)) { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (!isAuthorEditor(course, httpRequest)) { diff --git a/src/main/java/org/olat/group/ui/edit/_content/tab_bgGrpMngmnt.html b/src/main/java/org/olat/group/ui/edit/_content/tab_bgGrpMngmnt.html index 8ff211edbe119dcba153304ec066012e6c34f85d..8d253dcda9ef4920e8fde983f4ae096e5f1fe9d1 100644 --- a/src/main/java/org/olat/group/ui/edit/_content/tab_bgGrpMngmnt.html +++ b/src/main/java/org/olat/group/ui/edit/_content/tab_bgGrpMngmnt.html @@ -5,17 +5,18 @@ </fieldset> <fieldset> <legend>$r.translate("group.edit.tab.members")</legend> - - <div class="o_buttons_box_right"><br/><br/> - #if($r.available("addMembers")) - $r.render("addMembers") - #end - #if($r.available("importMembers")) - $r.render("importMembers") - #end + <div style="position: relative;"> + <div class="o_buttons_box_right" style="top: 0em;"> + #if($r.available("addMembers")) + $r.render("addMembers") + #end + #if($r.available("importMembers")) + $r.render("importMembers") + #end + </div> + + $r.contextHelpWithWrapper("org.olat.group.ui.edit","grp-memberOwner.html","help.hover.bgGrpMngmntOwner") + $r.render("members") </div> - - $r.contextHelpWithWrapper("org.olat.group.ui.edit","grp-memberOwner.html","help.hover.bgGrpMngmntOwner") - $r.render("members") </fieldset> diff --git a/src/main/java/org/olat/group/ui/main/_content/group_list_overview.html b/src/main/java/org/olat/group/ui/main/_content/group_list_overview.html index 6d51efac93c2315aa3b048811b397f3feddf9a5a..79d6e4e122b0d6602d86ae1c4132ffd2a31ddc71 100644 --- a/src/main/java/org/olat/group/ui/main/_content/group_list_overview.html +++ b/src/main/java/org/olat/group/ui/main/_content/group_list_overview.html @@ -1,11 +1,6 @@ <h4 class="b_with_small_icon_left b_group_icon"> $r.translate("menu.groups") </h4> -<div class="o_buttons_box_right"> - #if($r.available("create")) - $r.render("create") - #end -</div> <div class="b_clearfix"> $r.render("segments")<br/> $r.render("groupList") diff --git a/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType1.java b/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType1.java index 1c1b3db0c5124fbc07e280704fb6bb0fcb20720d..28a5c86810b3bc28266fdff856d852c6b574c973 100644 --- a/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType1.java +++ b/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType1.java @@ -34,13 +34,17 @@ import java.util.Locale; import java.util.Map; import org.apache.commons.lang.StringEscapeUtils; +import org.olat.core.id.User; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; import org.olat.core.logging.OLATRuntimeException; import org.olat.core.util.Formatter; +import org.olat.core.util.StringHelper; import org.olat.core.util.filter.FilterFactory; import org.olat.ims.qti.editor.beecom.parser.ItemParser; import org.olat.ims.qti.export.helper.QTIItemObject; +import org.olat.user.UserManager; +import org.olat.user.propertyhandlers.UserPropertyHandler; /** * Initial Date: May 23, 2006 <br> @@ -62,7 +66,9 @@ public class QTIExportFormatterCSVType1 extends QTIExportFormatter { // CELFI#107 (Header question max lenght) private int cut = 30; - + // user properties + private List<UserPropertyHandler> userPropertyHandlers; + /** * @param locale * @param type @@ -79,6 +85,11 @@ public class QTIExportFormatterCSVType1 extends QTIExportFormatter { this.esc = esc; this.car = car; this.tagless = tagless; + // initialize user property handlers + UserManager um = UserManager.getInstance(); + this.userPropertyHandlers = um.getUserPropertyHandlersFor(this.getClass().getName(), true); + this.translator = um.getPropertyHandlerTranslator(this.translator); + } public void openReport() { @@ -185,30 +196,33 @@ public class QTIExportFormatterCSVType1 extends QTIExportFormatter { } public void openResultSet(QTIExportSet set) { - - String firstName = set.getFirstName(); - String lastName = set.getLastName(); - ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(set.getIdentity()); - String login = BusinessControlFactory.getInstance().getAsURIString(Collections.singletonList(ce), false); - String instUsrIdent = set.getInstitutionalUserIdentifier(); - if (instUsrIdent == null) { - instUsrIdent = translator.translate("column.field.notavailable"); - } - float assessPoints = set.getScore(); - boolean isPassed = set.getIsPassed(); - + // header for personalized download (iqtest) sb.append(row_counter); sb.append(sep); - sb.append(lastName); - sb.append(sep); - sb.append(firstName); - sb.append(sep); - sb.append(login); - sb.append(sep); - sb.append(instUsrIdent); + + // add configured user properties + User user = set.getIdentity().getUser(); + for (UserPropertyHandler userPropertyHandler : this.userPropertyHandlers) { + if (userPropertyHandler == null) { + continue; + } + String property = userPropertyHandler.getUserProperty(user, translator.getLocale()); + if (!StringHelper.containsNonWhitespace(property)) { + property = translator.translate("column.field.notavailable"); + } + sb.append(property); + sb.append(sep); + } + + // add other user and session information + ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(set.getIdentity()); + String homepage = BusinessControlFactory.getInstance().getAsURIString(Collections.singletonList(ce), false); + sb.append(homepage); sb.append(sep); + float assessPoints = set.getScore(); sb.append(assessPoints); sb.append(sep); + boolean isPassed = set.getIsPassed(); sb.append(isPassed); sb.append(sep); sb.append(set.getIp()); @@ -449,35 +463,36 @@ public class QTIExportFormatterCSVType1 extends QTIExportFormatter { // header for personalized download (iqtest) String sequentialNumber = translator.translate("column.header.seqnum"); - - String lastName = translator.translate("column.header.name"); - String firstName = translator.translate("column.header.vorname"); - String login = translator.translate("column.header.login"); - String instUsrIdent = translator.translate("column.header.instUsrIdent"); - String assessPoint = translator.translate("column.header.assesspoints"); - String passed = translator.translate("column.header.passed"); - String ipAddress = translator.translate("column.header.ipaddress"); - String date = translator.translate("column.header.date"); - String duration = translator.translate("column.header.duration"); - hr2Intro.append(sequentialNumber); hr2Intro.append(sep); - hr2Intro.append(lastName); - hr2Intro.append(sep); - hr2Intro.append(firstName); - hr2Intro.append(sep); - hr2Intro.append(login); - hr2Intro.append(sep); - hr2Intro.append(instUsrIdent); + + // add configured user properties + for (UserPropertyHandler userPropertyHandler : this.userPropertyHandlers) { + if (userPropertyHandler == null) { + continue; + } + String header = translator.translate(userPropertyHandler.i18nFormElementLabelKey()); + hr2Intro.append(header); + hr2Intro.append(sep); + } + + // add other user and session information + String homepage = translator.translate("column.header.homepage"); + hr2Intro.append(homepage); hr2Intro.append(sep); + String assessPoint = translator.translate("column.header.assesspoints"); hr2Intro.append(assessPoint); hr2Intro.append(sep); + String passed = translator.translate("column.header.passed"); hr2Intro.append(passed); hr2Intro.append(sep); + String ipAddress = translator.translate("column.header.ipaddress"); hr2Intro.append(ipAddress); hr2Intro.append(sep); + String date = translator.translate("column.header.date"); hr2Intro.append(date); hr2Intro.append(sep); + String duration = translator.translate("column.header.duration"); hr2Intro.append(duration); hr2Intro.append(sep); diff --git a/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType2.java b/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType2.java index 782979f4f27332bba4629ce6a944f2391fa37d23..1cbb1e7e467233c4a3d9563842144efc2ccb8f81 100644 --- a/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType2.java +++ b/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType2.java @@ -186,10 +186,6 @@ public class QTIExportFormatterCSVType2 extends QTIExportFormatter { } public void openResultSet(QTIExportSet set) { - String instUsrIdent = set.getInstitutionalUserIdentifier(); - if (instUsrIdent == null) { - instUsrIdent = translator.translate("column.field.notavailable"); - } float assessPoints = set.getScore(); Long key = set.getIdentity().getKey(); diff --git a/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType3.java b/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType3.java index f154277aaad9d097a470171239e29062157feaa9..5bf27bf7bc9d121c7a2a9c32fe322a7e03178167 100644 --- a/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType3.java +++ b/src/main/java/org/olat/ims/qti/export/QTIExportFormatterCSVType3.java @@ -179,12 +179,6 @@ public class QTIExportFormatterCSVType3 extends QTIExportFormatter{ } public void openResultSet(QTIExportSet set) { - - String instUsrIdent = set.getInstitutionalUserIdentifier(); - if (instUsrIdent == null){ - instUsrIdent = translator.translate("column.field.notavailable"); - } - if (anonymizerCallback == null) sb.append(row_counter); else diff --git a/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_de.properties index 216dfadb6d0bfd5a544b384ef5765576d77f3600..3f0621175b58a620e236f7ec671a4584a174626f 100644 --- a/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_de.properties @@ -31,7 +31,7 @@ column.header.details=Details column.header.duration=Gesamtdauer (s) column.header.instUsrIdent=Institutionsnummer column.header.ipaddress=IP-Adresse -column.header.login=Benutzername +column.header.homepage=Homepage column.header.name=Name column.header.number=Probanddecknummer column.header.passed=Bestanden diff --git a/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_en.properties index 7fcdddc7d87758bc1887b67a7109b16f0869fcb8..50f2173e743be5546fa007ecf1588ea1a5e830be 100644 --- a/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_en.properties @@ -31,7 +31,7 @@ column.header.details=Details column.header.duration=Total time (s) column.header.instUsrIdent=Institution identifier column.header.ipaddress=IP address -column.header.login=User name +column.header.homepage=Home page column.header.name=Name column.header.number=Test person's number column.header.passed=Passed diff --git a/src/main/java/org/olat/instantMessaging/ui/ChatController.java b/src/main/java/org/olat/instantMessaging/ui/ChatController.java index 45c2dbee7586143947d3571f5163ae4a830cd7e4..e23e51bd5c19fbe0f4593c22264ee572e008245c 100644 --- a/src/main/java/org/olat/instantMessaging/ui/ChatController.java +++ b/src/main/java/org/olat/instantMessaging/ui/ChatController.java @@ -28,9 +28,11 @@ package org.olat.instantMessaging.ui; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.Deque; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.LinkedBlockingDeque; import javax.servlet.http.HttpServletRequest; @@ -79,7 +81,7 @@ public class ChatController extends BasicController implements GenericEventListe private final VelocityContainer chatMsgFieldContent; private Map<Long,String> avatarKeyCache = new HashMap<Long,String>(); - private List<ChatMessage> messageHistory = new ArrayList<ChatMessage>(); + private Deque<ChatMessage> messageHistory = new LinkedBlockingDeque<>(); private Link refresh, todayLink, lastWeek, lastMonth; private JSAndCSSComponent jsc; @@ -343,25 +345,21 @@ public class ChatController extends BasicController implements GenericEventListe creationDate = formatter.formatDateAndTime(message.getCreationDate()); } + boolean first = true; String from = message.getFromNickName(); - - synchronized (messageHistory) { - boolean first = true; - if(!messageHistory.isEmpty()) { - ChatMessage last = messageHistory.get(messageHistory.size() - 1); - if(from.equals(last.getFrom())) { - first = false; - } - } + ChatMessage last = messageHistory.peekLast(); + if(last != null && from.equals(last.getFrom())) { + first = false; + } - boolean anonym = message.isAnonym(); - Long fromKey = message.getFromKey(); - ChatMessage msg = new ChatMessage(creationDate, from, fromKey, m, first, anonym); - if(!anonym ) { - msg.setAvatarKey(getAvatarKey(message.getFromKey())); - } - messageHistory.add(msg); + boolean anonym = message.isAnonym(); + Long fromKey = message.getFromKey(); + ChatMessage msg = new ChatMessage(creationDate, from, fromKey, m, first, anonym); + if(!anonym ) { + msg.setAvatarKey(getAvatarKey(message.getFromKey())); } + messageHistory.addLast(msg); + chatMsgFieldContent.contextPut("chatMessages", messageHistory); chatMsgFieldContent.contextPut("focus", new Boolean(focus)); } diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java index 9c2d53dc42ba971e0e4172d24c42d07617ce3193..d2b910a666bc7cf3080277ce426b7d7c37a87858 100644 --- a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java +++ b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java @@ -72,6 +72,7 @@ import org.olat.modules.fo.Message; import org.olat.properties.Property; import org.olat.restapi.repository.course.AbstractCourseNodeWebService; import org.olat.restapi.repository.course.CourseWebService; +import org.olat.restapi.repository.course.CoursesWebService; import org.olat.restapi.security.RestSecurityHelper; /** @@ -101,7 +102,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getForums(@PathParam("courseId") Long courseId, @Context HttpServletRequest httpRequest) { - final ICourse course = CourseWebService.loadCourse(courseId); + final ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (!CourseWebService.isCourseAccessible(course, false, httpRequest)) { @@ -221,7 +222,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { @Path("{nodeId}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getForum(@PathParam("courseId") Long courseId, @PathParam("nodeId") String nodeId, @Context HttpServletRequest httpRequest) { - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (!CourseWebService.isCourseAccessible(course, false, httpRequest)) { @@ -256,7 +257,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { @Path("{nodeId}/forum") public ForumWebService getForumContent(@PathParam("courseId") Long courseId, @PathParam("nodeId") String nodeId, @Context HttpServletRequest request) { - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { throw new WebApplicationException(Response.serverError().status(Status.NOT_FOUND).build()); } else if (!CourseWebService.isCourseAccessible(course, false, request)) { @@ -371,7 +372,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { } //load forum - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (!isAuthorEditor(course, request)) { diff --git a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java index b29de9a9c4e1dec7e9f1c4898f54c858fe1a13f3..369ce410ed55b51a56d8f7393b9a0e8ceb3c460d 100644 --- a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java @@ -87,7 +87,7 @@ public abstract class AbstractCourseNodeWebService { return Response.serverError().status(Status.NOT_ACCEPTABLE).build(); } - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (!isAuthorEditor(course, request)) { @@ -128,7 +128,7 @@ public abstract class AbstractCourseNodeWebService { if(config == null || !config.isValid()) return Response.serverError().status(Status.CONFLICT).build(); - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (!isAuthorEditor(course, request)) { diff --git a/src/main/java/org/olat/restapi/repository/course/CourseAssessmentWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseAssessmentWebService.java index 5402d78aabcb644afe17bd1cad3ba57200dab335..80634f5b536e608feb0ef2376943a9923c12de97 100644 --- a/src/main/java/org/olat/restapi/repository/course/CourseAssessmentWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CourseAssessmentWebService.java @@ -145,7 +145,7 @@ public class CourseAssessmentWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } @@ -201,7 +201,7 @@ public class CourseAssessmentWebService { return Response.serverError().status(Status.NOT_FOUND).build(); } - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } @@ -247,7 +247,7 @@ public class CourseAssessmentWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (!isAuthorEditor(course, httpRequest)) { @@ -501,7 +501,7 @@ public class CourseAssessmentWebService { return Response.serverError().status(Status.NOT_FOUND).build(); } - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } diff --git a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java index 7d8d3a4c9e6acf1cca4c5f5a29c46e475ab07fd3..75198d600f3bb8427ffd7f83887ad768479f0b88 100644 --- a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java @@ -132,7 +132,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } @@ -1360,8 +1360,8 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response attachTaskFile(@PathParam("courseId") Long courseId, @PathParam("nodeId") String nodeId, @Context HttpServletRequest request) { - ICourse course = CourseWebService.loadCourse(courseId); - CourseNode node = getParentNode(course, nodeId); + ICourse course = CoursesWebService.loadCourse(courseId); + CourseNode node = getParentNode(course, nodeId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } @@ -1591,7 +1591,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { } TaskConfigVO config = new TaskConfigVO(); - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); CourseNode courseNode = getParentNode(course, nodeId); ModuleConfiguration moduleConfig = courseNode.getModuleConfiguration(); //build configuration with fallback to default values @@ -1762,7 +1762,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { } SurveyConfigVO config = new SurveyConfigVO(); - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); CourseNode courseNode = getParentNode(course, nodeId); ModuleConfiguration moduleConfig = courseNode.getModuleConfiguration(); //build configuration with fallback to default values @@ -1925,7 +1925,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { public Response getTestConfiguration(@PathParam("courseId") Long courseId, @PathParam("nodeId") String nodeId) { TestConfigVO config = new TestConfigVO(); - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); CourseNode courseNode = getParentNode(course, nodeId); //build configuration with fallback to default values ModuleConfiguration moduleConfig = courseNode.getModuleConfiguration(); diff --git a/src/main/java/org/olat/restapi/repository/course/CourseResourceFolderWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseResourceFolderWebService.java index fb63ec79142a8afddf34c778cef70be7b929a7fe..e6aa95c45900cd1b1dc42319e2c9f977fe179b90 100644 --- a/src/main/java/org/olat/restapi/repository/course/CourseResourceFolderWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CourseResourceFolderWebService.java @@ -298,7 +298,7 @@ public class CourseResourceFolderWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } @@ -369,7 +369,7 @@ public class CourseResourceFolderWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - ICourse course = CourseWebService.loadCourse(courseId); + ICourse course = CoursesWebService.loadCourse(courseId); if(course == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } diff --git a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java index 5fc695fe7f6590f64ec136e4c96a2767a31343b8..5f749765c5a43be4789353183df83b146c2d963b 100644 --- a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java @@ -21,6 +21,7 @@ package org.olat.restapi.repository.course; import static org.olat.restapi.security.RestSecurityHelper.getIdentity; import static org.olat.restapi.security.RestSecurityHelper.getUserRequest; +import static org.olat.restapi.security.RestSecurityHelper.isAdmin; import static org.olat.restapi.security.RestSecurityHelper.isAuthor; import static org.olat.restapi.security.RestSecurityHelper.isAuthorEditor; @@ -116,6 +117,14 @@ public class CourseWebService { static { cc.setMaxAge(-1); } + + private final ICourse course; + private final OLATResource courseOres; + + public CourseWebService(OLATResource courseOres, ICourse course) { + this.course = course; + this.courseOres = courseOres; + } /** * The version of the Course Web Service @@ -142,16 +151,10 @@ public class CourseWebService { } @Path("calendar") - public CalWebService getCourseCalendarWebService(@PathParam("courseId") Long courseId, - @Context HttpServletRequest request) { - ICourse course = loadCourse(courseId); - if(course == null) { - throw new WebApplicationException(Response.serverError().status(Status.NOT_FOUND).build()); - } + public CalWebService getCourseCalendarWebService(@Context HttpServletRequest request) { if(course.getCourseConfig().isCalendarEnabled()) { - OLATResource ores = getCourseOLATResource(courseId); UserRequest ureq = getUserRequest(request); - KalendarRenderWrapper wrapper = CourseCalendars.getCourseCalendarWrapper(ureq, ores, null); + KalendarRenderWrapper wrapper = CourseCalendars.getCourseCalendarWrapper(ureq, courseOres, null); return new CalWebService(wrapper); } return null; diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java index 09dd9e312ae08cd99c3d4a3cae4ff8bb64b5bc9f..0d2516d4cc53170956532dd690fca544a6a99dfd 100644 --- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java @@ -36,6 +36,7 @@ import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; @@ -49,6 +50,7 @@ import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; +import org.olat.core.helpers.Settings; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; @@ -80,6 +82,8 @@ import org.olat.repository.handlers.RepositoryHandler; import org.olat.repository.handlers.RepositoryHandlerFactory; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; +import org.olat.resource.accesscontrol.ACService; +import org.olat.resource.accesscontrol.AccessResult; import org.olat.restapi.security.RestSecurityHelper; import org.olat.restapi.support.ErrorWindowControl; import org.olat.restapi.support.MediaTypeVariants; @@ -190,6 +194,17 @@ public class CoursesWebService { voList.toArray(vos); return vos; } + + @Path("{courseId}") + public CourseWebService getCourse(@PathParam("courseId") Long courseId) { + OLATResource ores = getCourseOLATResource(courseId); + if(ores == null) return null; + ICourse course = CourseFactory.loadCourse(courseId); + if(course == null) return null; + CourseWebService courseWs = new CourseWebService(ores, course); + + return courseWs; + } /** * Creates an empty course, or a copy from a course if the parameter copyFrom is set. @@ -313,6 +328,42 @@ public class CoursesWebService { return Response.ok(vo).build(); } + private OLATResource getCourseOLATResource(Long courseId) { + String typeName = OresHelper.calculateTypeName(CourseModule.class); + OLATResource ores = OLATResourceManager.getInstance().findResourceable(courseId, typeName); + if(ores == null && Settings.isJUnitTest()) { + //hack for the BGContextManagerImpl which load the course + ores = OLATResourceManager.getInstance().findResourceable(courseId, "junitcourse"); + } + return ores; + } + + public static boolean isCourseAccessible(ICourse course, boolean authorRightsMandatory, HttpServletRequest request) { + if(authorRightsMandatory && !isAuthor(request)) { + return false; + } + + Identity identity = getIdentity(request); + RepositoryEntry entry = RepositoryManager.getInstance().lookupRepositoryEntry(course, true); + ACService acManager = CoreSpringFactory.getImpl(ACService.class); + AccessResult result = acManager.isAccessible(entry, identity, false); + if(result.isAccessible()) { + return true; + } + return false; + } + + public static ICourse loadCourse(Long courseId) { + try { + ICourse course = CourseFactory.loadCourse(courseId); + return course; + } catch(Exception ex) { + log.error("cannot load course with id: " + courseId, ex); + return null; + } + } + + public static ICourse importCourse(UserRequest ureq, Identity identity, File fCourseImportZIP, String displayName, String softKey, int access, boolean membersOnly) { diff --git a/src/main/java/org/olat/user/propertyhandlers/UserNameReadOnlyPropertyHandler.java b/src/main/java/org/olat/user/propertyhandlers/UserNameReadOnlyPropertyHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..93ac9c8eac8c92c2afec72d0dac6bbe819647978 --- /dev/null +++ b/src/main/java/org/olat/user/propertyhandlers/UserNameReadOnlyPropertyHandler.java @@ -0,0 +1,158 @@ +/** + * <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.user.propertyhandlers; + +import java.util.Collections; +import java.util.Locale; +import java.util.Map; + +import org.olat.basesecurity.Authentication; +import org.olat.basesecurity.BaseSecurity; +import org.olat.basesecurity.BaseSecurityManager; +import org.olat.core.gui.components.form.ValidationError; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.FormUIFactory; +import org.olat.core.gui.components.form.flexible.elements.TextElement; +import org.olat.core.id.Identity; +import org.olat.core.id.User; +import org.olat.core.id.context.BusinessControlFactory; +import org.olat.core.id.context.ContextEntry; +import org.olat.core.util.StringHelper; +import org.olat.user.AbstractUserPropertyHandler; + +/** + * <h3>Description:</h3> The UserNameReadOnlyPropertyHandler allows displaying + * of the user name. The property is read only and will throw errors when trying + * to saving values. + * <p> + * Initial Date: 04.04.2014 <br> + * + * @author gnaegi, http://www.frentix.com + */ +public class UserNameReadOnlyPropertyHandler extends AbstractUserPropertyHandler { + private String authProvider; + + /** + * Spring setter for the authentication provider + * @param authProvider + */ + public void setAuthProvider(String authProvider) { + this.authProvider = authProvider; + } + + @Override + public FormItem addFormItem(Locale locale, User user, + String usageIdentifyer, boolean isAdministrativeUser, + FormItemContainer formItemContainer) { + TextElement tElem = null; + + tElem = FormUIFactory.getInstance().addTextElement(getName(), i18nFormElementLabelKey(), 127, getInternalValue(user), formItemContainer); + tElem.setLabel(i18nFormElementLabelKey(), null); + // always read-only + tElem.setEnabled(false); + return tElem; + } + + @Override + public String getUserPropertyAsHTML(User user, Locale locale) { + BaseSecurity secMgr = BaseSecurityManager.getInstance(); + BusinessControlFactory bcFactory = BusinessControlFactory.getInstance(); + Identity identity = secMgr.findIdentityByUser(user); + if (identity != null) { + ContextEntry ce = bcFactory.createContextEntry(identity); + String homepage = bcFactory.getAsURIString(Collections.singletonList(ce), false); + return "<a href='" + homepage + "'>" + StringHelper.escapeHtml(getInternalValue(identity)) + "</a>"; + } + return ""; + } + + @Override + protected String getInternalValue(User user) { + Identity identity = BaseSecurityManager.getInstance().findIdentityByUser(user); + return getInternalValue(identity); + } + + /** + * lookup username from authentication + * @param identity + * @return + */ + private String getInternalValue(Identity identity) { + if (identity != null) { + Authentication auth = BaseSecurityManager.getInstance().findAuthentication(identity, this.authProvider); + if (auth != null) { + return auth.getAuthusername(); + } + } + return ""; + } + + @Override + protected void setInternalValue(User user, String value) { + throw new UnsupportedOperationException("Can not set user names in the read only property."); + } + + + @Override + public void updateUserFromFormItem(User user, FormItem formItem) { + throw new UnsupportedOperationException("Can not update user names by using the read only property."); + } + + @Override + public boolean isValid(User user, FormItem formItem, + Map<String, String> formContext) { + // read only, always true + return true; + } + + @Override + public boolean isValidValue(User user, String value, + ValidationError validationError, Locale locale) { + // read only, always true + return true; + } + + @Override + public String getStringValue(FormItem formItem) { + return ((TextElement) formItem).getValue(); + } + + @Override + public String getStringValue(String displayValue, Locale locale) { + return displayValue; + } + + @Override + public String i18nFormElementLabelKey() { + return "username"; + } + + @Override + public String i18nFormElementGroupKey() { + return "username"; + } + + @Override + public String i18nColumnDescriptorLabelKey() { + return "username"; + } + +} diff --git a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml index ab037a591367bddb0b9c1d7f1bc2575b24ac47a9..2d3b31c3e2207b4e70cb7f4a78022b7438642b2a 100644 --- a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml +++ b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml @@ -14,6 +14,7 @@ <bean id="org.olat.user.UserPropertiesConfig" class="org.olat.user.propertyhandlers.UserPropertiesConfigImpl" init-method="init"> <property name="userPropertyHandlers"> <list> + <ref bean="userPropertyUserName" /> <ref bean="userPropertyFirstName" /> <ref bean="userPropertyLastName" /> <ref bean="userPropertyEmail" /> @@ -96,6 +97,7 @@ </property> <property name="userViewReadOnlyProperties"> <set> + <ref bean="userPropertyUserName" /> <ref bean="userPropertyFirstName" /> <ref bean="userPropertyLastName" /> <ref bean="userPropertyInstitutionalName" /> @@ -274,6 +276,20 @@ </property> </bean> </entry> + + <entry key="org.olat.ims.qti.export.QTIExportFormatterCSVType1"> + <bean class="org.olat.user.propertyhandlers.UserPropertyUsageContext"> + <property name="description" value="Columns in download file of QTI assessment results in courses" /> + <property name="propertyHandlers"> + <list> + <ref bean="userPropertyFirstName" /> + <ref bean="userPropertyLastName" /> + <ref bean="userPropertyUserName" /> + <ref bean="userPropertyInstitutionalUserIdentifier" /> + </list> + </property> + </bean> + </entry> <entry key="org.olat.admin.user.UsermanagerUserSearchForm"> <bean class="org.olat.user.propertyhandlers.UserPropertyUsageContext"> diff --git a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertriesHandlersContext.xml b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertriesHandlersContext.xml index 794979f42d9856041247e7378581b10ec0636e30..7165e2326ab64329aa1e45f6c6d315690df3b355 100644 --- a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertriesHandlersContext.xml +++ b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertriesHandlersContext.xml @@ -9,6 +9,13 @@ <!-- Define all available user properties and its handlers --> + <bean id="userPropertyUserName" class="org.olat.user.propertyhandlers.UserNameReadOnlyPropertyHandler"> + <property name="name" value="userName" /> + <property name="group" value="account" /> + <property name="deletable" value="false" /> + <property name="authProvider" value="OLAT" /> <!-- could also be ldap, shibboleth, webdav, cal etc --> + </bean> + <bean id="userPropertyFirstName" class="org.olat.user.propertyhandlers.Generic127CharTextPropertyHandler"> <property name="name" value="firstName" /> <property name="group" value="account" /> diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties index bcf28be2bd30ac728cc8993555a53880856323ff..345ea42b38f2d511d9b2734b56c247be447e9b25 100644 --- a/src/main/resources/serviceconfig/olat.properties +++ b/src/main/resources/serviceconfig/olat.properties @@ -82,10 +82,12 @@ fallbacklang.values=de,en # ${userdata.dir}/system/configuration/org.olat.core.util.i18n.I18nModule.properties enabledLanguages=en,de,fr,it,es -# determines the character set of files written to the filesystem +# determines the character set of files written to the file system # e.g.: US-ASCII, ISO-8859-1, UTF-8 defaultcharset=UTF-8 - +# abort system startup when no UTF-8 capable file system is detected. In production this should be set to +# true to prevent accidental startup with another encoding which leads to a big data mess +enforce.utf8.filesystem=true # global on/off config for back and resume history.back.enabled=true diff --git a/src/test/java/org/olat/restapi/CourseTest.java b/src/test/java/org/olat/restapi/CourseTest.java index 1773d07caf682b359f069ea920f661498efdbe81..8417fbac609e4144f9dd7963bcef514915a5a927 100644 --- a/src/test/java/org/olat/restapi/CourseTest.java +++ b/src/test/java/org/olat/restapi/CourseTest.java @@ -123,8 +123,8 @@ public class CourseTest extends OlatJerseyTestCase { conn.shutdown(); } } catch (Exception e) { - e.printStackTrace(); - throw e; + log.error("", e); + throw e; } }