Skip to content
Snippets Groups Projects
Commit 0fc52835 authored by srosse's avatar srosse
Browse files

OO-1620: mark as new podcast and blog, rewrite part of the notifications...

OO-1620: mark as new podcast and blog, rewrite part of the notifications handlers, fix some issues reading the ids of the publishers
parent 7a791eb0
No related branches found
No related tags found
No related merge requests found
Showing
with 303 additions and 225 deletions
......@@ -22,7 +22,6 @@ package org.olat.core.commons.services.notifications;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
......@@ -73,26 +72,24 @@ public class NotificationHelper {
public static Map<Subscriber, SubscriptionInfo> getSubscriptionMap(Locale locale, boolean showWithNewsOnly, Date compareDate, List<Subscriber> subs) {
NotificationsManager man = NotificationsManager.getInstance();
Map<Subscriber, SubscriptionInfo> subToSubInfo = new HashMap<Subscriber, SubscriptionInfo>();
// calc subscriptioninfo for all subscriptions and, if only those with news
Map<Subscriber, SubscriptionInfo> subToSubInfo = new HashMap<>();
// calculate subscription info for all subscriptions and, if only those with news
// are to be shown, remove the other ones
for (Iterator<Subscriber> it_subs = subs.iterator(); it_subs.hasNext();) {
Subscriber subscriber = it_subs.next();
for (Subscriber subscriber:subs) {
Publisher pub = subscriber.getPublisher();
SubscriptionInfo subsInfo;
if (man.isPublisherValid(pub)) {
NotificationsHandler notifHandler = man.getNotificationsHandler(pub);
if (notifHandler!=null) {
if (notifHandler != null) {
subsInfo = notifHandler.createSubscriptionInfo(subscriber, locale, compareDate);
} else {
// OLAT-5647
log.error("getSubscriptionMap: No notificationhandler for valid publisher: "+pub+", resname: "+pub.getResName()+", businesspath: "+pub.getBusinessPath()+", subscriber: "+subscriber);
subsInfo = man.getNoSubscriptionInfo();
}
} else {
subsInfo = man.getNoSubscriptionInfo();
}
if (subsInfo.hasNews() || !showWithNewsOnly) {
if (subsInfo != null && subsInfo.hasNews() || !showWithNewsOnly) {
subToSubInfo.put(subscriber, subsInfo);
}
}
......
......@@ -171,6 +171,8 @@ public abstract class NotificationsManager extends BasicManager {
* @param ignoreNewsFor
*/
public abstract void markPublisherNews(SubscriptionContext subscriptionContext, Identity ignoreNewsFor, boolean sendEvent);
public abstract void markPublisherNews(String publisherType, String data, Identity ignoreNewsFor, boolean sendEvent);
public abstract void registerAsListener(GenericEventListener gel, Identity ident);
......
......@@ -289,6 +289,20 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
.getResultList();
}
private List<Subscriber> getValidSubscribersOf(String publisherType, String data) {
StringBuilder q = new StringBuilder();
q.append("select sub from notisub sub ")
.append(" inner join fetch sub.identity as ident")
.append(" inner join fetch sub.publisher as pub")
.append(" where pub.publisherType=:publisherType and pub.data=:data and sub.publisher.state=").append(PUB_STATE_OK);
return dbInstance.getCurrentEntityManager()
.createQuery(q.toString(), Subscriber.class)
.setParameter("publisherType", publisherType)
.setParameter("data", data)
.getResultList();
}
@Override
public List<SubscriptionInfo> getSubscriptionInfos(Identity identity, String publisherType) {
StringBuilder sb = new StringBuilder();
......@@ -697,13 +711,17 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
private Publisher getPublisherForUpdate(SubscriptionContext subsContext) {
Publisher pub = getPublisher(subsContext);
if(pub != null && pub.getKey() != null) {
return getPublisherForUpdate(pub);
}
private Publisher getPublisherForUpdate(Publisher publisher) {
if(publisher != null && publisher.getKey() != null) {
//prevent optimistic lock issue
dbInstance.getCurrentEntityManager().detach(pub);
pub = dbInstance.getCurrentEntityManager()
.find(PublisherImpl.class, pub.getKey(), LockModeType.PESSIMISTIC_WRITE);
dbInstance.getCurrentEntityManager().detach(publisher);
publisher = dbInstance.getCurrentEntityManager()
.find(PublisherImpl.class, publisher.getKey(), LockModeType.PESSIMISTIC_WRITE);
}
return pub;
return publisher;
}
@Override
......@@ -726,6 +744,15 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
.setParameter("resId", resId.longValue())
.getResultList();
}
private List<Publisher> getPublishers(String publisherType, String data) {
String q = "select pub from notipublisher pub where pub.type=:publisherType and pub.data=:data";
return dbInstance.getCurrentEntityManager()
.createQuery(q, Publisher.class)
.setParameter("publisherType", publisherType)
.setParameter("data", data)
.getResultList();
}
/**
* deletes all publishers of the given olatresourceable. e.g. ores =
......@@ -945,9 +972,8 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
Set<Long> subsKeys = new HashSet<Long>();
// 2. collect all keys of the affected subscribers
for (Iterator<Subscriber> it_subs = subscribers.iterator(); it_subs.hasNext();) {
Subscriber su = it_subs.next();
subsKeys.add(su.getKey());
for (Subscriber subscriber:subscribers) {
subsKeys.add(subscriber.getKey());
}
// fire the event
MultiUserEvent mue = EventFactory.createAffectedEvent(subsKeys);
......@@ -955,6 +981,55 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
}
}
@Override
public void markPublisherNews(String publisherType, String data, Identity ignoreNewsFor, boolean sendEvents) {
// to make sure: ignore if no subscriptionContext
if (!StringHelper.containsNonWhitespace(publisherType) || !StringHelper.containsNonWhitespace(data)) return;
List<Publisher> publisherToUpdates = getPublishers(publisherType, data);
if(publisherToUpdates == null || publisherToUpdates.isEmpty()) {
return;
}
List<Publisher> updatedPublishers = new ArrayList<>(publisherToUpdates.size());
for(Publisher toUpdate:publisherToUpdates) {
toUpdate = getPublisherForUpdate(toUpdate);
toUpdate.setLatestNewsDate(new Date());
Publisher publisher = dbInstance.getCurrentEntityManager().merge(toUpdate);
dbInstance.commit();//commit the select for update
updatedPublishers.add(publisher);
}
// no need to sync, since there is only one gui thread at a time from one
// user
if (ignoreNewsFor != null) {
for(Publisher publisher: updatedPublishers) {
markSubscriberRead(ignoreNewsFor, publisher);
}
}
if(sendEvents) {
//commit all things on the database
dbInstance.commit();
// channel-notify all interested listeners (e.g. the pnotificationsportletruncontroller)
// 1. find all subscribers which can be affected
List<Subscriber> subscribers = getValidSubscribersOf(publisherType, data);
Set<Long> subsKeys = new HashSet<Long>();
// 2. collect all keys of the affected subscribers
for (Subscriber subscriber:subscribers) {
subsKeys.add(subscriber.getKey());
}
// fire the event
MultiUserEvent mue = EventFactory.createAffectedEvent(subsKeys);
CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(mue, oresMyself);
}
}
/**
* @see org.olat.core.commons.services.notifications.NotificationsManager#registerAsListener(org.olat.core.util.event.GenericEventListener, org.olat.core.id.Identity)
*/
......
......@@ -19,27 +19,8 @@
*/
package org.olat.modules.webFeed.managers;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import org.olat.core.commons.services.notifications.NotificationsHandler;
import org.olat.core.commons.services.notifications.NotificationsManager;
import org.olat.core.commons.services.notifications.Publisher;
import org.olat.core.commons.services.notifications.Subscriber;
import org.olat.core.commons.services.notifications.SubscriptionInfo;
import org.olat.core.commons.services.notifications.model.SubscriptionListItem;
import org.olat.core.commons.services.notifications.model.TitleItem;
import org.olat.core.gui.translator.Translator;
import org.olat.core.gui.util.CSSHelper;
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.modules.webFeed.ui.FeedMainController;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.olat.fileresource.types.BlogFileResource;
import org.springframework.stereotype.Service;
/**
*
......@@ -48,97 +29,24 @@ import org.springframework.stereotype.Service;
*
*/
@Service
public class BlogNotificationsHandler implements NotificationsHandler {
public class BlogNotificationsHandler extends FeedNotificationsHandler {
private static final String NOTIFICATIONS_HEADER_COURSE = "notifications.header.course";
private static final String NOTIFICATIONS_HEADER = "notifications.header";
private static final String NOTIFICATIONS_HEADER_BLOG = "notifications.header.blog";
private static final String CSS_CLASS_ICON_BLOG = "o_blog_icon";
private static final OLog log = Tracing.createLoggerFor(BlogNotificationsHandler.class);
@Autowired
private NotificationsManager notificationsManager;
@Autowired
private RepositoryManager repoManager;
@Override
public SubscriptionInfo createSubscriptionInfo(Subscriber subscriber, Locale locale, Date compareDate) {
SubscriptionInfo si = null;
Publisher p = subscriber.getPublisher();
try {
final Translator translator = Util.createPackageTranslator(FeedMainController.class, locale);
FeedNotifications notifications = new FeedNotifications(subscriber, locale, compareDate, notificationsManager);
List<SubscriptionListItem> items = notifications.getItems();
if (items.isEmpty()) {
si = notificationsManager.getNoSubscriptionInfo();
} else {
String title;
try {
RepositoryEntry re = repoManager.lookupRepositoryEntry(
OresHelper.createOLATResourceableInstance(p.getResName(), p.getResId()), false);
String displayName = re.getDisplayname();
if("CourseModule".equals(p.getResName())) {
if (re.getRepositoryEntryStatus().isClosed() || re.getRepositoryEntryStatus().isUnpublished()) {
return notificationsManager.getNoSubscriptionInfo();
} else {
title = translator.translate(NOTIFICATIONS_HEADER_COURSE, new String[]{displayName});
}
} else {
title = translator.translate(NOTIFICATIONS_HEADER_BLOG, new String[]{displayName});
}
} catch (Exception e) {
log.error("Unknown Exception", e);
title = translator.translate(NOTIFICATIONS_HEADER);
}
si = new SubscriptionInfo(subscriber.getKey(), p.getType(), new TitleItem(title, CSS_CLASS_ICON_BLOG), items);
}
} catch (Exception e) {
log.error("Unknown Exception", e);
si = notificationsManager.getNoSubscriptionInfo();
}
return si;
protected String getCssClassIcon() {
return CSS_CLASS_ICON_BLOG;
}
@Override
public String createTitleInfo(Subscriber subscriber, Locale locale) {
Translator translator = Util.createPackageTranslator(FeedMainController.class, locale);
TitleItem title = getTitleItem(subscriber.getPublisher(), translator);
return title.getInfoContent("text/plain");
protected String getHeader(Translator translator, String title) {
return translator.translate(NOTIFICATIONS_HEADER_BLOG, new String[]{ title });
}
@Override
public String getType() {
return "FileResource.BLOG";
return BlogFileResource.TYPE_NAME;// FileResource.BLOG
}
private TitleItem getTitleItem(Publisher p, Translator translator) {
String title;
try {
String displayName = repoManager.lookupDisplayNameByOLATResourceableId(p.getResId());
title = translator.translate(NOTIFICATIONS_HEADER_BLOG, new String[]{displayName});
} catch (Exception e) {
log.error("", e);
checkPublisher(p);
title = translator.translate(NOTIFICATIONS_HEADER);
}
return new TitleItem(title, CSSHelper.CSS_CLASS_FILETYPE_FOLDER);
}
private void checkPublisher(Publisher p) {
try {
RepositoryEntry entry = repoManager.lookupRepositoryEntry(OresHelper.createOLATResourceableInstance(p.getResName(), p.getResId()), false);
if (entry == null) {
notificationsManager.deactivate(p);
}
} catch (Exception e) {
log.error("", e);
}
}
}
......@@ -24,11 +24,15 @@ import java.util.Date;
import java.util.List;
import java.util.Locale;
import org.olat.core.commons.services.notifications.NotificationsHandler;
import org.olat.core.commons.services.notifications.NotificationsManager;
import org.olat.core.commons.services.notifications.Publisher;
import org.olat.core.commons.services.notifications.Subscriber;
import org.olat.core.commons.services.notifications.SubscriptionInfo;
import org.olat.core.commons.services.notifications.model.SubscriptionListItem;
import org.olat.core.commons.services.notifications.model.TitleItem;
import org.olat.core.gui.translator.Translator;
import org.olat.core.gui.util.CSSHelper;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.context.BusinessControlFactory;
import org.olat.core.logging.OLog;
......@@ -38,82 +42,129 @@ import org.olat.core.util.resource.OresHelper;
import org.olat.modules.webFeed.models.Feed;
import org.olat.modules.webFeed.models.Item;
import org.olat.modules.webFeed.ui.FeedMainController;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 27.04.2017<br>
* @author Fabian Kiefer, fabian.kiefer@frentix.com, http://www.frentix.com
*
*/
public class FeedNotifications {
private static final OLog log = Tracing.createLoggerFor(FeedNotifications.class);
private final Date compareDate;
private final Subscriber subscriber;
private final Translator translator;
private final List<SubscriptionListItem> items = new ArrayList<>();
*
* Initial date: 6 juin 2017<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public abstract class FeedNotificationsHandler implements NotificationsHandler {
private NotificationsManager notificationsManager;
private static final OLog log = Tracing.createLoggerFor(FeedNotificationsHandler.class);
private static final String NOTIFICATIONS_HEADER_COURSE = "notifications.header.course";
protected static final String NOTIFICATIONS_HEADER = "notifications.header";
@Autowired
private FeedManager feedManager;
@Autowired
private RepositoryManager repoManager;
@Autowired
private NotificationsManager notificationsManager;
public FeedNotifications(Subscriber subscriber, Locale locale, Date compareDate, NotificationsManager notificationsManager) {
this.subscriber = subscriber;
this.compareDate = compareDate;
this.notificationsManager = notificationsManager;
this.feedManager = FeedManager.getInstance();
translator = Util.createPackageTranslator(FeedMainController.class, locale);
}
public List<SubscriptionListItem> getItems() throws Exception {
@Override
public SubscriptionInfo createSubscriptionInfo(Subscriber subscriber, Locale locale, Date compareDate) {
SubscriptionInfo si = null;
Publisher p = subscriber.getPublisher();
Date latestNews = p.getLatestNewsDate();
try {
Publisher p = subscriber.getPublisher();
String data = p.getData();
Date latestNews = p.getLatestNewsDate();
if (notificationsManager.isPublisherValid(p) && compareDate.before(latestNews)) {
String resName = p.getResName();
Long resId = p.getResId();
Feed feed;
if ("CourseModule".equals(resName)) {
OLATResourceable ores = OresHelper.createOLATResourceableInstance(resName, Long.parseLong(data));
feed = feedManager.getFeed(ores);
} else {
OLATResourceable ores = OresHelper.createOLATResourceableInstance(resName, resId);
feed = feedManager.getFeed(ores);
final Translator translator = Util.createPackageTranslator(FeedMainController.class, locale);
if (notificationsManager.isPublisherValid(p) && compareDate.before(latestNews)) {
String title;
try {
RepositoryEntry re = repoManager.lookupRepositoryEntry(
OresHelper.createOLATResourceableInstance(p.getResName(), p.getResId()), false);
String displayName = re.getDisplayname();
if("CourseModule".equals(p.getResName())) {
if (re.getRepositoryEntryStatus().isClosed() || re.getRepositoryEntryStatus().isUnpublished()) {
return notificationsManager.getNoSubscriptionInfo();
} else {
title = translator.translate(NOTIFICATIONS_HEADER_COURSE, new String[]{displayName});
}
} else {
title = getHeader(translator, displayName);
}
} catch (Exception e) {
log.error("Unknown Exception", e);
return notificationsManager.getNoSubscriptionInfo();
}
OLATResourceable feedOres = OresHelper.createOLATResourceableInstance(p.getType(), new Long(p.getData()));
Feed feed = feedManager.getFeed(feedOres);
List<Item> listItems = feedManager.loadItems(feed);
List<SubscriptionListItem> items = new ArrayList<>();
for (Item item : listItems) {
createSubscriptionItem(item, p);
if (!item.isDraft() && (compareDate.before(item.getPublishDate()) || compareDate.before(item.getLastModified()))) {
SubscriptionListItem subscriptionItem = createSubscriptionItem(item, p, translator);
if(subscriptionItem != null) {
items.add(subscriptionItem);
}
}
}
}
si = new SubscriptionInfo(subscriber.getKey(), p.getType(), new TitleItem(title, getCssClassIcon()), items);
}
} catch (Exception e) {
log.error("error in Feed notification",e);
log.error("Unknown Exception", e);
si = notificationsManager.getNoSubscriptionInfo();
}
return items;
return si;
}
private void createSubscriptionItem(Item item, Publisher p){
private SubscriptionListItem createSubscriptionItem(Item item, Publisher p, Translator translator){
String title = item.getTitle();
String author = item.getAuthor();
String businessPath = p.getBusinessPath();
String urlToSend = BusinessControlFactory.getInstance()
.getURLFromBusinessPathString(businessPath);
String iconCssClass = item.extraCSSClass();
Date modDate = item.getPublishDate();
if (compareDate.before(modDate)) {
String title = item.getTitle();
String author = item.getAuthor();
String desc;
if (item.isDraft()) {
return;
} else {
desc = translator.translate("notifications.entry", new String[] { title, author });
String desc;
if(modDate == null) {
modDate = item.getLastModified();
desc = translator.translate("notifications.entry.modified", new String[] { title, author });
} else {
desc = translator.translate("notifications.entry.published", new String[] { title, author });
}
return new SubscriptionListItem(desc, urlToSend, businessPath, modDate, iconCssClass);
}
protected abstract String getCssClassIcon();
protected abstract String getHeader(Translator translator, String title);
@Override
public String createTitleInfo(Subscriber subscriber, Locale locale) {
Translator translator = Util.createPackageTranslator(FeedMainController.class, locale);
TitleItem title = getTitleItem(subscriber.getPublisher(), translator);
return title.getInfoContent("text/plain");
}
protected TitleItem getTitleItem(Publisher p, Translator translator) {
String title;
try {
String displayName = repoManager.lookupDisplayNameByOLATResourceableId(p.getResId());
title = getHeader(translator, displayName);
} catch (Exception e) {
log.error("", e);
checkPublisher(p);
title = translator.translate(NOTIFICATIONS_HEADER);
}
return new TitleItem(title, CSSHelper.CSS_CLASS_FILETYPE_FOLDER);
}
protected void checkPublisher(Publisher p) {
try {
RepositoryEntry entry = repoManager.lookupRepositoryEntry(OresHelper.createOLATResourceableInstance(p.getResName(), p.getResId()), false);
if (entry == null) {
notificationsManager.deactivate(p);
}
String businessPath = p.getBusinessPath();
String urlToSend = BusinessControlFactory.getInstance()
.getURLFromBusinessPathString(businessPath);
String iconCssClass = item.extraCSSClass();
SubscriptionListItem subListItem = new SubscriptionListItem(desc, urlToSend, businessPath, modDate, iconCssClass);
items.add(subListItem);
} catch (Exception e) {
log.error("", e);
}
}
}
}
\ No newline at end of file
......@@ -19,27 +19,8 @@
*/
package org.olat.modules.webFeed.managers;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import org.olat.core.commons.services.notifications.NotificationsHandler;
import org.olat.core.commons.services.notifications.NotificationsManager;
import org.olat.core.commons.services.notifications.Publisher;
import org.olat.core.commons.services.notifications.Subscriber;
import org.olat.core.commons.services.notifications.SubscriptionInfo;
import org.olat.core.commons.services.notifications.model.SubscriptionListItem;
import org.olat.core.commons.services.notifications.model.TitleItem;
import org.olat.core.gui.translator.Translator;
import org.olat.core.gui.util.CSSHelper;
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.modules.webFeed.ui.FeedMainController;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.olat.fileresource.types.PodcastFileResource;
import org.springframework.stereotype.Service;
/**
*
......@@ -48,97 +29,23 @@ import org.springframework.stereotype.Service;
*
*/
@Service
public class PodcastNotificationsHandler implements NotificationsHandler {
public class PodcastNotificationsHandler extends FeedNotificationsHandler {
private static final String NOTIFICATIONS_HEADER_COURSE = "notifications.header.course";
private static final String NOTIFICATIONS_HEADER = "notifications.header";
private static final String NOTIFICATIONS_HEADER_PODCAST = "notifications.header.podcast";
private static final String CSS_CLASS_ICON_PODCAST = "o_podcast_icon";
private static final OLog log = Tracing.createLoggerFor(PodcastNotificationsHandler.class);
@Autowired
private NotificationsManager notificationsManager;
@Autowired
private RepositoryManager repoManager;
@Override
public SubscriptionInfo createSubscriptionInfo(Subscriber subscriber, Locale locale, Date compareDate) {
SubscriptionInfo si = null;
Publisher p = subscriber.getPublisher();
try {
final Translator translator = Util.createPackageTranslator(FeedMainController.class, locale);
FeedNotifications notifications = new FeedNotifications(subscriber, locale, compareDate, notificationsManager);
List<SubscriptionListItem> items = notifications.getItems();
if (items.isEmpty()) {
si = notificationsManager.getNoSubscriptionInfo();
} else {
String title;
try {
RepositoryEntry re = repoManager.lookupRepositoryEntry(
OresHelper.createOLATResourceableInstance(p.getResName(), p.getResId()), false);
String displayName = re.getDisplayname();
if("CourseModule".equals(p.getResName())) {
if (re.getRepositoryEntryStatus().isClosed() || re.getRepositoryEntryStatus().isUnpublished()) {
return notificationsManager.getNoSubscriptionInfo();
} else {
title = translator.translate(NOTIFICATIONS_HEADER_COURSE, new String[]{displayName});
}
} else {
title = translator.translate(NOTIFICATIONS_HEADER_PODCAST, new String[]{displayName});
}
} catch (Exception e) {
log.error("Unknown Exception", e);
title = translator.translate(NOTIFICATIONS_HEADER);
}
si = new SubscriptionInfo(subscriber.getKey(), p.getType(), new TitleItem(title, CSS_CLASS_ICON_PODCAST), items);
}
} catch (Exception e) {
log.error("Unknown Exception", e);
si = notificationsManager.getNoSubscriptionInfo();
}
return si;
protected String getCssClassIcon() {
return CSS_CLASS_ICON_PODCAST;
}
@Override
public String createTitleInfo(Subscriber subscriber, Locale locale) {
Translator translator = Util.createPackageTranslator(FeedMainController.class, locale);
TitleItem title = getTitleItem(subscriber.getPublisher(), translator);
return title.getInfoContent("text/plain");
protected String getHeader(Translator translator, String displayName) {
return translator.translate(NOTIFICATIONS_HEADER_PODCAST, new String[]{ displayName });
}
@Override
public String getType() {
return "FileResource.PODCAST";
return PodcastFileResource.TYPE_NAME;// FileResource.PODCAST
}
private TitleItem getTitleItem(Publisher p, Translator translator) {
String title;
try {
String displayName = repoManager.lookupDisplayNameByOLATResourceableId(p.getResId());
title = translator.translate(NOTIFICATIONS_HEADER_PODCAST, new String[]{displayName});
} catch (Exception e) {
log.error("", e);
checkPublisher(p);
title = translator.translate(NOTIFICATIONS_HEADER);
}
return new TitleItem(title, CSSHelper.CSS_CLASS_FILETYPE_FOLDER);
}
private void checkPublisher(Publisher p) {
try {
RepositoryEntry entry = repoManager.lookupRepositoryEntry(OresHelper.createOLATResourceableInstance(p.getResName(), p.getResId()), false);
if (entry == null) {
notificationsManager.deactivate(p);
}
} catch (Exception e) {
log.error("", e);
}
}
}
}
\ No newline at end of file
......@@ -34,6 +34,8 @@ import org.olat.search.service.SearchResourceContext;
* @author gwassmann
*/
public class FeedItemDocument extends OlatDocument {
private static final long serialVersionUID = -3074986648480909133L;
private static Filter tagsFilter = FilterFactory.getHtmlTagsFilter();
public FeedItemDocument(Item item, SearchResourceContext searchResourceContext) {
......
......@@ -33,6 +33,8 @@ import org.olat.search.service.SearchResourceContext;
*/
public class FeedNodeDocument extends OlatDocument {
private static final long serialVersionUID = 5585883273458311252L;
public FeedNodeDocument(Feed feed, SearchResourceContext searchResourceContext) {
super();
setTitle(feed.getTitle());
......
......@@ -164,8 +164,8 @@ public class FeedMainController extends BasicController implements Activateable2
vcInfo.contextPut("helper", helper);
if (subsContext != null) {
String businnessPath = wControl.getBusinessControl().getAsString();
PublisherData data = new PublisherData(ores.getResourceableTypeName(), ores.getResourceableId().toString(), businnessPath);
String businessPath = wControl.getBusinessControl().getAsString();
PublisherData data = new PublisherData(ores.getResourceableTypeName(), ores.getResourceableId().toString(), businessPath);
cSubscriptionCtrl = new ContextualSubscriptionController(ureq, getWindowControl(), subsContext, data);
listenTo(cSubscriptionCtrl);
vcInfo.put("subscription", cSubscriptionCtrl.getInitialComponent());
......
......@@ -40,4 +40,5 @@ notifications.header=Neue Blog Eintr\u00E4ge
notifications.header.blog=Neue Eintr\u00E4ge im Blog "{0}"
notifications.header.podcast=Neue Eintr\u00E4ge im Podcast "{0}"
notifications.header.course=Neue Eintr\u00E4ge im Kurs "{0}"
notifications.entry=Der Post "{0}" wurde von "{1}" hinzugef\u00fcgt.
notifications.entry.published=Der Post "{0}" wurde von "{1}" publiziert.
notifications.entry.modified=Der Post "{0}" wurde von "{1}" ge\u00E4ndert.
......@@ -41,4 +41,5 @@ notifications.header=New blog entries
notifications.header.blog=New entries in blog "{0}"
notifications.header.podcast=New entries in podcast "{0}"
notifications.header.course=New entries in course "{0}"
notifications.entry=The post "{0}" was added by {1}.
notifications.entry.published=The post "{0}" was published by {1}.
notifications.entry.modified=The post "{0}" was modified by {1}.
......@@ -22,6 +22,7 @@ package org.olat.modules.webFeed.ui.blog;
import java.util.Calendar;
import java.util.Date;
import org.olat.core.commons.services.notifications.NotificationsManager;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
......@@ -38,12 +39,15 @@ import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.OLATResourceable;
import org.olat.core.util.vfs.Quota;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback;
import org.olat.fileresource.types.BlogFileResource;
import org.olat.modules.webFeed.managers.FeedManager;
import org.olat.modules.webFeed.models.Feed;
import org.olat.modules.webFeed.models.Item;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Form controller for blog posts.
......@@ -56,6 +60,8 @@ import org.olat.modules.webFeed.models.Item;
public class BlogPostFormController extends FormBasicController {
private Item post;
private OLATResourceable feedOres;
private VFSContainer baseDir;
private TextElement title;
......@@ -64,6 +70,9 @@ public class BlogPostFormController extends FormBasicController {
private FormLink draftLink;
private boolean currentlyDraft;
@Autowired
private NotificationsManager notificationManager;
/**
* @param ureq
......@@ -72,6 +81,7 @@ public class BlogPostFormController extends FormBasicController {
public BlogPostFormController(UserRequest ureq, WindowControl control, Item post, Feed blog, Translator translator) {
super(ureq, control);
this.post = post;
this.feedOres = blog;
this.currentlyDraft = post.isDraft();
this.baseDir = FeedManager.getInstance().getItemContainer(post, blog);
if(baseDir.getLocalSecurityCallback() == null) {
......@@ -99,12 +109,12 @@ public class BlogPostFormController extends FormBasicController {
setValues();
if(!currentlyDraft || post.getModifierKey() > 0) {
post.setModifierKey(ureq.getIdentity().getKey());
//fxdiff BAKS-18
} else if(currentlyDraft && !ureq.getIdentity().getKey().equals(post.getAuthorKey())) {
post.setModifierKey(ureq.getIdentity().getKey());
}
post.setDraft(false);
fireEvent(ureq, Event.CHANGED_EVENT);
notificationManager.markPublisherNews(BlogFileResource.TYPE_NAME, feedOres.getResourceableId().toString(), null, false);
}
/**
......@@ -136,12 +146,11 @@ public class BlogPostFormController extends FormBasicController {
setValues();
if(!currentlyDraft || post.getModifierKey() > 0) {
post.setModifierKey(ureq.getIdentity().getKey());
//fxdiff BAKS-18
} else if(currentlyDraft && !ureq.getIdentity().getKey().equals(post.getAuthorKey())) {
post.setModifierKey(ureq.getIdentity().getKey());
}
post.setDraft(true);
this.fireEvent(ureq, Event.CHANGED_EVENT);
fireEvent(ureq, Event.CHANGED_EVENT);
}
}
......
......@@ -23,6 +23,7 @@ import java.io.File;
import java.util.Date;
import org.olat.core.commons.services.image.Size;
import org.olat.core.commons.services.notifications.NotificationsManager;
import org.olat.core.commons.services.video.MovieService;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem;
......@@ -49,6 +50,7 @@ import org.olat.core.util.vfs.Quota;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.VFSLeaf;
import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback;
import org.olat.fileresource.types.PodcastFileResource;
import org.olat.modules.webFeed.managers.FeedManager;
import org.olat.modules.webFeed.models.Feed;
import org.olat.modules.webFeed.models.Item;
......@@ -82,6 +84,8 @@ public class EpisodeFormController extends FormBasicController {
@Autowired
private MovieService movieService;
@Autowired
private NotificationsManager notificationsManager;
/**
* @param ureq
......@@ -124,7 +128,6 @@ public class EpisodeFormController extends FormBasicController {
// Set episode as published (no draft feature for podcast)
episode.setDraft(false);
//fxdiff FXOLAT-118: size for video podcast
String width = widthEl.getValue();
if(StringHelper.containsNonWhitespace(width)) {
try {
......@@ -143,7 +146,8 @@ public class EpisodeFormController extends FormBasicController {
}
}
this.fireEvent(ureq, Event.CHANGED_EVENT);
fireEvent(ureq, Event.CHANGED_EVENT);
notificationsManager.markPublisherNews(PodcastFileResource.TYPE_NAME, podcast.getResourceableId().toString(), null, false);
}
/**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment