From debc8d0011ebb184911cd96289160e13860e5b8f Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 20 Nov 2014 09:31:33 +0100
Subject: [PATCH] OO-1322: show an error message in the course element if the
 feed doesn't exist

---
 .../nodes/feed/FeedPeekviewController.java    | 74 ++++++++++---------
 .../course/nodes/feed/_content/peekview.html  |  5 ++
 .../feed/_i18n/LocalStrings_de.properties     |  2 +-
 .../webFeed/_spring/webFeedContext.xml        |  2 +-
 .../webFeed/ui/FeedMainController.java        | 46 +++++++-----
 .../webFeed/ui/_content/feed_error.html       |  3 +
 .../ui/_i18n/LocalStrings_de.properties       |  3 +-
 7 files changed, 79 insertions(+), 56 deletions(-)
 create mode 100644 src/main/java/org/olat/modules/webFeed/ui/_content/feed_error.html

diff --git a/src/main/java/org/olat/course/nodes/feed/FeedPeekviewController.java b/src/main/java/org/olat/course/nodes/feed/FeedPeekviewController.java
index ff2a06bf327..6291886ded8 100644
--- a/src/main/java/org/olat/course/nodes/feed/FeedPeekviewController.java
+++ b/src/main/java/org/olat/course/nodes/feed/FeedPeekviewController.java
@@ -22,7 +22,6 @@ package org.olat.course.nodes.feed;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.htmlsite.OlatCmdEvent;
@@ -43,6 +42,7 @@ import org.olat.modules.webFeed.models.Item;
 import org.olat.modules.webFeed.ui.FeedUIFactory;
 import org.olat.resource.OLATResource;
 import org.olat.user.UserManager;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * <h3>Description:</h3> The feed peekview controller displays the configurable
@@ -60,6 +60,11 @@ import org.olat.user.UserManager;
 public class FeedPeekviewController extends BasicController implements Controller {
 	// the current course node id
 	private final String nodeId;
+	
+	@Autowired
+	private FeedManager feedManager;
+	@Autowired
+	private UserManager userManager;
 
 	/**
 	 * Constructor for the feed peekview controller
@@ -79,43 +84,46 @@ public class FeedPeekviewController extends BasicController implements Controlle
 			Long courseId, String nodeId, FeedUIFactory feedUIFactory, int itemsToDisplay, String wrapperCssClass) {
 		super(ureq, wControl);
 		this.nodeId = nodeId;
-		FeedManager feedManager = FeedManager.getInstance();
 		Feed feed = feedManager.getFeed(olatResource);
-		UserManager userManager = CoreSpringFactory.getImpl(UserManager.class);
 
 		VelocityContainer peekviewVC = createVelocityContainer("peekview");
-		peekviewVC.contextPut("wrapperCssClass", wrapperCssClass != null ? wrapperCssClass : "");
-		// add gui helper
-		String authorFullname = userManager.getUserDisplayName(feed.getAuthor());
-		FeedViewHelper helper = new FeedViewHelper(feed, getIdentity(), authorFullname, getTranslator(), courseId, nodeId, callback);
-		peekviewVC.contextPut("helper", helper);
-		// add items, only as many as configured
-		List<Item> allItems = feed.getFilteredItems(callback, getIdentity());
-		List<Item> items = new ArrayList<Item>();
-		for (int i = 0; i < allItems.size(); i++) {
-			if (items.size() == itemsToDisplay) {
-				break;
-			}
-			// add item itself if published
-			Item item = allItems.get(i);
-			if (item.isPublished()) {
-				items.add(item);
-				// add link to item
-				// Add link to jump to course node
-				Link nodeLink = LinkFactory.createLink("nodeLink_" + item.getGuid(), peekviewVC, this);
-				nodeLink.setCustomDisplayText(StringHelper.escapeHtml(item.getTitle()));
-				nodeLink.setIconLeftCSS("o_icon o_" + feed.getResourceableTypeName().replace(".", "-") + "_icon");
-				nodeLink.setCustomEnabledLinkCSS("o_gotoNode");
-				nodeLink.setUserObject(item.getGuid());
+		if(feed == null) {
+			peekviewVC.contextPut("items", new ArrayList<>(1));
+			peekviewVC.contextPut("errorMessage", translate("peekview.error"));
+		} else {
+			peekviewVC.contextPut("wrapperCssClass", wrapperCssClass != null ? wrapperCssClass : "");
+			// add gui helper
+			String authorFullname = userManager.getUserDisplayName(feed.getAuthor());
+			FeedViewHelper helper = new FeedViewHelper(feed, getIdentity(), authorFullname, getTranslator(), courseId, nodeId, callback);
+			peekviewVC.contextPut("helper", helper);
+			// add items, only as many as configured
+			List<Item> allItems = feed.getFilteredItems(callback, getIdentity());
+			List<Item> items = new ArrayList<Item>();
+			for (int i = 0; i < allItems.size(); i++) {
+				if (items.size() == itemsToDisplay) {
+					break;
+				}
+				// add item itself if published
+				Item item = allItems.get(i);
+				if (item.isPublished()) {
+					items.add(item);
+					// add link to item
+					// Add link to jump to course node
+					Link nodeLink = LinkFactory.createLink("nodeLink_" + item.getGuid(), peekviewVC, this);
+					nodeLink.setCustomDisplayText(StringHelper.escapeHtml(item.getTitle()));
+					nodeLink.setIconLeftCSS("o_icon o_" + feed.getResourceableTypeName().replace(".", "-") + "_icon");
+					nodeLink.setCustomEnabledLinkCSS("o_gotoNode");
+					nodeLink.setUserObject(item.getGuid());
+				}
 			}
+			peekviewVC.contextPut("items", items);
+			// Add link to show all items (go to node)
+			Link allItemsLink = LinkFactory.createLink("peekview.allItemsLink", peekviewVC, this);
+			allItemsLink.setIconRightCSS("o_icon o_icon_start");
+			allItemsLink.setCustomEnabledLinkCSS("pull-right");
+			// Add Formatter for proper date formatting
+			peekviewVC.contextPut("formatter", Formatter.getInstance(getLocale()));
 		}
-		peekviewVC.contextPut("items", items);
-		// Add link to show all items (go to node)
-		Link allItemsLink = LinkFactory.createLink("peekview.allItemsLink", peekviewVC, this);
-		allItemsLink.setIconRightCSS("o_icon o_icon_start");
-		allItemsLink.setCustomEnabledLinkCSS("pull-right");
-		// Add Formatter for proper date formatting
-		peekviewVC.contextPut("formatter", Formatter.getInstance(getLocale()));
 		putInitialPanel(peekviewVC);
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/feed/_content/peekview.html b/src/main/java/org/olat/course/nodes/feed/_content/peekview.html
index ca90c7c3c3f..37a90fdff8b 100644
--- a/src/main/java/org/olat/course/nodes/feed/_content/peekview.html
+++ b/src/main/java/org/olat/course/nodes/feed/_content/peekview.html
@@ -1,3 +1,6 @@
+#if($errorMessage)
+	<div class="o_error">$errorMessage</div>
+#end
 <div class="o_feed_peekview $wrapperCssClass clearfix">
 #foreach( $post in $items ) 	
 	<div class="o_item">
@@ -10,5 +13,7 @@
 		$!helper.getItemDescriptionForBrowser($post)
 	</div>
 #end
+#if($r.available("peekview.allItemsLink"))
 	$r.render("peekview.allItemsLink")
+#end
 </div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/feed/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/feed/_i18n/LocalStrings_de.properties
index a346215cc5d..f02641ff9b4 100644
--- a/src/main/java/org/olat/course/nodes/feed/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/feed/_i18n/LocalStrings_de.properties
@@ -9,7 +9,7 @@ command.close=Vorschau schliessen
 condition.accessModerator.title=Moderieren
 condition.accessPoster.title=Lesen und Schreiben
 condition.accessReader.title=Nur Lesen
-
+peekview.error=$org.olat.modules.webFeed.ui:feed.error
 peekview.allItemsLink = Alle Ausgaben
 help.hover.feed.mo=Hilfe, um den moderierenden Zugang zu konfigurieren
 help.hover.feed.r=Hilfe, um den lesenden Zugang zu konfigurieren
diff --git a/src/main/java/org/olat/modules/webFeed/_spring/webFeedContext.xml b/src/main/java/org/olat/modules/webFeed/_spring/webFeedContext.xml
index 3f2299d1c57..50b7925f335 100644
--- a/src/main/java/org/olat/modules/webFeed/_spring/webFeedContext.xml
+++ b/src/main/java/org/olat/modules/webFeed/_spring/webFeedContext.xml
@@ -3,7 +3,7 @@
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="
   http://www.springframework.org/schema/beans 
-  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
+  http://www.springframework.org/schema/beans/spring-beans.xsd">
 
 <bean id="feedManager" class="org.olat.modules.webFeed.managers.FeedManagerImpl">
 	<constructor-arg index="0" ref="resourceManager"/>
diff --git a/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java b/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java
index a8fd512a364..d4f77ba0a9e 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java
+++ b/src/main/java/org/olat/modules/webFeed/ui/FeedMainController.java
@@ -21,7 +21,6 @@ package org.olat.modules.webFeed.ui;
 
 import java.util.List;
 
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.elements.FileElement;
@@ -50,6 +49,7 @@ import org.olat.modules.webFeed.models.Feed;
 import org.olat.modules.webFeed.models.Item;
 import org.olat.user.UserManager;
 import org.olat.util.logging.activity.LoggingResourceable;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * This is the main feed layout controller. It handles everything from adding
@@ -62,7 +62,6 @@ import org.olat.util.logging.activity.LoggingResourceable;
  */
 public class FeedMainController extends BasicController implements Activateable2, GenericEventListener {
 
-	private static final FeedManager feedManager = FeedManager.getInstance();
 	private Feed feed;
 	private Link editFeedButton;
 	private CloseableModalController cmc;
@@ -77,7 +76,10 @@ public class FeedMainController extends BasicController implements Activateable2
 	// needed for comparison
 	private String oldFeedUrl;
 	
-	private final UserManager userManager;
+	@Autowired
+	private UserManager userManager;
+	@Autowired
+	private FeedManager feedManager;
 	
 	/**
 	 * Constructor for learning resource (not course nodes)
@@ -107,15 +109,28 @@ public class FeedMainController extends BasicController implements Activateable2
 		super(ureq, wControl);
 		this.uiFactory = uiFactory;
 		this.callback = callback;
-		userManager = CoreSpringFactory.getImpl(UserManager.class);
 		setTranslator(uiFactory.getTranslator());
 		feed = feedManager.getFeed(ores);
-		String authorFullname = userManager.getUserDisplayName(feed.getAuthor());
-		helper = new FeedViewHelper(feed, getIdentity(), authorFullname, uiFactory.getTranslator(), courseId, nodeId, callback);
-		CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, ureq.getIdentity(), feed);
-		display(ureq, wControl, displayConfig);
-		// do logging
-		ThreadLocalUserActivityLogger.log(FeedLoggingAction.FEED_READ, getClass(), LoggingResourceable.wrap(feed));
+		if(feed == null) {
+			vcMain = createVelocityContainer("feed_error");
+			vcMain.contextPut("errorMessage", translate("feed.error"));
+			putInitialPanel(vcMain);
+		} else {
+			String authorFullname = userManager.getUserDisplayName(feed.getAuthor());
+			helper = new FeedViewHelper(feed, getIdentity(), authorFullname, uiFactory.getTranslator(), courseId, nodeId, callback);
+			CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, ureq.getIdentity(), feed);
+			display(ureq, wControl, displayConfig);
+			// do logging
+			ThreadLocalUserActivityLogger.log(FeedLoggingAction.FEED_READ, getClass(), LoggingResourceable.wrap(feed));
+		}
+	}
+
+	@Override
+	protected void doDispose() {
+		feedManager.releaseLock(lock);
+		if(feed != null) {
+			CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(this, feed);
+		}
 	}
 
 	/**
@@ -156,16 +171,7 @@ public class FeedMainController extends BasicController implements Activateable2
 		listenTo(itemsCtr);
 		vcMain.put("items", itemsCtr.getInitialComponent());
 
-		this.putInitialPanel(vcMain);
-	}
-
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose()
-	 */
-	@Override
-	protected void doDispose() {
-		feedManager.releaseLock(lock);
-		CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(this, feed);
+		putInitialPanel(vcMain);
 	}
 
 	/**
diff --git a/src/main/java/org/olat/modules/webFeed/ui/_content/feed_error.html b/src/main/java/org/olat/modules/webFeed/ui/_content/feed_error.html
new file mode 100644
index 00000000000..5ee912b6b67
--- /dev/null
+++ b/src/main/java/org/olat/modules/webFeed/ui/_content/feed_error.html
@@ -0,0 +1,3 @@
+<div class="o_error">
+	$errorMessage
+</div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties
index 2af164dacdd..7f175723acd 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/webFeed/ui/_i18n/LocalStrings_de.properties
@@ -34,4 +34,5 @@ feed.form.minutes.error = Die Minutenangabe ist ung\u00FCltig
 feed.item.confirm.delete = Wollen Sie diesen Eintrag wirklich l\u00F6schen?
 feed.item.is.being.edited.by = Der Eintrag wird bereits von {0} bearbeitet.
 feed.is.being.edited.by = Die Beschreibung wird bereits von {0} bearbeitet.
-feed.link.more=weiterlesen
\ No newline at end of file
+feed.link.more=weiterlesen
+feed.error=Leider ist ein unerwartete Fehler aufgetretten und der Feed konnte nicht dargestellt werden.
\ No newline at end of file
-- 
GitLab