diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java index 55fd8a63e203fcd2e32d76ac006ca848de2bde4e..131065ef0e4dd952cc79271b2b3769b9b50a2649 100644 --- a/src/main/java/org/olat/course/CourseFactory.java +++ b/src/main/java/org/olat/course/CourseFactory.java @@ -70,7 +70,6 @@ import org.olat.core.logging.AssertException; import org.olat.core.logging.OLATRuntimeException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; -import org.olat.core.manager.BasicManager; import org.olat.core.util.CodeHelper; import org.olat.core.util.ExportUtil; import org.olat.core.util.FileUtils; @@ -147,7 +146,7 @@ import org.olat.util.logging.activity.LoggingResourceable; * @author Felix Jost * @author guido */ -public class CourseFactory extends BasicManager { +public class CourseFactory { private static CacheWrapper<Long,PersistingCourseImpl> loadedCourses; private static ConcurrentMap<Long, ModifyCourseEvent> modifyCourseEvents = new ConcurrentHashMap<Long, ModifyCourseEvent>(); diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java index 14e20cdf7c98d9e18b2885659e0b4ea9f6657d3f..271137a6e18f4903bdc0e86603d38624ee619eb7 100644 --- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java @@ -34,6 +34,7 @@ import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.event.GenericEventListener; +import org.olat.course.CourseFactory; import org.olat.course.assessment.AssessmentMode; import org.olat.course.assessment.AssessmentMode.Status; import org.olat.course.assessment.AssessmentModeCoordinationService; @@ -43,6 +44,8 @@ import org.olat.course.assessment.model.AssessmentModeImpl; import org.olat.course.assessment.model.CoordinatedAssessmentMode; import org.olat.course.assessment.model.TransientAssessmentMode; import org.olat.group.ui.edit.BusinessGroupModifiedEvent; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -62,6 +65,8 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor @Autowired private AssessmentModule assessmentModule; @Autowired + private RepositoryService repositoryService; + @Autowired private CoordinatorManager coordinatorManager; @Autowired private AssessmentModeManagerImpl assessmentModeManager; @@ -268,6 +273,9 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor if(currentStatus == null || currentStatus != status) { mode.setStatus(status); mode = dbInstance.getCurrentEntityManager().merge(mode); + if(status == Status.leadtime || status == Status.assessment) { + warmUpAssessment(mode); + } dbInstance.commit(); } return mode; @@ -330,4 +338,9 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor } return mode; } + + private void warmUpAssessment(AssessmentMode mode) { + RepositoryEntry entry = repositoryService.loadByKey(mode.getRepositoryEntry().getKey()); + CourseFactory.loadCourse(entry); + } } \ No newline at end of file diff --git a/src/main/java/org/olat/course/assessment/manager/LastCoursesPreWarm.java b/src/main/java/org/olat/course/assessment/manager/LastCoursesPreWarm.java new file mode 100644 index 0000000000000000000000000000000000000000..eda5f054d0835ff4b1c037bafc625db93f91d3ea --- /dev/null +++ b/src/main/java/org/olat/course/assessment/manager/LastCoursesPreWarm.java @@ -0,0 +1,58 @@ +/** + * <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.course.assessment.manager; + +import java.util.List; + +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.olat.course.CourseFactory; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.manager.RepositoryEntryDAO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 18.02.2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Service +public class LastCoursesPreWarm implements PreWarm { + + private static final OLog log = Tracing.createLoggerFor(LastCoursesPreWarm.class); + + @Autowired + private RepositoryEntryDAO repositoryEntryDao; + + @Override + public void run() { + long start = System.nanoTime(); + List<RepositoryEntry> entries = repositoryEntryDao + .getLastUsedRepositoryEntries("CourseModule", 0, 100); + for(RepositoryEntry entry:entries) { + CourseFactory.loadCourse(entry); + } + log.info(entries.size() + " Courses preloaded in (ms): " + CodeHelper.nanoToMilliTime(start)); + } +} diff --git a/src/main/java/org/olat/ims/qti/QTIPreWarm.java b/src/main/java/org/olat/ims/qti/QTIPreWarm.java index c6fb853787e7e77aaf7655543fb8c8ed8636b069..64b0c50502c48ebcac4820e3926fb76663c7a622 100644 --- a/src/main/java/org/olat/ims/qti/QTIPreWarm.java +++ b/src/main/java/org/olat/ims/qti/QTIPreWarm.java @@ -22,8 +22,7 @@ package org.olat.ims.qti; import java.util.ArrayList; import java.util.List; -import org.olat.core.CoreSpringFactory; -import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.persistence.DB; import org.olat.core.configuration.PreWarm; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; @@ -32,6 +31,7 @@ import org.olat.ims.qti.fileresource.SurveyFileResource; import org.olat.ims.qti.fileresource.TestFileResource; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.bps.onyx.plugin.OnyxModule; @@ -48,6 +48,11 @@ import de.bps.onyx.plugin.OnyxModule; public class QTIPreWarm implements PreWarm { private static final OLog log = Tracing.createLoggerFor(QTIPreWarm.class); + + @Autowired + private DB dbInstance; + @Autowired + private OLATResourceManager olatResourceManager; @Override public void run() { @@ -57,8 +62,8 @@ public class QTIPreWarm implements PreWarm { List<String> types = new ArrayList<>(2); types.add(TestFileResource.TYPE_NAME); types.add(SurveyFileResource.TYPE_NAME); - List<OLATResource> qtiResources = CoreSpringFactory.getImpl(OLATResourceManager.class).findResourceByTypes(types); - DBFactory.getInstance().commitAndCloseSession(); + List<OLATResource> qtiResources = olatResourceManager.findResourceByTypes(types); + dbInstance.commitAndCloseSession(); for(OLATResource qtiResource:qtiResources) { OnyxModule.isOnyxTest(qtiResource); } diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java index 628025bdbc975388a5881570091780971a8c9ba7..2aa927ce1fedac69952d60bf6d845fcbdcfd304a 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java +++ b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java @@ -155,4 +155,21 @@ public class RepositoryEntryDAO { } return entries.get(0); } + + public List<RepositoryEntry> getLastUsedRepositoryEntries(String resourceTypeName, int firstResult, int maxResults) { + StringBuilder sb = new StringBuilder(); + sb.append("select v from ").append(RepositoryEntry.class.getName()).append(" as v ") + .append(" inner join fetch v.olatResource as ores") + .append(" inner join fetch v.statistics as statistics") + .append(" left join fetch v.lifecycle as lifecycle") + .append(" where ores.resName=:resourceTypeName") + .append(" order by statistics.lastUsage desc"); + + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), RepositoryEntry.class) + .setFirstResult(firstResult) + .setMaxResults(maxResults) + .setParameter("resourceTypeName", resourceTypeName) + .getResultList(); + } } \ No newline at end of file