From 61548199825b99e01ffb8655ae9490f92eaad884 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Mon, 16 Jun 2014 11:48:04 +0200 Subject: [PATCH] OO-990: fix delete of course --- .../java/org/olat/course/CourseModule.java | 9 ++- .../org/olat/course/_spring/courseContext.xml | 2 +- .../PersistingCourseGroupManager.java | 1 + .../qti/repository/handlers/QTIHandler.java | 14 ++-- .../java/org/olat/repository/ErrorList.java | 47 ++++++++++++ .../org/olat/repository/RepositoryEntry.java | 3 +- .../olat/repository/RepositoryManager.java | 71 ------------------ .../olat/repository/RepositoryService.java | 18 +++++ .../service/RepositoryDeletionManager.java | 6 +- .../olat/repository/handlers/BlogHandler.java | 10 ++- .../repository/handlers/CourseHandler.java | 20 ++--- .../olat/repository/handlers/FileHandler.java | 11 ++- .../repository/handlers/GlossaryHandler.java | 10 ++- .../repository/handlers/PodcastHandler.java | 10 ++- .../repository/handlers/PortfolioHandler.java | 10 ++- .../handlers/RepositoryHandler.java | 18 ++--- .../handlers/SharedFolderHandler.java | 9 ++- .../olat/repository/handlers/WikiHandler.java | 10 ++- .../manager/RepositoryEntryRelationDAO.java | 9 +-- .../manager/RepositoryServiceImpl.java | 73 +++++++++++++++++++ .../AuthoringEntryDetailsController.java | 14 ++-- .../repository/RepositoryEntryResource.java | 9 ++- .../repository/course/CourseWebService.java | 10 ++- .../manager/RepositoryServiceImplTest.java | 17 ++++- .../profile/mysql/olat.eclipse.properties | 1 + 25 files changed, 260 insertions(+), 152 deletions(-) create mode 100644 src/main/java/org/olat/repository/ErrorList.java diff --git a/src/main/java/org/olat/course/CourseModule.java b/src/main/java/org/olat/course/CourseModule.java index 2d9a10b544a..4a1fde26e97 100644 --- a/src/main/java/org/olat/course/CourseModule.java +++ b/src/main/java/org/olat/course/CourseModule.java @@ -50,6 +50,7 @@ import org.olat.properties.Property; import org.olat.properties.PropertyManager; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; +import org.olat.repository.RepositoryService; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; @@ -77,7 +78,7 @@ public class CourseModule extends AbstractOLATModule { private CourseFactory courseFactory; private Map<String, String> logVisibilities; private List<DeployableCourseExport> deployableCourseExports; - private RepositoryManager repositoryManager; + private RepositoryService repositoryService; private OLATResourceManager olatResourceManager; @@ -85,11 +86,11 @@ public class CourseModule extends AbstractOLATModule { /** * [used by spring] */ - private CourseModule(CoordinatorManager coordinatorManager, PropertyManager propertyManager, CourseFactory courseFactory, RepositoryManager repositoryManager, OLATResourceManager olatResourceManager) { + private CourseModule(CoordinatorManager coordinatorManager, PropertyManager propertyManager, CourseFactory courseFactory, RepositoryService repositoryService, OLATResourceManager olatResourceManager) { this.coordinatorManager = coordinatorManager; this.propertyManager = propertyManager; this.courseFactory = courseFactory; - this.repositoryManager = repositoryManager; + this.repositoryService = repositoryService; this.olatResourceManager = olatResourceManager; coordinatorManager.getCoordinator().getEventBus().registerFor(this, null, FrameworkStartupEventChannel.getStartupEventChannel()); } @@ -277,7 +278,7 @@ public class CourseModule extends AbstractOLATModule { private void deleteCourseAndProperty(Property prop, RepositoryEntry re) { try { propertyManager.deleteProperty(prop); - repositoryManager.deleteRepositoryEntryAndBasesecurity(re); + repositoryService.deleteRepositoryEntryAndBaseGroups(re); CourseFactory.deleteCourse(re.getOlatResource()); OLATResource ores = olatResourceManager.findResourceable(re.getOlatResource()); olatResourceManager.deleteOLATResource(ores); diff --git a/src/main/java/org/olat/course/_spring/courseContext.xml b/src/main/java/org/olat/course/_spring/courseContext.xml index 78bd0820525..89a122c83ca 100644 --- a/src/main/java/org/olat/course/_spring/courseContext.xml +++ b/src/main/java/org/olat/course/_spring/courseContext.xml @@ -24,7 +24,7 @@ <constructor-arg index="0" ref="coordinatorManager" /> <constructor-arg index="1" ref="propertyManager" /> <constructor-arg index="2" ref="courseFactory" /> - <constructor-arg index="3" ref="repositoryManager" /> + <constructor-arg index="3" ref="repositoryService" /> <constructor-arg index="4" ref="resourceManager" /> <property name="persistedProperties"> diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java index 6f73653aec6..fef06048e54 100644 --- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java +++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java @@ -263,6 +263,7 @@ public class PersistingCourseGroupManager extends BasicManager implements Course /** * @see org.olat.course.groupsandrights.CourseGroupManager#deleteCourseGroupmanagement() */ + @Override public void deleteCourseGroupmanagement() { //delete permission group to course RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(getCourseResource(), false); diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTIHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTIHandler.java index e09900fbf3b..3a3b83332f8 100644 --- a/src/main/java/org/olat/ims/qti/repository/handlers/QTIHandler.java +++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTIHandler.java @@ -39,6 +39,7 @@ import org.olat.core.gui.control.generic.layout.MainLayoutController; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.Roles; import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; import org.olat.core.util.coordinate.CoordinatorManager; @@ -53,6 +54,7 @@ import org.olat.ims.qti.process.Resolver; import org.olat.modules.iq.IQManager; import org.olat.modules.iq.IQPreviewSecurityCallback; import org.olat.modules.iq.IQSecurityCallback; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -155,18 +157,18 @@ public abstract class QTIHandler extends FileHandler { } @Override - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) { + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) { ReferenceManager refM = ReferenceManager.getInstance(); - String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); + String referencesSummary = refM.getReferencesToSummary(res, locale); if (referencesSummary != null) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.references", + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); return false; } if (CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(res, null)) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.editor")); + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.editor")); return false; } return true; diff --git a/src/main/java/org/olat/repository/ErrorList.java b/src/main/java/org/olat/repository/ErrorList.java new file mode 100644 index 00000000000..21f558bec9b --- /dev/null +++ b/src/main/java/org/olat/repository/ErrorList.java @@ -0,0 +1,47 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.repository; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Initial date: 16.06.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ErrorList { + + private final List<String> errors = new ArrayList<>(2); + + + public boolean hasErrors() { + return errors.size() > 0; + } + + public String getFirstError() { + return errors.size() > 0 ? errors.get(0) : null; + } + + public void setError(String error) { + errors.add(error); + } +} diff --git a/src/main/java/org/olat/repository/RepositoryEntry.java b/src/main/java/org/olat/repository/RepositoryEntry.java index a340c04b1c2..b4689ba12a7 100644 --- a/src/main/java/org/olat/repository/RepositoryEntry.java +++ b/src/main/java/org/olat/repository/RepositoryEntry.java @@ -108,7 +108,8 @@ public class RepositoryEntry implements CreateInfo, Persistable , RepositoryEntr @JoinColumn(name="fk_olatresource", nullable=false, insertable=true, updatable=false) private OLATResource olatResource; - @OneToMany(targetEntity=RepositoryEntryToGroupRelation.class, fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.REMOVE}) + @OneToMany(targetEntity=RepositoryEntryToGroupRelation.class, fetch=FetchType.LAZY, + orphanRemoval=true, cascade={CascadeType.PERSIST, CascadeType.REMOVE}) @JoinColumn(name="fk_entry_id") private Set<RepositoryEntryToGroupRelation> groups; diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java index bed0186f04b..8cdea0b9a34 100644 --- a/src/main/java/org/olat/repository/RepositoryManager.java +++ b/src/main/java/org/olat/repository/RepositoryManager.java @@ -41,13 +41,11 @@ import javax.persistence.TypedQuery; import org.olat.admin.securitygroup.gui.IdentitiesAddEvent; import org.olat.basesecurity.BaseSecurity; -import org.olat.basesecurity.Group; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.IdentityImpl; import org.olat.basesecurity.IdentityRef; import org.olat.basesecurity.manager.GroupDAO; import org.olat.catalog.CatalogEntry; -import org.olat.catalog.CatalogManager; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.persistence.DB; @@ -55,10 +53,8 @@ import org.olat.core.commons.persistence.DBQuery; import org.olat.core.commons.persistence.PersistenceHelper; import org.olat.core.commons.services.image.ImageService; import org.olat.core.commons.services.image.Size; -import org.olat.core.commons.services.mark.MarkManager; import org.olat.core.commons.services.mark.impl.MarkImpl; import org.olat.core.gui.UserRequest; -import org.olat.core.gui.control.WindowControl; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; @@ -78,8 +74,6 @@ import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSManager; import org.olat.course.assessment.manager.UserCourseInformationsManager; import org.olat.group.GroupLoggingAction; -import org.olat.repository.handlers.RepositoryHandler; -import org.olat.repository.handlers.RepositoryHandlerFactory; import org.olat.repository.manager.RepositoryEntryRelationDAO; import org.olat.repository.model.RepositoryEntryLifecycle; import org.olat.repository.model.RepositoryEntryMembership; @@ -203,72 +197,7 @@ public class RepositoryManager extends BasicManager { Size size = imageHelper.scaleImage(newImageFile, repoImage, PICTUREWIDTH, PICTUREWIDTH, false); return size != null; } - - /** - * clean up a repo entry with all children and associated data like bookmarks and user references to it - * @param ureq - * @param wControl - * @param entry - * @return - * FIXME: we need a delete method without ureq, wControl for manager use. In general, very bad idea to pass ureq and - * wControl down to the manger layer. - */ - public boolean deleteRepositoryEntryWithAllData(UserRequest ureq, WindowControl wControl, RepositoryEntry entry) { - // invoke handler delete callback - logDebug("deleteRepositoryEntry start entry=" + entry); - entry = (RepositoryEntry) dbInstance.loadObject(entry,true); - logDebug("deleteRepositoryEntry after load entry=" + entry); - RepositoryHandler handler = RepositoryHandlerFactory.getInstance().getRepositoryHandler(entry); - OLATResource resource = entry.getOlatResource(); - //delete old context - if (!handler.readyToDelete(resource, ureq, wControl)) { - return false; - } - - // start transaction - // delete entry picture - deleteImage(entry); - userCourseInformationsManager.deleteUserCourseInformations(entry); - - // delete all bookmarks referencing deleted entry - CoreSpringFactory.getImpl(MarkManager.class).deleteMarks(entry); - // delete all catalog entries referencing deleted entry - CatalogManager.getInstance().resourceableDeleted(entry); - - //delete all policies - securityManager.deletePolicies(resource); - - // inform handler to do any cleanup work... handler must delete the - // referenced resourceable a swell. - handler.cleanupOnDelete(resource); - - dbInstance.commit(); - logDebug("deleteRepositoryEntry after reload entry=" + entry); - deleteRepositoryEntryAndBasesecurity(entry); - - logDebug("deleteRepositoryEntry Done"); - return true; - } - - /** - * - * @param addedEntry - */ - public void deleteRepositoryEntryAndBasesecurity(RepositoryEntry entry) { - RepositoryEntry reloadedEntry = dbInstance.getCurrentEntityManager() - .getReference(RepositoryEntry.class, entry.getKey()); - - Group defaultGroup = repositoryEntryRelationDao.getDefaultGroup(reloadedEntry); - groupDao.removeMemberships(defaultGroup); - repositoryEntryRelationDao.removeRelations(reloadedEntry); - groupDao.removeGroup(defaultGroup); - dbInstance.getCurrentEntityManager().remove(reloadedEntry); - - dbInstance.commit(); - - deleteImage(entry); - } /** * Lookup repo entry by key. diff --git a/src/main/java/org/olat/repository/RepositoryService.java b/src/main/java/org/olat/repository/RepositoryService.java index 5a3b774d3dd..00dd30185a9 100644 --- a/src/main/java/org/olat/repository/RepositoryService.java +++ b/src/main/java/org/olat/repository/RepositoryService.java @@ -20,10 +20,12 @@ package org.olat.repository; import java.util.List; +import java.util.Locale; import org.olat.basesecurity.Group; import org.olat.basesecurity.IdentityRef; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.vfs.VFSLeaf; import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams; import org.olat.repository.model.SearchMyRepositoryEntryViewParams; @@ -57,6 +59,22 @@ public interface RepositoryService { public RepositoryEntry update(RepositoryEntry re); + /** + * Delete the learning resource with all its attached resources. + * @param entry + * @param identity + * @param roles + * @param locale + * @return + */ + public ErrorList delete(RepositoryEntry entry, Identity identity, Roles roles, Locale locale); + + /** + * Delete only the database object + * @param entry + */ + public void deleteRepositoryEntryAndBaseGroups(RepositoryEntry entry); + public void incrementLaunchCounter(RepositoryEntry re); 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 ae50ad7a724..5ee02fc14a4 100644 --- a/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java +++ b/src/main/java/org/olat/repository/delete/service/RepositoryDeletionManager.java @@ -52,6 +52,7 @@ import org.olat.core.util.mail.MailTemplate; import org.olat.core.util.mail.MailerResult; import org.olat.properties.Property; import org.olat.properties.PropertyManager; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -392,7 +393,10 @@ public class RepositoryDeletionManager extends BasicManager implements UserDataD } String archiveFileName = repositoryHandler.archive(ureq.getIdentity(), getArchivFilePath(), repositoryEntry); logAudit("Repository-Deletion: archived repositoryEntry=" + repositoryEntry + " , archive-file-name=" + archiveFileName); - RepositoryManager.getInstance().deleteRepositoryEntryWithAllData( ureq, wControl, repositoryEntry ); + ErrorList errors = repositoryService.delete(repositoryEntry, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale()); + if(errors.hasErrors()) { + wControl.setError(errors.getFirstError()); + } LifeCycleManager.createInstanceFor(repositoryEntry).deleteTimestampFor(SEND_DELETE_EMAIL_ACTION); LifeCycleManager.createInstanceFor(repositoryEntry).markTimestampFor(REPOSITORY_DELETED_ACTION, createLifeCycleLogDataFor(repositoryEntry)); logAudit("Repository-Deletion: deleted repositoryEntry=" + repositoryEntry); diff --git a/src/main/java/org/olat/repository/handlers/BlogHandler.java b/src/main/java/org/olat/repository/handlers/BlogHandler.java index cf4dc28d42d..f858c09c004 100644 --- a/src/main/java/org/olat/repository/handlers/BlogHandler.java +++ b/src/main/java/org/olat/repository/handlers/BlogHandler.java @@ -35,6 +35,7 @@ import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.translator.Translator; 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.util.Util; import org.olat.core.util.coordinate.CoordinatorManager; @@ -51,6 +52,7 @@ import org.olat.modules.webFeed.FeedSecurityCallback; import org.olat.modules.webFeed.managers.FeedManager; import org.olat.modules.webFeed.ui.FeedMainController; import org.olat.modules.webFeed.ui.blog.BlogUIFactory; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -201,12 +203,12 @@ public class BlogHandler implements RepositoryHandler { } @Override - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) { + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) { ReferenceManager refM = ReferenceManager.getInstance(); - String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); + String referencesSummary = refM.getReferencesToSummary(res, locale); if (referencesSummary != null) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); return false; } return true; diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java index c3cd587e3f0..a40fc06943e 100644 --- a/src/main/java/org/olat/repository/handlers/CourseHandler.java +++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java @@ -53,6 +53,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.helpers.Settings; import org.olat.core.id.Identity; 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.CodeHelper; @@ -100,6 +101,7 @@ import org.olat.modules.sharedfolder.SharedFolderManager; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryImportExport; import org.olat.repository.RepositoryEntryImportExport.RepositoryEntryImport; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -539,19 +541,19 @@ public class CourseHandler implements RepositoryHandler { //archiving is done within readyToDelete CourseFactory.deleteCourse(res); // delete resourceable - OLATResourceManager rm = OLATResourceManager.getInstance(); - OLATResource ores = rm.findResourceable(res); - rm.deleteOLATResource(ores); + //OLATResourceManager rm = OLATResourceManager.getInstance(); + //OLATResource ores = rm.findResourceable(res); + //rm.deleteOLATResource(ores); return true; } @Override - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) { + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) { ReferenceManager refM = ReferenceManager.getInstance(); - String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); + String referencesSummary = refM.getReferencesToSummary(res, locale); if (referencesSummary != null) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.references", + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); return false; } @@ -559,9 +561,9 @@ public class CourseHandler implements RepositoryHandler { * make an archive of the course nodes with valuable data */ UserManager um = UserManager.getInstance(); - String charset = um.getUserCharset(ureq.getIdentity()); + String charset = um.getUserCharset(identity); try { - CourseFactory.archiveCourse(res,charset, ureq.getLocale(), ureq.getIdentity(), ureq.getUserSession().getRoles()); + CourseFactory.archiveCourse(res,charset, locale, identity, roles); } catch (CorruptedCourseException e) { log.error("The course is corrupted, cannot archive it: " + res, e); } diff --git a/src/main/java/org/olat/repository/handlers/FileHandler.java b/src/main/java/org/olat/repository/handlers/FileHandler.java index e5eccb7ab15..473684a263b 100644 --- a/src/main/java/org/olat/repository/handlers/FileHandler.java +++ b/src/main/java/org/olat/repository/handlers/FileHandler.java @@ -26,6 +26,7 @@ package org.olat.repository.handlers; import java.io.File; +import java.util.Locale; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; @@ -34,12 +35,14 @@ import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.Roles; import org.olat.core.util.Util; import org.olat.core.util.ZipUtil; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent; import org.olat.core.util.vfs.VFSContainer; import org.olat.fileresource.FileResourceManager; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.resource.references.ReferenceManager; @@ -80,11 +83,11 @@ public abstract class FileHandler implements RepositoryHandler { } @Override - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) { - String referencesSummary = ReferenceManager.getInstance().getReferencesToSummary(res, ureq.getLocale()); + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) { + String referencesSummary = ReferenceManager.getInstance().getReferencesToSummary(res, locale); if (referencesSummary != null) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.references", + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); return false; } diff --git a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java index 77fe9c006d4..ce352cd0500 100644 --- a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java +++ b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java @@ -46,6 +46,7 @@ import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.translator.Translator; 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.util.FileUtils; import org.olat.core.util.Util; @@ -60,6 +61,7 @@ import org.olat.fileresource.types.ResourceEvaluation; import org.olat.modules.glossary.GlossaryEditSettingsController; import org.olat.modules.glossary.GlossaryManager; import org.olat.modules.glossary.GlossaryRegisterSettingsController; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -254,12 +256,12 @@ public class GlossaryHandler implements RepositoryHandler { } @Override - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) { + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) { ReferenceManager refM = ReferenceManager.getInstance(); - String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); + String referencesSummary = refM.getReferencesToSummary(res, locale); if (referencesSummary != null) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); return false; } return true; diff --git a/src/main/java/org/olat/repository/handlers/PodcastHandler.java b/src/main/java/org/olat/repository/handlers/PodcastHandler.java index 6d16ed2aaed..681ea318b93 100644 --- a/src/main/java/org/olat/repository/handlers/PodcastHandler.java +++ b/src/main/java/org/olat/repository/handlers/PodcastHandler.java @@ -35,6 +35,7 @@ import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.translator.Translator; 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.util.Util; import org.olat.core.util.coordinate.CoordinatorManager; @@ -51,6 +52,7 @@ import org.olat.modules.webFeed.FeedSecurityCallback; import org.olat.modules.webFeed.managers.FeedManager; import org.olat.modules.webFeed.ui.FeedMainController; import org.olat.modules.webFeed.ui.podcast.PodcastUIFactory; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -199,12 +201,12 @@ public class PodcastHandler implements RepositoryHandler { } @Override - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) { + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) { ReferenceManager refM = ReferenceManager.getInstance(); - String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); + String referencesSummary = refM.getReferencesToSummary(res, locale); if (referencesSummary != null) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); return false; } return true; diff --git a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java index a53ebe78414..3a2e4cea347 100644 --- a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java +++ b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java @@ -37,6 +37,7 @@ import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.translator.Translator; 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; @@ -58,6 +59,7 @@ import org.olat.portfolio.model.structel.EPStructuredMapTemplate; import org.olat.portfolio.model.structel.PortfolioStructure; import org.olat.portfolio.model.structel.PortfolioStructureMap; import org.olat.portfolio.ui.structel.EPCreateMapController; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -185,7 +187,7 @@ public class PortfolioHandler implements RepositoryHandler { } @Override - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) { + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) { EPFrontendManager ePFMgr = (EPFrontendManager) CoreSpringFactory.getBean("epFrontendManager"); PortfolioStructure map = ePFMgr.loadPortfolioStructure(res); if(map != null) { @@ -197,10 +199,10 @@ public class PortfolioHandler implements RepositoryHandler { if (ePFMgr.isTemplateInUse(exercise, null, null, null)) return false; } ReferenceManager refM = ReferenceManager.getInstance(); - String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); + String referencesSummary = refM.getReferencesToSummary(res, locale); if (referencesSummary != null) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); return false; } return true; diff --git a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java index 2c738a5ead5..054ed7e69b4 100644 --- a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java +++ b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java @@ -36,9 +36,11 @@ import org.olat.core.gui.control.generic.wizard.StepsMainRunController; import org.olat.core.gui.media.MediaResource; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.Roles; import org.olat.core.util.coordinate.LockResult; import org.olat.core.util.vfs.VFSContainer; import org.olat.fileresource.types.ResourceEvaluation; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.controllers.WizardCloseResourceController; import org.olat.repository.ui.author.AuthoringEditEntrySettingsController; @@ -200,19 +202,13 @@ public interface RepositoryHandler { * from the repository. Return status wether to proceed with the delete action. If * this method returns false, the entry will not be deleted. * @param res - * @param ureq - * @param wControl + * @param identity + * @param roles TODO + * @param locale TODO + * @param errors * @return true if ressource is ready to delete, false if not. */ - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl); - - /** - * Create a copy of the given resourceable. - * @param res - * @param ureq - * @return Copy of given resourceable. - */ - //public OLATResourceable createCopy(OLATResourceable res, UserRequest ureq); + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors); /** * If a handler likes to provied any details on a resourceable in the repository's details diff --git a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java index 88d37764501..4b26b129966 100644 --- a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java +++ b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java @@ -55,6 +55,7 @@ import org.olat.fileresource.types.SharedFolderFileResource; import org.olat.modules.sharedfolder.SharedFolderDisplayController; import org.olat.modules.sharedfolder.SharedFolderEditorController; import org.olat.modules.sharedfolder.SharedFolderManager; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -228,12 +229,12 @@ public class SharedFolderHandler implements RepositoryHandler { } @Override - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) { + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) { ReferenceManager refM = ReferenceManager.getInstance(); - String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); + String referencesSummary = refM.getReferencesToSummary(res, locale); if (referencesSummary != null) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); return false; } return true; diff --git a/src/main/java/org/olat/repository/handlers/WikiHandler.java b/src/main/java/org/olat/repository/handlers/WikiHandler.java index c15687cd5f1..82d940794e5 100644 --- a/src/main/java/org/olat/repository/handlers/WikiHandler.java +++ b/src/main/java/org/olat/repository/handlers/WikiHandler.java @@ -48,6 +48,7 @@ import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.Roles; import org.olat.core.id.context.BusinessControl; import org.olat.core.id.context.ContextEntry; import org.olat.core.logging.AssertException; @@ -74,6 +75,7 @@ import org.olat.modules.wiki.WikiPage; import org.olat.modules.wiki.WikiSecurityCallback; import org.olat.modules.wiki.WikiSecurityCallbackImpl; import org.olat.modules.wiki.WikiToZipUtils; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -293,12 +295,12 @@ public class WikiHandler implements RepositoryHandler { } @Override - public boolean readyToDelete(OLATResourceable res, UserRequest ureq, WindowControl wControl) { + public boolean readyToDelete(OLATResourceable res, Identity identity, Roles roles, Locale locale, ErrorList errors) { ReferenceManager refM = ReferenceManager.getInstance(); - String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale()); + String referencesSummary = refM.getReferencesToSummary(res, locale); if (referencesSummary != null) { - Translator translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); - wControl.setError(translator.translate("details.delete.error.references", + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", new String[] { referencesSummary })); return false; } diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java index bdbf22289c8..117431ef664 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java +++ b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java @@ -266,13 +266,10 @@ public class RepositoryEntryRelationDAO { .setParameter("repoKey", re.getKey()) .setParameter("groupKey", group.getKey()) .getResultList(); - + for(RepositoryEntryToGroupRelation rel:rels) { em.remove(rel); } - if(re instanceof RepositoryEntry) { - ((RepositoryEntry)re).getGroups().removeAll(rels); - } return rels.size(); } @@ -285,13 +282,9 @@ public class RepositoryEntryRelationDAO { List<RepositoryEntryToGroupRelation> rels = em.createQuery(sb.toString(), RepositoryEntryToGroupRelation.class) .setParameter("repoKey", re.getKey()) .getResultList(); - for(RepositoryEntryToGroupRelation rel:rels) { em.remove(rel); } - if(re instanceof RepositoryEntry) { - ((RepositoryEntry)re).getGroups().removeAll(rels); - } return rels.size(); } diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java index 6af011a6719..e35505e0a72 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java +++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java @@ -23,6 +23,7 @@ import java.io.File; import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import org.olat.basesecurity.BaseSecurity; @@ -30,10 +31,16 @@ import org.olat.basesecurity.Group; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.IdentityRef; import org.olat.basesecurity.manager.GroupDAO; +import org.olat.catalog.CatalogManager; +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.services.mark.MarkManager; import org.olat.core.id.Identity; 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.CodeHelper; import org.olat.core.util.StringHelper; import org.olat.core.util.resource.OresHelper; @@ -41,6 +48,8 @@ import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; +import org.olat.course.assessment.manager.UserCourseInformationsManager; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryAuthorView; import org.olat.repository.RepositoryEntryMyView; @@ -68,6 +77,8 @@ import org.springframework.stereotype.Service; */ @Service("repositoryService") public class RepositoryServiceImpl implements RepositoryService { + + private static final OLog log = Tracing.createLoggerFor(RepositoryServiceImpl.class); @Autowired private DB dbInstance; @@ -87,6 +98,8 @@ public class RepositoryServiceImpl implements RepositoryService { private RepositoryEntryAuthorQueries authorViewQueries; @Autowired private OLATResourceManager resourceManager; + @Autowired + private UserCourseInformationsManager userCourseInformationsManager; @Autowired private LifeFullIndexer lifeIndexer; @@ -210,6 +223,66 @@ public class RepositoryServiceImpl implements RepositoryService { } return null; } + + public ErrorList delete(RepositoryEntry entry, Identity identity, Roles roles, Locale locale) { + ErrorList errors = new ErrorList(); + + boolean debug = log.isDebug(); + + // invoke handler delete callback + if(debug) log.debug("deleteRepositoryEntry start entry=" + entry); + entry = (RepositoryEntry) dbInstance.loadObject(entry,true); + if(debug) log.debug("deleteRepositoryEntry after load entry=" + entry); + RepositoryHandler handler = RepositoryHandlerFactory.getInstance().getRepositoryHandler(entry); + OLATResource resource = entry.getOlatResource(); + //delete old context + if (!handler.readyToDelete(resource, identity, roles, locale, errors)) { + return errors; + } + + // start transaction + // delete entry picture + + userCourseInformationsManager.deleteUserCourseInformations(entry); + + // delete all bookmarks referencing deleted entry + CoreSpringFactory.getImpl(MarkManager.class).deleteMarks(entry); + // delete all catalog entries referencing deleted entry + CatalogManager.getInstance().resourceableDeleted(entry); + + //delete all policies + securityManager.deletePolicies(resource); + + // inform handler to do any cleanup work... handler must delete the + // referenced resourceable a swell. + handler.cleanupOnDelete(resource); + + dbInstance.commit(); + + if(debug) log.debug("deleteRepositoryEntry after reload entry=" + entry); + deleteRepositoryEntryAndBaseGroups(entry); + + if(debug) log.debug("deleteRepositoryEntry Done"); + return errors; + } + + /** + * + * @param entry + */ + @Override + public void deleteRepositoryEntryAndBaseGroups(RepositoryEntry entry) { + RepositoryEntry reloadedEntry = dbInstance.getCurrentEntityManager() + .getReference(RepositoryEntry.class, entry.getKey()); + + Group defaultGroup = reToGroupDao.getDefaultGroup(reloadedEntry); + groupDao.removeMemberships(defaultGroup); + reToGroupDao.removeRelations(reloadedEntry); + dbInstance.commit(); + dbInstance.getCurrentEntityManager().remove(reloadedEntry); + groupDao.removeGroup(defaultGroup); + dbInstance.commit(); + } @Override public void incrementLaunchCounter(RepositoryEntry re) { diff --git a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java index 4db3b6665d4..1f0638872e3 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java +++ b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDetailsController.java @@ -71,6 +71,7 @@ import org.olat.course.run.RunMainController; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.group.model.SearchBusinessGroupParams; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryEntryRef; @@ -97,6 +98,7 @@ import org.olat.resource.accesscontrol.ui.PriceFormat; import org.olat.user.UserManager; import org.springframework.beans.factory.annotation.Autowired; + /** * * Initial date: 29.04.2014<br> @@ -483,7 +485,7 @@ public class AuthoringEntryDetailsController extends RepositoryEntryDetailsContr } } else if (deleteDialogCtrl == source){ if (DialogBoxUIFactory.isYesEvent(event)){ - deleteRepositoryEntry(ureq, getWindowControl()); + deleteRepositoryEntry(ureq); } } else if(copyCtrl == source) { cmc.deactivate(); @@ -688,12 +690,14 @@ public class AuthoringEntryDetailsController extends RepositoryEntryDetailsContr listenTo(catalogCtlr); } - private void deleteRepositoryEntry(UserRequest ureq, WindowControl wControl) { - if (RepositoryManager.getInstance().deleteRepositoryEntryWithAllData( ureq, wControl, entry) ) { + private void deleteRepositoryEntry(UserRequest ureq) { + Roles roles = ureq.getUserSession().getRoles(); + ErrorList errors = repositoryService.delete(entry, getIdentity(), roles, getLocale()); + if (errors.hasErrors()) { + showInfo("info.could.not.delete.entry"); + } else { fireEvent(ureq, new EntryChangedEvent(entry, EntryChangedEvent.DELETED)); showInfo("info.entry.deleted"); - } else { - showInfo("info.could.not.delete.entry"); } } } diff --git a/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java b/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java index 9c14e940856..a9c0f480604 100644 --- a/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java +++ b/src/main/java/org/olat/restapi/repository/RepositoryEntryResource.java @@ -65,6 +65,7 @@ import org.olat.core.util.FileUtils; import org.olat.core.util.coordinate.LockResult; import org.olat.fileresource.FileResourceManager; import org.olat.fileresource.types.ImsCPFileResource; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -75,7 +76,6 @@ import org.olat.repository.model.RepositoryEntryLifecycle; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; import org.olat.restapi.security.RestSecurityHelper; -import org.olat.restapi.support.ErrorWindowControl; import org.olat.restapi.support.MultipartReader; import org.olat.restapi.support.ObjectFactory; import org.olat.restapi.support.vo.RepositoryEntryLifecycleVO; @@ -670,8 +670,11 @@ public class RepositoryEntryResource { return Response.serverError().status(Status.UNAUTHORIZED).build(); } UserRequest ureq = getUserRequest(request); - ErrorWindowControl error = new ErrorWindowControl(); - repositoryManager.deleteRepositoryEntryWithAllData(ureq, error, re); + RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class); + ErrorList errors = rs.delete(re, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale()); + if(errors.hasErrors()) { + return Response.serverError().status(500).build(); + } return Response.ok().build(); } diff --git a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java index 3f453cc5332..d1b0532bc7b 100644 --- a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java @@ -71,6 +71,7 @@ import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.config.CourseConfig; import org.olat.course.nodes.cal.CourseCalendars; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; @@ -81,7 +82,6 @@ import org.olat.resource.OLATResourceManager; import org.olat.resource.accesscontrol.ACService; import org.olat.resource.accesscontrol.AccessResult; import org.olat.restapi.security.RestSecurityHelper; -import org.olat.restapi.support.ErrorWindowControl; import org.olat.restapi.support.ObjectFactory; import org.olat.restapi.support.vo.CourseConfigVO; import org.olat.restapi.support.vo.CourseVO; @@ -287,10 +287,14 @@ public class CourseWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } UserRequest ureq = getUserRequest(request); - ErrorWindowControl error = new ErrorWindowControl(); RepositoryManager rm = RepositoryManager.getInstance(); + RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class); RepositoryEntry re = rm.lookupRepositoryEntry(course, true); - rm.deleteRepositoryEntryWithAllData(ureq, error, re); + + ErrorList errors = rs.delete(re, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale()); + if(errors.hasErrors()) { + return Response.serverError().status(500).build(); + } return Response.ok().build(); } diff --git a/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java b/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java index f9a241c8c0e..a76aa4ae6e8 100644 --- a/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java +++ b/src/test/java/org/olat/repository/manager/RepositoryServiceImplTest.java @@ -19,10 +19,14 @@ */ package org.olat.repository.manager; +import java.util.Locale; + import org.junit.Assert; import org.junit.Test; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; +import org.olat.repository.ErrorList; import org.olat.repository.RepositoryEntry; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; @@ -86,7 +90,18 @@ public class RepositoryServiceImplTest extends OlatTestCase { Assert.assertEquals(0, re.getAccess()); } - + @Test + public void deleteCourse() { + Identity initialAuthor = JunitTestHelper.createAndPersistIdentityAsRndUser("auth-del-1"); + RepositoryEntry re = JunitTestHelper.deployDemoCourse(initialAuthor); + dbInstance.commitAndCloseSession(); + + Roles roles = new Roles(false, false, false, true, false, false, false); + ErrorList errors = repositoryService.delete(re, initialAuthor, roles, Locale.ENGLISH); + Assert.assertNotNull(errors); + Assert.assertFalse(errors.hasErrors()); + } + } diff --git a/src/test/profile/mysql/olat.eclipse.properties b/src/test/profile/mysql/olat.eclipse.properties index c14b342cc1d..680947553ca 100644 --- a/src/test/profile/mysql/olat.eclipse.properties +++ b/src/test/profile/mysql/olat.eclipse.properties @@ -47,6 +47,7 @@ db.name=olattest db.user=olat db.pass=olat db.host.port=3306 +db.show_sql=true db.database.dialect=org.hibernate.dialect.MySQL5InnoDBDialect auto.upgrade.database=false db.hibernate.c3p0.debugUnreturnedConnectionStackTraces=true -- GitLab