From bbb433dbd68eafcdaa340d40a8d439f6eac30eb4 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Wed, 8 Apr 2015 08:42:49 +0200 Subject: [PATCH] OO-1483: implement a prewarm infrastructure to warm-up openolat caches, implement it for velocity templates, display names of users and QTI 2.1 resources --- .../org/olat/admin/search/_content/index.html | 4 +- .../gui/multi/_content/index.html | 4 +- .../calendar/_content/importedCalConfig.html | 4 +- .../calendar/_content/manageCalendars.html | 2 +- .../org/olat/core/_spring/mainCorecontext.xml | 2 +- .../ui/_content/userComments.html | 2 +- .../org/olat/core/configuration/PreWarm.java | 5 ++ .../velocity/VelocityTemplatesPreWarm.java | 69 +++++++++++++++++++ .../olat/core/servlets/OpenOLATServlet.java | 11 +++ .../_content/translationToolI18nItemList.html | 2 +- .../_content/deletenodehasreferences.html | 2 +- .../projectbroker/_content/peekview.html | 6 +- .../olat/course/nodes/st/_content/run.html | 2 +- .../course/nodes/st/_content/stPeekView.html | 2 +- .../java/org/olat/ims/_spring/imsContext.xml | 2 +- .../java/org/olat/ims/qti/QTIPreWarm.java | 48 +++++++++++++ .../ims/qti/editor/_content/tab_fibItem.html | 2 +- .../qti/editor/_content/tab_kprimItem.html | 2 +- .../ims/qti/editor/_content/tab_mcItem.html | 2 +- .../ims/qti/editor/_content/tab_scItem.html | 2 +- .../ui/_content/newMsgIcon.html | 2 +- .../org/olat/login/_content/afterlogin.html | 2 +- .../java/org/olat/login/_content/login.html | 2 +- .../modules/wiki/_content/breadcrump.html | 2 +- .../repository/ui/list/_content/details.html | 2 +- .../repository/ui/list/_content/row_1.html | 2 +- .../ui/_content/configuration_list.html | 2 +- .../search/ui/_content/contextHelpResult.html | 2 +- .../org/olat/user/UserDisplayNamePreWarm.java | 28 ++++++++ src/main/java/org/olat/user/UserManager.java | 2 + .../java/org/olat/user/UserManagerImpl.java | 26 +++++++ .../org/olat/user/_spring/userContext.xml | 9 ++- 32 files changed, 225 insertions(+), 31 deletions(-) create mode 100644 src/main/java/org/olat/core/configuration/PreWarm.java create mode 100644 src/main/java/org/olat/core/gui/render/velocity/VelocityTemplatesPreWarm.java create mode 100644 src/main/java/org/olat/ims/qti/QTIPreWarm.java create mode 100644 src/main/java/org/olat/user/UserDisplayNamePreWarm.java diff --git a/src/main/java/org/olat/admin/search/_content/index.html b/src/main/java/org/olat/admin/search/_content/index.html index da99e3fed2d..6df15d4419d 100644 --- a/src/main/java/org/olat/admin/search/_content/index.html +++ b/src/main/java/org/olat/admin/search/_content/index.html @@ -10,7 +10,7 @@ $r.translate("fullindexer.label.running.indexer") : $searchstatus.fullIndexerStatus.NumberRunningFolderIndexer<br /> $r.translate("fullindexer.label.available.indexer") : $searchstatus.fullIndexerStatus.NumberAvailableFolderIndexer<br /> <br /> - $r.translate("fullindexer.label.finished") : #if($searchstatus.fullIndexerStatus.lastFullIndexTime > 1) $searchstatus.fullIndexerStatus.lastFullIndexDateString #else - #end<br /> + $r.translate("fullindexer.label.finished") : #if($searchstatus && $searchstatus.fullIndexerStatus.lastFullIndexTime > 1) $searchstatus.fullIndexerStatus.lastFullIndexDateString #else - #end<br /> $r.translate("fullindexer.label.time") : $searchstatus.fullIndexerStatus.indexingTime ms<br /> $r.translate("fullindexer.label.size") : $searchstatus.fullIndexerStatus.IndexSize </fieldset> @@ -32,7 +32,7 @@ <br /> $r.translate("search.label.query") : $searchstatus.queryCount<br /> <div class="o_button_group"> - #if (($searchstatus.fullIndexerStatus.status == "running") || ($searchstatus.fullIndexerStatus.status == "sleeping")) + #if ($searchstatus && ($searchstatus.fullIndexerStatus.status == "running" || $searchstatus.fullIndexerStatus.status == "sleeping")) $r.render("button.stopindexing") #else $r.render("button.startindexing") diff --git a/src/main/java/org/olat/admin/securitygroup/gui/multi/_content/index.html b/src/main/java/org/olat/admin/securitygroup/gui/multi/_content/index.html index ec32cff14ca..6233423379c 100644 --- a/src/main/java/org/olat/admin/securitygroup/gui/multi/_content/index.html +++ b/src/main/java/org/olat/admin/securitygroup/gui/multi/_content/index.html @@ -1,4 +1,4 @@ -#if ($usercount > 0) +#if ($usercount && $usercount > 0) <h4>$r.translate("import.title.finish.create")</h4> $r.render("table") #end @@ -25,7 +25,7 @@ $r.render("table") #end <div class="o_button_group"> -#if ($usercount > 0) +#if ($usercount && $usercount > 0) #if ($r.available("next")) $r.render("next") #else diff --git a/src/main/java/org/olat/commons/calendar/_content/importedCalConfig.html b/src/main/java/org/olat/commons/calendar/_content/importedCalConfig.html index f21715c0b9e..5c39b17809c 100644 --- a/src/main/java/org/olat/commons/calendar/_content/importedCalConfig.html +++ b/src/main/java/org/olat/commons/calendar/_content/importedCalConfig.html @@ -12,7 +12,7 @@ </div> #end -#if ($calendars.size() > 5) +#if ($calendars && $calendars.size() > 5) <div class="o_cal_config_scrollwrapper"> #end @@ -59,7 +59,7 @@ #end #end -#if ($calendars.size() > 5) +#if ($calendars && $calendars.size() > 5) </div> #end </fieldset> diff --git a/src/main/java/org/olat/commons/calendar/_content/manageCalendars.html b/src/main/java/org/olat/commons/calendar/_content/manageCalendars.html index 50055df3215..f077526f5bd 100644 --- a/src/main/java/org/olat/commons/calendar/_content/manageCalendars.html +++ b/src/main/java/org/olat/commons/calendar/_content/manageCalendars.html @@ -1,4 +1,4 @@ -#if ($importedCalendarWrappers.size() > 0) +#if ($importedCalendarWrappers && $importedCalendarWrappers.size() > 0) <div class="clearfix"> $r.render("importedCalendarConfig") </div> diff --git a/src/main/java/org/olat/core/_spring/mainCorecontext.xml b/src/main/java/org/olat/core/_spring/mainCorecontext.xml index 9288b359898..5fcb2120244 100644 --- a/src/main/java/org/olat/core/_spring/mainCorecontext.xml +++ b/src/main/java/org/olat/core/_spring/mainCorecontext.xml @@ -8,7 +8,7 @@ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> - <context:component-scan base-package="org.olat.core.dispatcher.mapper,org.olat.core.commons.controllers.impressum" /> + <context:component-scan base-package="org.olat.core.dispatcher.mapper,org.olat.core.commons.controllers.impressum,org.olat.core.gui.render.velocity" /> <bean id="coreSpringFactory" class="org.olat.core.CoreSpringFactory" /> diff --git a/src/main/java/org/olat/core/commons/services/commentAndRating/ui/_content/userComments.html b/src/main/java/org/olat/core/commons/services/commentAndRating/ui/_content/userComments.html index 366c8ed2cc3..29f26ffe9e3 100644 --- a/src/main/java/org/olat/core/commons/services/commentAndRating/ui/_content/userComments.html +++ b/src/main/java/org/olat/core/commons/services/commentAndRating/ui/_content/userComments.html @@ -1,5 +1,5 @@ <div class="o_block"> - #if(($commentControllers.size() > 0) && $r.available("createCommentFormCtr")) + #if($commentControllers && $commentControllers.size() > 0 && $r.available("createCommentFormCtr")) <div class="o_block"> <a id="o_comment_form_link" onclick="{o_scrollToElement('#o_comment_form'); return false;}" href="#o_comment_form"> $r.translate("comments.create.goto") <i class="o_icon o_icon_start"></i> diff --git a/src/main/java/org/olat/core/configuration/PreWarm.java b/src/main/java/org/olat/core/configuration/PreWarm.java new file mode 100644 index 00000000000..1624dd2ad68 --- /dev/null +++ b/src/main/java/org/olat/core/configuration/PreWarm.java @@ -0,0 +1,5 @@ +package org.olat.core.configuration; + +public interface PreWarm extends Runnable { + +} diff --git a/src/main/java/org/olat/core/gui/render/velocity/VelocityTemplatesPreWarm.java b/src/main/java/org/olat/core/gui/render/velocity/VelocityTemplatesPreWarm.java new file mode 100644 index 00000000000..469ee1e28b3 --- /dev/null +++ b/src/main/java/org/olat/core/gui/render/velocity/VelocityTemplatesPreWarm.java @@ -0,0 +1,69 @@ +package org.olat.core.gui.render.velocity; + +import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.velocity.VelocityContext; +import org.apache.velocity.exception.ParseErrorException; +import org.apache.velocity.exception.ResourceNotFoundException; +import org.olat.core.configuration.PreWarm; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.CodeHelper; +import org.olat.core.util.WebappHelper; +import org.springframework.stereotype.Service; + +/** + * + * @author srosse + * + */ +@Service +public class VelocityTemplatesPreWarm implements PreWarm { + private static final OLog log = Tracing.createLoggerFor(VelocityTemplatesPreWarm.class); + + @Override + public void run() { + long start = System.nanoTime(); + log.info("Start filling the velocity template cache"); + + final VelocityContext context = new VelocityContext(); + final AtomicInteger numOfTemplates = new AtomicInteger(0); + final File root = new File(WebappHelper.getContextRoot(), "WEB-INF/classes"); + final Path fPath = root.toPath(); + try { + Files.walkFileTree(fPath, new SimpleFileVisitor<Path>() { + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { + try { + + String path = fPath.relativize(file).toString(); + if(path.endsWith(".html") && path.contains("/_content/")) { + StringOutput writer = new StringOutput(); + VelocityHelper.getInstance().mergeContent(path, context, writer, null); + + numOfTemplates.incrementAndGet(); + } + } catch (ResourceNotFoundException e) { + e.printStackTrace(); + } catch (ParseErrorException e) { + e.printStackTrace(); + } + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + log.info("Velocity cache filled with " + numOfTemplates + " templates in (ms): " + CodeHelper.nanoToMilliTime(start)); + } + +} diff --git a/src/main/java/org/olat/core/servlets/OpenOLATServlet.java b/src/main/java/org/olat/core/servlets/OpenOLATServlet.java index 27c0ef718fc..72afd7b36c4 100644 --- a/src/main/java/org/olat/core/servlets/OpenOLATServlet.java +++ b/src/main/java/org/olat/core/servlets/OpenOLATServlet.java @@ -33,7 +33,9 @@ import javax.servlet.http.HttpServletResponse; import org.olat.admin.sysinfo.manager.SessionStatsManager; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.services.taskexecutor.TaskExecutorManager; import org.olat.core.commons.services.webdav.WebDAVDispatcher; +import org.olat.core.configuration.PreWarm; import org.olat.core.dispatcher.Dispatcher; import org.olat.core.dispatcher.DispatcherModule; import org.olat.core.dispatcher.mapper.GlobalMapperRegistry; @@ -120,6 +122,15 @@ public class OpenOLATServlet extends HttpServlet { //preload extensions ExtManager.getInstance().getExtensions(); + preWarm(); + } + + private void preWarm() { + TaskExecutorManager executor = CoreSpringFactory.getImpl(TaskExecutorManager.class); + Map<String,PreWarm> preWarms = CoreSpringFactory.getBeansOfType(PreWarm.class); + for(PreWarm preWarm:preWarms.values()) { + executor.execute(preWarm); + } } @Override diff --git a/src/main/java/org/olat/core/util/i18n/ui/_content/translationToolI18nItemList.html b/src/main/java/org/olat/core/util/i18n/ui/_content/translationToolI18nItemList.html index 8da2c51efa4..93513de891f 100644 --- a/src/main/java/org/olat/core/util/i18n/ui/_content/translationToolI18nItemList.html +++ b/src/main/java/org/olat/core/util/i18n/ui/_content/translationToolI18nItemList.html @@ -2,7 +2,7 @@ ## <h2>$r.translate("list.title")</h2> <p>$r.translate("list.found.entries", ["$keysCount","$bundlesCount"])</p> <p class="o_info">$r.translate("list.${customizingPrefix}intro")</p> -#if ($i18nItems.size() > 0) +#if ($i18nItems && $i18nItems.size() > 0) <div class="o_button_group"> $r.render("allTranslateButtonTop") </div> diff --git a/src/main/java/org/olat/course/editor/_content/deletenodehasreferences.html b/src/main/java/org/olat/course/editor/_content/deletenodehasreferences.html index 0929c821751..d464068b078 100644 --- a/src/main/java/org/olat/course/editor/_content/deletenodehasreferences.html +++ b/src/main/java/org/olat/course/editor/_content/deletenodehasreferences.html @@ -2,7 +2,7 @@ <p> $r.translate("deletenode.hasreferences.explain",$nodeident) </p> -#if($entries.size()>0) +#if($entries && $entries.size()>0) <ol> #foreach ($entry in $entries) <li>$entry</li> diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_content/peekview.html b/src/main/java/org/olat/course/nodes/projectbroker/_content/peekview.html index 2c70fb68607..b243264f93f 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/_content/peekview.html +++ b/src/main/java/org/olat/course/nodes/projectbroker/_content/peekview.html @@ -1,5 +1,5 @@ <div class="o_projectbroker_peekview clearfix"> -#if ( $myProjects.size() > 0 ) +#if ($myProjects && $myProjects.size() > 0 ) <div class="o_projectbroker_peekview_title"> $r.translate("peekview.selected.project.title") </div> @@ -16,14 +16,14 @@ </div> #end #else - #if ($myCoachedProjects.size() == 0) + #if ($myCoachedProjects && $myCoachedProjects.size() == 0) <div class="o_projectbroker_peekview_title"> $r.translate("peekview.no.selected.projects") </div> #end #end -#if ($myCoachedProjects.size() > 0) +#if ($myCoachedProjects && $myCoachedProjects.size() > 0) <div class="o_projectbroker_peekview_title"> $r.translate("peekview.coached.project.title") </div> diff --git a/src/main/java/org/olat/course/nodes/st/_content/run.html b/src/main/java/org/olat/course/nodes/st/_content/run.html index d8df7a4e57f..be64b7a7e2f 100644 --- a/src/main/java/org/olat/course/nodes/st/_content/run.html +++ b/src/main/java/org/olat/course/nodes/st/_content/run.html @@ -43,7 +43,7 @@ </div> #end -#if ($children.size() > 0) +#if ($children && $children.size() > 0) #set ($i = 0) <div class="o_toc #if ($layoutType == 1) o_one_column #else o_two_column #end"> <div class="row"> diff --git a/src/main/java/org/olat/course/nodes/st/_content/stPeekView.html b/src/main/java/org/olat/course/nodes/st/_content/stPeekView.html index 6ab5af8b49e..36e06ad79f1 100644 --- a/src/main/java/org/olat/course/nodes/st/_content/stPeekView.html +++ b/src/main/java/org/olat/course/nodes/st/_content/stPeekView.html @@ -1,4 +1,4 @@ -#if($childNodes.size() > 0) +#if($childNodes && $childNodes.size() > 0) <div class="o_st_peekview"> <ul class="list-unstyled"> #foreach ($coursenode in $childNodes) diff --git a/src/main/java/org/olat/ims/_spring/imsContext.xml b/src/main/java/org/olat/ims/_spring/imsContext.xml index adda71c27cc..693c965cc70 100644 --- a/src/main/java/org/olat/ims/_spring/imsContext.xml +++ b/src/main/java/org/olat/ims/_spring/imsContext.xml @@ -8,7 +8,7 @@ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> - <context:component-scan base-package="org.olat.ims.lti.manager,org.olat.ims.qti.qpool,org.olat.ims.qti.statistics" /> + <context:component-scan base-package="org.olat.ims.lti.manager,org.olat.ims.qti" /> <import resource="classpath:/org/olat/ims/qti/_spring/qtiContext.xml"/> diff --git a/src/main/java/org/olat/ims/qti/QTIPreWarm.java b/src/main/java/org/olat/ims/qti/QTIPreWarm.java new file mode 100644 index 00000000000..41079a6fc5c --- /dev/null +++ b/src/main/java/org/olat/ims/qti/QTIPreWarm.java @@ -0,0 +1,48 @@ +package org.olat.ims.qti; + +import java.util.ArrayList; +import java.util.List; + +import org.olat.core.configuration.PreWarm; +import org.olat.core.id.Roles; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.CodeHelper; +import org.olat.ims.qti.fileresource.SurveyFileResource; +import org.olat.ims.qti.fileresource.TestFileResource; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryManager; +import org.springframework.stereotype.Service; + +import de.bps.onyx.plugin.OnyxModule; + +/** + * + * + * + * Initial date: 07.04.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Service +public class QTIPreWarm implements PreWarm { + + private static final OLog log = Tracing.createLoggerFor(QTIPreWarm.class); + + @Override + public void run() { + long start = System.nanoTime(); + log.info("Start scanning for QTI resources"); + + Roles adminRoles = new Roles(true, false, false, false, false, false, false); + List<String> types = new ArrayList<>(2); + types.add(TestFileResource.TYPE_NAME); + types.add(SurveyFileResource.TYPE_NAME); + + List<RepositoryEntry> res = RepositoryManager.getInstance().queryByTypeLimitAccess(null, types, adminRoles); + for(RepositoryEntry re:res) { + OnyxModule.isOnyxTest(re.getOlatResource()); + } + log.info("QTI Resources scanned in (ms): " + CodeHelper.nanoToMilliTime(start)); + } +} diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_fibItem.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_fibItem.html index 8e163f18dff..b551a226bea 100644 --- a/src/main/java/org/olat/ims/qti/editor/_content/tab_fibItem.html +++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_fibItem.html @@ -8,7 +8,7 @@ </legend> <form action="$r.formURIbg("sfib")" id="ofo_tab_fibitem" $r.bgTarget() method="post"> - #if ($question.getResponses().size() > 0) + #if ($question && $question.getResponses().size() > 0) <table class="table table-bordered"> <thead> <tr> diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_kprimItem.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_kprimItem.html index 96771f7a56b..9ab0835b9d6 100644 --- a/src/main/java/org/olat/ims/qti/editor/_content/tab_kprimItem.html +++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_kprimItem.html @@ -32,7 +32,7 @@ </legend> <form action="$r.formURIbg("skprim")" id="ofo_tab_kprimitem" $r.bgTarget() method="post"> -#if ($question.getResponses().size() > 0) +#if ($question && $question.getResponses().size() > 0) <table class="table table-bordered" style="position:relative"> <thead> <tr> diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_mcItem.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_mcItem.html index 3c061686930..2660c66f2d6 100644 --- a/src/main/java/org/olat/ims/qti/editor/_content/tab_mcItem.html +++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_mcItem.html @@ -30,7 +30,7 @@ </legend> <form action="$r.formURIbg("smc")" id="ofo_tab_mcitem" $r.bgTarget() method="post"> -#if ($question.getResponses().size() > 0) +#if ($question && $question.getResponses().size() > 0) <table class="table table-bordered" style="position:relative"> <thead><tr> <th width="5">Pos</th> diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_scItem.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_scItem.html index cdfbf3a7952..d96017dceea 100644 --- a/src/main/java/org/olat/ims/qti/editor/_content/tab_scItem.html +++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_scItem.html @@ -28,7 +28,7 @@ #end </legend> -#if ($question.getResponses().size() > 0) +#if ($question && $question.getResponses().size() > 0) <form action="$r.formURIbg("ssc")" id="ofo_tab_scitem" $r.bgTarget() method="post"> <table class="table table-bordered"> <thead><tr> diff --git a/src/main/java/org/olat/instantMessaging/ui/_content/newMsgIcon.html b/src/main/java/org/olat/instantMessaging/ui/_content/newMsgIcon.html index f880a5e2bbe..339a9908078 100644 --- a/src/main/java/org/olat/instantMessaging/ui/_content/newMsgIcon.html +++ b/src/main/java/org/olat/instantMessaging/ui/_content/newMsgIcon.html @@ -1,5 +1,5 @@ $r.render("chats") -#if($iconsHolder.size() > 0) +#if($iconsHolder && $iconsHolder.size() > 0) <div id="o_im_message"> <script type="text/javascript"> /* <![CDATA[ */ diff --git a/src/main/java/org/olat/login/_content/afterlogin.html b/src/main/java/org/olat/login/_content/afterlogin.html index 48c74246509..c1480c2a31f 100644 --- a/src/main/java/org/olat/login/_content/afterlogin.html +++ b/src/main/java/org/olat/login/_content/afterlogin.html @@ -1,4 +1,4 @@ -#if ($ctrlCount > 1) +#if ($ctrlCount && $ctrlCount > 1) <div class="clearfix"> $r.render("wizard") </div> diff --git a/src/main/java/org/olat/login/_content/login.html b/src/main/java/org/olat/login/_content/login.html index d122deb3a81..6cf7c725cf1 100644 --- a/src/main/java/org/olat/login/_content/login.html +++ b/src/main/java/org/olat/login/_content/login.html @@ -34,7 +34,7 @@ <div class="o_login_box_wrapper"> <div class="o_login_box"> - #if ($r.available("menu.guest") || $providerSet.size() > 1) + #if ($r.available("menu.guest") || ($providerSet && $providerSet.size() > 1)) <div class="o_login_providers"> <div class="btn-group btn-group-lg btn-group-justified"> #foreach ($authProvider in $providerSet) diff --git a/src/main/java/org/olat/modules/wiki/_content/breadcrump.html b/src/main/java/org/olat/modules/wiki/_content/breadcrump.html index dfcf78a9187..5e6bc229678 100644 --- a/src/main/java/org/olat/modules/wiki/_content/breadcrump.html +++ b/src/main/java/org/olat/modules/wiki/_content/breadcrump.html @@ -1,4 +1,4 @@ -#if($queue.size() > 0) +#if($queue && $queue.size() > 0) <ul> #foreach($crumb in $queue) <li><a title="$r.escapeHtml($crumb.getName())" href="$r.commandURIbg("go")$crumb.getName()" onclick="return o2cl()" onkeypress="return o2cl()" $r.bgTarget()>$crumb.getDescription()</a></li> diff --git a/src/main/java/org/olat/repository/ui/list/_content/details.html b/src/main/java/org/olat/repository/ui/list/_content/details.html index 0fa455f7b4d..1e828ecd799 100644 --- a/src/main/java/org/olat/repository/ui/list/_content/details.html +++ b/src/main/java/org/olat/repository/ui/list/_content/details.html @@ -302,7 +302,7 @@ </script> #end - #if ($v.getManagedFlags().size() > 0) + #if ($v && $v.getManagedFlags().size() > 0) <div class="panel panel-default o_managedpanel"> <div class="panel-heading" data-toggle="collapse" data-target="#collapseManaged"> <h3 class="panel-title"> diff --git a/src/main/java/org/olat/repository/ui/list/_content/row_1.html b/src/main/java/org/olat/repository/ui/list/_content/row_1.html index 47dd974ee2e..bd10074749d 100644 --- a/src/main/java/org/olat/repository/ui/list/_content/row_1.html +++ b/src/main/java/org/olat/repository/ui/list/_content/row_1.html @@ -53,7 +53,7 @@ #end #end - #if($row.isMember() || $row.getVisit() > 0) + #if($row && ($row.isMember() || $row.getVisit() > 0)) #if($row.passed || $row.failed) <div class="row"> #if($row.passed) diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html b/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html index a52eed8805c..a47c183830d 100644 --- a/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html +++ b/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html @@ -1,4 +1,4 @@ -#if ($confControllers.size() > 0) +#if ($confControllers && $confControllers.size() > 0) #foreach($confController in $confControllers) #set($css = $confController.getLink().getMethod().getMethodCssClass()) #set($desc = $confController.getLink().getOffer().getDescription()) diff --git a/src/main/java/org/olat/search/ui/_content/contextHelpResult.html b/src/main/java/org/olat/search/ui/_content/contextHelpResult.html index 6bff872bc38..7381614a73d 100644 --- a/src/main/java/org/olat/search/ui/_content/contextHelpResult.html +++ b/src/main/java/org/olat/search/ui/_content/contextHelpResult.html @@ -2,7 +2,7 @@ <div class="o_search_result_title"> #set($contextpath = $result.getResourceUrl() ) #set($lastIndex = $contextpath.lastIndexOf("path=") + 5 ) - #if($lastIndex>=0) + #if($lastIndex && $lastIndex>=0) #set($minone=$contextpath.length() - 1) #set($contextpath = $contextpath.substring($lastIndex,$minone) ) #end diff --git a/src/main/java/org/olat/user/UserDisplayNamePreWarm.java b/src/main/java/org/olat/user/UserDisplayNamePreWarm.java new file mode 100644 index 00000000000..1c8b7b266f9 --- /dev/null +++ b/src/main/java/org/olat/user/UserDisplayNamePreWarm.java @@ -0,0 +1,28 @@ +package org.olat.user; + +import org.olat.core.configuration.PreWarm; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.CodeHelper; +import org.springframework.stereotype.Service; + +/** + * + * @author srosse + * + */ +@Service +public class UserDisplayNamePreWarm implements PreWarm { + + private static final OLog log = Tracing.createLoggerFor(UserDisplayNamePreWarm.class); + + @Override + public void run() { + long start = System.nanoTime(); + log.info("Start filling the user displayname cache"); + + int numOfNames = UserManager.getInstance().warmUp(); + + log.info("Display name cache filled with " + numOfNames + " names in (ms): " + CodeHelper.nanoToMilliTime(start)); + } +} diff --git a/src/main/java/org/olat/user/UserManager.java b/src/main/java/org/olat/user/UserManager.java index 729942f1385..9aa14e10455 100644 --- a/src/main/java/org/olat/user/UserManager.java +++ b/src/main/java/org/olat/user/UserManager.java @@ -243,6 +243,8 @@ public abstract class UserManager extends BasicManager { this.userPropertiesConfig = userPropertiesConfig; } + public abstract int warmUp(); + public abstract String getUsername(Long identityKey); /** diff --git a/src/main/java/org/olat/user/UserManagerImpl.java b/src/main/java/org/olat/user/UserManagerImpl.java index fb8f78c4f5a..004c66bf1d7 100644 --- a/src/main/java/org/olat/user/UserManagerImpl.java +++ b/src/main/java/org/olat/user/UserManagerImpl.java @@ -30,6 +30,7 @@ import java.util.Locale; import java.util.Map; import javax.annotation.PostConstruct; +import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import org.olat.basesecurity.BaseSecurity; @@ -436,6 +437,31 @@ public class UserManagerImpl extends UserManager { if(isLogDebugEnabled()) logDebug("Delete all user-attributtes for user=" + user); } + @Override + public int warmUp() { + StringBuilder sb = new StringBuilder(); + sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident"); + + EntityManager em = dbInstance.getCurrentEntityManager(); + + int batchSize = 5000; + TypedQuery<IdentityShort> query = em.createQuery(sb.toString(), IdentityShort.class) + .setMaxResults(batchSize); + int count = 0; + + List<IdentityShort> identities; + do { + identities = query.setFirstResult(count).getResultList(); + em.clear(); + for(IdentityShort identity:identities) { + getUserDisplayName(identity); + } + count += identities.size(); + } while(identities.size() >= batchSize); + + return count; + } + @Override public String getUsername(Long identityKey) { String username = userToNameCache.get(identityKey); diff --git a/src/main/java/org/olat/user/_spring/userContext.xml b/src/main/java/org/olat/user/_spring/userContext.xml index 5c0a46f11b8..1eaedfecf1b 100644 --- a/src/main/java/org/olat/user/_spring/userContext.xml +++ b/src/main/java/org/olat/user/_spring/userContext.xml @@ -1,9 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd"> + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context.xsd"> + + <context:component-scan base-package="org.olat.user" /> <import resource="classpath:/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml"/> <import resource="classpath:/org/olat/user/propertyhandlers/_spring/userPropertriesHandlersContext.xml"/> -- GitLab