From e337c320966240d0f19e8e11312d45e58d61b0c2 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Mon, 28 May 2018 13:38:24 +0200 Subject: [PATCH] OO-3504: export forum messages of user --- .../model/CourseCreationConfiguration.java | 35 ++- .../collaboration/CollaborationTools.java | 6 +- .../olat/core/gui/DefaultGlobalSettings.java | 38 +++ .../gui/control/winmgr/WindowManagerImpl.java | 2 +- .../olat/course/nodes/DialogCourseNode.java | 4 +- .../org/olat/course/nodes/FOCourseNode.java | 6 +- .../QTI21ResultsExportMediaResource.java | 34 +-- .../modules/fo/ForumNotificationsHandler.java | 2 +- .../fo/archiver/ForumArchiveManager.java | 27 +- .../formatters/ForumDownloadResource.java | 5 +- .../formatters/ForumRTFFormatter.java | 7 +- .../formatters/ForumStreamedRTFFormatter.java | 9 +- .../olat/modules/fo/manager/ForumManager.java | 30 ++- .../fo/manager/ForumUserDataManager.java | 230 ++++++++++++++++++ .../fo/manager/_content/export_message.html | 36 +++ .../fo/portfolio/ForumArtefactHandler.java | 3 +- .../fo/restapi/ForumCourseNodeWebService.java | 5 +- .../fo/restapi/ForumImportWebService.java | 3 +- .../modules/fo/restapi/ForumWebService.java | 4 +- .../ui/export/ExportBinderAsCPResource.java | 34 +-- .../ui/export/ExportBinderAsPDFResource.java | 34 +-- .../olat/modules/wiki/WikiMainController.java | 6 +- ...PageChangeOrCreateNotificationHandler.java | 2 +- .../search/service/indexer/ForumIndexer.java | 3 +- .../indexer/group/GroupForumIndexer.java | 5 +- .../course/DialogCourseNodeIndexer.java | 4 +- .../course/FOCourseNodeIndexer.java | 5 +- .../ui/data/_i18n/LocalStrings_de.properties | 3 +- .../ui/data/_i18n/LocalStrings_en.properties | 1 + .../logging/activity/LoggingResourceable.java | 3 +- src/test/java/org/olat/restapi/ForumTest.java | 20 +- .../java/org/olat/restapi/GroupMgmtTest.java | 38 +-- .../org/olat/restapi/NotificationsTest.java | 9 +- .../java/org/olat/restapi/UserMgmtTest.java | 10 +- 34 files changed, 441 insertions(+), 222 deletions(-) create mode 100644 src/main/java/org/olat/core/gui/DefaultGlobalSettings.java create mode 100644 src/main/java/org/olat/modules/fo/manager/ForumUserDataManager.java create mode 100644 src/main/java/org/olat/modules/fo/manager/_content/export_message.html diff --git a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/model/CourseCreationConfiguration.java b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/model/CourseCreationConfiguration.java index 5cfd5176fd4..50042b0cbd0 100644 --- a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/model/CourseCreationConfiguration.java +++ b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/model/CourseCreationConfiguration.java @@ -32,18 +32,21 @@ package de.tuchemnitz.wizard.workflows.coursecreation.model; -import org.apache.commons.io.IOUtils; +import java.io.IOException; + import org.apache.velocity.context.Context; import org.olat.core.commons.editor.htmleditor.WysiwygFactory; +import org.olat.core.gui.DefaultGlobalSettings; import org.olat.core.gui.GlobalSettings; import org.olat.core.gui.components.velocity.VelocityContainer; -import org.olat.core.gui.control.winmgr.AJAXFlags; import org.olat.core.gui.render.RenderResult; import org.olat.core.gui.render.Renderer; import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.velocity.VelocityHelper; import org.olat.core.gui.render.velocity.VelocityRenderDecorator; import org.olat.core.gui.translator.Translator; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.course.editor.CourseAccessAndProperties; import org.olat.repository.CatalogEntry; @@ -62,6 +65,8 @@ import de.tuchemnitz.wizard.workflows.coursecreation.CourseCreationHelper; * @author Sebastian Fritzsche (seb.fritzsche@googlemail.com) */ public class CourseCreationConfiguration { + + private static final OLog log = Tracing.createLoggerFor(CourseCreationConfiguration.class); public static final String ACL_GUEST = "acl_guest"; public static final String ACL_OLAT = "acl_olat"; @@ -360,29 +365,21 @@ public class CourseCreationConfiguration { vc.contextPut("coursetitle", courseTitle); //prepare rendering of velocity page for the content of the single page node - GlobalSettings globalSettings = new GlobalSettings() { - public int getFontSize() { return 100;} - public AJAXFlags getAjaxFlags() { return new EmptyAJAXFlags();} - public boolean isIdDivsForced() { return false; } - }; + GlobalSettings globalSettings = new DefaultGlobalSettings(); Context context = vc.getContext(); Renderer fr = Renderer.getInstance(vc, translator, null, new RenderResult(), globalSettings); StringOutput wOut = new StringOutput(10000); - VelocityRenderDecorator vrdec = new VelocityRenderDecorator(fr, vc, wOut); - context.put("r", vrdec); - VelocityHelper.getInstance().mergeContent(vc.getPage(), context, wOut, null); - //free the decorator - context.remove("r"); - IOUtils.closeQuietly(vrdec); + try(VelocityRenderDecorator vrdec = new VelocityRenderDecorator(fr, vc, wOut)) { + context.put("r", vrdec); + VelocityHelper.getInstance().mergeContent(vc.getPage(), context, wOut, null); + //free the decorator + context.remove("r"); + } catch(IOException e) { + log.error("", e); + } return WysiwygFactory.createXHtmlFileContent(wOut.toString(), courseTitle); } - - private static class EmptyAJAXFlags extends AJAXFlags { - public EmptyAJAXFlags() { super(null); } - @Override - public boolean isIframePostEnabled() { return false; } - } /** * @param subscriberCount The subscriberCount to set. diff --git a/src/main/java/org/olat/collaboration/CollaborationTools.java b/src/main/java/org/olat/collaboration/CollaborationTools.java index a0bf3b5c890..28cd3a738ee 100644 --- a/src/main/java/org/olat/collaboration/CollaborationTools.java +++ b/src/main/java/org/olat/collaboration/CollaborationTools.java @@ -336,7 +336,7 @@ public class CollaborationTools implements Serializable { } public Forum getForum() { - final ForumManager fom = ForumManager.getInstance(); + final ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); final NarrowedPropertyManager npm = NarrowedPropertyManager.getInstance(ores); Property forumProperty = npm.findProperty(null, null, PROP_CAT_BG_COLLABTOOLS, KEY_FORUM); @@ -655,7 +655,7 @@ public class CollaborationTools implements Serializable { /* * delete the forum, if existing */ - ForumManager fom = ForumManager.getInstance(); + ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); Property forumKeyProperty = npm.findProperty(null, null, PROP_CAT_BG_COLLABTOOLS, KEY_FORUM); if (forumKeyProperty != null) { // if there was a forum, delete it @@ -1027,7 +1027,7 @@ public class CollaborationTools implements Serializable { String archiveForumName = "del_forum_" + forumKeyProperty.getLongValue(); VFSContainer archiveForumContainer = archiveContainer.createChildContainer(archiveForumName); ForumFormatter ff = new ForumRTFFormatter(archiveForumContainer, false, I18nModule.getDefaultLocale()); - ForumArchiveManager.getInstance().applyFormatter(ff, forumKeyProperty.getLongValue(), null); + CoreSpringFactory.getImpl(ForumArchiveManager.class).applyFormatter(ff, forumKeyProperty.getLongValue(), null); } } diff --git a/src/main/java/org/olat/core/gui/DefaultGlobalSettings.java b/src/main/java/org/olat/core/gui/DefaultGlobalSettings.java new file mode 100644 index 00000000000..e0c34064791 --- /dev/null +++ b/src/main/java/org/olat/core/gui/DefaultGlobalSettings.java @@ -0,0 +1,38 @@ +package org.olat.core.gui; + +import org.olat.core.gui.control.winmgr.AJAXFlags; + +/** + * + * Initial date: 28 mai 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class DefaultGlobalSettings implements GlobalSettings { + @Override + public int getFontSize() { + return 100; + } + + @Override + public AJAXFlags getAjaxFlags() { + return new EmptyAJAXFlags(); + } + + @Override + public boolean isIdDivsForced() { + return false; + } + + private static class EmptyAJAXFlags extends AJAXFlags { + + public EmptyAJAXFlags() { + super(null); + } + + @Override + public boolean isIframePostEnabled() { + return false; + } + } +} diff --git a/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java b/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java index 377cbdeccb7..f3228866dda 100644 --- a/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java +++ b/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java @@ -50,7 +50,7 @@ import org.olat.core.manager.BasicManager; */ public class WindowManagerImpl extends BasicManager implements WindowManager { - private List<WindowBackOfficeImpl> wbos = new ArrayList<WindowBackOfficeImpl>(); + private List<WindowBackOfficeImpl> wbos = new ArrayList<>(); private GlobalSettings globalSettings; private boolean ajaxEnabled = false; diff --git a/src/main/java/org/olat/course/nodes/DialogCourseNode.java b/src/main/java/org/olat/course/nodes/DialogCourseNode.java index 60863ee013c..45a551d6226 100644 --- a/src/main/java/org/olat/course/nodes/DialogCourseNode.java +++ b/src/main/java/org/olat/course/nodes/DialogCourseNode.java @@ -228,7 +228,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { diaNodeElemExportContainer.setLocalSecurityCallback(new FullAccessCallback()); diaNodeElemExportContainer.copyFrom(dialogFile); - ForumArchiveManager fam = ForumArchiveManager.getInstance(); + ForumArchiveManager fam = CoreSpringFactory.getImpl(ForumArchiveManager.class); ForumFormatter ff = new ForumRTFFormatter(diaNodeElemExportContainer, false, locale); fam.applyFormatter(ff, element.getForum().getKey(), null); } @@ -264,7 +264,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { ZipUtil.addToZip(item, exportDirName, exportStream); } - ForumArchiveManager fam = ForumArchiveManager.getInstance(); + ForumArchiveManager fam = CoreSpringFactory.getImpl(ForumArchiveManager.class); ForumFormatter ff = new ForumStreamedRTFFormatter(exportStream, exportDirName, false, locale); fam.applyFormatter(ff, element.getForum().getKey(), null); } diff --git a/src/main/java/org/olat/course/nodes/FOCourseNode.java b/src/main/java/org/olat/course/nodes/FOCourseNode.java index 566c6dcb7ab..61ddb57d90f 100644 --- a/src/main/java/org/olat/course/nodes/FOCourseNode.java +++ b/src/main/java/org/olat/course/nodes/FOCourseNode.java @@ -440,14 +440,14 @@ public class FOCourseNode extends AbstractAccessableCourseNode { return false; } Long forumKey = forumKeyProperty.getLongValue(); - if(ForumManager.getInstance().countThreadsByForumID(forumKey) <= 0) { + if(CoreSpringFactory.getImpl(ForumManager.class).countThreadsByForumID(forumKey) <= 0) { return false; } String forumName = "forum_" + Formatter.makeStringFilesystemSave(getShortTitle()) + "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())); ForumStreamedRTFFormatter rtff = new ForumStreamedRTFFormatter(exportStream, forumName, false, locale); - ForumArchiveManager.getInstance().applyFormatter(rtff, forumKey, null); + CoreSpringFactory.getImpl(ForumArchiveManager.class).applyFormatter(rtff, forumKey, null); return true; } @@ -479,7 +479,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode { Property forumKeyProperty = cpm.findCourseNodeProperty(this, null, null, FORUM_KEY); if (forumKeyProperty != null) { Long forumKey = forumKeyProperty.getLongValue(); - ForumManager.getInstance().deleteForum(forumKey); // delete the forum + CoreSpringFactory.getImpl(ForumManager.class).deleteForum(forumKey); // delete the forum cpm.deleteProperty(forumKeyProperty); // delete the property } } diff --git a/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java b/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java index 5290ee82a35..09a58c0ac3a 100644 --- a/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java +++ b/src/main/java/org/olat/ims/qti21/resultexport/QTI21ResultsExportMediaResource.java @@ -44,13 +44,12 @@ import javax.servlet.http.HttpServletResponse; import org.apache.velocity.VelocityContext; import org.olat.admin.user.imp.TransientIdentity; import org.olat.core.CoreSpringFactory; -import org.olat.core.gui.GlobalSettings; +import org.olat.core.gui.DefaultGlobalSettings; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.winmgr.AJAXFlags; import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.render.RenderResult; import org.olat.core.gui.render.Renderer; @@ -340,7 +339,7 @@ public class QTI21ResultsExportMediaResource implements MediaResource { mainVC.put("results", results); //render VelocityContainer to StringOutPut - Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new EmptyGlobalSettings()); + Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new DefaultGlobalSettings()); try(StringOutput sb = new StringOutput(32000); VelocityRenderDecorator vrdec = new VelocityRenderDecorator(renderer, mainVC, sb)) { mainVC.contextPut("r", vrdec); @@ -416,33 +415,4 @@ public class QTI21ResultsExportMediaResource implements MediaResource { public void release() { // } - - private static class EmptyAJAXFlags extends AJAXFlags { - - public EmptyAJAXFlags() { - super(null); - } - - @Override - public boolean isIframePostEnabled() { - return false; - } - } - - private static class EmptyGlobalSettings implements GlobalSettings { - @Override - public int getFontSize() { - return 100; - } - - @Override - public AJAXFlags getAjaxFlags() { - return new EmptyAJAXFlags(); - } - - @Override - public boolean isIdDivsForced() { - return false; - } - } } diff --git a/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java b/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java index d96d83d1d5d..c6b2bfe5f76 100644 --- a/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java +++ b/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java @@ -96,7 +96,7 @@ public class ForumNotificationsHandler extends LogDelegator implements Notificat } } - final List<Message> mInfos = ForumManager.getInstance().getNewMessageInfo(forumKey, compareDate); + final List<Message> mInfos = CoreSpringFactory.getImpl(ForumManager.class).getNewMessageInfo(forumKey, compareDate); final Translator translator = Util.createPackageTranslator(ForumNotificationsHandler.class, locale); businessControlString = p.getBusinessPath() + "[Message:"; diff --git a/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java b/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java index 54843950fcc..eb9e66bc092 100644 --- a/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java +++ b/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java @@ -39,26 +39,20 @@ import org.olat.modules.fo.ForumCallback; import org.olat.modules.fo.Message; import org.olat.modules.fo.archiver.formatters.ForumFormatter; import org.olat.modules.fo.manager.ForumManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; /** * Initial Date: Nov 11, 2005 <br> * @author Alexander Schneider */ - +@Service public class ForumArchiveManager { + private static final OLog log = Tracing.createLoggerFor(ForumArchiveManager.class); - private static final ForumArchiveManager instance = new ForumArchiveManager(); - private ForumArchiveManager() { - // private since singleton - } - - /** - * @return the singleton - */ - public static ForumArchiveManager getInstance() { - return instance; - } + @Autowired + private ForumManager forumManager; /** * If the forumCallback is null no restriction applies to the forum archiver. @@ -98,10 +92,9 @@ public class ForumArchiveManager { */ private List<MessageNode> convertToThreadTrees(Long forumId, ForumCallback forumCallback){ List<MessageNode> topNodeList = new ArrayList<>(); - ForumManager fm = ForumManager.getInstance(); - - Forum f = fm.loadForum(forumId); - List<Message> messages = fm.getMessagesByForum(f); + + Forum f = forumManager.loadForum(forumId); + List<Message> messages = forumManager.getMessagesByForum(f); for (Iterator<Message> iterTop = messages.iterator(); iterTop.hasNext();) { Message msg = iterTop.next(); @@ -144,7 +137,7 @@ public class ForumArchiveManager { */ private MessageNode convertToThreadTree(Long topMessageId){ MessageNode topNode = null; - List<Message> messages = ForumManager.getInstance().getThread(topMessageId); + List<Message> messages = forumManager.getThread(topMessageId); for (Iterator<Message> iterTop = messages.iterator(); iterTop.hasNext();) { Message msg = iterTop.next(); if (msg.getParent() == null) { diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java index 60292670b7e..4a5a9890cfc 100644 --- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java +++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java @@ -30,6 +30,7 @@ import java.util.zip.ZipOutputStream; import javax.servlet.http.HttpServletResponse; +import org.olat.core.CoreSpringFactory; import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.media.ServletUtil; import org.olat.core.logging.OLog; @@ -146,10 +147,10 @@ public class ForumDownloadResource implements MediaResource { ForumOpenXMLFormatter openXmlFormatter = new ForumOpenXMLFormatter(mediaContainer, locale); if(topMessageId != null) { - ForumArchiveManager.getInstance() + CoreSpringFactory.getImpl(ForumArchiveManager.class) .applyFormatterForOneThread(openXmlFormatter, forum.getKey(), topMessageId); } else { - ForumArchiveManager.getInstance() + CoreSpringFactory.getImpl(ForumArchiveManager.class) .applyFormatter(openXmlFormatter, forum.getKey(), foCallback); } diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java index f48c1a4eb61..b65c09fd248 100644 --- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java +++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java @@ -40,6 +40,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringEscapeUtils; +import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.id.Identity; import org.olat.core.id.UserConstants; @@ -72,7 +73,6 @@ public class ForumRTFFormatter extends ForumFormatter { private VFSContainer container; private VFSItem vfsFil = null; - private ForumManager fm = ForumManager.getInstance(); private VFSContainer tempContainer; final Pattern PATTERN_HTML_BOLD = Pattern.compile("<strong>(.*?)</strong>", Pattern.CASE_INSENSITIVE); @@ -91,6 +91,8 @@ public class ForumRTFFormatter extends ForumFormatter { //TODO: (LD) translate this! private String HIDDEN_STR = "VERBORGEN"; + private final ForumManager forumManager; + /** * * @param container @@ -103,6 +105,7 @@ public class ForumRTFFormatter extends ForumFormatter { // where to write this.container = container; this.filePerThread = filePerThread; + forumManager = CoreSpringFactory.getImpl(ForumManager.class); } /** @@ -167,7 +170,7 @@ public class ForumRTFFormatter extends ForumFormatter { } sb.append(" \\par}"); // attachment(s) - VFSContainer msgContainer = fm.getMessageContainer(getForumKey(), mn.getKey()); + VFSContainer msgContainer = forumManager.getMessageContainer(getForumKey(), mn.getKey()); List<VFSItem> attachments = msgContainer.getItems(); if (attachments != null && attachments.size() > 0){ VFSItem item = container.resolve("attachments"); diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java index fd85dbb2f54..49847b8ff0c 100644 --- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java +++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java @@ -39,6 +39,7 @@ import java.util.zip.ZipOutputStream; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringEscapeUtils; +import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; import org.olat.core.id.UserConstants; import org.olat.core.logging.AssertException; @@ -65,7 +66,6 @@ public class ForumStreamedRTFFormatter extends ForumFormatter { private static final OLog log = Tracing.createLoggerFor(ForumStreamedRTFFormatter.class); private ZipOutputStream exportStream; - private ForumManager fm = ForumManager.getInstance(); final Pattern PATTERN_HTML_BOLD = Pattern.compile("<strong>(.*?)</strong>", Pattern.CASE_INSENSITIVE); final Pattern PATTERN_HTML_ITALIC = Pattern.compile("<em>(.*?)</em>", Pattern.CASE_INSENSITIVE); @@ -82,6 +82,8 @@ public class ForumStreamedRTFFormatter extends ForumFormatter { private String HIDDEN_STR = "VERBORGEN"; private final String path; + + private final ForumManager forumManager; /** * @@ -92,6 +94,9 @@ public class ForumStreamedRTFFormatter extends ForumFormatter { public ForumStreamedRTFFormatter(ZipOutputStream exportStream, String path, boolean filePerThread, Locale locale) { // init String Buffer in ForumFormatter super(locale); + + forumManager = CoreSpringFactory.getImpl(ForumManager.class); + // where to write this.exportStream = exportStream; this.filePerThread = filePerThread; @@ -152,7 +157,7 @@ public class ForumStreamedRTFFormatter extends ForumFormatter { } sb.append(" \\par}"); // attachment(s) - VFSContainer msgContainer = fm.getMessageContainer(getForumKey(), mn.getKey()); + VFSContainer msgContainer = forumManager.getMessageContainer(getForumKey(), mn.getKey()); List<VFSItem> attachments = msgContainer.getItems(); if (attachments != null && attachments.size() > 0){ sb.append("{\\pard \\f0\\fs15 Attachment(s): "); diff --git a/src/main/java/org/olat/modules/fo/manager/ForumManager.java b/src/main/java/org/olat/modules/fo/manager/ForumManager.java index 935aeacb113..a72e0fad806 100644 --- a/src/main/java/org/olat/modules/fo/manager/ForumManager.java +++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java @@ -90,8 +90,7 @@ import org.springframework.stereotype.Service; @Service public class ForumManager { private static final OLog log = Tracing.createLoggerFor(ForumManager.class); - - private static ForumManager INSTANCE; + @Autowired private DB dbInstance; @Autowired @@ -102,20 +101,6 @@ public class ForumManager { private UserManager userManager; @Autowired private MarkingService markingService; - - /** - * [spring] - */ - private ForumManager() { - INSTANCE = this; - } - - /** - * @return the singleton - */ - public static ForumManager getInstance() { - return INSTANCE; - } public int countThread(Long messageKey) { String query = "select count(msg) from fomessage as msg where msg.key=:messageKey or msg.threadtop.key=:messageKey"; @@ -374,6 +359,19 @@ public class ForumManager { .getResultList(); return messages == null || messages.isEmpty() ? null : messages.get(0); } + + public List<Message> getMessageByCreator(IdentityRef creator) { + StringBuilder query = new StringBuilder(); + query.append("select msg from fomessage as msg") + .append(" inner join msg.creator as creator") + .append(" inner join fetch msg.forum as forum") + .append(" where msg.creator.key=:identityKey"); + + return dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), Message.class) + .setParameter("identityKey", creator.getKey()) + .getResultList(); + } public boolean isPseudonymProtected(String pseudonym) { StringBuilder query = new StringBuilder(); diff --git a/src/main/java/org/olat/modules/fo/manager/ForumUserDataManager.java b/src/main/java/org/olat/modules/fo/manager/ForumUserDataManager.java new file mode 100644 index 00000000000..407e206953b --- /dev/null +++ b/src/main/java/org/olat/modules/fo/manager/ForumUserDataManager.java @@ -0,0 +1,230 @@ +/** + * <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.modules.fo.manager; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import org.olat.core.commons.persistence.DB; +import org.olat.core.gui.DefaultGlobalSettings; +import org.olat.core.gui.components.velocity.VelocityContainer; +import org.olat.core.gui.render.EmptyURLBuilder; +import org.olat.core.gui.render.RenderResult; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.render.velocity.VelocityRenderDecorator; +import org.olat.core.gui.translator.Translator; +import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; +import org.olat.core.id.context.BusinessControlFactory; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.FileUtils; +import org.olat.core.util.StringHelper; +import org.olat.core.util.Util; +import org.olat.core.util.io.SystemFileFilter; +import org.olat.core.util.resource.OresHelper; +import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupService; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.ForumModule; +import org.olat.modules.fo.Message; +import org.olat.modules.wiki.WikiManager; +import org.olat.properties.Property; +import org.olat.properties.PropertyManager; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryManager; +import org.olat.user.UserDataExportable; +import org.olat.user.manager.ManifestBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 28 mai 2018<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Service +public class ForumUserDataManager implements UserDataExportable { + + private static final OLog log = Tracing.createLoggerFor(ForumUserDataManager.class); + + public static final String FORUM_KEY = "forumKey";// course and group + + @Autowired + private DB dbInstance; + @Autowired + private ForumManager forumManager; + @Autowired + private PropertyManager propertyManager; + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private BusinessGroupService businessGroupService; + + @Override + public String getExporterID() { + return "forums"; + } + + @Override + public void export(Identity identity, ManifestBuilder manifest, File archiveDirectory, Locale locale) { + List<Message> messages = forumManager.getMessageByCreator(identity); + dbInstance.commitAndCloseSession(); + if(messages.isEmpty()) return; + + + File forumArchive = new File(archiveDirectory, "Forums"); + forumArchive.mkdir(); + Map<Long,Property> properties = loadMappingProperties(); + Map<Long, Location> locations = new HashMap<>(); + Translator translator = Util.createPackageTranslator(ForumModule.class, locale); + int count = 1; + for(Message message:messages) { + String name = count++ + "_" + StringHelper.transformDisplayNameToFileSystemName(message.getTitle()); + + Forum forum = message.getForum(); + Location location = locations.computeIfAbsent(forum.getKey(), forumKey -> resolveLocation(forumKey, properties)); + + List<File> attachments; + File msgContainer = forumManager.getMessageDirectory(forum.getKey(), message.getKey(), false); + if(msgContainer != null && msgContainer.exists()) { + File[] attachmentArr = msgContainer.listFiles(new SystemFileFilter(true, false)); + attachments = Arrays.asList(attachmentArr); + if(!attachments.isEmpty()) { + File messageAttachementDir = new File(forumArchive, name); + messageAttachementDir.mkdir(); + for(File attachment:attachments) { + FileUtils.copyFileToDir(attachment, messageAttachementDir, "Copy forum message attachments"); + } + } + } else { + attachments = Collections.emptyList(); + } + + File messageFile = new File(forumArchive, name + ".html"); + try(OutputStream out = new FileOutputStream(messageFile)) { + String content = renderForumMessage(location, message, attachments, translator); + out.write(content.getBytes("UTF-8")); + out.flush(); + } catch(IOException e) { + log.error("", e); + } + } + + } + + private Location resolveLocation(Long forumKey, Map<Long,Property> properties) { + Property property = properties.get(forumKey); + String name = null; + String businessPath = null; + if(property != null) { + if("CourseModule".equals(property.getResourceTypeName())) { + OLATResourceable resourceable = OresHelper.createOLATResourceableInstance(property.getResourceTypeName(), property.getResourceTypeId()); + RepositoryEntry entry = repositoryManager.lookupRepositoryEntry(resourceable, false); + if(entry != null) { + name = entry.getDisplayname(); + businessPath = "[RepositoryEntry:" + entry.getKey() + "]"; + String nodeId = extractNodeId(property); + if(nodeId != null) { + businessPath += "[CourseNode:" + nodeId + "]"; + } + } + } else if("BusinessGroup".equals(property.getResourceTypeName())) { + BusinessGroup businessGroup = businessGroupService.loadBusinessGroup(property.getResourceTypeId()); + if(businessGroup != null) { + name = businessGroup.getName(); + businessPath += "[BusinessGroup:" + businessGroup.getKey() + "]"; + } + } + } + + String url = businessPath == null ? null : BusinessControlFactory.getInstance().getURLFromBusinessPathString(businessPath); + return new Location(name, url); + } + + private String extractNodeId(Property property) { + if(property.getCategory() != null) { + String category = property.getCategory(); + int index = category.indexOf("::"); + if(index > 0 && index + 2 < category.length()) { + return category.substring(index + 2, category.length()); + } + } + return null; + } + + private Map<Long,Property> loadMappingProperties() { + Map<Long,Property> propertyMap = new HashMap<>(); + List<Property> properties = propertyManager.listProperties(null, null, null, null, null, FORUM_KEY); + for(Property property:properties) { + propertyMap.put(property.getLongValue(), property); + } + + List<Property> wikiProperties = propertyManager.listProperties(null, null, null, null, null, WikiManager.FORUM_KEY); + for(Property property:wikiProperties) { + propertyMap.put(property.getLongValue(), property); + } + return propertyMap; + } + + + private String renderForumMessage(Location location, Message message, List<File> attachments, Translator translator) { + StringOutput sb = new StringOutput(10000); + String pagePath = Util.getPackageVelocityRoot(ForumUserDataManager.class) + "/export_message.html"; + VelocityContainer component = new VelocityContainer("html", pagePath, translator, null); + component.contextPut("message", message); + component.contextPut("attachments", attachments); + component.contextPut("location", location); + + Renderer renderer = Renderer.getInstance(component, translator, new EmptyURLBuilder(), new RenderResult(), new DefaultGlobalSettings()); + VelocityRenderDecorator vrdec = new VelocityRenderDecorator(renderer, component, sb); + component.contextPut("r", vrdec); + renderer.render(sb, component, null); + return sb.toString(); + } + + public static class Location { + private final String name; + private final String url; + + public Location(String name, String url) { + this.name = name; + this.url = url; + } + + public String getName() { + return name; + } + + public String getUrl() { + return url; + } + } +} diff --git a/src/main/java/org/olat/modules/fo/manager/_content/export_message.html b/src/main/java/org/olat/modules/fo/manager/_content/export_message.html new file mode 100644 index 00000000000..19a0a32db7b --- /dev/null +++ b/src/main/java/org/olat/modules/fo/manager/_content/export_message.html @@ -0,0 +1,36 @@ +<html> + <head> + <title>$r.escapeHtml($message.title)</title> + <meta http-equiv="Content-type" content="text/html; charset=utf-8"> + </head> + <body> + <div class="o_forum_message_header clearfix"> + <h4 class="o_forum_message_title">$r.escapeHtml($message.title)</h4> + <div class="o_date"> + $r.translate("msg.creationdate") $r.formatDateAndTime($message.creationDate) + </div> + #if($r.isNotEmpty($location.url)) + <div class="o_path"> + <a href="$location.url">$location.name <small>$location.url</small></a> + </div> + #end + </div> + <div class="o_forum_message_body o_user_content_block"> + <div class="clearfix o_scrollblock">$r.formatLatexFormulas($message.body)</div> + </div> + + #if($r.isNotEmpty($attachments)) + <div class="o_forum_message_attachments"> + <h5>$r.translate("attachments"):</h5> + <ul class="list-inline"> + #foreach($attachment in $attachments) + #set($fname = $attachment.getName()) + <li class="o_attachment"> + <a href="${message.forum.key}_${message.key}/${fname}" target="_blank"><span class="o_filename">$r.escapeHtml($fname)</span></a> + </li> + #end + </ul> + </div> + #end + </body> +</html> \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java b/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java index 6850fbf8ce2..14f713116ee 100755 --- a/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java +++ b/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java @@ -21,6 +21,7 @@ package org.olat.modules.fo.portfolio; import java.util.List; +import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; @@ -51,7 +52,7 @@ public class ForumArtefactHandler extends EPAbstractHandler<ForumArtefact> { super.prefillArtefactAccordingToSource(artefact, source); if (source instanceof OLATResourceable){ OLATResourceable ores = (OLATResourceable) source; - ForumManager fMgr = ForumManager.getInstance(); + ForumManager fMgr = CoreSpringFactory.getImpl(ForumManager.class); Message fm = fMgr.loadMessage(ores.getResourceableId()); String thread = fm.getThreadtop() != null ? fm.getThreadtop().getTitle() + " - " : ""; artefact.setTitle(thread + fm.getTitle()); diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java index 34d5202c0b1..cf11317ed75 100644 --- a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java +++ b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java @@ -53,6 +53,7 @@ import javax.ws.rs.core.Response.Status; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityManager; +import org.olat.core.CoreSpringFactory; import org.olat.core.commons.services.notifications.NotificationsManager; import org.olat.core.commons.services.notifications.Subscriber; import org.olat.core.gui.UserRequest; @@ -388,7 +389,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); Property forumKeyProp = cpm.findCourseNodeProperty(courseNode, null, null, FOCourseNode.FORUM_KEY); Forum forum = null; - ForumManager fom = ForumManager.getInstance(); + ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); if(forumKeyProp!=null) { // Forum does already exist, load forum with key from properties Long forumKey = forumKeyProp.getLongValue(); @@ -455,7 +456,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { @Override public void configure(ICourse course, CourseNode newNode, ModuleConfiguration moduleConfig) { // create the forum - ForumManager fom = ForumManager.getInstance(); + ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); Forum forum = fom.addAForum(); Long forumKey = forum.getKey(); diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java index d15989eed7a..e042b1b7765 100644 --- a/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java +++ b/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java @@ -27,6 +27,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.olat.core.CoreSpringFactory; import org.olat.modules.fo.Forum; import org.olat.modules.fo.manager.ForumManager; @@ -65,7 +66,7 @@ public class ForumImportWebService { */ @Path("{forumKey}") public ForumWebService getForumWebservice(@PathParam("forumKey") Long forumKey) { - ForumManager fom = ForumManager.getInstance(); + ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); Forum forum = fom.loadForum(forumKey); return new ForumWebService(forum); } diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java index 484c84d8e14..d621a1535b7 100644 --- a/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java +++ b/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java @@ -60,6 +60,7 @@ import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityManager; +import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; @@ -100,10 +101,11 @@ public class ForumWebService { } private final Forum forum; - private final ForumManager fom = ForumManager.getInstance(); + private final ForumManager fom; public ForumWebService(Forum forum) { this.forum = forum; + fom = CoreSpringFactory.getImpl(ForumManager.class); } /** diff --git a/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsCPResource.java b/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsCPResource.java index 9ff9848763f..292664baa77 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsCPResource.java +++ b/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsCPResource.java @@ -47,12 +47,11 @@ import org.olat.core.commons.services.commentAndRating.ui.UserCommentsController import org.olat.core.dispatcher.DispatcherModule; import org.olat.core.dispatcher.mapper.Mapper; import org.olat.core.dispatcher.mapper.MapperService; -import org.olat.core.gui.GlobalSettings; +import org.olat.core.gui.DefaultGlobalSettings; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.winmgr.AJAXFlags; import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.render.RenderResult; import org.olat.core.gui.render.Renderer; @@ -375,7 +374,7 @@ public class ExportBinderAsCPResource implements MediaResource { private String renderVelocityContainer(VelocityContainer mainVC) { StringOutput sb = new StringOutput(32000); URLBuilder ubu = new URLBuilder("auth", "1", "0"); - Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new EmptyGlobalSettings()); + Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new DefaultGlobalSettings()); VelocityRenderDecorator vrdec = new VelocityRenderDecorator(renderer, mainVC, sb); mainVC.contextPut("r", vrdec); renderer.render(sb, mainVC, null); @@ -535,35 +534,6 @@ public class ExportBinderAsCPResource implements MediaResource { } } - private static class EmptyGlobalSettings implements GlobalSettings { - @Override - public int getFontSize() { - return 100; - } - - @Override - public AJAXFlags getAjaxFlags() { - return new EmptyAJAXFlags(); - } - - @Override - public boolean isIdDivsForced() { - return false; - } - }; - - private static class EmptyAJAXFlags extends AJAXFlags { - - public EmptyAJAXFlags() { - super(null); - } - - @Override - public boolean isIframePostEnabled() { - return false; - } - } - private class PortfolioPageProvider implements PageProvider { private final List<PageElementHandler> handlers = new ArrayList<>(); diff --git a/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsPDFResource.java b/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsPDFResource.java index 6ab3ff44b91..46af8f17b1b 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsPDFResource.java +++ b/src/main/java/org/olat/modules/portfolio/ui/export/ExportBinderAsPDFResource.java @@ -40,12 +40,11 @@ import org.olat.core.CoreSpringFactory; import org.olat.core.dispatcher.DispatcherModule; import org.olat.core.dispatcher.mapper.Mapper; import org.olat.core.dispatcher.mapper.MapperService; -import org.olat.core.gui.GlobalSettings; +import org.olat.core.gui.DefaultGlobalSettings; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.winmgr.AJAXFlags; import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.render.RenderResult; import org.olat.core.gui.render.Renderer; @@ -225,7 +224,7 @@ public class ExportBinderAsPDFResource implements MediaResource { StringOutput sb = new StringOutput(32000); URLBuilder ubu = new URLBuilder("auth", "1", "0"); - Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new EmptyGlobalSettings()); + Renderer renderer = Renderer.getInstance(mainVC, translator, ubu, new RenderResult(), new DefaultGlobalSettings()); VelocityRenderDecorator vrdec = new VelocityRenderDecorator(renderer, mainVC, sb); mainVC.contextPut("r", vrdec); renderer.render(sb, mainVC, null); @@ -369,33 +368,4 @@ public class ExportBinderAsPDFResource implements MediaResource { return cleanedSrc; } } - - private static class EmptyGlobalSettings implements GlobalSettings { - @Override - public int getFontSize() { - return 100; - } - - @Override - public AJAXFlags getAjaxFlags() { - return new EmptyAJAXFlags(); - } - - @Override - public boolean isIdDivsForced() { - return false; - } - }; - - private static class EmptyAJAXFlags extends AJAXFlags { - - public EmptyAJAXFlags() { - super(null); - } - - @Override - public boolean isIframePostEnabled() { - return false; - } - } } diff --git a/src/main/java/org/olat/modules/wiki/WikiMainController.java b/src/main/java/org/olat/modules/wiki/WikiMainController.java index 945a00ad300..269d19b0af9 100644 --- a/src/main/java/org/olat/modules/wiki/WikiMainController.java +++ b/src/main/java/org/olat/modules/wiki/WikiMainController.java @@ -189,6 +189,8 @@ public class WikiMainController extends BasicController implements CloneableCont private WikiMediaHandler wikiMediaHandler; @Autowired private PortfolioV2Module portfolioModule; + @Autowired + private ForumManager forumManager; public WikiMainController(UserRequest ureq, WindowControl wControl, OLATResourceable ores, WikiSecurityCallback securityCallback, String initialPageName) { @@ -672,10 +674,10 @@ public class WikiMainController extends BasicController implements CloneableCont **********************************************************************/ Forum forum = null; if (page.getForumKey() > 0) { - forum = ForumManager.getInstance().loadForum(Long.valueOf(page.getForumKey())); + forum = forumManager.loadForum(Long.valueOf(page.getForumKey())); } if (forum == null) { - forum = ForumManager.getInstance().addAForum(); + forum = forumManager.addAForum(); page.setForumKey(forum.getKey().longValue()); WikiManager.getInstance().updateWikiPageProperties(ores, page); } diff --git a/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java b/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java index 5083eba9447..2642172fea7 100644 --- a/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java +++ b/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java @@ -171,7 +171,7 @@ public class WikiPageChangeOrCreateNotificationHandler implements NotificationsH } long forumKey = element.getForumKey(); - List<Message> mInfos = ForumManager.getInstance().getNewMessageInfo(forumKey, compareDate); + List<Message> mInfos = CoreSpringFactory.getImpl(ForumManager.class).getNewMessageInfo(forumKey, compareDate); for (Message mInfo : mInfos) { String messageTitle = mInfo.getTitle(); diff --git a/src/main/java/org/olat/search/service/indexer/ForumIndexer.java b/src/main/java/org/olat/search/service/indexer/ForumIndexer.java index 47b6c1b25e1..bacc1bd6ebd 100644 --- a/src/main/java/org/olat/search/service/indexer/ForumIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/ForumIndexer.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.util.List; import org.apache.lucene.document.Document; +import org.olat.core.CoreSpringFactory; import org.olat.modules.fo.Forum; import org.olat.modules.fo.Message; import org.olat.modules.fo.manager.ForumManager; @@ -48,7 +49,7 @@ public abstract class ForumIndexer extends AbstractHierarchicalIndexer { return; } // loop over all messages of a forum - List<Message> messages = ForumManager.getInstance().getMessagesByForum(forum); + List<Message> messages = CoreSpringFactory.getImpl(ForumManager.class).getMessagesByForum(forum); for(Message message : messages) { SearchResourceContext searchResourceContext = new SearchResourceContext(parentResourceContext); searchResourceContext.setBusinessControlFor(message); diff --git a/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java b/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java index d9903a8d540..f73a39d3c22 100644 --- a/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java @@ -31,6 +31,7 @@ import java.io.IOException; import org.olat.basesecurity.Constants; import org.olat.basesecurity.BaseSecurityManager; import org.olat.collaboration.CollaborationTools; +import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; import org.olat.core.id.Roles; import org.olat.core.id.context.BusinessControl; @@ -73,7 +74,7 @@ public class GroupForumIndexer extends ForumIndexer{ BusinessGroup businessGroup = (BusinessGroup)businessObj; NarrowedPropertyManager npm = NarrowedPropertyManager.getInstance(businessGroup); - ForumManager fom = ForumManager.getInstance(); + ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); Property forumKeyProperty = npm.findProperty(null, null, CollaborationTools.PROP_CAT_BG_COLLABTOOLS, CollaborationTools.KEY_FORUM); // Check if forum-property exist @@ -102,7 +103,7 @@ public class GroupForumIndexer extends ForumIndexer{ public boolean checkAccess(ContextEntry contextEntry, BusinessControl businessControl, Identity identity, Roles roles) { ContextEntry ce = businessControl.popLauncherContextEntry(); Long resourceableId = ce.getOLATResourceable().getResourceableId(); - Message message = ForumManager.getInstance().loadMessage(resourceableId); + Message message = CoreSpringFactory.getImpl(ForumManager.class).loadMessage(resourceableId); if(message == null) return false; Message threadtop = message.getThreadtop(); diff --git a/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java index 4c6fe478f95..94489c2cd85 100644 --- a/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java @@ -130,7 +130,7 @@ public class DialogCourseNodeIndexer extends DefaultIndexer implements CourseNod private void doIndexAllMessages(SearchResourceContext parentResourceContext, Forum forum, OlatFullIndexer indexWriter) throws IOException,InterruptedException { // loop over all messages of a forum - List<Message> messages = ForumManager.getInstance().getMessagesByForum(forum); + List<Message> messages = CoreSpringFactory.getImpl(ForumManager.class).getMessagesByForum(forum); for(Message message:messages){ SearchResourceContext searchResourceContext = new SearchResourceContext(parentResourceContext); searchResourceContext.setBusinessControlFor(message); @@ -160,7 +160,7 @@ public class DialogCourseNodeIndexer extends DefaultIndexer implements CourseNod } else if (ores.getResourceableTypeName().equals(OresHelper.calculateTypeName(Message.class))) { // it is message => check message access Long resourceableId = ores.getResourceableId(); - Message message = ForumManager.getInstance().loadMessage(resourceableId); + Message message = CoreSpringFactory.getImpl(ForumManager.class).loadMessage(resourceableId); Message threadtop = message.getThreadtop(); if(threadtop==null) { threadtop = message; diff --git a/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java index 0b6526a0446..dcd418f59be 100644 --- a/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java @@ -30,6 +30,7 @@ import java.io.IOException; import org.apache.lucene.document.Document; import org.olat.basesecurity.BaseSecurityManager; import org.olat.basesecurity.Constants; +import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; import org.olat.core.id.Roles; import org.olat.core.id.context.BusinessControl; @@ -90,7 +91,7 @@ public class FOCourseNodeIndexer extends ForumIndexer implements CourseNodeIndex } Long resourceableId = ce.getOLATResourceable().getResourceableId(); - Message message = ForumManager.getInstance().loadMessage(resourceableId); + Message message = CoreSpringFactory.getImpl(ForumManager.class).loadMessage(resourceableId); if(message != null) { Message threadtop = message.getThreadtop(); if(threadtop == null) { @@ -117,7 +118,7 @@ public class FOCourseNodeIndexer extends ForumIndexer implements CourseNodeIndex */ private void doIndexForum(SearchResourceContext parentResourceContext, ICourse course, CourseNode courseNode, OlatFullIndexer indexWriter) throws IOException,InterruptedException { if (log.isDebug()) log.debug("Index Course Forum..."); - ForumManager fom = ForumManager.getInstance(); + ForumManager fom = CoreSpringFactory.getImpl(ForumManager.class); CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); Property forumKeyProperty = cpm.findCourseNodeProperty(courseNode, null, null, FOCourseNode.FORUM_KEY); diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties index e28608c4d07..54789b0ca66 100644 --- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties @@ -7,8 +7,6 @@ chat=Chat disclaimer=Nutzungsbedigung display.portrait=Profilbild download.data=Dateien herunterladen -dx=dr -dy=dr efficiency.statements=Leistungnachweise export.options=Export Elemente export.start=Start export @@ -20,6 +18,7 @@ export.user.data.processing=Der Export ist gerade bearbeitet. export.user.data.ready=Der Benutzer kann den Export mit dem folgenden Link herunterladen. Sie k\u00F6nnen auch ein en neuen Export erfordern. export.user.data.ready.subject=Export von "{0}" ist fertig export.user.data.ready.text=<p>Export von "{0}" ist fertig. Es konnte unter <a href\="{1}">{1}</a> heruntergeladen werden</p> +forums=Foren group.memberships=Zugeh\u00F6rigkeit zu Gruppen mail=Mail notes=Pers\u00F6nliche Notizen diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties index 860f801c21b..6236b054fd3 100644 --- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties @@ -13,6 +13,7 @@ efficiency.statements=Evidences of achievement export.options=Export elements export.start=Start export export.url=Link to the data +forums=Forums group.memberships=Membership to groups mail=Emails notes=Notes diff --git a/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java b/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java index 2663cad2f67..b8139b7090c 100644 --- a/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java +++ b/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java @@ -29,6 +29,7 @@ package org.olat.util.logging.activity; import java.io.UnsupportedEncodingException; import org.olat.commons.calendar.model.Kalendar; +import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.ContextEntry; @@ -447,7 +448,7 @@ public class LoggingResourceable implements ILoggingResourceable { * @return a LoggingResourceable wrapping the given Forum */ public static LoggingResourceable wrap(Forum forum) { - final String name = ForumManager.getInstance().getForumNameForLogging(forum); + final String name = CoreSpringFactory.getImpl(ForumManager.class).getForumNameForLogging(forum); return new LoggingResourceable(forum, OlatResourceableType.forum, forum.getResourceableTypeName(), String.valueOf(forum.getResourceableId()), name, false); } diff --git a/src/test/java/org/olat/restapi/ForumTest.java b/src/test/java/org/olat/restapi/ForumTest.java index 6e75f8528af..6b73bb8538d 100644 --- a/src/test/java/org/olat/restapi/ForumTest.java +++ b/src/test/java/org/olat/restapi/ForumTest.java @@ -216,8 +216,7 @@ public class ForumTest extends OlatJerseyTestCase { //really saved? boolean saved = false; - ForumManager fm = ForumManager.getInstance(); - List<Message> allMessages = fm.getMessagesByForum(forum); + List<Message> allMessages = forumManager.getMessagesByForum(forum); for(Message message:allMessages) { if(message.getKey().equals(thread.getKey())) { saved = true; @@ -249,8 +248,7 @@ public class ForumTest extends OlatJerseyTestCase { //really saved? boolean saved = false; - ForumManager fm = ForumManager.getInstance(); - List<Message> allMessages = fm.getMessagesByForum(forum); + List<Message> allMessages = forumManager.getMessagesByForum(forum); for(Message msg:allMessages) { if(msg.getKey().equals(message.getKey())) { saved = true; @@ -326,8 +324,7 @@ public class ForumTest extends OlatJerseyTestCase { assertEquals(200, attachResponse.getStatusLine().getStatusCode()); //check if the file exists - ForumManager fm = ForumManager.getInstance(); - VFSContainer container = fm.getMessageContainer(message.getForumKey(), message.getKey()); + VFSContainer container = forumManager.getMessageContainer(message.getForumKey(), message.getKey()); VFSItem uploadedFile = container.resolve("portrait.jpg"); assertNotNull(uploadedFile); assertTrue(uploadedFile instanceof VFSLeaf); @@ -374,8 +371,7 @@ public class ForumTest extends OlatJerseyTestCase { assertEquals(200, attachCode.getStatusLine().getStatusCode()); //check if the file exists - ForumManager fm = ForumManager.getInstance(); - VFSContainer container = fm.getMessageContainer(message.getForumKey(), message.getKey()); + VFSContainer container = forumManager.getMessageContainer(message.getForumKey(), message.getKey()); VFSItem uploadedFile = container.resolve("portrait64.jpg"); assertNotNull(uploadedFile); assertTrue(uploadedFile instanceof VFSLeaf); @@ -439,9 +435,8 @@ public class ForumTest extends OlatJerseyTestCase { } - //check if the file exists - ForumManager fm = ForumManager.getInstance(); - VFSContainer container = fm.getMessageContainer(message.getForumKey(), message.getKey()); + //check if the file existsforumManager + VFSContainer container = forumManager.getMessageContainer(message.getForumKey(), message.getKey()); VFSItem uploadedFile = container.resolve("portrait64.jpg"); assertNotNull(uploadedFile); assertTrue(uploadedFile instanceof VFSLeaf); @@ -493,8 +488,7 @@ public class ForumTest extends OlatJerseyTestCase { assertEquals(200, attachCode.getStatusLine().getStatusCode()); //check if the file exists - ForumManager fm = ForumManager.getInstance(); - VFSContainer container = fm.getMessageContainer(message.getForumKey(), message.getKey()); + VFSContainer container = forumManager.getMessageContainer(message.getForumKey(), message.getKey()); VFSItem uploadedFile = container.resolve("portrait64vo.jpg"); assertNotNull(uploadedFile); assertTrue(uploadedFile instanceof VFSLeaf); diff --git a/src/test/java/org/olat/restapi/GroupMgmtTest.java b/src/test/java/org/olat/restapi/GroupMgmtTest.java index 86aa3af55b5..a025a6f9184 100644 --- a/src/test/java/org/olat/restapi/GroupMgmtTest.java +++ b/src/test/java/org/olat/restapi/GroupMgmtTest.java @@ -61,7 +61,6 @@ import org.olat.collaboration.CollaborationTools; import org.olat.collaboration.CollaborationToolsFactory; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DB; -import org.olat.core.commons.persistence.DBFactory; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.logging.OLog; @@ -111,6 +110,8 @@ public class GroupMgmtTest extends OlatJerseyTestCase { @Autowired private DB dbInstance; @Autowired + private ForumManager forumManager; + @Autowired private BusinessGroupService businessGroupService; @Autowired private BusinessGroupRelationDAO businessGroupRelationDao; @@ -139,7 +140,7 @@ public class GroupMgmtTest extends OlatJerseyTestCase { course = rm.findOrPersistResourceable(resourceable); RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class); RepositoryEntry re = rs.create("administrator", "-", "rest-re", null, course); - DBFactory.getInstance().commit(); + dbInstance.commit(); assertNotNull(re); //create learn group @@ -148,7 +149,7 @@ public class GroupMgmtTest extends OlatJerseyTestCase { // create groups without waiting list g1 = businessGroupService.createBusinessGroup(null, "rest-g1", null, 0, 10, false, false, c1); g2 = businessGroupService.createBusinessGroup(null, "rest-g2", null, 0, 10, false, false, c1); - DBFactory.getInstance().commit(); + dbInstance.commit(); //permission to see owners and participants businessGroupService.updateDisplayMembers(g1, false, false, false, false, false, false, false); businessGroupService.updateDisplayMembers(g2, true, true, false, false, false, false, false); @@ -169,7 +170,7 @@ public class GroupMgmtTest extends OlatJerseyTestCase { // groups g3 = businessGroupService.createBusinessGroup(null, "rest-g3", null, -1, -1, false, false, c2); g4 = businessGroupService.createBusinessGroup(null, "rest-g4", null, -1, -1, false, false, c2); - DBFactory.getInstance().commit(); + dbInstance.commit(); // members businessGroupRelationDao.addRole(owner1, g3, GroupRoles.participant.name()); businessGroupRelationDao.addRole(owner2, g4, GroupRoles.participant.name()); @@ -189,42 +190,41 @@ public class GroupMgmtTest extends OlatJerseyTestCase { CollaborationTools collabTools2 = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(g2); collabTools2.setToolEnabled(CollaborationTools.TOOL_FORUM, true); - DBFactory.getInstance().closeSession(); // simulate user clicks + dbInstance.closeSession(); // simulate user clicks //4) fill forum for g1 NarrowedPropertyManager npm = NarrowedPropertyManager.getInstance(g1); Property forumKeyProperty = npm.findProperty(null, null, CollaborationTools.PROP_CAT_BG_COLLABTOOLS, CollaborationTools.KEY_FORUM); - ForumManager fm = ForumManager.getInstance(); - Forum forum = fm.loadForum(forumKeyProperty.getLongValue()); + Forum forum = forumManager.loadForum(forumKeyProperty.getLongValue()); - m1 = fm.createMessage(forum, owner1, false); + m1 = forumManager.createMessage(forum, owner1, false); m1.setTitle("Thread-1"); m1.setBody("Body of Thread-1"); - fm.addTopMessage(m1); + forumManager.addTopMessage(m1); - m2 = fm.createMessage(forum, owner2, false); + m2 = forumManager.createMessage(forum, owner2, false); m2.setTitle("Thread-2"); m2.setBody("Body of Thread-2"); - fm.addTopMessage(m2); + forumManager.addTopMessage(m2); - DBFactory.getInstance().intermediateCommit(); + dbInstance.intermediateCommit(); - m3 = fm.createMessage(forum, owner3, false); + m3 = forumManager.createMessage(forum, owner3, false); m3.setTitle("Message-1.1"); m3.setBody("Body of Message-1.1"); - fm.replyToMessage(m3, m1); + forumManager.replyToMessage(m3, m1); - m4 = fm.createMessage(forum, part1, false); + m4 = forumManager.createMessage(forum, part1, false); m4.setTitle("Message-1.1.1"); m4.setBody("Body of Message-1.1.1"); - fm.replyToMessage(m4, m3); + forumManager.replyToMessage(m4, m3); - m5 = fm.createMessage(forum, part2, false); + m5 = forumManager.createMessage(forum, part2, false); m5.setTitle("Message-1.2"); m5.setBody("Body of Message-1.2"); - fm.replyToMessage(m5, m1); + forumManager.replyToMessage(m5, m1); - DBFactory.getInstance().intermediateCommit(); + dbInstance.intermediateCommit(); } @After diff --git a/src/test/java/org/olat/restapi/NotificationsTest.java b/src/test/java/org/olat/restapi/NotificationsTest.java index e9d06a4b99f..1ee9ef3b96c 100644 --- a/src/test/java/org/olat/restapi/NotificationsTest.java +++ b/src/test/java/org/olat/restapi/NotificationsTest.java @@ -110,6 +110,8 @@ public class NotificationsTest extends OlatJerseyTestCase { @Autowired private DB dbInstance; @Autowired + private ForumManager forumManager; + @Autowired private BusinessGroupService businessGroupService; @Autowired private NotificationsManager notificationManager; @@ -134,7 +136,7 @@ public class NotificationsTest extends OlatJerseyTestCase { } //create a forum - forum = ForumManager.getInstance().addAForum(); + forum = forumManager.addAForum(); Message m1 = createMessage(userSubscriberId, forum); Assert.assertNotNull(m1); @@ -501,11 +503,10 @@ public class NotificationsTest extends OlatJerseyTestCase { } private Message createMessage(Identity id, Forum fo) { - ForumManager fm = ForumManager.getInstance(); - Message m1 = fm.createMessage(fo, id, false); + Message m1 = forumManager.createMessage(fo, id, false); m1.setTitle("Thread-1"); m1.setBody("Body of Thread-1"); - fm.addTopMessage(m1); + forumManager.addTopMessage(m1); return m1; } diff --git a/src/test/java/org/olat/restapi/UserMgmtTest.java b/src/test/java/org/olat/restapi/UserMgmtTest.java index 0bac254f21e..12c3e7e167d 100644 --- a/src/test/java/org/olat/restapi/UserMgmtTest.java +++ b/src/test/java/org/olat/restapi/UserMgmtTest.java @@ -144,6 +144,8 @@ public class UserMgmtTest extends OlatJerseyTestCase { @Autowired private DB dbInstance; @Autowired + private ForumManager forumManager; + @Autowired private BusinessGroupRelationDAO businessGroupRelationDao; @Autowired private BusinessGroupService businessGroupService; @@ -223,10 +225,10 @@ public class UserMgmtTest extends OlatJerseyTestCase { CollaborationTools g1CTSMngr = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(g1); g1CTSMngr.setToolEnabled(CollaborationTools.TOOL_FORUM, true); Forum g1Forum = g1CTSMngr.getForum();//create the forum - Message m1 = ForumManager.getInstance().createMessage(g1Forum, id1, false); + Message m1 = forumManager.createMessage(g1Forum, id1, false); m1.setTitle("Thread-1"); m1.setBody("Body of Thread-1"); - ForumManager.getInstance().addTopMessage(m1); + forumManager.addTopMessage(m1); dbInstance.commitAndCloseSession(); @@ -259,10 +261,10 @@ public class UserMgmtTest extends OlatJerseyTestCase { if(demoForumNode == null) { demoForumNode = (FOCourseNode)node; Forum courseForum = demoForumNode.loadOrCreateForum(demoCourse.getCourseEnvironment()); - Message message1 = ForumManager.getInstance().createMessage(courseForum, id1, false); + Message message1 = forumManager.createMessage(courseForum, id1, false); message1.setTitle("Thread-1"); message1.setBody("Body of Thread-1"); - ForumManager.getInstance().addTopMessage(message1); + forumManager.addTopMessage(message1); } } else if (node instanceof BCCourseNode) { if(demoBCCourseNode == null) { -- GitLab