diff --git a/src/main/java/org/olat/modules/fo/ForumController.java b/src/main/java/org/olat/modules/fo/ForumController.java index c95004b26646f752b296c368c61de7f50dce327e..b64cf4208e23874a24c5bdd91d27a2b0a49a0d78 100644 --- a/src/main/java/org/olat/modules/fo/ForumController.java +++ b/src/main/java/org/olat/modules/fo/ForumController.java @@ -220,7 +220,8 @@ public class ForumController extends BasicController implements GenericEventList * @param ureq * @param wControl */ - ForumController(Forum forum, ForumCallback focallback, UserRequest ureq, WindowControl wControl) { + public ForumController(UserRequest ureq, WindowControl wControl, + Forum forum, ForumCallback focallback, boolean showSubscriptionButton) { super(ureq, wControl); this.forum = forum; this.focallback = focallback; @@ -267,8 +268,7 @@ public class ForumController extends BasicController implements GenericEventList // --- subscription --- subsContext = focallback.getSubscriptionContext(); // if sc is null, then no subscription is desired - if (subsContext != null) { - // FIXME fj: implement subscription callback for group forums + if (subsContext != null && showSubscriptionButton) { String businessPath = wControl.getBusinessControl().getAsString(); String data = String.valueOf(forum.getKey()); PublisherData pdata = new PublisherData(OresHelper.calculateTypeName(Forum.class), data, businessPath); diff --git a/src/main/java/org/olat/modules/fo/ForumUIFactory.java b/src/main/java/org/olat/modules/fo/ForumUIFactory.java index 73aced5bd3699e386230334143ab223446a485e9..2a0dd63ddbf8d51a493f7d036268d0a173aeb489 100644 --- a/src/main/java/org/olat/modules/fo/ForumUIFactory.java +++ b/src/main/java/org/olat/modules/fo/ForumUIFactory.java @@ -81,7 +81,7 @@ public class ForumUIFactory { * @return a TitledWrapperController */ public static Controller getTitledForumController(UserRequest ureq, WindowControl wControl, Forum forum, ForumCallback forumCallback, TitleInfo titleInfo) { - ForumController popupFoCtr = new ForumController(forum, forumCallback, ureq, wControl); + ForumController popupFoCtr = new ForumController(ureq, wControl, forum, forumCallback, true); TitledWrapperController forumWrapperController = new TitledWrapperController(ureq, wControl, popupFoCtr, "o_course_run", titleInfo); // Set CSS values to default forum icons if no values are set in the title info if (!StringHelper.containsNonWhitespace(titleInfo.getIconCssClass())) { @@ -99,7 +99,7 @@ public class ForumUIFactory { * @return */ public static ForumController getStandardForumController(UserRequest ureq, WindowControl wControl, Forum forum, ForumCallback forumCallback) { - return new ForumController(forum, forumCallback, ureq, wControl); + return new ForumController(ureq, wControl, forum, forumCallback, true); } } diff --git a/src/main/java/org/olat/modules/wiki/WikiMainController.java b/src/main/java/org/olat/modules/wiki/WikiMainController.java index 2af5f9e66759f21314cb5075065a754c397c3fa7..6a36b585aa28a4d6385290845d319cff0d5d06ab 100644 --- a/src/main/java/org/olat/modules/wiki/WikiMainController.java +++ b/src/main/java/org/olat/modules/wiki/WikiMainController.java @@ -96,7 +96,6 @@ import org.olat.modules.fo.Forum; import org.olat.modules.fo.ForumCallback; import org.olat.modules.fo.ForumController; import org.olat.modules.fo.ForumManager; -import org.olat.modules.fo.ForumUIFactory; import org.olat.modules.wiki.gui.components.wikiToHtml.ErrorEvent; import org.olat.modules.wiki.gui.components.wikiToHtml.FilterUtil; import org.olat.modules.wiki.gui.components.wikiToHtml.RequestImageEvent; @@ -420,14 +419,14 @@ public class WikiMainController extends BasicController implements CloneableCont ContextEntry ce = entries.get(0); String typ = ce.getOLATResourceable().getResourceableTypeName(); - if("az".equals(typ)) { + if("az".equalsIgnoreCase(typ)) { openAtoZPage(ureq, wiki); - } else if ("lastChanges".equals(typ)) { + } else if ("lastChanges".equalsIgnoreCase(typ)) { openLastChangesPage(ureq, wiki); - } else if ("index".equals(typ)) { + } else if ("index".equalsIgnoreCase(typ)) { WikiPage page = openIndexPage(ureq, wiki); pageId = page.getPageId(); - } else if ("Forum".equals(typ)) { + } else if ("Forum".equalsIgnoreCase(typ)) { Long forumKey = ce.getOLATResourceable().getResourceableId(); for(WikiPage page:wiki.getAllPagesWithContent()) { if(forumKey.longValue() == page.getForumKey()) { @@ -462,8 +461,14 @@ public class WikiMainController extends BasicController implements CloneableCont if(entries.size() > 1) { List<ContextEntry> subEntries = entries.subList(1, entries.size()); String subTyp = subEntries.get(0).getOLATResourceable().getResourceableTypeName(); - if("tab".equals(subTyp)) { + if("tab".equalsIgnoreCase(subTyp)) { tabs.activate(ureq, subEntries, ce.getTransientState()); + } else if("message".equalsIgnoreCase(subTyp)) { + OLATResourceable tabOres = OresHelper.createOLATResourceableInstance("tab", 1l); + ContextEntry tabCe = BusinessControlFactory.getInstance().createContextEntry(tabOres); + tabs.activate(ureq, Collections.singletonList(tabCe), null); + + forumController.activate(ureq, subEntries, null); } } } @@ -647,7 +652,7 @@ public class WikiMainController extends BasicController implements CloneableCont WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, getWindowControl()); removeAsListenerAndDispose(forumController); - forumController = ForumUIFactory.getStandardForumController(ureq, bwControl, forum, forumCallback); + forumController = new ForumController(ureq, bwControl, forum, forumCallback, false); listenTo(forumController); discussionContent.put("articleforum", forumController.getInitialComponent()); } diff --git a/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java b/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java index af48339018a29f4f08a7eaf282a4ad3d11a79920..e0225a5912c3dee7b904deb6612118e9064a06f1 100644 --- a/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java +++ b/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java @@ -45,7 +45,8 @@ 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.LogDelegator; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.core.util.Util; import org.olat.core.util.resource.OresHelper; import org.olat.course.CourseFactory; @@ -59,6 +60,9 @@ import org.olat.fileresource.types.WikiResource; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.modules.ModuleConfiguration; +import org.olat.modules.fo.ForumManager; +import org.olat.modules.fo.ForumNotificationsHandler; +import org.olat.modules.fo.Message; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; @@ -71,9 +75,11 @@ import org.olat.repository.RepositoryManager; * * @author guido */ -public class WikiPageChangeOrCreateNotificationHandler extends LogDelegator implements NotificationsHandler { +public class WikiPageChangeOrCreateNotificationHandler implements NotificationsHandler { + + private static final OLog log = Tracing.createLoggerFor(WikiPageChangeOrCreateNotificationHandler.class); - private static final String CSS_CLASS_WIKI_PAGE_CHANGED_ICON = "o_edit_icon"; + private static final String CSS_CLASS_WIKI_PAGE_CHANGED_ICON = "o_wiki_icon"; protected String businessControlString; public WikiPageChangeOrCreateNotificationHandler() { @@ -84,14 +90,17 @@ public class WikiPageChangeOrCreateNotificationHandler extends LogDelegator impl * @see org.olat.core.commons.services.notifications.NotificationsHandler#createSubscriptionInfo(org.olat.core.commons.services.notifications.Subscriber, * java.util.Locale, java.util.Date) */ + @Override public SubscriptionInfo createSubscriptionInfo(Subscriber subscriber, final Locale locale, Date compareDate) { Publisher p = subscriber.getPublisher(); final Date latestNews = p.getLatestNewsDate(); Long resId = p.getResId(); SubscriptionInfo si; + final boolean debug = log.isDebug(); + // there could be news for me, investigate deeper - logDebug("compareDate=" + compareDate + " ; latestNews=" + latestNews, null); + if(debug) log.debug("compareDate=" + compareDate + " ; latestNews=" + latestNews, null); try { if (NotificationsManager.getInstance().isPublisherValid(p) && compareDate.before(latestNews)) { OLATResourceable ores = null; @@ -111,61 +120,88 @@ public class WikiPageChangeOrCreateNotificationHandler extends LogDelegator impl ModuleConfiguration config = ((WikiCourseNode)courseNode).getModuleConfiguration(); RepositoryEntry re = WikiEditController.getWikiRepoReference(config, true); resId = re.getOlatResource().getResourceableId(); - logDebug("resId=" + resId, null); + if(debug) log.debug("resId=" + resId, null); ores = OresHelper.createOLATResourceableInstance(WikiResource.TYPE_NAME, resId); businessControlString = p.getBusinessPath() + "[path="; } else { // resName = 'BusinessGroup' or 'FileResource.WIKI' - logDebug("p.getResName()=" + p.getResName(), null); - ores = OresHelper.createOLATResourceableInstance(p.getResName(), resId); + if(debug) log.debug("p.getResName()=" + p.getResName(), null); + ores = OresHelper.createOLATResourceableInstance(p.getResName(), resId); businessControlString = p.getBusinessPath() + "[path="; } Wiki wiki = WikiManager.getInstance().getOrLoadWiki(ores); final List<WikiPage> pages = wiki.getPagesByDate(); Translator translator = Util.createPackageTranslator(WikiPageChangeOrCreateNotificationHandler.class, locale); + Translator forumTranslator = Util.createPackageTranslator(ForumNotificationsHandler.class, locale); TitleItem title = getTitleItem(p, translator); si = new SubscriptionInfo(subscriber.getKey(), p.getType(), title, null); - SubscriptionListItem subListItem; - for (Iterator<WikiPage> it = pages.listIterator(); it.hasNext();) { - WikiPage element = it.next(); - - // do only show entries newer then the ones already seen - Date modDate = new Date(element.getModificationTime()); - logDebug("modDate=" + modDate + " ; compareDate=" + compareDate, null); - if (modDate.after(compareDate)) { - if((element.getPageName().startsWith("O_") || element.getPageName().startsWith(WikiPage.WIKI_MENU_PAGE)) && - (element.getModifyAuthor() <= 0)) { - //theses pages are created sometimes automatically. Check if this is the case - continue; - } + + for (Iterator<WikiPage> it = pages.listIterator(); it.hasNext();) { + WikiPage element = it.next(); + + // do only show entries newer then the ones already seen + Date modDate = new Date(element.getModificationTime()); + if(debug) log.debug("modDate=" + modDate + " ; compareDate=" + compareDate, null); + if (modDate.after(compareDate)) { + if((element.getPageName().startsWith("O_") || element.getPageName().startsWith(WikiPage.WIKI_MENU_PAGE)) + && (element.getModifyAuthor() <= 0)) { + //theses pages are created sometimes automatically. Check if this is the case + continue; + } - //build Businesscontrol-Path - String businessPath = null; - String urlToSend = null; - if(p.getBusinessPath() != null) { - businessPath = businessControlString + element.getPageName() + "]"; - urlToSend = BusinessControlFactory.getInstance().getURLFromBusinessPathString(businessPath); - } - - // string[] gets filled into translation key by adding {0...n} to - // the string - Identity ident = BaseSecurityManager.getInstance().loadIdentityByKey(Long.valueOf(element.getModifyAuthor())); - String desc = translator.translate("notifications.entry", new String[] { element.getPageName(), NotificationHelper.getFormatedName(ident)}); - subListItem = new SubscriptionListItem(desc, urlToSend, businessPath, modDate, CSS_CLASS_WIKI_PAGE_CHANGED_ICON); - si.addSubscriptionListItem(subListItem); - } else { - //there are no more new pages so we stop here - break; - } + //build Businesscontrol-Path + String businessPath = null; + String urlToSend = null; + if(p.getBusinessPath() != null) { + businessPath = businessControlString + element.getPageName() + "]"; + urlToSend = BusinessControlFactory.getInstance().getURLFromBusinessPathString(businessPath); + } + + // string[] gets filled into translation key by adding {0...n} to + // the string + Identity ident = BaseSecurityManager.getInstance().loadIdentityByKey(Long.valueOf(element.getModifyAuthor())); + String desc = translator.translate("notifications.entry", new String[] { element.getPageName(), NotificationHelper.getFormatedName(ident)}); + SubscriptionListItem subListItem = new SubscriptionListItem(desc, urlToSend, businessPath, modDate, CSS_CLASS_WIKI_PAGE_CHANGED_ICON); + si.addSubscriptionListItem(subListItem); + } + + long forumKey = element.getForumKey(); + List<Message> mInfos = ForumManager.getInstance().getNewMessageInfo(forumKey, compareDate); + + for (Message mInfo : mInfos) { + String messageTitle = mInfo.getTitle(); + Identity creator = mInfo.getCreator(); + Identity modifier = mInfo.getModifier(); + Date messageModDate = mInfo.getLastModified(); + + String name; + if(modifier != null) { + name = NotificationHelper.getFormatedName(modifier); + } else { + name = NotificationHelper.getFormatedName(creator); + } + final String descKey = "notifications.entry" + (mInfo.getCreationDate().equals(messageModDate) ? "" : ".modified"); + final String desc = forumTranslator.translate(descKey, new String[] { messageTitle, name }); + String urlToSend = null; + String businessPath = null; + if(p.getBusinessPath() != null) { + businessPath = businessControlString + element.getPageName() + "][message:" + mInfo.getKey().toString() + "]"; + urlToSend = BusinessControlFactory.getInstance().getURLFromBusinessPathString(businessPath); } + + SubscriptionListItem subListItem = + new SubscriptionListItem(desc, urlToSend, businessPath, messageModDate, CSS_CLASS_WIKI_PAGE_CHANGED_ICON); + si.addSubscriptionListItem(subListItem); + } + } } else { //no news si = NotificationsManager.getInstance().getNoSubscriptionInfo(); } } catch (Exception e) { - logError("Error creating wiki's notifications for subscriber: " + subscriber.getKey(), e); + log.error("Error creating wiki's notifications for subscriber: " + subscriber.getKey(), e); checkPublisher(p); si = NotificationsManager.getInstance().getNoSubscriptionInfo(); } @@ -177,22 +213,22 @@ public class WikiPageChangeOrCreateNotificationHandler extends LogDelegator impl if("BusinessGroup".equals(p.getResName())) { BusinessGroup bg = CoreSpringFactory.getImpl(BusinessGroupService.class).loadBusinessGroup(p.getResId()); if(bg == null) { - logInfo("deactivating publisher with key; " + p.getKey(), null); + log.info("deactivating publisher with key; " + p.getKey(), null); NotificationsManager.getInstance().deactivate(p); } } else if ("CourseModule".equals(p.getResName())) { if(!NotificationsUpgradeHelper.checkCourse(p)) { - logInfo("deactivating publisher with key; " + p.getKey(), null); + log.info("deactivating publisher with key; " + p.getKey(), null); NotificationsManager.getInstance().deactivate(p); } } else { if(!NotificationsUpgradeHelper.checkOLATResourceable(p)) { - logInfo("deactivating publisher with key; " + p.getKey(), null); + log.info("deactivating publisher with key; " + p.getKey(), null); NotificationsManager.getInstance().deactivate(p); } } } catch (Exception e) { - logError("", e); + log.error("", e); } } @@ -220,7 +256,7 @@ public class WikiPageChangeOrCreateNotificationHandler extends LogDelegator impl TitleItem title = getTitleItem(subscriber.getPublisher(), translator); return title.getInfoContent("text/plain"); } catch (Exception e) { - logError("Error while creating assessment notifications for subscriber: " + subscriber.getKey(), e); + log.error("Error while creating assessment notifications for subscriber: " + subscriber.getKey(), e); checkPublisher(subscriber.getPublisher()); return "-"; }