-
+
-
+
diff --git a/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/MessageForumsMessageManagerImpl.java b/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/MessageForumsMessageManagerImpl.java
index 85ec06bb3a3e..b13842de1c1e 100644
--- a/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/MessageForumsMessageManagerImpl.java
+++ b/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/MessageForumsMessageManagerImpl.java
@@ -54,6 +54,8 @@
import org.sakaiproject.api.app.messageforums.MessageForumsMessageManager;
import org.sakaiproject.api.app.messageforums.MessageForumsTypeManager;
import org.sakaiproject.api.app.messageforums.MessageMoveHistory;
+import org.sakaiproject.api.app.messageforums.OpenForum;
+import org.sakaiproject.api.app.messageforums.OpenTopic;
import org.sakaiproject.api.app.messageforums.PrivateMessage;
import org.sakaiproject.api.app.messageforums.SynopticMsgcntrManager;
import org.sakaiproject.api.app.messageforums.Topic;
@@ -63,6 +65,8 @@
import org.sakaiproject.component.app.messageforums.dao.hibernate.AttachmentImpl;
import org.sakaiproject.component.app.messageforums.dao.hibernate.MessageImpl;
import org.sakaiproject.component.app.messageforums.dao.hibernate.MessageMoveHistoryImpl;
+import org.sakaiproject.component.app.messageforums.dao.hibernate.OpenForumImpl;
+import org.sakaiproject.component.app.messageforums.dao.hibernate.OpenTopicImpl;
import org.sakaiproject.component.app.messageforums.dao.hibernate.PrivateMessageImpl;
import org.sakaiproject.component.app.messageforums.dao.hibernate.UnreadStatusImpl;
import org.sakaiproject.component.app.messageforums.dao.hibernate.Util;
@@ -1757,19 +1761,33 @@ private boolean isForumOrTopicLocked(final Long forumId, final Long topicId) {
log.debug("isForumLocked executing with forumId: " + forumId + ":: topicId: " + topicId);
+ final Date now = new Date();
+
HibernateCallback hcb = session -> {
- Query q = session.getNamedQuery("findForumLockedAttribute");
- q.setParameter("id", forumId, LongType.INSTANCE);
- return (Boolean) q.uniqueResult();
+ OpenForumImpl forum = session.get(OpenForumImpl.class, forumId);
+ OpenTopicImpl topic = session.get(OpenTopicImpl.class, topicId);
+ return isLocked(forum, now) || isLocked(topic, now);
};
- HibernateCallback hcb2 = session -> {
- Query q = session.getNamedQuery("findTopicLockedAttribute");
- q.setParameter("id", topicId, LongType.INSTANCE);
- return (Boolean) q.uniqueResult();
- };
-
- return getHibernateTemplate().execute(hcb) || getHibernateTemplate().execute(hcb2);
+ return getHibernateTemplate().execute(hcb);
+ }
+
+ private boolean isLocked(OpenForum forum, Date now) {
+ if (forum == null) return true;
+ if (Boolean.TRUE.equals(forum.getLocked())) return true;
+ if (!Boolean.TRUE.equals(forum.getAvailabilityRestricted())) return false;
+ if (!Boolean.TRUE.equals(forum.getLockedAfterClosed())) return false;
+ Date closeDate = forum.getCloseDate();
+ return closeDate != null && closeDate.before(now);
+ }
+
+ private boolean isLocked(OpenTopic topic, Date now) {
+ if (topic == null) return true;
+ if (Boolean.TRUE.equals(topic.getLocked())) return true;
+ if (!Boolean.TRUE.equals(topic.getAvailabilityRestricted())) return false;
+ if (!Boolean.TRUE.equals(topic.getLockedAfterClosed())) return false;
+ Date closeDate = topic.getCloseDate();
+ return closeDate != null && closeDate.before(now);
}
// helpers
diff --git a/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/ui/UIPermissionsManagerImpl.java b/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/ui/UIPermissionsManagerImpl.java
index 9da00d92163b..7404431482e3 100644
--- a/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/ui/UIPermissionsManagerImpl.java
+++ b/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/ui/UIPermissionsManagerImpl.java
@@ -20,6 +20,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -161,9 +162,9 @@ public boolean isNewResponse(DiscussionTopic topic, DiscussionForum forum, Strin
if (forum != null
&& !forum.getDraft()
- && !forum.getLocked()
+ && !isLocked(forum)
&& !topic.getDraft()
- && !topic.getLocked()) {
+ && !isLocked(topic)) {
return getTopicItemsByUser(topic, userId, contextId).stream().anyMatch(ifNewResponse);
}
return false;
@@ -180,9 +181,9 @@ public boolean isNewResponseToResponse(DiscussionTopic topic, DiscussionForum fo
if (forum != null
&& !forum.getDraft()
- && !forum.getLocked()
+ && !isLocked(forum)
&& !topic.getDraft()
- && !topic.getLocked()) {
+ && !isLocked(topic)) {
return getTopicItemsByUser(topic, userId, contextId).stream().anyMatch(ifNewResponseToResponse);
}
return false;
@@ -194,9 +195,9 @@ public boolean isMovePostings(DiscussionTopic topic, DiscussionForum forum) {
if (forum != null
&& !forum.getDraft()
- && !forum.getLocked()
+ && !isLocked(forum)
&& !topic.getDraft()
- && !topic.getLocked()) {
+ && !isLocked(topic)) {
return getTopicItemsByCurrentUser(topic).stream().anyMatch(ifMovePosting.or(ifReviseAny).or(ifReviseOwn));
}
@@ -292,9 +293,9 @@ public boolean isReviseAny(DiscussionTopic topic, DiscussionForum forum, String
if (checkBaseConditions(topic, forum, userId, contextId)) return true;
return (forum.getDraft() == null || !forum.getDraft())
- && (forum.getLocked() == null || !forum.getLocked())
+ && !isLocked(forum)
&& (topic.getDraft() == null || !topic.getDraft())
- && (topic.getLocked() == null || !topic.getLocked())
+ && !isLocked(topic)
&& getTopicItemsByUser(topic, userId, contextId).stream().anyMatch(ifReviseAny);
}
@@ -307,12 +308,12 @@ public boolean isReviseOwn(DiscussionTopic topic, DiscussionForum forum) {
public boolean isReviseOwn(DiscussionTopic topic, DiscussionForum forum, String userId, String contextId) {
if (checkBaseConditions(topic, forum, userId, contextId)) return true;
- if (topic.getLocked() == null || topic.getLocked()) return false;
+ if (isLocked(topic)) return false;
if (!forum.getDraft()
- && !forum.getLocked()
+ && !isLocked(forum)
&& !topic.getDraft()
- && !topic.getLocked()) {
+ && !isLocked(topic)) {
return getTopicItemsByUser(topic, userId, contextId).stream().anyMatch(ifReviseOwn);
}
return false;
@@ -327,12 +328,12 @@ public boolean isDeleteAny(DiscussionTopic topic, DiscussionForum forum) {
public boolean isDeleteAny(DiscussionTopic topic, DiscussionForum forum, String userId, String contextId) {
if (checkBaseConditions(topic, forum, userId, contextId)) return true;
- if (topic.getLocked() == null || topic.getLocked()) return false;
+ if (isLocked(topic)) return false;
if (!forum.getDraft()
- && !forum.getLocked()
+ && !isLocked(forum)
&& !topic.getDraft()
- && !topic.getLocked()) {
+ && !isLocked(topic)) {
return getTopicItemsByUser(topic, userId, contextId).stream().anyMatch(ifDeleteAny);
}
return false;
@@ -347,12 +348,12 @@ public boolean isDeleteOwn(DiscussionTopic topic, DiscussionForum forum) {
public boolean isDeleteOwn(DiscussionTopic topic, DiscussionForum forum, String userId, String contextId) {
if (checkBaseConditions(topic, forum, userId, contextId)) return true;
- if (topic.getLocked() == null || topic.getLocked().equals(Boolean.TRUE)) return false;
+ if (isLocked(topic)) return false;
if (!forum.getDraft()
- && !forum.getLocked()
+ && !isLocked(forum)
&& !topic.getDraft()
- && !topic.getLocked()) {
+ && !isLocked(topic)) {
return getTopicItemsByUser(topic, userId, contextId).stream().anyMatch(ifDeleteOwn);
}
return false;
@@ -362,12 +363,12 @@ public boolean isDeleteOwn(DiscussionTopic topic, DiscussionForum forum, String
public boolean isMarkAsRead(DiscussionTopic topic, DiscussionForum forum) {
if (checkBaseConditions(topic, forum)) return true;
- if (topic.getLocked() == null || topic.getLocked().equals(Boolean.TRUE)) return false;
+ if (isLocked(topic)) return false;
if (!forum.getDraft()
- && !forum.getLocked()
+ && !isLocked(forum)
&& !topic.getDraft()
- && !topic.getLocked()) {
+ && !isLocked(topic)) {
return getTopicItemsByCurrentUser(topic).stream().anyMatch(ifMarkAsRead);
}
return false;
@@ -581,8 +582,8 @@ public BulkPermission getBulkPermissions(DiscussionTopic topic, DiscussionForum
}
boolean ifTopicOwner = topic != null && forumManager.isTopicOwner(topic, userId);
- boolean ifLockedTopic = topic != null && (topic.getLocked() == null || topic.getLocked());
- boolean ifLockedForum = forum != null && (forum.getLocked() == null || forum.getLocked());
+ boolean ifLockedTopic = isLocked(topic);
+ boolean ifLockedForum = isLocked(forum);
boolean ifDraftTopic = topic != null && (topic.getDraft() != null && topic.getDraft());
boolean ifDraftForum = forum != null && (forum.getDraft() != null && forum.getDraft());
@@ -692,6 +693,34 @@ private boolean checkBaseConditions(DiscussionTopic topic, DiscussionForum forum
|| (topic != null && topic.getRestrictPermissionsForGroups() && isInstructorForAllowedGroup(topic.getId(), false, contextSiteId, userId));
}
+ private boolean isLockedAfterClose(DiscussionForum forum) {
+ if (forum == null) return false;
+ if (!Boolean.TRUE.equals(forum.getAvailabilityRestricted())) return false;
+ if (!Boolean.TRUE.equals(forum.getLockedAfterClosed())) return false;
+ Date closeDate = forum.getCloseDate();
+ return closeDate != null && closeDate.before(new Date());
+ }
+
+ private boolean isLockedAfterClose(DiscussionTopic topic) {
+ if (topic == null) return false;
+ if (!Boolean.TRUE.equals(topic.getAvailabilityRestricted())) return false;
+ if (!Boolean.TRUE.equals(topic.getLockedAfterClosed())) return false;
+ Date closeDate = topic.getCloseDate();
+ return closeDate != null && closeDate.before(new Date());
+ }
+
+ private boolean isLocked(DiscussionForum forum) {
+ if (forum == null) return true;
+ if (Boolean.TRUE.equals(forum.getLocked())) return true;
+ return isLockedAfterClose(forum);
+ }
+
+ private boolean isLocked(DiscussionTopic topic) {
+ if (topic == null) return true;
+ if (Boolean.TRUE.equals(topic.getLocked())) return true;
+ return isLockedAfterClose(topic);
+ }
+
public void clearMembershipsFromCacheForArea(Area area) {
if (area == null || area.getId() == null) return;
String areaId = area.getId().toString();