From c0ccc6a8ff08ca3d5373b54165527beedfb6129b Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Thu, 18 Oct 2012 10:22:50 +0200 Subject: [PATCH] OO-386: remove the async executor of the repository manager and replace it with a evict from cache, select for update, merge process --- .../coursecreation/CourseCreationHelper.java | 17 +- .../java/org/olat/catalog/CatalogManager.java | 9 +- .../core/id/context/HistoryPointImpl.java | 8 +- .../course/run/navigation/NodeClickedRef.java | 4 +- .../org/olat/repository/RepositoryEntry.java | 8 +- .../olat/repository/RepositoryManager.java | 191 ++++++++++--- .../repository/_spring/repositoryContext.xml | 9 +- .../async/AbstractBackgroundTask.java | 143 ---------- .../olat/repository/async/BackgroundTask.java | 37 --- .../async/BackgroundTaskQueueManager.java | 90 ------ ...ncrementDownloadCounterBackgroundTask.java | 70 ----- .../IncrementLaunchCounterBackgroundTask.java | 68 ----- .../async/SetAccessBackgroundTask.java | 66 ----- .../SetDescriptionNameBackgroundTask.java | 65 ----- .../async/SetLastUsageBackgroundTask.java | 67 ----- .../async/SetPropertiesBackgroundTask.java | 71 ----- .../repository/async/TaskExecutorThread.java | 99 ------- .../async/doc-files/BackgroundJobDesign.png | Bin 25366 -> 0 bytes .../async/doc-files/BackgroundJobDesign.vsd | Bin 154624 -> 0 bytes .../org/olat/repository/async/package.html | 17 -- .../controllers/RepositoryAddController.java | 13 +- .../controllers/RepositoryCopyController.java | 11 +- .../RepositoryDetailsController.java | 13 +- .../delete/ReadyToDeleteController.java | 2 +- .../delete/SelectionController.java | 2 +- .../repository/delete/StatusController.java | 2 +- .../service/RepositoryDeletionManager.java | 4 +- .../repository/RepositoryEntryResource.java | 12 +- .../repository/course/CoursesWebService.java | 2 +- .../commons/coordinate/CoordinatorTest.java | 14 +- .../RepositoryManagerConcurrentTest.java | 270 ++++++------------ .../accesscontrol/ACFrontendManagerTest.java | 4 +- .../java/org/olat/test/JunitTestHelper.java | 4 +- 33 files changed, 296 insertions(+), 1096 deletions(-) delete mode 100644 src/main/java/org/olat/repository/async/AbstractBackgroundTask.java delete mode 100644 src/main/java/org/olat/repository/async/BackgroundTask.java delete mode 100644 src/main/java/org/olat/repository/async/BackgroundTaskQueueManager.java delete mode 100644 src/main/java/org/olat/repository/async/IncrementDownloadCounterBackgroundTask.java delete mode 100644 src/main/java/org/olat/repository/async/IncrementLaunchCounterBackgroundTask.java delete mode 100644 src/main/java/org/olat/repository/async/SetAccessBackgroundTask.java delete mode 100644 src/main/java/org/olat/repository/async/SetDescriptionNameBackgroundTask.java delete mode 100644 src/main/java/org/olat/repository/async/SetLastUsageBackgroundTask.java delete mode 100644 src/main/java/org/olat/repository/async/SetPropertiesBackgroundTask.java delete mode 100644 src/main/java/org/olat/repository/async/TaskExecutorThread.java delete mode 100644 src/main/java/org/olat/repository/async/doc-files/BackgroundJobDesign.png delete mode 100644 src/main/java/org/olat/repository/async/doc-files/BackgroundJobDesign.vsd delete mode 100644 src/main/java/org/olat/repository/async/package.html diff --git a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/CourseCreationHelper.java b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/CourseCreationHelper.java index e39abc195b6..fa845ab7519 100644 --- a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/CourseCreationHelper.java +++ b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/CourseCreationHelper.java @@ -45,6 +45,7 @@ import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.translator.Translator; import org.olat.core.id.UserConstants; +import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.Util; import org.olat.core.util.vfs.VFSLeaf; @@ -85,6 +86,8 @@ import de.tuchemnitz.wizard.workflows.coursecreation.model.CourseCreationConfigu * @author Sebastian Fritzsche (seb.fritzsche@googlemail.com) */ public class CourseCreationHelper { + + private static final OLog log = Tracing.createLoggerFor(CourseCreationHelper.class); private CourseCreationConfiguration courseConfig; private final Translator translator; @@ -270,16 +273,18 @@ public class CourseCreationHelper { // 3.1. setup rights // -------------------------- if (courseConfig.getPublish()) { + + int access = RepositoryEntry.ACC_OWNERS; if (courseConfig.getAclType().equals(CourseCreationConfiguration.ACL_GUEST)) { // set "BARG" as rule - addedEntry.setAccess(RepositoryEntry.ACC_USERS_GUESTS); + access = RepositoryEntry.ACC_USERS_GUESTS; } else if (courseConfig.getAclType().equals(CourseCreationConfiguration.ACL_OLAT)) { // set "BAR" as rule - addedEntry.setAccess(RepositoryEntry.ACC_USERS); + access = RepositoryEntry.ACC_USERS; } else if (courseConfig.getAclType().equals(CourseCreationConfiguration.ACL_UNI)) { // set "BAR" rule + expert rule on university // hasAttribute("institution","[Hochschule]") - addedEntry.setAccess(RepositoryEntry.ACC_USERS); + access = RepositoryEntry.ACC_USERS; final CourseNode cnRoot = course.getEditorTreeModel().getCourseEditorNodeById(course.getEditorTreeModel().getRootNode().getIdent()) .getCourseNode(); String shibInstitution = ureq.getIdentity().getUser().getProperty(UserConstants.INSTITUTIONALNAME, ureq.getLocale()); @@ -292,9 +297,9 @@ public class CourseCreationHelper { + "\")")); } } else { - Tracing.createLoggerFor(this.getClass()).error("No valid ACL Rule: " + courseConfig.getAclType()); + log.error("No valid ACL Rule: " + courseConfig.getAclType()); } - RepositoryManager.getInstance().updateRepositoryEntry(addedEntry); + addedEntry = RepositoryManager.getInstance().setAccess(addedEntry, access, false); } CourseFactory.openCourseEditSession(course.getResourceableId()); @@ -325,7 +330,7 @@ public class CourseCreationHelper { boolean isValid = sds.length == 0; if (!isValid) { // no error and no warnings -> return immediate - Tracing.createLoggerFor(this.getClass()).error("Course Publishing failed", new AssertionError()); + log.error("Course Publishing failed", new AssertionError()); } pp.applyPublishSet(ureq.getIdentity(), ureq.getLocale()); CourseFactory.closeCourseEditSession(course.getResourceableId(), true); diff --git a/src/main/java/org/olat/catalog/CatalogManager.java b/src/main/java/org/olat/catalog/CatalogManager.java index 2da6378d9ce..df5589ef049 100644 --- a/src/main/java/org/olat/catalog/CatalogManager.java +++ b/src/main/java/org/olat/catalog/CatalogManager.java @@ -584,13 +584,10 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I /** * - * @param repositoryEntry + * @param re */ - public void updateReferencedRepositoryEntry(RepositoryEntry repositoryEntry) { - RepositoryEntry reloaded = RepositoryManager.getInstance().lookupRepositoryEntry(repositoryEntry.getKey()); - reloaded.setDisplayname(repositoryEntry.getDisplayname()); - reloaded.setDescription(repositoryEntry.getDescription()); - RepositoryManager.getInstance().updateRepositoryEntry(reloaded); + public void updateReferencedRepositoryEntry(RepositoryEntry re) { + RepositoryEntry reloaded = RepositoryManager.getInstance().setDescriptionAndName(re, re.getDisplayname(), re.getDescription()); // inform anybody interested about this change MultiUserEvent modifiedEvent = new EntryChangedEvent(reloaded, EntryChangedEvent.MODIFIED_DESCRIPTION); CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(modifiedEvent, reloaded); diff --git a/src/main/java/org/olat/core/id/context/HistoryPointImpl.java b/src/main/java/org/olat/core/id/context/HistoryPointImpl.java index 2f44a8b44b4..02c39f9459d 100644 --- a/src/main/java/org/olat/core/id/context/HistoryPointImpl.java +++ b/src/main/java/org/olat/core/id/context/HistoryPointImpl.java @@ -21,6 +21,7 @@ package org.olat.core.id.context; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -35,12 +36,15 @@ public class HistoryPointImpl implements HistoryPoint { private final String uuid; private final String businessPath; - private final List<ContextEntry> entries = new ArrayList<ContextEntry>(); + private final List<ContextEntry> entries; public HistoryPointImpl(String uuid, String businessPath, List<ContextEntry> entries) { this.uuid = uuid; this.businessPath = businessPath; - if(entries != null) { + if(entries == null) { + this.entries = Collections.emptyList(); + } else { + this.entries = new ArrayList<ContextEntry>(entries.size()); for(ContextEntry entry:entries) { this.entries.add(entry.clone()); } diff --git a/src/main/java/org/olat/course/run/navigation/NodeClickedRef.java b/src/main/java/org/olat/course/run/navigation/NodeClickedRef.java index 5d87c46542e..455fc380393 100644 --- a/src/main/java/org/olat/course/run/navigation/NodeClickedRef.java +++ b/src/main/java/org/olat/course/run/navigation/NodeClickedRef.java @@ -146,7 +146,9 @@ public class NodeClickedRef { */ public Controller getRunController() { if(calledCourseNode == null || nodeConstructionResult == null) return null; - RepositoryManager.setLastUsageNowFor(calledCourseNode.getReferencedRepositoryEntry()); + if(calledCourseNode.needsReferenceToARepositoryEntry()) { + RepositoryManager.getInstance().setLastUsageNowFor(calledCourseNode.getReferencedRepositoryEntry()); + } return nodeConstructionResult.getRunController(); } diff --git a/src/main/java/org/olat/repository/RepositoryEntry.java b/src/main/java/org/olat/repository/RepositoryEntry.java index a3a24f5afb4..e06f793f440 100644 --- a/src/main/java/org/olat/repository/RepositoryEntry.java +++ b/src/main/java/org/olat/repository/RepositoryEntry.java @@ -376,12 +376,16 @@ public class RepositoryEntry extends PersistentObject implements ModifiedInfo, O /** * Increment launch counter. */ - public void incrementLaunchCounter() { launchCounter++; } + public void incrementLaunchCounter() { + launchCounter++; + } /** * Increment download counter. */ - public void incrementDownloadCounter() { downloadCounter++; } + public void incrementDownloadCounter() { + downloadCounter++; + } /** * @return Returns the displayname. diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java index 48471aaed95..027cb7f1c6c 100644 --- a/src/main/java/org/olat/repository/RepositoryManager.java +++ b/src/main/java/org/olat/repository/RepositoryManager.java @@ -32,6 +32,8 @@ import java.util.Collections; import java.util.Date; import java.util.List; +import javax.persistence.CacheRetrieveMode; +import javax.persistence.LockModeType; import javax.persistence.TypedQuery; import org.hibernate.type.StandardBasicTypes; @@ -44,6 +46,8 @@ import org.olat.basesecurity.SecurityGroup; import org.olat.basesecurity.SecurityGroupMembershipImpl; import org.olat.bookmark.BookmarkManager; import org.olat.catalog.CatalogManager; +import org.olat.commons.lifecycle.LifeCycleManager; +import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DBFactory; @@ -55,6 +59,7 @@ import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; import org.olat.core.logging.AssertException; +import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.logging.activity.ActionType; import org.olat.core.logging.activity.OlatResourceableType; @@ -72,13 +77,7 @@ import org.olat.core.util.vfs.VFSManager; import org.olat.course.assessment.manager.UserCourseInformationsManager; import org.olat.group.GroupLoggingAction; import org.olat.group.model.BGResourceRelation; -import org.olat.repository.async.BackgroundTaskQueueManager; -import org.olat.repository.async.IncrementDownloadCounterBackgroundTask; -import org.olat.repository.async.IncrementLaunchCounterBackgroundTask; -import org.olat.repository.async.SetAccessBackgroundTask; -import org.olat.repository.async.SetDescriptionNameBackgroundTask; -import org.olat.repository.async.SetLastUsageBackgroundTask; -import org.olat.repository.async.SetPropertiesBackgroundTask; +import org.olat.repository.delete.service.RepositoryDeletionManager; import org.olat.repository.handlers.RepositoryHandler; import org.olat.repository.handlers.RepositoryHandlerFactory; import org.olat.repository.model.RepositoryEntryMember; @@ -91,6 +90,7 @@ import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceImpl; import org.olat.resource.OLATResourceManager; import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.transaction.annotation.Transactional; /** * Initial Date: Mar 31, 2004 @@ -102,24 +102,24 @@ import org.olat.util.logging.activity.LoggingResourceable; */ public class RepositoryManager extends BasicManager { + private static final OLog log = Tracing.createLoggerFor(RepositoryManager.class); + private final int PICTUREWIDTH = 570; - private static RepositoryManager INSTANCE; private BaseSecurity securityManager; private ImageHelper imageHelper; - private static BackgroundTaskQueueManager taskQueueManager; private UserCourseInformationsManager userCourseInformationsManager; private DB dbInstance; + /** - * [used by spring] + * [used by Spring] + * @param securityManager */ - private RepositoryManager(BaseSecurity securityManager, BackgroundTaskQueueManager taskQueueManager) { + public void setSecurityManager(BaseSecurity securityManager) { this.securityManager = securityManager; - RepositoryManager.taskQueueManager = taskQueueManager; - INSTANCE = this; } - + /** * [used by Spring] * @param userCourseInformationsManager @@ -147,7 +147,9 @@ public class RepositoryManager extends BasicManager { /** * @return Singleton. */ - public static RepositoryManager getInstance() { return INSTANCE; } + public static RepositoryManager getInstance() { + return CoreSpringFactory.getImpl(RepositoryManager.class); + } /** * @param initialAuthor @@ -195,10 +197,10 @@ public class RepositoryManager extends BasicManager { * Update repo entry. * @param re */ - public void updateRepositoryEntry(RepositoryEntry re) { + /*public void updateRepositoryEntry(RepositoryEntry re) { re.setLastModified(new Date()); DBFactory.getInstance().updateObject(re); - } + }*/ /** * Delete repo entry. @@ -212,8 +214,16 @@ public class RepositoryManager extends BasicManager { deleteImage(re); } - public void createTutorSecurityGroup(RepositoryEntry re) { - if(re.getTutorGroup() != null) return; + /** + * + * @param re + * @param update If true, update the repository immediately + * @return + */ + public RepositoryEntry createTutorSecurityGroup(RepositoryEntry re, boolean update) { + if(re.getTutorGroup() != null) { + return re; + } SecurityGroup tutorGroup = securityManager.createAndPersistSecurityGroup(); // member of this group may modify member's membership @@ -222,10 +232,21 @@ public class RepositoryManager extends BasicManager { // members of this group are always tutors also securityManager.createAndPersistPolicy(tutorGroup, Constants.PERMISSION_HASROLE, Constants.ORESOURCE_TUTOR); re.setTutorGroup(tutorGroup); + if(update) { + re = DBFactory.getInstance().getCurrentEntityManager().merge(re); + } + return re; } - public void createParticipantSecurityGroup(RepositoryEntry re) { - if(re.getParticipantGroup() != null) return; + /** + * + * @param re + * @param update If true, update the repository immediately + */ + public RepositoryEntry createParticipantSecurityGroup(RepositoryEntry re, boolean update) { + if(re.getParticipantGroup() != null) { + return re; + } SecurityGroup participantGroup = securityManager.createAndPersistSecurityGroup(); // member of this group may modify member's membership @@ -234,6 +255,10 @@ public class RepositoryManager extends BasicManager { // members of this group are always participants also securityManager.createAndPersistPolicy(participantGroup, Constants.PERMISSION_HASROLE, Constants.ORESOURCE_PARTICIPANT); re.setParticipantGroup(participantGroup); + if(update) { + re = DBFactory.getInstance().getCurrentEntityManager().merge(re); + } + return re; } public void createOwnerSecurityGroup(RepositoryEntry re) { @@ -393,6 +418,7 @@ public class RepositoryManager extends BasicManager { * @param the repository entry key (not the olatresourceable key) * @return Repo entry represented by key or null if no such entry or key is null. */ + @Transactional(readOnly=true) public RepositoryEntry lookupRepositoryEntry(Long key) { if (key == null) return null; return lookupRepositoryEntry(key, false) ; @@ -403,6 +429,7 @@ public class RepositoryManager extends BasicManager { * @param the repository entry key (not the olatresourceable key) * @return Repo entry represented by key or null if no such entry or key is null. */ + @Transactional(readOnly=true) public RepositoryEntry lookupRepositoryEntry(Long key, boolean strict) { if (key == null) return null; if(strict) { @@ -423,7 +450,8 @@ public class RepositoryManager extends BasicManager { } return entries.get(0); } - + + @Transactional(readOnly=true) public List<RepositoryEntry> lookupRepositoryEntries(Collection<Long> keys) { if (keys == null || keys.isEmpty()) { return Collections.emptyList(); @@ -451,6 +479,7 @@ public class RepositoryManager extends BasicManager { * @return the RepositorEntry or null if strict=false * @throws AssertException if the softkey could not be found (strict=true) */ + @Transactional(readOnly=true) public RepositoryEntry lookupRepositoryEntry(OLATResourceable resourceable, boolean strict) { OLATResource ores = (resourceable instanceof OLATResource) ? (OLATResource)resourceable : OLATResourceManager.getInstance().findResourceable(resourceable); @@ -619,48 +648,124 @@ public class RepositoryManager extends BasicManager { return false; } + private RepositoryEntry loadForUpdate(RepositoryEntry re) { + //first remove it from caches + DBFactory.getInstance().getCurrentEntityManager().detach(re); + + StringBuilder query = new StringBuilder(); + query.append("select v from ").append(RepositoryEntry.class.getName()).append(" as v ") + .append(" left join fetch v.olatResource as ores") + .append(" left join fetch v.ownerGroup as ownerGroup") + .append(" left join fetch v.participantGroup as participantGroup") + .append(" left join fetch v.tutorGroup as tutorGroup") + .append(" where v.key=:repoKey"); + + RepositoryEntry entry = DBFactory.getInstance().getCurrentEntityManager().createQuery(query.toString(), RepositoryEntry.class) + .setParameter("repoKey", re.getKey()) + .setLockMode(LockModeType.PESSIMISTIC_WRITE) + .getSingleResult(); + return entry; + } + + private void updateLifeCycle(RepositoryEntry reloadedRe) { + LifeCycleManager lcManager = LifeCycleManager.createInstanceFor(reloadedRe); + if (lcManager.lookupLifeCycleEntry(RepositoryDeletionManager.SEND_DELETE_EMAIL_ACTION) != null) { + log.audit("Repository-Deletion: Remove from delete-list repositoryEntry=" + reloadedRe); + lcManager.deleteTimestampFor(RepositoryDeletionManager.SEND_DELETE_EMAIL_ACTION); + } + } + /** * Increment the launch counter. * @param re */ - public void incrementLaunchCounter(RepositoryEntry re) { - taskQueueManager.addTask(new IncrementLaunchCounterBackgroundTask(re)); + @Transactional + public RepositoryEntry incrementLaunchCounter(RepositoryEntry re) { + RepositoryEntry reloadedRe = loadForUpdate(re); + if(reloadedRe == null) return null;//deleted + + reloadedRe.setLaunchCounter(reloadedRe.getLaunchCounter() + 1); + reloadedRe.setLastUsage(new Date()); + updateLifeCycle(reloadedRe); + + RepositoryEntry updatedRe = DBFactory.getInstance().getCurrentEntityManager().merge(reloadedRe); + DBFactory.getInstance().commitAndCloseSession(); + return updatedRe; } - + /** * Increment the download counter. * @param re */ - public void incrementDownloadCounter(final RepositoryEntry re) { - taskQueueManager.addTask(new IncrementDownloadCounterBackgroundTask(re)); + @Transactional + public RepositoryEntry incrementDownloadCounter( final RepositoryEntry re) { + RepositoryEntry reloadedRe = loadForUpdate(re); + if(reloadedRe == null) return null;//deleted + + reloadedRe.incrementDownloadCounter(); + reloadedRe.setLastUsage(new Date()); + updateLifeCycle(reloadedRe); + RepositoryEntry updatedRe = DBFactory.getInstance().getCurrentEntityManager().merge(reloadedRe); + DBFactory.getInstance().commitAndCloseSession(); + return updatedRe; } /** * Set last-usage date to to now for certain repository-entry. * @param */ - public static void setLastUsageNowFor(final RepositoryEntry re) { - if (re != null) { - taskQueueManager.addTask(new SetLastUsageBackgroundTask(re)); - } + @Transactional + public RepositoryEntry setLastUsageNowFor(final RepositoryEntry re) { + if (re == null) return null; + RepositoryEntry reloadedRe = loadForUpdate(re); + reloadedRe.setLastUsage(new Date()); + RepositoryEntry updatedRe = DBFactory.getInstance().getCurrentEntityManager().merge(reloadedRe); + DBFactory.getInstance().commitAndCloseSession(); + return updatedRe; } - public void setAccess(final RepositoryEntry re, int access, boolean membersOnly ) { - SetAccessBackgroundTask task = new SetAccessBackgroundTask(re, access, membersOnly); - taskQueueManager.addTask(task); - task.waitForDone(); + @Transactional + public RepositoryEntry setAccess(final RepositoryEntry re, int access, boolean membersOnly ) { + RepositoryEntry reloadedRe = loadForUpdate(re); + reloadedRe.setAccess(access); + reloadedRe.setMembersOnly(membersOnly);//fxdiff VCRP-1,2: access control of resources + + RepositoryEntry updatedRe = DBFactory.getInstance().getCurrentEntityManager().merge(reloadedRe); + DBFactory.getInstance().commitAndCloseSession(); + return updatedRe; } - public void setDescriptionAndName(final RepositoryEntry re, String displayName, String description ) { - SetDescriptionNameBackgroundTask task = new SetDescriptionNameBackgroundTask(re, displayName, description); - taskQueueManager.addTask(task); - task.waitForDone(); + /** + * + * @param re + * @param displayName If null, nothing happen + * @param description If null, nothing happen + * @return + */ + @Transactional + public RepositoryEntry setDescriptionAndName(final RepositoryEntry re, String displayName, String description ) { + RepositoryEntry reloadedRe = loadForUpdate(re); + if(StringHelper.containsNonWhitespace(displayName)) { + reloadedRe.setDisplayname(displayName); + } + if(StringHelper.containsNonWhitespace(description)) { + reloadedRe.setDescription(description); + } + RepositoryEntry updatedRe = DBFactory.getInstance().getCurrentEntityManager().merge(reloadedRe); + DBFactory.getInstance().commitAndCloseSession(); + return updatedRe; } - public void setProperties(final RepositoryEntry re, boolean canCopy, boolean canReference, boolean canLaunch, boolean canDownload ) { - SetPropertiesBackgroundTask task = new SetPropertiesBackgroundTask(re, canCopy, canReference, canLaunch, canDownload); - taskQueueManager.addTask(task); - task.waitForDone(); + @Transactional + public RepositoryEntry setProperties(final RepositoryEntry re, boolean canCopy, boolean canReference, boolean canLaunch, boolean canDownload ) { + RepositoryEntry reloadedRe = loadForUpdate(re); + reloadedRe.setCanCopy(canCopy); + reloadedRe.setCanReference(canReference); + reloadedRe.setCanLaunch(canLaunch); + reloadedRe.setCanDownload(canDownload); + RepositoryEntry updatedRe = DBFactory.getInstance().getCurrentEntityManager().merge(reloadedRe); + DBFactory.getInstance().commitAndCloseSession(); + return updatedRe; } diff --git a/src/main/java/org/olat/repository/_spring/repositoryContext.xml b/src/main/java/org/olat/repository/_spring/repositoryContext.xml index 360ec651ddd..0d3c773f010 100644 --- a/src/main/java/org/olat/repository/_spring/repositoryContext.xml +++ b/src/main/java/org/olat/repository/_spring/repositoryContext.xml @@ -22,17 +22,10 @@ <bean id="repositoryManager" class="org.olat.repository.RepositoryManager"> - <constructor-arg index="0" ref="baseSecurityManager" /> - <constructor-arg index="1" ref="org.olat.core.commons.persistence.async.BackgroundTaskQueueManager" /> <property name="userCourseInformationsManager" ref="userCourseInformationsManager"/> <property name="imageHelper" ref="imageHelper"/> <property name="dbInstance" ref="database"/> + <property name="securityManager" ref="baseSecurityManager" /> </bean> -<!-- BackgroundTaskQueueManager for increment launch-,download-counter and set LastUsage in background thread --> -<bean id="org.olat.core.commons.persistence.async.BackgroundTaskQueueManager" class="org.olat.repository.async.BackgroundTaskQueueManager" destroy-method="destroy"> - <!-- Number of retries when a task failed e.g. incrementLaunchCounter try 20 times to increment when a exception occurs --> - <property name="maxRetry" value="20"/> -</bean> - </beans> \ No newline at end of file diff --git a/src/main/java/org/olat/repository/async/AbstractBackgroundTask.java b/src/main/java/org/olat/repository/async/AbstractBackgroundTask.java deleted file mode 100644 index a115eaae7ea..00000000000 --- a/src/main/java/org/olat/repository/async/AbstractBackgroundTask.java +++ /dev/null @@ -1,143 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - -import org.hibernate.HibernateException; -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.logging.DBRuntimeException; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; - - -/** - * @author Christian Guretzki - */ -public abstract class AbstractBackgroundTask implements BackgroundTask { - private static OLog log = Tracing.createLoggerFor(AbstractBackgroundTask.class); - - private int maxRetry = 1000;// 0 = endless retry - - private boolean taskDone = false; - - public AbstractBackgroundTask() { - } - - public void execute() { - boolean finished = false; - int retry = 0; - while(!finished ) { - try { - executeTask(); - DBFactory.getInstance().commitAndCloseSession(); - finished = true; - // catch all exception because other cluster nodes can write data concurrently - } catch (DBRuntimeException re) { - log.debug("DBRuntimeException in executeTask retry=" + retry + " Ex=" + re); - retry++; - finished = handleError( retry); - } catch (HibernateException re) { - log.debug("RuntimeException in executeTask retry=" + retry); - retry++; - finished = handleError( retry); - } catch (Error re) { - log.debug("Error in executeTask retry=" + retry); - retry++; - finished = handleError( retry); - } catch(Throwable th) { - log.debug("Error in executeTask retry=" + retry); - retry++; - finished = handleError( retry); - } - if (!finished) { - try { - Thread.sleep(5); - } catch (InterruptedException e) { - // empty is ok - } - } - } - if (retry > 0) { - if (retry >= maxRetry) { - log.error("Too many retries, check background-task , retry=" + retry ); - } else { - log.debug("retry=" + retry ); - } - } - log.debug("set taskDone=true this=" + this); - taskDone = true; - } - - - private boolean handleError( int retry) { - boolean finished = false; - if ( (maxRetry != 0 ) && (retry >= maxRetry) ){ - // finished because to many retries - finished = true; - } - try { - DBFactory.getInstance().rollbackAndCloseSession(); - log.debug("handleError DB-Session rolled back and closed"); - } catch (DBRuntimeException re) { - log.debug("###DBRuntimeException2, Could not rollbackAndCloseSession properly after Exception in BackgroundTask.execute"); - } catch (HibernateException re2) { - log.debug("###HibernateException2, Could not rollbackAndCloseSession properly after Exception in BackgroundTask.execute"); - } catch (Error re) { - log.debug("###Error2, Could not rollbackAndCloseSession properly after Exception in BackgroundTask.execute"); - } catch (Throwable th2) { - log.debug("###Could not rollbackAndCloseSession properly after Exception in BackgroundTask.execute" ); - } - return finished; - } - - public void setMaxRetry(int maxRetry) { - this.maxRetry = maxRetry; - } - - public abstract void executeTask(); - - public boolean isTaskDone() { - return taskDone; - } - - public void waitForDone() { - log.debug("waitForDone start"); - // Wait until background task is done or reach timeout - int counter = 0; - int COUNTER_LIMIT = 10; - while (!this.isTaskDone() && counter < COUNTER_LIMIT) { - try { - log.debug("waitForDone: this.isTaskDone()=" + this.isTaskDone() + " counter=" + counter + " this=" + this); - Thread.sleep(200); - counter++; - } catch (InterruptedException e) { - // no log - } - } - if (counter >= COUNTER_LIMIT) { - log.error("waitForDone: Could not finish BackgroundTask this=" + this); - } - } - -} diff --git a/src/main/java/org/olat/repository/async/BackgroundTask.java b/src/main/java/org/olat/repository/async/BackgroundTask.java deleted file mode 100644 index ff01ad6fec4..00000000000 --- a/src/main/java/org/olat/repository/async/BackgroundTask.java +++ /dev/null @@ -1,37 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - - -/** - * @author Christian Guretzki - */ -public interface BackgroundTask { - - public void execute(); - - public void setMaxRetry(int maxRetry); - -} diff --git a/src/main/java/org/olat/repository/async/BackgroundTaskQueueManager.java b/src/main/java/org/olat/repository/async/BackgroundTaskQueueManager.java deleted file mode 100644 index a50c83e9cd5..00000000000 --- a/src/main/java/org/olat/repository/async/BackgroundTaskQueueManager.java +++ /dev/null @@ -1,90 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; - -import org.apache.log4j.Logger; -import org.olat.core.manager.BasicManager; - -/** - * !!!This is only for the Repository Manager. It's absolutely forbidden to use for something else!!! - * - * FIFO-queue for background job. Application can put-in 'background-task', the background-job check in a fix interval - * this queue and can execute task. If you look for scheduled tasks check TaskExecutorManager - * - * @author Christian Guretzki - */ -public class BackgroundTaskQueueManager extends BasicManager { - private static Logger log = Logger.getLogger(BackgroundTaskQueueManager.class.getName()); - - private Queue<BackgroundTask> backgroundTaskQueue; - - private int maxRetry; - - private TaskExecutorThread taskExecutor; - - /** - * [used by spring] - */ - private BackgroundTaskQueueManager() { - backgroundTaskQueue = new ConcurrentLinkedQueue<BackgroundTask>(); - taskExecutor = new TaskExecutorThread(backgroundTaskQueue); - taskExecutor.setDaemon(true); - taskExecutor.start(); - } - - /** - * [used by spring] - */ - public void destroy() { - taskExecutor.stopExecutor(); - addTask(new BackgroundTask() { - @Override - public void execute() { /* */ } - @Override - public void setMaxRetry(int maxRetry) { /* */ } - }); - } - - public Queue<BackgroundTask> getQueue() { - return backgroundTaskQueue; - } - - public void addTask(BackgroundTask task) { - log.debug("Add task=" + task); - task.setMaxRetry(maxRetry); - synchronized(backgroundTaskQueue) { - backgroundTaskQueue.offer(task); - backgroundTaskQueue.notifyAll(); - } - } - - public void setMaxRetry(int maxRetry) { - this.maxRetry = maxRetry; - } - -} diff --git a/src/main/java/org/olat/repository/async/IncrementDownloadCounterBackgroundTask.java b/src/main/java/org/olat/repository/async/IncrementDownloadCounterBackgroundTask.java deleted file mode 100644 index 23d1ef37c92..00000000000 --- a/src/main/java/org/olat/repository/async/IncrementDownloadCounterBackgroundTask.java +++ /dev/null @@ -1,70 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - -import java.util.Date; - -import org.olat.commons.lifecycle.LifeCycleManager; -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.repository.RepositoryEntry; -import org.olat.repository.RepositoryManager; -import org.olat.repository.delete.service.RepositoryDeletionManager; -import org.olat.testutils.codepoints.server.Codepoint; - - -/** - * @author Christian Guretzki - */ -public class IncrementDownloadCounterBackgroundTask extends AbstractBackgroundTask { - private static OLog log = Tracing.createLoggerFor(IncrementDownloadCounterBackgroundTask.class); - - private RepositoryEntry repositoryEntry; - - public IncrementDownloadCounterBackgroundTask(RepositoryEntry repositoryEntry) { - this.repositoryEntry = repositoryEntry; - } - public void executeTask() { - log.debug("IncrementDownloadCounterBackgroundTask executing with repositoryEntry=" + repositoryEntry); - // this code must not be synchronized because in case of exception we try it again - // this code must not have any error handling or retry, this will be done in super class - if ( RepositoryManager.getInstance().lookupRepositoryEntry(repositoryEntry.getKey()) != null ) { - RepositoryEntry reloadedRe = (RepositoryEntry) DBFactory.getInstance().loadObject(repositoryEntry, true); - reloadedRe.incrementDownloadCounter(); - reloadedRe.setLastUsage(new Date()); - LifeCycleManager lcManager = LifeCycleManager.createInstanceFor(reloadedRe); - if (lcManager.lookupLifeCycleEntry(RepositoryDeletionManager.SEND_DELETE_EMAIL_ACTION) != null) { - log.audit("Repository-Deletion: Remove from delete-list repositoryEntry=" + reloadedRe); - LifeCycleManager.createInstanceFor(reloadedRe).deleteTimestampFor(RepositoryDeletionManager.SEND_DELETE_EMAIL_ACTION); - } - Codepoint.hierarchicalCodepoint(IncrementDownloadCounterBackgroundTask.class, "executeTask-before-update", 1); - RepositoryManager.getInstance().updateRepositoryEntry(reloadedRe); - } else { - log.info("Could not executeTask, because repositoryEntry does no longer exist"); - } - } - -} diff --git a/src/main/java/org/olat/repository/async/IncrementLaunchCounterBackgroundTask.java b/src/main/java/org/olat/repository/async/IncrementLaunchCounterBackgroundTask.java deleted file mode 100644 index 5e2e68ef531..00000000000 --- a/src/main/java/org/olat/repository/async/IncrementLaunchCounterBackgroundTask.java +++ /dev/null @@ -1,68 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - -import java.util.Date; - -import org.olat.commons.lifecycle.LifeCycleManager; -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.repository.RepositoryEntry; -import org.olat.repository.RepositoryManager; -import org.olat.repository.delete.service.RepositoryDeletionManager; - - -/** - * @author Christian Guretzki - */ -public class IncrementLaunchCounterBackgroundTask extends AbstractBackgroundTask { - private static OLog log = Tracing.createLoggerFor(IncrementLaunchCounterBackgroundTask.class); - - private RepositoryEntry repositoryEntry; - - public IncrementLaunchCounterBackgroundTask(RepositoryEntry repositoryEntry) { - this.repositoryEntry = repositoryEntry; - } - public void executeTask() { - log.debug("IncrementLaunchCounterBackgroundTask executing with repositoryEntry=" + repositoryEntry); - // this code must not be synchronized because in case of exception we try it again - // this code must not have any error handling or retry, this will be done in super class - if ( RepositoryManager.getInstance().lookupRepositoryEntry(repositoryEntry.getKey()) != null ) { - RepositoryEntry reloadedRe = (RepositoryEntry) DBFactory.getInstance().loadObject(repositoryEntry, true); - reloadedRe.incrementLaunchCounter(); - reloadedRe.setLastUsage(new Date()); - LifeCycleManager lcManager = LifeCycleManager.createInstanceFor(reloadedRe); - if (lcManager.lookupLifeCycleEntry(RepositoryDeletionManager.SEND_DELETE_EMAIL_ACTION) != null) { - log.audit("Repository-Deletion: Remove from delete-list repositoryEntry=" + reloadedRe); - LifeCycleManager.createInstanceFor(reloadedRe).deleteTimestampFor(RepositoryDeletionManager.SEND_DELETE_EMAIL_ACTION); - } - RepositoryManager.getInstance().updateRepositoryEntry(reloadedRe); - } else { - log.info("Could not executeTask, because repositoryEntry does no longer exist"); - } - } - -} diff --git a/src/main/java/org/olat/repository/async/SetAccessBackgroundTask.java b/src/main/java/org/olat/repository/async/SetAccessBackgroundTask.java deleted file mode 100644 index 71beb1636e2..00000000000 --- a/src/main/java/org/olat/repository/async/SetAccessBackgroundTask.java +++ /dev/null @@ -1,66 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.repository.RepositoryEntry; -import org.olat.repository.RepositoryManager; - - -/** - * @author Christian Guretzki - */ -public class SetAccessBackgroundTask extends AbstractBackgroundTask { - private static OLog log = Tracing.createLoggerFor(SetAccessBackgroundTask.class); - - private RepositoryEntry repositoryEntry; - private int access; - private boolean membersOnly;//fxdiff VCRP-1,2: access control of resources - - public SetAccessBackgroundTask(RepositoryEntry repositoryEntry, int access, boolean membersOnly) { - this.repositoryEntry = repositoryEntry; - this.access = access; - this.membersOnly = membersOnly; - } - - public void executeTask() { - log.debug("SetAccessBackgroundTask executing with repositoryEntry=" + repositoryEntry); - // this code must not be synchronized because in case of exception we try it again - // this code must not have any error handling or retry, this will be done in super class - if ( RepositoryManager.getInstance().lookupRepositoryEntry(repositoryEntry.getKey()) != null ) { - RepositoryEntry reloadedRe = (RepositoryEntry) DBFactory.getInstance().loadObject(repositoryEntry, true); - reloadedRe.setAccess(access); - reloadedRe.setMembersOnly(membersOnly);//fxdiff VCRP-1,2: access control of resources - RepositoryManager.getInstance().updateRepositoryEntry(reloadedRe); - log.debug("SetAccessBackgroundTask DONE for repositoryEntry=" + repositoryEntry + " this=" + this); - } else { - log.info("Could not executeTask, because repositoryEntry does no longer exist"); - } - } - - -} diff --git a/src/main/java/org/olat/repository/async/SetDescriptionNameBackgroundTask.java b/src/main/java/org/olat/repository/async/SetDescriptionNameBackgroundTask.java deleted file mode 100644 index ac075733fa5..00000000000 --- a/src/main/java/org/olat/repository/async/SetDescriptionNameBackgroundTask.java +++ /dev/null @@ -1,65 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.repository.RepositoryEntry; -import org.olat.repository.RepositoryManager; - - -/** - * @author Christian Guretzki - */ -public class SetDescriptionNameBackgroundTask extends AbstractBackgroundTask { - private static OLog log = Tracing.createLoggerFor(SetDescriptionNameBackgroundTask.class); - - private RepositoryEntry repositoryEntry; - - private String displayname; - - private String description; - - public SetDescriptionNameBackgroundTask(RepositoryEntry repositoryEntry, String displayname, String description) { - this.repositoryEntry = repositoryEntry; - this.displayname = displayname; - this.description = description; - } - public void executeTask() { - log.debug("SetDescriptionNameBackgroundTask executing with repositoryEntry=" + repositoryEntry); - // this code must not be synchronized because in case of exception we try it again - // this code must not have any error handling or retry, this will be done in super class - if ( RepositoryManager.getInstance().lookupRepositoryEntry(repositoryEntry.getKey()) != null ) { - RepositoryEntry reloadedRe = (RepositoryEntry) DBFactory.getInstance().loadObject(repositoryEntry, true); - reloadedRe.setDisplayname(displayname); - reloadedRe.setDescription(description); - RepositoryManager.getInstance().updateRepositoryEntry(reloadedRe); - } else { - log.info("Could not executeTask, because repositoryEntry does no longer exist"); - } - } - -} diff --git a/src/main/java/org/olat/repository/async/SetLastUsageBackgroundTask.java b/src/main/java/org/olat/repository/async/SetLastUsageBackgroundTask.java deleted file mode 100644 index a553ff6ce7c..00000000000 --- a/src/main/java/org/olat/repository/async/SetLastUsageBackgroundTask.java +++ /dev/null @@ -1,67 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - -import java.util.Date; - -import org.olat.commons.lifecycle.LifeCycleManager; -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.repository.RepositoryEntry; -import org.olat.repository.RepositoryManager; -import org.olat.repository.delete.service.RepositoryDeletionManager; - - -/** - * @author Christian Guretzki - */ -public class SetLastUsageBackgroundTask extends AbstractBackgroundTask { - private static OLog log = Tracing.createLoggerFor(SetLastUsageBackgroundTask.class); - - private RepositoryEntry repositoryEntry; - - public SetLastUsageBackgroundTask(RepositoryEntry repositoryEntry) { - this.repositoryEntry = repositoryEntry; - } - public void executeTask() { - log.debug("SetLastUsageBackgroundTask executing with repositoryEntry=" + repositoryEntry); - // this code must not be synchronized because in case of exception we try it again - // this code must not have any error handling or retry, this will be done in super class - if ( RepositoryManager.getInstance().lookupRepositoryEntry(repositoryEntry.getKey()) != null ) { - RepositoryEntry reloadedRe = (RepositoryEntry) DBFactory.getInstance().loadObject(repositoryEntry, true); - reloadedRe.setLastUsage(new Date()); - LifeCycleManager lcManager = LifeCycleManager.createInstanceFor(reloadedRe); - if (lcManager.lookupLifeCycleEntry(RepositoryDeletionManager.SEND_DELETE_EMAIL_ACTION) != null) { - log.audit("Repository-Deletion: Remove from delete-list repositoryEntry=" + reloadedRe); - lcManager.deleteTimestampFor(RepositoryDeletionManager.SEND_DELETE_EMAIL_ACTION); - } - RepositoryManager.getInstance().updateRepositoryEntry(reloadedRe); - } else { - log.info("Could not executeTask, because repositoryEntry does no longer exist"); - } - } - -} diff --git a/src/main/java/org/olat/repository/async/SetPropertiesBackgroundTask.java b/src/main/java/org/olat/repository/async/SetPropertiesBackgroundTask.java deleted file mode 100644 index 6b1a272b30d..00000000000 --- a/src/main/java/org/olat/repository/async/SetPropertiesBackgroundTask.java +++ /dev/null @@ -1,71 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.repository.RepositoryEntry; -import org.olat.repository.RepositoryManager; - - -/** - * @author Christian Guretzki - */ -public class SetPropertiesBackgroundTask extends AbstractBackgroundTask { - private static OLog log = Tracing.createLoggerFor(SetPropertiesBackgroundTask.class); - - private RepositoryEntry repositoryEntry; - - private boolean canCopy; - private boolean canReference; - private boolean canLaunch; - private boolean canDownload; - - - public SetPropertiesBackgroundTask(RepositoryEntry repositoryEntry, boolean canCopy, boolean canReference, boolean canLaunch, boolean canDownload) { - this.repositoryEntry = repositoryEntry; - this.canCopy = canCopy; - this.canReference = canReference; - this.canLaunch = canLaunch; - this.canDownload = canDownload; - } - public void executeTask() { - log.debug("SetPropertiesBackgroundTask executing with repositoryEntry=" + repositoryEntry); - // this code must not be synchronized because in case of exception we try it again - // this code must not have any error handling or retry, this will be done in super class - if ( RepositoryManager.getInstance().lookupRepositoryEntry(repositoryEntry.getKey()) != null ) { - RepositoryEntry reloadedRe = (RepositoryEntry) DBFactory.getInstance().loadObject(repositoryEntry, true); - reloadedRe.setCanCopy(canCopy); - reloadedRe.setCanReference(canReference); - reloadedRe.setCanLaunch(canLaunch); - reloadedRe.setCanDownload(canDownload); - RepositoryManager.getInstance().updateRepositoryEntry(reloadedRe); - } else { - log.info("Could not executeTask, because repositoryEntry does no longer exist"); - } - } - -} diff --git a/src/main/java/org/olat/repository/async/TaskExecutorThread.java b/src/main/java/org/olat/repository/async/TaskExecutorThread.java deleted file mode 100644 index ac052645138..00000000000 --- a/src/main/java/org/olat/repository/async/TaskExecutorThread.java +++ /dev/null @@ -1,99 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <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 -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <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> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.repository.async; - -import java.util.Queue; - -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; - -/** - * this is a special task executor system used only for learning resources. If you look for a general task Executor for scheduled tasks - * search for TaskExecutorManager which does Quartz scheduled tasks. - * TODO:gs may convert this to taskexecutor manager - * @author Christian Guretzki - */ -public class TaskExecutorThread extends Thread { - private static OLog log = Tracing.createLoggerFor(TaskExecutorThread.class); - private Queue<BackgroundTask> taskQueue; - private volatile boolean running = true; - - public TaskExecutorThread(Queue<BackgroundTask> taskQueue) { - super("TaskExecutorThread"); - this.taskQueue = taskQueue; - } - - public void stopExecutor() { - running = false; - } - - public void run() { - log.info("TaskExecutorThread started"); - while(running) { - synchronized(taskQueue) { - if (taskQueue.size() == 0) { - try { - log.debug("TaskExecutorThread waiting..."); - taskQueue.wait(); - } catch (InterruptedException e) { - log.error("Execption when waiting", e); - } - } - } - log.debug("TaskExecutorThread in working loop"); - if (taskQueue.size() > 0) { - // Queue is not empty - long startTime = 0; - if (log.isDebug()) { - startTime = System.currentTimeMillis(); - } - if (taskQueue.size() > 10) { - if (taskQueue.size() > 20) { - log.error("Too many item in background-job queue, queue-size=" + taskQueue.size() + ", check execution-time"); - } else { - log.warn("Many item in background-job queue, queue-size=" + taskQueue.size() + ", check execution-time"); - } - } - int executeCount = 0; - while(!taskQueue.isEmpty()) { - log.debug("TaskExecutorThread taskQueue is not empty => execute task"); - taskQueue.poll().execute(); - executeCount++; - } - // running in a seperate thread, we must close db-session after each run. - DBFactory.getInstance().commitAndCloseSession(); - if (log.isDebug()) { - long endTime = System.currentTimeMillis(); - log.debug("TaskExecutorThread executed in " + (endTime - startTime) + "ms, executeCount=" + executeCount ); - } - } else { - log.warn("taskQueue notified but queue was empty"); - } - } - log.info("TaskExecutorThread finished"); - } - -} diff --git a/src/main/java/org/olat/repository/async/doc-files/BackgroundJobDesign.png b/src/main/java/org/olat/repository/async/doc-files/BackgroundJobDesign.png deleted file mode 100644 index 87ac35dee102a4808ddeca07cbada8a0f40c56ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25366 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 Xs_D5@n>PI8ifw1l7;5L7w!8g5Sq@c> diff --git a/src/main/java/org/olat/repository/async/doc-files/BackgroundJobDesign.vsd b/src/main/java/org/olat/repository/async/doc-files/BackgroundJobDesign.vsd deleted file mode 100644 index 905aed11310c5b0852fe0d51433ce7d5bb0f6446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154624 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�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 P;<v8<)R@Kp{XqU3^e~$O diff --git a/src/main/java/org/olat/repository/async/package.html b/src/main/java/org/olat/repository/async/package.html deleted file mode 100644 index 166a16bfeaa..00000000000 --- a/src/main/java/org/olat/repository/async/package.html +++ /dev/null @@ -1,17 +0,0 @@ -<html> -<head> -</head> - -<body> - -Overview description of asynchron background task. -The business-logic can create background-task, which will be executed async by the background-db-updater job (QuarzJob). -This job runs with a configurable interval. The task will be added to FIFO queue. The queue will be checked by the background-db-updater job. - -<h3>Class Diagram</h3> -<p> -<img src="doc-files/BackgroundJobDesign.png"/> - - -</body> -</html> \ No newline at end of file diff --git a/src/main/java/org/olat/repository/controllers/RepositoryAddController.java b/src/main/java/org/olat/repository/controllers/RepositoryAddController.java index d6d6ee85546..8d93ae2f344 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryAddController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryAddController.java @@ -116,7 +116,6 @@ public class RepositoryAddController extends BasicController { private boolean workflowSuccessful = false; private Link cancelButton; private Link forwardButton; - private Panel panel; private String actionAddCommand, actionProcess; /** @@ -284,8 +283,7 @@ public class RepositoryAddController extends BasicController { repositoryadd.contextPut("typeIntro", typeIntro); forwardButton.setEnabled(false); forwardButton.setTextReasonForDisabling(translate("disabledforwardreason")); - panel = putInitialPanel(repositoryadd); - return; + putInitialPanel(repositoryadd); } /** @@ -312,19 +310,14 @@ public class RepositoryAddController extends BasicController { */ public void event(UserRequest ureq, Component source, Event event) { if (source == forwardButton){ - - //FIXME: this code belongs to the repo manager and not here! // finish transaction and add repository entry if (!addController.transactionFinishBeforeCreate()) return; //save current name and description from create from String displayName = addedEntry.getDisplayname(); String description = addedEntry.getDescription(); // Do set access for owner at the end, because unfinished course should be invisible - addedEntry = (RepositoryEntry) DBFactory.getInstance().loadObject(addedEntry); // need a reload from hibernate because create a new cp load a repository-entry (OLAT-5631) TODO: 7.1 Refactor in method getRepositoryEntry() - addedEntry.setAccess(RepositoryEntry.ACC_OWNERS); - addedEntry.setDisplayname(displayName); - addedEntry.setDescription(description); - RepositoryManager.getInstance().updateRepositoryEntry(addedEntry); + addedEntry = RepositoryManager.getInstance().setDescriptionAndName(addedEntry, displayName, description); + addedEntry = RepositoryManager.getInstance().setAccess(addedEntry, RepositoryEntry.ACC_OWNERS, false); addController.repositoryEntryCreated(addedEntry); workflowSuccessful = true; diff --git a/src/main/java/org/olat/repository/controllers/RepositoryCopyController.java b/src/main/java/org/olat/repository/controllers/RepositoryCopyController.java index d87e14a3f1e..53b0dc4bc87 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryCopyController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryCopyController.java @@ -42,7 +42,6 @@ import org.olat.core.id.OLATResourceable; import org.olat.core.logging.DBRuntimeException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; -import org.olat.core.util.Util; import org.olat.repository.DetailsReadOnlyForm; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; @@ -59,10 +58,7 @@ import org.olat.resource.OLATResourceManager; */ public class RepositoryCopyController extends BasicController { - OLog log = Tracing.createLoggerFor(this.getClass()); - - private static final String PACKAGE = Util.getPackageName(RepositoryManager.class); - private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(RepositoryManager.class); + private static final OLog log = Tracing.createLoggerFor(RepositoryCopyController.class); private VelocityContainer mainContainer; private Link cancelButton; @@ -142,9 +138,10 @@ public class RepositoryCopyController extends BasicController { fireEvent(ureq, new EntryChangedEvent(sourceEntry, EntryChangedEvent.DELETED)); return; } - newEntry = descriptionController.getRepositoryEntry(); + String displayname = descriptionController.getRepositoryEntry().getDisplayname(); + String description = descriptionController.getRepositoryEntry().getDescription(); //update needed to save changed name and desc. - RepositoryManager.getInstance().updateRepositoryEntry(newEntry); + newEntry = RepositoryManager.getInstance().setDescriptionAndName(newEntry, displayname, description); RepositoryHandler typeToCopy = RepositoryHandlerFactory.getInstance().getRepositoryHandler(sourceEntry); IAddController addController = typeToCopy.createAddController(null, null, ureq, getWindowControl()); addController.repositoryEntryCreated(newEntry); diff --git a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java index 639343a17f5..82e01a29b07 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java @@ -958,16 +958,14 @@ public class RepositoryDetailsController extends BasicController implements Gene } else if (cmd.equals(ACTION_GROUPS_TUTOR)) { // edit tutor group if (!isOwner) throw new OLATSecurityException("Trying to access groupmanagement, but not allowed: user = " + ureq.getIdentity()); if(repositoryEntry.getTutorGroup() == null){ - RepositoryManager.getInstance().createTutorSecurityGroup(repositoryEntry); - RepositoryManager.getInstance().updateRepositoryEntry(repositoryEntry); + repositoryEntry = RepositoryManager.getInstance().createTutorSecurityGroup(repositoryEntry, true); } groupTutorEditController = doManageSecurityGroup(ureq, false, repositoryEntry.getTutorGroup(), "groups_tutor"); return; } else if (cmd.equals(ACTION_GROUPS_PARTICIPANT)) { // edit tutor group if (!isOwner) throw new OLATSecurityException("Trying to access groupmanagement, but not allowed: user = " + ureq.getIdentity()); if(repositoryEntry.getParticipantGroup() == null){ - RepositoryManager.getInstance().createParticipantSecurityGroup(repositoryEntry); - RepositoryManager.getInstance().updateRepositoryEntry(repositoryEntry); + repositoryEntry = RepositoryManager.getInstance().createParticipantSecurityGroup(repositoryEntry, true); } groupParticipantEditController = doManageSecurityGroup(ureq, false, repositoryEntry.getParticipantGroup(), "groups_participant"); return; @@ -1021,10 +1019,9 @@ public class RepositoryDetailsController extends BasicController implements Gene if (event == Event.CHANGED_EVENT) { // RepositoryEntry changed // setEntry(repositoryEditDescriptionController.getRepositoryEntry(), ureq); - this.repositoryEntry = (RepositoryEntry) DBFactory.getInstance().loadObject(repositoryEditDescriptionController.getRepositoryEntry()); // need a reload from hibernate because create a new cp load a repository-entry (OLAT-5631) TODO: 7.1 Refactor in method getRepositoryEntry() - this.repositoryEntry.setDisplayname(repositoryEditDescriptionController.getRepositoryEntry().getDisplayname()); - this.repositoryEntry.setDescription(repositoryEditDescriptionController.getRepositoryEntry().getDescription()); - RepositoryManager.getInstance().updateRepositoryEntry(this.repositoryEntry); + String displayname = repositoryEditDescriptionController.getRepositoryEntry().getDisplayname(); + String description = repositoryEditDescriptionController.getRepositoryEntry().getDescription(); + repositoryEntry = RepositoryManager.getInstance().setDescriptionAndName(repositoryEntry, displayname, description); // do not close upon save/upload image closeableModalController.deactivate(); updateView(ureq); } else if (event == Event.CANCELLED_EVENT) { diff --git a/src/main/java/org/olat/repository/delete/ReadyToDeleteController.java b/src/main/java/org/olat/repository/delete/ReadyToDeleteController.java index 5c1d0794579..0149c89c11d 100644 --- a/src/main/java/org/olat/repository/delete/ReadyToDeleteController.java +++ b/src/main/java/org/olat/repository/delete/ReadyToDeleteController.java @@ -115,7 +115,7 @@ public class ReadyToDeleteController extends BasicController { TableEvent te = (TableEvent) event; if (te.getActionId().equals(ACTION_SINGLESELECT_CHOOSE)) { int rowid = te.getRowId(); - RepositoryManager.setLastUsageNowFor( (RepositoryEntry) redtm.getObject(rowid) ); + RepositoryManager.getInstance().setLastUsageNowFor( (RepositoryEntry) redtm.getObject(rowid) ); updateRepositoryEntryList(); } } else if (event.getCommand().equals(Table.COMMAND_MULTISELECT)) { diff --git a/src/main/java/org/olat/repository/delete/SelectionController.java b/src/main/java/org/olat/repository/delete/SelectionController.java index a62c2881bd7..384e98cdc2b 100644 --- a/src/main/java/org/olat/repository/delete/SelectionController.java +++ b/src/main/java/org/olat/repository/delete/SelectionController.java @@ -153,7 +153,7 @@ public class SelectionController extends BasicController { TableEvent te = (TableEvent) event; if (te.getActionId().equals(ACTION_SINGLESELECT_CHOOSE)) { int rowid = te.getRowId(); - RepositoryManager.setLastUsageNowFor( (RepositoryEntry) redtm.getObject(rowid) ); + RepositoryManager.getInstance().setLastUsageNowFor( (RepositoryEntry) redtm.getObject(rowid) ); updateRepositoryEntryList(); } } else if (event.getCommand().equals(Table.COMMAND_MULTISELECT)) { diff --git a/src/main/java/org/olat/repository/delete/StatusController.java b/src/main/java/org/olat/repository/delete/StatusController.java index d45e9a20053..a106bb8ff02 100644 --- a/src/main/java/org/olat/repository/delete/StatusController.java +++ b/src/main/java/org/olat/repository/delete/StatusController.java @@ -106,7 +106,7 @@ public class StatusController extends BasicController { TableEvent te = (TableEvent) event; if (te.getActionId().equals(ACTION_SINGLESELECT_CHOOSE)) { int rowid = te.getRowId(); - RepositoryManager.setLastUsageNowFor( (RepositoryEntry) redtm.getObject(rowid) ); + RepositoryManager.getInstance().setLastUsageNowFor( (RepositoryEntry) redtm.getObject(rowid) ); updateRepositoryEntryList(); } } diff --git a/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java b/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java index 857d176ed35..9fefa92288c 100644 --- a/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java +++ b/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java @@ -261,9 +261,9 @@ public class RepositoryDeletionManager extends BasicManager implements UserDataD } private void markSendEmailEvent(RepositoryEntry repositoryEntry) { - repositoryEntry = (RepositoryEntry)DBFactory.getInstance().loadObject(repositoryEntry); + //repositoryEntry = (RepositoryEntry)DBFactory.getInstance().loadObject(repositoryEntry); LifeCycleManager.createInstanceFor(repositoryEntry).markTimestampFor(SEND_DELETE_EMAIL_ACTION); - DBFactory.getInstance().updateObject(repositoryEntry); + //DBFactory.getInstance().updateObject(repositoryEntry); } diff --git a/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java b/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java index 18ea491a48f..dfd07a47617 100644 --- a/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java +++ b/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java @@ -223,14 +223,7 @@ public class RepositoryEntryResource { Identity identity = RestSecurityHelper.getUserRequest(request).getIdentity(); RepositoryEntry replacedRe; if(file == null) { - replacedRe = re; - if(StringHelper.containsNonWhitespace(displayname)) { - replacedRe.setDisplayname(displayname); - } - if(StringHelper.containsNonWhitespace(description)) { - replacedRe.setDescription(description); - } - RepositoryManager.getInstance().updateRepositoryEntry(replacedRe); + replacedRe = RepositoryManager.getInstance().setDescriptionAndName(re, displayname, description); } else { String tmpName = StringHelper.containsNonWhitespace(filename) ? filename : "import.zip"; tmpFile = getTmpFile(tmpName); @@ -245,8 +238,7 @@ public class RepositoryEntryResource { if(replacedRe == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if (StringHelper.containsNonWhitespace(displayname)) { - replacedRe.setDisplayname(displayname); - RepositoryManager.getInstance().updateRepositoryEntry(replacedRe); + replacedRe = RepositoryManager.getInstance().setDescriptionAndName(replacedRe, displayname, null); } } RepositoryEntryVO vo = ObjectFactory.get(replacedRe); 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 75fb8a6a07e..b57cbdab685 100644 --- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java @@ -522,7 +522,7 @@ public class CoursesWebService { courseConfig.setSharedFolderSoftkey(courseConfigVO.getSharedFolderSoftKey()); } } - RepositoryManager.getInstance().updateRepositoryEntry(addedEntry); + //RepositoryManager.getInstance().updateRepositoryEntry(addedEntry); CourseFactory.saveCourse(course.getResourceableId()); CourseFactory.closeCourseEditSession(course.getResourceableId(), true); diff --git a/src/test/java/org/olat/commons/coordinate/CoordinatorTest.java b/src/test/java/org/olat/commons/coordinate/CoordinatorTest.java index 4290ff545c6..44f243bd90b 100644 --- a/src/test/java/org/olat/commons/coordinate/CoordinatorTest.java +++ b/src/test/java/org/olat/commons/coordinate/CoordinatorTest.java @@ -31,7 +31,6 @@ import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.List; import org.apache.log4j.Logger; @@ -49,8 +48,6 @@ import org.olat.core.util.coordinate.SyncerExecutor; import org.olat.core.util.resource.OresHelper; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; -import org.olat.resource.OLATResource; -import org.olat.resource.OLATResourceManager; import org.olat.test.OlatTestCase; /** @@ -347,7 +344,7 @@ public class CoordinatorTest extends OlatTestCase { SecurityGroup ownerGroup = BaseSecurityManager.getInstance().createAndPersistSecurityGroup(); re.setOwnerGroup(ownerGroup); RepositoryManager.getInstance().saveRepositoryEntry(re); - DBFactory.getInstance().closeSession(); + DBFactory.getInstance().commitAndCloseSession(); // 1. Do job without doInSync System.out.println("testDoInSyncPerformance: start test with doInSync"); @@ -392,12 +389,9 @@ public class CoordinatorTest extends OlatTestCase { } private Boolean doTestPerformanceJob(RepositoryEntry re) { - RepositoryEntry reloadedRe = (RepositoryEntry) DBFactory.getInstance().loadObject(re, true); - reloadedRe.incrementLaunchCounter(); - reloadedRe.setLastUsage(new Date()); - RepositoryManager.getInstance().updateRepositoryEntry(reloadedRe); - return true; - } + RepositoryManager.getInstance().incrementLaunchCounter(re); + return true; + } diff --git a/src/test/java/org/olat/repository/RepositoryManagerConcurrentTest.java b/src/test/java/org/olat/repository/RepositoryManagerConcurrentTest.java index 00c58052656..32073b9aaf6 100644 --- a/src/test/java/org/olat/repository/RepositoryManagerConcurrentTest.java +++ b/src/test/java/org/olat/repository/RepositoryManagerConcurrentTest.java @@ -32,9 +32,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.UUID; import java.util.concurrent.CountDownLatch; @@ -42,13 +40,11 @@ import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityManager; import org.olat.basesecurity.Constants; import org.olat.basesecurity.SecurityGroup; -import org.olat.commons.coordinate.cluster.ClusterSyncer; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.id.Identity; @@ -56,19 +52,11 @@ import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; -import org.olat.core.util.coordinate.CoordinatorManager; -import org.olat.core.util.coordinate.Syncer; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; import org.olat.test.JMSCodePointServerJunitHelper; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; -import org.olat.testutils.codepoints.client.BreakpointStateException; -import org.olat.testutils.codepoints.client.CodepointClient; -import org.olat.testutils.codepoints.client.CodepointClientFactory; -import org.olat.testutils.codepoints.client.CodepointRef; -import org.olat.testutils.codepoints.client.CommunicationException; -import org.olat.testutils.codepoints.client.TemporaryPausedThread; /** * Initial Date: Mar 26, 2004 @@ -191,9 +179,8 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { /** * */ - @Test public void testIncrementLaunchCounter() { - Syncer syncer = CoordinatorManager.getInstance().getCoordinator().getSyncer(); - assertTrue("syncer is not of type 'ClusterSyncer'", syncer instanceof ClusterSyncer); + @Test + public void testIncrementLaunchCounter() { RepositoryEntry repositoryEntry = createRepositoryCG("T1_perf2"); final Long keyRepo = repositoryEntry.getKey(); final OLATResourceable resourceable = repositoryEntry.getOlatResource(); @@ -212,20 +199,14 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { } long endTime = System.currentTimeMillis(); System.out.println("testIncrementLaunchCounter time=" + (endTime - startTime) + " for " + loop + " incrementLaunchCounter calls"); - sleep(2000); } - sleep(20000); RepositoryEntry repositoryEntry2 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); assertEquals("Wrong value of incrementLaunch counter",mainLoop * loop,repositoryEntry2.getLaunchCounter()); System.out.println("testIncrementLaunchCounter finished"); } - - /** - * - */ - @Test public void testIncrementDownloadCounter() { - Syncer syncer = CoordinatorManager.getInstance().getCoordinator().getSyncer(); - assertTrue("syncer is not of type 'ClusterSyncer'", syncer instanceof ClusterSyncer); + + @Test + public void testIncrementDownloadCounter() { RepositoryEntry repositoryEntry = createRepositoryCG("T1_perf2"); final Long keyRepo = repositoryEntry.getKey(); final OLATResourceable resourceable = repositoryEntry.getOlatResource(); @@ -244,95 +225,52 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { } long endTime = System.currentTimeMillis(); System.out.println("testIncrementDownloadCounter time=" + (endTime - startTime) + " for " + loop + " incrementDownloadCounter calls"); - sleep(2000); } - sleep(20000); RepositoryEntry repositoryEntry2 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); assertEquals("Wrong value of incrementLaunch counter",mainLoop * loop,repositoryEntry2.getDownloadCounter()); System.out.println("testIncrementDownloadCounter finished"); } - - - /** - * Test synchronization between same RepositoryEntry and setLastUsageNowFor, incrementLaunchCounter and incrementDownloadCounter. - * This test starts 4 threads : - * 2 to call setLastUsageNowFor, - * 1 to call incrementLaunchCounter - * 1 to call incrementDownloadCounter - * Breakpoint is set for 'setLastUsageNowFor', all other calls must wait. - */ - @Test @Ignore //this test doesn't test anything, and result is fully random - public void testSetLastUsageNowFor() { - Date lastSetLastUsageDate = null; - Syncer syncer = CoordinatorManager.getInstance().getCoordinator().getSyncer(); - assertTrue("syncer is not of type 'ClusterSyncer'", syncer instanceof ClusterSyncer); - - final int loop = 500; - RepositoryEntry repositoryEntry = createRepositoryCG("T1_perf2"); - final Long keyRepo = repositoryEntry.getKey(); - final OLATResourceable resourceable = repositoryEntry.getOlatResource(); - assertNotNull(resourceable); - DBFactory.getInstance().closeSession(); - long startTime = System.currentTimeMillis(); - for (int i = 0; i < loop; i++) { - // 1. load RepositoryEntry - RepositoryEntry repositoryEntryT1 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - RepositoryManager.setLastUsageNowFor(repositoryEntryT1); - lastSetLastUsageDate = Calendar.getInstance().getTime(); - DBFactory.getInstance().closeSession(); - } - long endTime = System.currentTimeMillis(); - sleep(20000); - - RepositoryEntry repositoryEntry2 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - assertTrue("Wrong date-value of lastUsage, could not be before ",repositoryEntry2.getLastUsage().after(lastSetLastUsageDate) ); - System.out.println("testSetLastUsageNowFor time=" + (endTime - startTime) + " for " + loop + " testSetLastUsageNowFor calls"); - System.out.println("testSetLastUsageNowFor finished"); - } - @Test public void testConcurrentIncrementLaunchCounter() { + @Test + public void testConcurrentIncrementLaunchCounter() { final List<Exception> exceptionHolder = Collections.synchronizedList(new ArrayList<Exception>(1)); final List<Boolean> statusList = Collections.synchronizedList(new ArrayList<Boolean>(1)); - Syncer syncer = CoordinatorManager.getInstance().getCoordinator().getSyncer(); - assertTrue("syncer is not of type 'ClusterSyncer'", syncer instanceof ClusterSyncer); final int loop = 100; final int numberOfThreads = 3; - RepositoryEntry repositoryEntry = createRepositoryCG("T1_perf2"); + final RepositoryEntry repositoryEntry = createRepositoryCG("T1_perf2"); final Long keyRepo = repositoryEntry.getKey(); - final OLATResourceable resourceable = repositoryEntry.getOlatResource(); - assertNotNull(resourceable); - DBFactory.getInstance().closeSession(); + assertNotNull(repositoryEntry.getOlatResource()); + DBFactory.getInstance().commitAndCloseSession(); assertEquals("Launch counter was not 0", 0, repositoryEntry.getLaunchCounter() ); long startTime = System.currentTimeMillis(); + + final CountDownLatch doneSignal = new CountDownLatch(3); + // start thread 1 : incrementLaunchCounter / setAccess - new Thread(new Runnable() { + Thread thread1 = new Thread(){ public void run() { try { + sleep(10); for (int i = 1; i <= loop; i++) { // 1. load RepositoryEntry - RepositoryEntry repositoryEntryT1 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - RepositoryManager.getInstance().incrementLaunchCounter(repositoryEntryT1); + RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); + re = RepositoryManager.getInstance().incrementLaunchCounter(re); if (i % 20 == 0 ) { int ACCESS_VALUE = 4; - System.out.println("RepositoryManagerTest: call setAccess i=" + i); //fxdiff VCRP-1,2: access control of resources - RepositoryManager.getInstance().setAccess(repositoryEntryT1, ACCESS_VALUE, false); - DBFactory.getInstance().closeSession(); + re = RepositoryManager.getInstance().setAccess(re, ACCESS_VALUE, false); RepositoryEntry repositoryEntryT1Reloaded = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - assertEquals("Wrong access value",ACCESS_VALUE,repositoryEntryT1Reloaded.getAccess()); + assertEquals("Wrong access value", ACCESS_VALUE, repositoryEntryT1Reloaded.getAccess()); } else if (i % 10 == 0 ) { int ACCESS_VALUE = 1; - System.out.println("RepositoryManagerTest: call setAccess i=" + i); //fxdiff VCRP-1,2: access control of resources - RepositoryManager.getInstance().setAccess(repositoryEntryT1, ACCESS_VALUE, false); - DBFactory.getInstance().closeSession(); + re = RepositoryManager.getInstance().setAccess(re, ACCESS_VALUE, false); RepositoryEntry repositoryEntryT1Reloaded = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); assertEquals("Wrong access value",ACCESS_VALUE,repositoryEntryT1Reloaded.getAccess()); } - DBFactory.getInstance().closeSession(); + DBFactory.getInstance().commitAndCloseSession(); } - System.out.println("Thread-1: finished"); statusList.add(Boolean.TRUE); } catch (Exception e) { exceptionHolder.add(e); @@ -342,29 +280,30 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { } catch (Exception e) { // ignore } + doneSignal.countDown(); } - }}).start(); + } + }; + // start thread 2 : incrementLaunchCounter / setDescriptionAndName - new Thread(new Runnable() { + Thread thread2 = new Thread() { public void run() { try { + sleep(10); for (int i = 1; i <= loop; i++) { // 1. load RepositoryEntry - RepositoryEntry repositoryEntryT1 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - RepositoryManager.getInstance().incrementLaunchCounter(repositoryEntryT1); + RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); + re = RepositoryManager.getInstance().incrementLaunchCounter(re); if (i % 25 == 0 ) { String displayName = "DisplayName" + i; String description = "Description" + i; - System.out.println("RepositoryManagerTest: call setDescriptionAndName"); - RepositoryManager.getInstance().setDescriptionAndName(repositoryEntryT1, displayName,description); - DBFactory.getInstance().closeSession(); - RepositoryEntry repositoryEntryT1Reloaded = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - assertEquals("Wrong displayName value",displayName,repositoryEntryT1Reloaded.getDisplayname()); - assertEquals("Wrong description value",description,repositoryEntryT1Reloaded.getDescription()); + re = RepositoryManager.getInstance().setDescriptionAndName(re, displayName,description); + RepositoryEntry reReloaded = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); + assertEquals("Wrong displayName value", displayName, reReloaded.getDisplayname()); + assertEquals("Wrong description value", description, reReloaded.getDescription()); } - DBFactory.getInstance().closeSession(); + DBFactory.getInstance().commitAndCloseSession(); } - System.out.println("Thread-1: finished"); statusList.add(Boolean.TRUE); } catch (Exception e) { exceptionHolder.add(e); @@ -374,38 +313,37 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { } catch (Exception e) { // ignore } + doneSignal.countDown(); } - }}).start(); + } + }; + // start thread 3 - new Thread(new Runnable() { + Thread thread3 = new Thread() { public void run() { try { + sleep(10); for (int i = 1; i <= loop; i++) { // 1. load RepositoryEntry - RepositoryEntry repositoryEntryT1 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - RepositoryManager.getInstance().incrementLaunchCounter(repositoryEntryT1); + RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); + re = RepositoryManager.getInstance().incrementLaunchCounter(re); if (i % 30 == 0 ) { - System.out.println("RepositoryManagerTest: call setProperties i=" + i); - RepositoryManager.getInstance().setProperties(repositoryEntryT1, true, false, true, false); - DBFactory.getInstance().closeSession(); - RepositoryEntry repositoryEntryT1Reloaded = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - assertEquals("Wrong canCopy value",true,repositoryEntryT1Reloaded.getCanCopy()); - assertEquals("Wrong getCanReference value",false,repositoryEntryT1Reloaded.getCanReference()); - assertEquals("Wrong getCanLaunch value",true,repositoryEntryT1Reloaded.getCanLaunch()); - assertEquals("Wrong getCanDownload value",false,repositoryEntryT1Reloaded.getCanDownload()); + re = RepositoryManager.getInstance().setProperties(re, true, false, true, false); + RepositoryEntry reT3Reloaded = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); + assertEquals("Wrong canCopy value", true, reT3Reloaded.getCanCopy()); + assertEquals("Wrong getCanReference value",false, reT3Reloaded.getCanReference()); + assertEquals("Wrong getCanLaunch value", true, reT3Reloaded.getCanLaunch()); + assertEquals("Wrong getCanDownload value", false, reT3Reloaded.getCanDownload()); } else if (i % 15 == 0 ) { - System.out.println("RepositoryManagerTest: call setProperties i=" + i); - RepositoryManager.getInstance().setProperties(repositoryEntryT1, false, true, false, true); - DBFactory.getInstance().closeSession(); - RepositoryEntry repositoryEntryT1Reloaded = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - assertEquals("Wrong canCopy value",false,repositoryEntryT1Reloaded.getCanCopy()); - assertEquals("Wrong getCanReference value",true,repositoryEntryT1Reloaded.getCanReference()); - assertEquals("Wrong getCanLaunch value",false,repositoryEntryT1Reloaded.getCanLaunch() ); - assertEquals("Wrong getCanDownload value",true,repositoryEntryT1Reloaded.getCanDownload()); + re = RepositoryManager.getInstance().setProperties(re, false, true, false, true); + RepositoryEntry reT3Reloaded = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); + assertEquals("Wrong canCopy value", false, reT3Reloaded.getCanCopy()); + assertEquals("Wrong getCanReference value", true, reT3Reloaded.getCanReference()); + assertEquals("Wrong getCanLaunch value", false, reT3Reloaded.getCanLaunch() ); + assertEquals("Wrong getCanDownload value", true, reT3Reloaded.getCanDownload()); } - DBFactory.getInstance().closeSession(); + DBFactory.getInstance().commitAndCloseSession(); } - System.out.println("Thread-1: finished"); statusList.add(Boolean.TRUE); } catch (Exception e) { exceptionHolder.add(e); @@ -415,21 +353,41 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { } catch (Exception e) { // ignore } + doneSignal.countDown(); } - }}).start(); + } + }; - long endTime = System.currentTimeMillis(); - sleep(20000); - RepositoryEntry repositoryEntry2 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - assertEquals("Worng value of incrementLaunch counter",loop * numberOfThreads,repositoryEntry2.getLaunchCounter()); - System.out.println("testConcurrentIncrementLaunchCounter time=" + (endTime - startTime) + " for " + loop + " incrementLaunchCounter calls"); + //go! go! go! + thread1.start(); + thread2.start(); + thread3.start(); + + try { + boolean interrupt = doneSignal.await(30, TimeUnit.SECONDS); + assertTrue("Test takes too long (more than 10s)", interrupt); + } catch (InterruptedException e) { + fail("" + e.getMessage()); + } + + for(Exception e:exceptionHolder) { + e.printStackTrace(); + } + assertEquals("Exceptions", 0, exceptionHolder.size()); + + RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); + assertEquals("Worng value of incrementLaunch counter", loop * numberOfThreads, re.getLaunchCounter()); + assertEquals("DisplayName" + loop, re.getDisplayname());//check if the displayname is correct + assertEquals("Description" + loop, re.getDescription()); + System.out.println("testConcurrentIncrementLaunchCounter time=" + (System.currentTimeMillis() - startTime) + " for " + loop + " incrementLaunchCounter calls"); System.out.println("testConcurrentIncrementLaunchCounter finished"); } /** * Compare async increment-call with sync 'setDscription' call. */ - @Test public void testIncrementLaunchCounterSetDescription() { + @Test + public void testIncrementLaunchCounterSetDescription() { System.out.println("testIncrementLaunchCounterSetDescription: START..."); RepositoryEntry repositoryEntry = createRepositoryCG("testIncrementLaunchCounterSetDescription"); DBFactory.getInstance().closeSession(); @@ -462,8 +420,8 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { * Thread 3 : update access-value on repository-entry directly after 200ms * Codepoint-breakpoint at IncrementDownloadCounterBackgroundTask in executeTask before update */ - @Ignore //the test works random - @Test public void testConcurrentIncrementLaunchCounterWithCodePoints() { + @Test + public void testConcurrentIncrementLaunchCounter_v2() { final List<Exception> exceptionHolder = Collections.synchronizedList(new ArrayList<Exception>(1)); RepositoryEntry repositoryEntry = createRepositoryCG("IncCodePoint"); @@ -474,19 +432,6 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { DBFactory.getInstance().closeSession(); assertEquals("Launch counter was not 0", 0, repositoryEntry.getLaunchCounter() ); - // enable breakpoint - CodepointClient codepointClient = null; - CodepointRef codepointRef = null; - try { - codepointClient = CodepointClientFactory.createCodepointClient("vm://localhost?broker.persistent=false", CODEPOINT_SERVER_ID); - codepointRef = codepointClient.getCodepoint("org.olat.repository.async.IncrementDownloadCounterBackgroundTask.executeTask-before-update"); - codepointRef.enableBreakpoint(); - } catch (Exception e) { - e.printStackTrace(); - fail("Could not initialzed CodepointClient"); - } - - final CountDownLatch doneSignal = new CountDownLatch(3); // thread 1 @@ -495,13 +440,13 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { try { Thread.sleep(100); RepositoryEntry repositoryEntryT1 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - RepositoryManager.getInstance().incrementDownloadCounter(repositoryEntryT1); + repositoryEntryT1 = RepositoryManager.getInstance().incrementDownloadCounter(repositoryEntryT1); System.out.println("testConcurrentIncrementLaunchCounterWithCodePoints: Thread1 incremented download-counter"); } catch (Exception ex) { exceptionHolder.add(ex);// no exception should happen } finally { - doneSignal.countDown(); DBFactory.getInstance().commitAndCloseSession(); + doneSignal.countDown(); } }}; @@ -511,13 +456,13 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { try { Thread.sleep(300); RepositoryEntry repositoryEntryT2 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - RepositoryManager.getInstance().incrementDownloadCounter(repositoryEntryT2); + repositoryEntryT2 = RepositoryManager.getInstance().incrementDownloadCounter(repositoryEntryT2); System.out.println("testConcurrentIncrementLaunchCounterWithCodePoints: Thread2 incremented download-counter"); } catch (Exception ex) { exceptionHolder.add(ex);// no exception should happen } finally { - doneSignal.countDown(); DBFactory.getInstance().commitAndCloseSession(); + doneSignal.countDown(); } }}; @@ -527,16 +472,14 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { try { Thread.sleep(200); RepositoryEntry repositoryEntryT3 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); - // change repository directly and not via RepositoryManager.setAccess(...) for testing - repositoryEntryT3.setAccess(access); - RepositoryManager.getInstance().updateRepositoryEntry(repositoryEntryT3); + repositoryEntryT3 = RepositoryManager.getInstance().setAccess(repositoryEntryT3, access, false); DBFactory.getInstance().closeSession(); System.out.println("testConcurrentIncrementLaunchCounterWithCodePoints: Thread3 setAccess DONE"); } catch (Exception ex) { exceptionHolder.add(ex);// no exception should happen } finally { - doneSignal.countDown(); DBFactory.getInstance().commitAndCloseSession(); + doneSignal.countDown(); } }}; @@ -551,29 +494,9 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { fail("" + e.getMessage()); } - try { - // to see all registered code-points: comment-in next 2 lines - // List<CodepointRef> codepointList = codepointClient.listAllCodepoints(); - // System.out.println("codepointList=" + codepointList); - System.out.println("testConcurrentIncrementLaunchCounterWithCodePoints start waiting for breakpoint reached"); - TemporaryPausedThread[] threads = codepointRef.waitForBreakpointReached(1000); - assertTrue("Did not reach breakpoint", threads.length > 0); - System.out.println("threads[0].getCodepointRef()=" + threads[0].getCodepointRef()); - codepointRef.disableBreakpoint(true); - System.out.println("testConcurrentIncrementLaunchCounterWithCodePoints breakpoint reached => continue"); - } catch (BreakpointStateException e) { - e.printStackTrace(); - fail("Codepoints: BreakpointStateException=" + e.getMessage()); - } catch (CommunicationException e) { - e.printStackTrace(); - fail("Codepoints: CommunicationException=" + e.getMessage()); - } - sleep(100); RepositoryEntry repositoryEntry2 = RepositoryManager.getInstance().lookupRepositoryEntry(keyRepo); assertEquals("Wrong value of incrementLaunch counter",2,repositoryEntry2.getDownloadCounter()); assertEquals("Wrong access value",access,repositoryEntry2.getAccess()); - - codepointClient.close(); System.out.println("testConcurrentIncrementLaunchCounterWithCodePoints finish successful"); } @@ -592,17 +515,4 @@ public class RepositoryManagerConcurrentTest extends OlatTestCase { DBFactory.getInstance().saveObject(d); return d; } - - /** - * - * @param milis the duration in miliseconds to sleep - */ - private void sleep(int milis) { - try { - Thread.sleep(milis); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } diff --git a/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java b/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java index 2d71d54d461..c7d17b9aa95 100644 --- a/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java +++ b/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java @@ -336,8 +336,8 @@ public class ACFrontendManagerTest extends OlatTestCase { re.setOlatResource(r); re.setAccess(RepositoryEntry.ACC_OWNERS_AUTHORS); - repositoryManager.createParticipantSecurityGroup(re); - repositoryManager.createTutorSecurityGroup(re); + repositoryManager.createParticipantSecurityGroup(re, false); + repositoryManager.createTutorSecurityGroup(re, false); repositoryManager.createOwnerSecurityGroup(re); repositoryManager.saveRepositoryEntry(re); dbInstance.commitAndCloseSession(); diff --git a/src/test/java/org/olat/test/JunitTestHelper.java b/src/test/java/org/olat/test/JunitTestHelper.java index abfe7a89d29..14c16292f48 100644 --- a/src/test/java/org/olat/test/JunitTestHelper.java +++ b/src/test/java/org/olat/test/JunitTestHelper.java @@ -163,8 +163,8 @@ public class JunitTestHelper { re.setResourcename("Lernen mit OLAT"); re.setDisplayname(r.getResourceableTypeName()); repositoryManager.createOwnerSecurityGroup(re); - repositoryManager.createTutorSecurityGroup(re); - repositoryManager.createParticipantSecurityGroup(re); + repositoryManager.createTutorSecurityGroup(re, false); + repositoryManager.createParticipantSecurityGroup(re, false); repositoryManager.saveRepositoryEntry(re); return re; } -- GitLab