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 da99e3fed2dac6d3741f1fbf675cfa2dc7f264e2..6df15d4419d89e3ca83525699186077d4d1fd3c5 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 ec32cff14ca9e18a887951ef05f1573f64ed1ec0..6233423379cce8fb10b03afb2e793fffbbc6b1d3 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 f21715c0b9ec550642e1bfba25126aa832fe3ffe..5c39b17809cce9a69be13097d64bee3260db29d4 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 50055df32150a0216ac40cf517aa875507cbcf78..f077526f5bda34624bd9b75dd0b40394e70c7c0a 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 9288b3598989a4007558d0828b9c1942165ad170..5fcb2120244a5a6dd71f6073e7bda732fe5e3f11 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 366c8ed2cc39f8369b1da6b7e58cf220d3e99ffe..29f26ffe9e3bd3a0a9fde0529e1ed0549373d405 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 0000000000000000000000000000000000000000..1624dd2ad68c48e424ed3952c91bed29b1638a2d --- /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 0000000000000000000000000000000000000000..469ee1e28b3b5dce6ca95a4e2ae1ab01d7664d28 --- /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 27c0ef718fcec5eebc61743f5a793f07265d7d66..72afd7b36c4f61eb9856e147ba38659d2c82f044 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 8da2c51efa4e9029fccf5f0a22432fac6d539d71..93513de891ffde25494914007dfb608551dce25d 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 0929c8217513ab247db2fef6eaf414cacd410bef..d464068b0786ff31c2b812014e766e3d532a0b24 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 2c70fb68607bf40e1a5639f69390c15f111c587b..b243264f93f0a101afcf1cc03369a62c74520c6c 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 d8df7a4e57f7c793c1548a4405d818bd822a35a1..be64b7a7e2f837ea1527901bb5ad545ea0bfd7fd 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 6ab5af8b49e8d455218fe9e28b83697d9c249fbc..36e06ad79f1d5db064109f8647effd7566256758 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 adda71c27cc64e0c23cd432abfe185e714144d11..693c965cc707d163730dfd2cba234c74563425af 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 0000000000000000000000000000000000000000..41079a6fc5ceeb5d78f49f8106065fe71e65d556 --- /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 8e163f18dfff93eaef4e130ba3004e16e6f91c8c..b551a226bea58bec4ae1ddfd2b92dd04b80526f4 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 96771f7a56b7ff100ad3425106493b3dafed79c5..9ab0835b9d6d1c211ca29b92ed18e82f96578a47 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 3c061686930c50ae37173ff51bc2c4f33d69cb90..2660c66f2d60068c72c5162609bfd00e6039f9c5 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 cdfbf3a7952b9cf8142d3d32f2346855e85c1281..d96017dceea492f726727037d34b75dbe90fc867 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 f880a5e2bbe615966d8f89040d3b0ce97f5e129e..339a9908078c31e4d2d690e87d5b321df82d1a85 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 48c74246509c1b3fd383b605cd016a29ef1d2a68..c1480c2a31fe1ebee5dbdaf60caa399e45464de0 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 d122deb3a81de11ba82973035f3a336dcfc579f9..6cf7c725cf13b9335bddb93956f6b453cbbdfb2e 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 dfcf78a9187702104967bfd7ca5ff58707b30faa..5e6bc229678955393663480cf6794cbb7e48230c 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 0fa455f7b4d57f2e8d84894074bd356c7ba0095e..1e828ecd799a5834e8a27a26aab9c7a6475ac76a 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 47dd974ee2e25e7ae0e7487f540e0e4aef1a37ab..bd10074749d0878503ef08ecb4f0c8fb27397dee 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 a52eed8805cfc66d097104d101a10c8f1f7a4b64..a47c183830d794d43c62f611f8b999ac02dcc164 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 6bff872bc3835c4b507770d68027bbb4dba4d96d..7381614a73d82ad7c62e919dfe264ea213518f3e 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 0000000000000000000000000000000000000000..1c8b7b266f9abc1c1621cdb95601a4fae9c6cb59 --- /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 729942f138527479a1bad2cc8eda3c48113a99a1..9aa14e10455301b54831307fb7afcb7fcf9fcf9e 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 fb8f78c4f5a05d1bb813f1cbf31203cf463ef211..004c66bf1d7246ad97123dfb038f45790d67c4d0 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 5c0a46f11b83ceff68c999abc19d94aadfeb322b..1eaedfecf1bcf92346e5c1695d865146de89961f 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"/>