From f6ead6c91a76017cd53dde1137537f7f506ad487 Mon Sep 17 00:00:00 2001
From: fkiefer <none@none>
Date: Tue, 4 Apr 2017 15:01:08 +0200
Subject: [PATCH] OO-2621 enable nullable info message author

---
 .../info/manager/InfoMessageFrontendManager.java  |  2 +-
 .../manager/InfoMessageFrontendManagerImpl.java   | 14 +++++++++++---
 .../info/manager/InfoMessageManagerImpl.java      | 15 ++++++++-------
 .../olat/commons/info/model/InfoMessageImpl.java  |  4 ++--
 .../commons/info/ui/InfoDisplayController.java    |  7 ++++++-
 .../info/ui/_i18n/LocalStrings_de.properties      |  1 +
 .../info/ui/_i18n/LocalStrings_en.properties      |  1 +
 .../group/manager/BusinessGroupServiceImpl.java   |  2 +-
 8 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManager.java b/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManager.java
index 99fda9dbdff..c59d8869e22 100644
--- a/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManager.java
+++ b/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManager.java
@@ -62,7 +62,7 @@ public interface InfoMessageFrontendManager {
 	
 	public void deleteInfoMessage(InfoMessage infoMessage);
 	
-	public void deleteInfoMessagesOfIdentity(BusinessGroup businessGroup, Identity identity);
+	public void updateInfoMessagesOfIdentity(BusinessGroup businessGroup, Identity identity);
 	
 	public void removeInfoMessagesAndSubscriptionContext(BusinessGroup group);
 	
diff --git a/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManagerImpl.java b/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManagerImpl.java
index 57aab19ea57..c1413b8c378 100644
--- a/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManagerImpl.java
+++ b/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManagerImpl.java
@@ -27,6 +27,7 @@ import java.util.Locale;
 import java.util.Set;
 
 import org.olat.commons.info.model.InfoMessage;
+import org.olat.commons.info.model.InfoMessageImpl;
 import org.olat.commons.info.notification.InfoSubscriptionManager;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.id.Identity;
@@ -163,11 +164,18 @@ public class InfoMessageFrontendManagerImpl implements InfoMessageFrontendManage
 	}
 	
 	@Override
-	public void deleteInfoMessagesOfIdentity(BusinessGroup businessGroup, Identity identity) {
+	public void updateInfoMessagesOfIdentity(BusinessGroup businessGroup, Identity identity) {
 		List<InfoMessage> infoMessages = infoMessageManager.loadInfoMessagesOfIdentity(businessGroup, identity);
 		for (InfoMessage infoMessage : infoMessages) {
-			infoMessageManager.deleteInfoMessage(infoMessage);
-			infoSubscriptionManager.markPublisherNews(infoMessage.getOLATResourceable(), infoMessage.getResSubPath());
+			Identity author = infoMessage.getAuthor();
+			Identity modifier = infoMessage.getModifier();
+			if (author != null && author.equals(identity)) {
+				((InfoMessageImpl)infoMessage).setAuthor(null);
+				infoSubscriptionManager.markPublisherNews(infoMessage.getOLATResourceable(), infoMessage.getResSubPath());
+			} 
+			if (modifier != null && modifier.equals(identity)) {
+				infoMessage.setModifier(null);
+			}
 		}		
 	}
 	
diff --git a/src/main/java/org/olat/commons/info/manager/InfoMessageManagerImpl.java b/src/main/java/org/olat/commons/info/manager/InfoMessageManagerImpl.java
index eeccc4f8cfe..8e4668e3cec 100644
--- a/src/main/java/org/olat/commons/info/manager/InfoMessageManagerImpl.java
+++ b/src/main/java/org/olat/commons/info/manager/InfoMessageManagerImpl.java
@@ -103,11 +103,12 @@ public class InfoMessageManagerImpl extends InfoMessageManager {
 	public List<InfoMessage> loadInfoMessagesOfIdentity(BusinessGroupRef businessGroup, IdentityRef identity) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select msg from ").append(InfoMessageImpl.class.getName()).append(" msg")
-			.append(" inner join fetch msg.author author")
-			.append(" inner join fetch author.user")
+			.append(" left join fetch msg.author author")
+			.append(" left join fetch author.user")
 			.append(" left join fetch msg.modifier modifier")
 			.append(" left join fetch modifier.user")
-			.append(" where author.key=:authorKey")
+			.append(" where (author.key=:authorKey")
+			.append(" or modifier.key=:authorKey)")
 			.append(" and msg.resId=:groupKey");
 		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), InfoMessage.class)
@@ -120,8 +121,8 @@ public class InfoMessageManagerImpl extends InfoMessageManager {
 	public InfoMessage loadInfoMessageByKey(Long key) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select msg from ").append(InfoMessageImpl.class.getName()).append(" msg")
-			.append(" inner join fetch msg.author author")
-			.append(" inner join fetch author.user")
+			.append(" left join fetch msg.author author")
+			.append(" left join fetch author.user")
 			.append(" left join fetch msg.modifier modifier")
 			.append(" left join fetch modifier.user")
 			.append(" where msg.key=:key");
@@ -175,8 +176,8 @@ public class InfoMessageManagerImpl extends InfoMessageManager {
 		sb.append(" from ").append(InfoMessageImpl.class.getName()).append(" msg");
 		
 		if (!count) {
-			sb.append(" inner join fetch msg.author author")
-			.append(" inner join fetch author.user")
+			sb.append(" left join fetch msg.author author")
+			.append(" left join fetch author.user")
 			.append(" left join fetch msg.modifier modifier")
 			.append(" left join fetch modifier.user");
 		}
diff --git a/src/main/java/org/olat/commons/info/model/InfoMessageImpl.java b/src/main/java/org/olat/commons/info/model/InfoMessageImpl.java
index 5e976126033..8cf468566d4 100644
--- a/src/main/java/org/olat/commons/info/model/InfoMessageImpl.java
+++ b/src/main/java/org/olat/commons/info/model/InfoMessageImpl.java
@@ -87,8 +87,8 @@ public class InfoMessageImpl implements InfoMessage, CreateInfo, Persistable {
 	@Column(name="businesspath", nullable=true, insertable=true, updatable=false)
 	private String businessPath;
 	
-	@ManyToOne(targetEntity=IdentityImpl.class, fetch=FetchType.LAZY, optional=false)
-	@JoinColumn(name="fk_author_id", nullable=false, insertable=true, updatable=false)
+	@ManyToOne(targetEntity=IdentityImpl.class, fetch=FetchType.LAZY, optional=true)
+	@JoinColumn(name="fk_author_id", nullable=true, insertable=true, updatable=true)
 	private Identity author;
 	@ManyToOne(targetEntity=IdentityImpl.class, fetch=FetchType.LAZY, optional=true)
 	@JoinColumn(name="fk_modifier_id", nullable=true, insertable=true, updatable=true)
diff --git a/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java b/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java
index 16d73dc4c2c..244835969f4 100644
--- a/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java
+++ b/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java
@@ -270,7 +270,12 @@ public class InfoDisplayController extends FormBasicController {
 
 		String authorName = userManager.getUserDisplayName(info.getAuthor());
 		String creationDate = formatter.formatDateAndTime(info.getCreationDate());
-		String infos = translate("display.info", new String[]{StringHelper.escapeHtml(authorName), creationDate});
+		String infos;
+		if (authorName.isEmpty()) {
+			infos = translate("display.info.noauthor", new String[]{creationDate});
+		} else {
+			infos = translate("display.info", new String[]{StringHelper.escapeHtml(authorName), creationDate});
+		}		
 
 		return new InfoMessageForDisplay(info.getKey(), info.getTitle(), message, infos, modifier);
 	}
diff --git a/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_de.properties
index 4a566161276..e2bdfad10a7 100644
--- a/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_de.properties
@@ -5,6 +5,7 @@ new_message=Neue Mitteilung erstellen
 create_message=Mitteilung erstellen
 input.toolong=Leider ist Ihr gerade eingegebener Text mit {1} Zeichen zu lang. Bitte beschr\u00E4nken Sie sich auf maximal {0} Zeichen.
 display.info=Publiziert von {0} am {1}
+display.info.noauthor=Publiziert am {0}
 display.modifier=ge\u00E4ndert von {0} am {1}
 display.new_messages=Aktuelle Mitteilungen anzeigen
 display.old_messages=\u00C4ltere Mitteilungen anzeigen
diff --git a/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_en.properties
index 9a78b7e5f7f..59c8bee1e71 100644
--- a/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_en.properties
@@ -3,6 +3,7 @@ already.deleted=This message has been deleted in the meantime by another user.
 already.edited=This message is being edited by user {0}. Please try again later.
 create_message=Create message
 display.info=Published by {0} on {1}
+display.info.noauthor=Published on {0}
 display.modifier=modified by {0} on {1}
 display.new_messages=Show new messages
 display.no_messages=There are no new messages
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index e177c724e0f..db310cfa666 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -1035,7 +1035,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 
 	private void removeParticipant(Identity ureqIdentity, Identity identity, BusinessGroup group, MailPackage mailing,
 			List<BusinessGroupModifiedEvent.Deferred> events) {
-		infoMessageManager.deleteInfoMessagesOfIdentity(group, identity);
+		infoMessageManager.updateInfoMessagesOfIdentity(group, identity);
 		boolean removed = businessGroupRelationDAO.removeRole(identity, group, GroupRoles.participant.name());
 		if(removed) {
 			// notify currently active users of this business group
-- 
GitLab