Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r94ed30ec071e295e4a2d469f02778c25f401ca41 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 94ed30ec071e295e4a2d469f02778c25f401ca41) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -677,7 +677,8 @@ label.no.comments=No Comments label.newest.first=Newest First label.top.comments=Top Comments - +label.add.sticky=Stick To Top +label.remove.sticky=Remove Sticky label.private.notifications.title =Notifications label.private.notifications.messages =Messages label.private.notifications.read =Read Index: lams_central/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -rb04831bae6986da3f6ed5dc515f209d98d13e6ed -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision b04831bae6986da3f6ed5dc515f209d98d13e6ed) +++ lams_central/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -664,4 +664,12 @@ label.no.comments=No Comments label.newest.first=Newest First label.top.comments=Top Comments +label.add.sticky=Stick To Top +label.remove.sticky=Remove Sticky +label.private.notifications.title =Notifications +label.private.notifications.messages =Messages +label.private.notifications.read =Read +label.private.notifications.read.hint =Mark notification as read +label.private.notifications.read.all.hint =Mark all notifications as read + #======= End labels: Exported 439 labels for en AU ===== \ No newline at end of file Index: lams_central/conf/xdoclet/struts-actions.xml =================================================================== diff -u -r3dbf966d900adefc34cdad501d3c392118451cd9 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_central/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision 3dbf966d900adefc34cdad501d3c392118451cd9) +++ lams_central/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -7,6 +7,7 @@ scope="request" > + + + + + \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/comments/CommentConstants.java =================================================================== diff -u -rd3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_central/src/java/org/lamsfoundation/lams/comments/CommentConstants.java (.../CommentConstants.java) (revision d3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746) +++ lams_central/src/java/org/lamsfoundation/lams/comments/CommentConstants.java (.../CommentConstants.java) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -43,6 +43,7 @@ public static final String ATTR_LIKE_AND_DISLIKE = "likeAndDislike"; public static final String ATTR_READ_ONLY = "readOnly"; public static final String ATTR_SORT_BY = "sortBy"; // 0 date, 1 likes + public static final String ATTR_STICKY = "sticky"; // 0 date, 1 likes // for paging long topics & inlining reply public static final String PAGE_LAST_ID = "pageLastId"; Index: lams_central/src/java/org/lamsfoundation/lams/comments/web/CommentAction.java =================================================================== diff -u -rd3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_central/src/java/org/lamsfoundation/lams/comments/web/CommentAction.java (.../CommentAction.java) (revision d3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746) +++ lams_central/src/java/org/lamsfoundation/lams/comments/web/CommentAction.java (.../CommentAction.java) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -112,6 +112,9 @@ if (param.equals("hide")) { return hideComment(mapping, form, request, response, false); } + if (param.equals("makeSticky")) { + return makeSticky(mapping, form, request, response); + } return mapping.findForward("error"); } @@ -188,23 +191,34 @@ Comment rootComment = getCommentService().createOrGetRoot(externalId, externalType, externalSignature, user); sessionMap.put(CommentConstants.ATTR_ROOT_COMMENT_UID, rootComment.getUid()); - return viewTopicImpl(mapping, form, request, response, sessionMap, pageSize, sortBy); + return viewTopicImpl(mapping, form, request, response, sessionMap, pageSize, sortBy, true); } private void throwException(String msg, String loginName, Long externalId, Integer externalType, String externalSignature) throws ServletException { String error = msg+" User "+loginName+" "+externalId+":"+externalType+":"+externalSignature; log.error(error); throw new ServletException(error); } - + + private void throwException(String msg, String loginName) throws ServletException { + String error = msg+" User "+loginName; + log.error(error); + throw new ServletException(error); + } + private boolean learnerInToolSession(Long toolSessionId, User user) { GroupedToolSession toolSession = (GroupedToolSession) getCoreToolService().getToolSessionById(toolSessionId); return toolSession.getSessionGroup().getUsers().contains(user); } - private boolean monitorInToolSession(Long toolSessionId, User user) { - GroupedToolSession toolSession = (GroupedToolSession) getCoreToolService().getToolSessionById(toolSessionId); - return getSecurityService().isLessonMonitor(toolSession.getLesson().getLessonId(), user.getUserId(), "Comment Monitoring Tasks", false); + private boolean monitorInToolSession(Long toolSessionId, User user, SessionMap sessionMap) { + + if ( ToolAccessMode.TEACHER.equals(WebUtil.getToolAccessMode((String)sessionMap.get(AttributeNames.ATTR_MODE))) ) { + GroupedToolSession toolSession = (GroupedToolSession) getCoreToolService().getToolSessionById(toolSessionId); + return getSecurityService().isLessonMonitor(toolSession.getLesson().getLessonId(), user.getUserId(), "Comment Monitoring Tasks", false); + } else { + return false; + } } /** @@ -226,14 +240,15 @@ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); Integer pageSize = WebUtil.readIntParam(request, CommentConstants.PAGE_SIZE, true); Integer sortBy = WebUtil.readIntParam(request, CommentConstants.ATTR_SORT_BY, true); + Boolean sticky = WebUtil.readBooleanParam(request, CommentConstants.ATTR_STICKY, false); if ( sortBy != null ) sessionMap.put( CommentConstants.ATTR_SORT_BY, sortBy); - return viewTopicImpl(mapping, form, request, response, sessionMap, pageSize, sortBy); + return viewTopicImpl(mapping, form, request, response, sessionMap, pageSize, sortBy, sticky); } private ActionForward viewTopicImpl(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response, SessionMap sessionMap, Integer pageSize, Integer sortBy) { + HttpServletResponse response, SessionMap sessionMap, Integer pageSize, Integer sortBy, boolean includeSticky) { Long externalId = (Long) sessionMap.get(CommentConstants.ATTR_EXTERNAL_ID); Integer externalType = (Integer) sessionMap.get(CommentConstants.ATTR_EXTERNAL_TYPE); @@ -256,11 +271,17 @@ List msgDtoList = commentService.getTopicThread(externalId, externalType, externalSignature, lastMsgSeqId, pageSize, sortBy, currentLikeCount, user.getUserID()); updateMessageFlag(msgDtoList, user.getUserID()); request.setAttribute(CommentConstants.ATTR_COMMENT_THREAD, msgDtoList); + + if ( includeSticky ) { + List stickyList = commentService.getTopicStickyThread(externalId, externalType, externalSignature,sortBy, currentLikeCount, user.getUserID()); + updateMessageFlag(stickyList, user.getUserID()); + request.setAttribute(CommentConstants.ATTR_STICKY, stickyList); + } // transfer SessionMapID as well request.setAttribute(CommentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); - return mapping.findForward("success"); + return mapping.findForward(includeSticky ? "successAll" : "success"); } @SuppressWarnings("unchecked") @@ -363,7 +384,8 @@ commentService = getCommentService(); User user = getCurrentUser(request); - if ( ! learnerInToolSession(externalId, user) ) + boolean monitoringMode = ToolAccessMode.TEACHER.equals(WebUtil.getToolAccessMode((String)sessionMap.get(AttributeNames.ATTR_MODE))); + if ( ! learnerInToolSession(externalId, user) && ! monitorInToolSession(externalId, user, sessionMap) ) throwException("New comment: User does not have the rights to access the comments. ", user.getLogin(), externalId, externalType, externalSignature ); Comment rootSeq = commentService.getRoot(externalId, externalType, externalSignature); @@ -435,7 +457,7 @@ commentService = getCommentService(); User user = getCurrentUser(request); - if ( ! learnerInToolSession(externalId, user) ) + if ( ! learnerInToolSession(externalId, user) && ! monitorInToolSession(externalId, user, sessionMap) ) throwException("New comment: User does not have the rights to access the comments. ", user.getLogin(), externalId, externalType, externalSignature ); // save message into database @@ -517,12 +539,12 @@ CommentDTO originalComment = commentService.getComment(commentId); - boolean monitoringMode = ToolAccessMode.TEACHER.equals(WebUtil.getToolAccessMode((String)sessionMap.get(AttributeNames.ATTR_MODE))); User user = getCurrentUser(request); - if ( ! originalComment.getComment().getCreatedBy().equals(user) && ! ( monitoringMode && monitorInToolSession(externalId, user) ) ) + if ( ! originalComment.getComment().getCreatedBy().equals(user) && ! monitorInToolSession(externalId, user, sessionMap) ) throwException("Update comment: User does not have the rights to update the comment "+commentId+". ", user.getLogin(), externalId, externalType, externalSignature ); - Comment updatedComment = commentService.updateComment(commentId, commentText, user, monitoringMode); + Comment updatedComment = commentService.updateComment(commentId, commentText, user, + ToolAccessMode.TEACHER.equals(WebUtil.getToolAccessMode((String)sessionMap.get(AttributeNames.ATTR_MODE)))); JSONObject = new JSONObject(); JSONObject.put(CommentConstants.ATTR_COMMENT_ID, commentId); @@ -579,9 +601,8 @@ commentService = getCommentService(); - boolean monitoringMode = ToolAccessMode.TEACHER.equals(WebUtil.getToolAccessMode((String)sessionMap.get(AttributeNames.ATTR_MODE))); User user = getCurrentUser(request); - if ( ! monitoringMode || ! monitorInToolSession(externalId, user) ) + if ( ! monitorInToolSession(externalId, user, sessionMap) ) throwException("Update comment: User does not have the rights to hide the comment "+commentId+". ", user.getLogin(), externalId, (Integer) sessionMap.get(CommentConstants.ATTR_EXTERNAL_TYPE), (String) sessionMap.get(CommentConstants.ATTR_EXTERNAL_SIG) ); @@ -599,6 +620,39 @@ } /** + * Make a topic sticky - the topic should be level 1 only. + * @throws ServletException + */ + public ActionForward makeSticky(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws JSONException, IOException, ServletException { + + commentService = getCommentService(); + SessionMap sessionMap = getSessionMap(request); + Long commentId = WebUtil.readLongParam(request, CommentConstants.ATTR_COMMENT_ID); + Boolean sticky = WebUtil.readBooleanParam(request, CommentConstants.ATTR_STICKY); + Long externalId = (Long) sessionMap.get(CommentConstants.ATTR_EXTERNAL_ID); + + CommentDTO originalComment = commentService.getComment(commentId); + User user = getCurrentUser(request); + + if ( ! monitorInToolSession(externalId, user, sessionMap)) + throwException("Make comment sticky: User does not have the rights to make the comment stick to the top of the list "+commentId+". ", user.getLogin()); + if ( originalComment.getComment().getCommentLevel() != 1) + throwException("Make comment sticky: Comment much be level 1 to stick to the top of the list "+commentId+" level "+originalComment.getLevel()+". ", user.getLogin()); + + Comment updatedComment = commentService.updateSticky(commentId, sticky); + + JSONObject JSONObject = new JSONObject(); + JSONObject.put(CommentConstants.ATTR_COMMENT_ID, commentId); + JSONObject.put(CommentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + JSONObject.put(CommentConstants.ATTR_THREAD_ID, updatedComment.getThreadComment().getUid()); + JSONObject.put(CommentConstants.ATTR_PARENT_COMMENT_ID, updatedComment.getParent().getUid()); + + response.setContentType("application/json;charset=utf-8"); + response.getWriter().print(JSONObject); + return null; + } + /** * Get login user information from system level session. */ private User getCurrentUser(HttpServletRequest request) { Index: lams_central/web/comments/allview.jsp =================================================================== diff -u --- lams_central/web/comments/allview.jsp (revision 0) +++ lams_central/web/comments/allview.jsp (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -0,0 +1,27 @@ + + + + + + +
+ <%@ include file="topicview.jsp"%> +
+ + + +
+ + + + + +
+ + <%@ include file="topicview.jsp"%> + +
+ \ No newline at end of file Index: lams_central/web/comments/allviewwrapper.jsp =================================================================== diff -u --- lams_central/web/comments/allviewwrapper.jsp (revision 0) +++ lams_central/web/comments/allviewwrapper.jsp (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -0,0 +1,19 @@ + + + + +<%@ taglib uri="tags-lams" prefix="lams"%> +<%@ taglib uri="tags-core" prefix="c"%> +<%@ taglib uri="tags-html" prefix="html"%> +<%@ taglib uri="tags-fmt" prefix="fmt"%> + + + + + + + + +<%@ include file="allview.jsp"%> + + Index: lams_central/web/comments/comments.jsp =================================================================== diff -u -r5e63656a12c02f7476564e278b43ff4ce86ac930 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_central/web/comments/comments.jsp (.../comments.jsp) (revision 5e63656a12c02f7476564e278b43ff4ce86ac930) +++ lams_central/web/comments/comments.jsp (.../comments.jsp) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -34,22 +34,19 @@ scrollDoneCallback(); $('#sortMenu').change(function(){ - var url = "comments/viewTopic.do?sessionMapID=${sessionMapID}&sortBy="+$(this).find("option:selected").attr('value'); - reloadScroll(url); + var url = "comments/viewTopic.do?pageSize=2&sessionMapID=${sessionMapID}&sticky=true&sortBy="+$(this).find("option:selected").attr('value'); + reloadDivs(url); }); }); function refreshComments(){ var reqIDVar = new Date(); - reloadScroll('comments/viewTopic.do?sessionMapID=${sessionMapID}&reqUid='+reqIDVar.getTime()); + reloadDivs('comments/viewTopic.do?pageSize=2&sessionMapID=${sessionMapID}&sticky=true&reqUid='+reqIDVar.getTime()); } - function reloadScroll(url) { - $('#newcomments').children().remove(); - $('.scroll').load(url, function() { - $('.scroll').data('jscroll', null); - $('.scroll').jscroll({loadingHtml: '${loading_words}${loading_words}',padding:30,autoTrigger:false,callback:scrollDoneCallback}); - }); + function reloadDivs(url) { + $('.scroll').data('jscroll', null); + $('#commentDiv').load(url); } function scrollDoneCallback() { @@ -59,7 +56,7 @@ - +
<%@ include file="new.jsp"%> @@ -71,23 +68,9 @@ - -
- - - - -
-
- - <%@ include file="topicview.jsp"%> - -
-
- - +
+ <%@ include file="allview.jsp"%> +
Index: lams_central/web/comments/msgview.jsp =================================================================== diff -u -rb655a75c3d5169a2e886a235fc4682855b2a3038 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_central/web/comments/msgview.jsp (.../msgview.jsp) (revision b655a75c3d5169a2e886a235fc4682855b2a3038) +++ lams_central/web/comments/msgview.jsp (.../msgview.jsp) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -25,19 +25,30 @@

-   - - + + + + + + + + + + + + - | () - + +

@@ -52,7 +63,7 @@
+
@@ -158,7 +183,7 @@
Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/comments/Comment.hbm.xml =================================================================== diff -u -rd3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/comments/Comment.hbm.xml (.../Comment.hbm.xml) (revision d3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/comments/Comment.hbm.xml (.../Comment.hbm.xml) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -137,6 +137,13 @@ column="comment_level" /> + Index: lams_common/src/java/org/lamsfoundation/lams/comments/Comment.java =================================================================== diff -u -rd3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_common/src/java/org/lamsfoundation/lams/comments/Comment.java (.../Comment.java) (revision d3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746) +++ lams_common/src/java/org/lamsfoundation/lams/comments/Comment.java (.../Comment.java) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -52,7 +52,8 @@ private Date lastReplyDate; private int replyNumber; private boolean hideFlag; - + private boolean sticky; + private Comment rootComment; private Comment threadComment; private short commentLevel; @@ -177,6 +178,13 @@ this.hideFlag = hideFlag; } + public boolean isSticky() { + return sticky; + } + + public void setSticky(boolean sticky) { + this.sticky = sticky; + } public Comment getParent() { return parent; } Index: lams_common/src/java/org/lamsfoundation/lams/comments/dao/ICommentDAO.java =================================================================== diff -u -rd3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_common/src/java/org/lamsfoundation/lams/comments/dao/ICommentDAO.java (.../ICommentDAO.java) (revision d3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746) +++ lams_common/src/java/org/lamsfoundation/lams/comments/dao/ICommentDAO.java (.../ICommentDAO.java) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -23,5 +23,7 @@ public abstract SortedSet getNextThreadByThreadId(final Long rootTopicId, final Long previousThreadMessageId, Integer numberOfThreads, Integer sortBy, String extraSortParam, Integer userId); + + public abstract SortedSet getStickyThreads(final Long rootTopicId, Integer sortBy, String extraSortParam, Integer userId); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/comments/dao/hibernate/CommentDAO.java =================================================================== diff -u -rd3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_common/src/java/org/lamsfoundation/lams/comments/dao/hibernate/CommentDAO.java (.../CommentDAO.java) (revision d3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746) +++ lams_common/src/java/org/lamsfoundation/lams/comments/dao/hibernate/CommentDAO.java (.../CommentDAO.java) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -123,10 +123,9 @@ } private static final String SQL_QUERY_FIND_FIRST_THREAD_TOP_BY_UID = "SELECT uid FROM lams_comment" - + " WHERE root_comment_uid = :rootUid AND comment_level = 1 ORDER BY uid DESC"; - + + " WHERE root_comment_uid = :rootUid AND comment_level = 1 AND sticky = 0 ORDER BY uid DESC"; private static final String SQL_QUERY_FIND_NEXT_THREAD_TOP = "SELECT uid FROM lams_comment" - + " WHERE root_comment_uid = :rootUid AND uid < :lastUid AND comment_level = 1 ORDER BY uid DESC"; + + " WHERE root_comment_uid = :rootUid AND uid < :lastUid AND comment_level = 1 AND sticky = 0 ORDER BY uid DESC"; private static final String SQL_QUERY_FIND_NEXT_THREAD_MESSAGES = "SELECT c.*, SUM(l.vote) likes_total, l2.vote user_vote FROM lams_comment c " @@ -175,7 +174,7 @@ + " FROM lams_comment c " + " LEFT JOIN lams_comment_likes l ON c.uid = l.comment_uid " + " LEFT JOIN lams_comment_likes l2 ON c.uid = l2.comment_uid AND l2.user_id=:userId " - + " WHERE root_comment_uid = :rootUid AND comment_level = 1 " + + " WHERE root_comment_uid = :rootUid AND comment_level = 1 AND sticky = 0 " + " GROUP BY c.uid " + " ORDER BY likes_total DESC, c.uid DESC"; @@ -184,7 +183,7 @@ + " FROM lams_comment c " + " LEFT JOIN lams_comment_likes l ON c.uid = l.comment_uid " + " LEFT JOIN lams_comment_likes l2 ON c.uid = l2.comment_uid AND l2.user_id=:userId " - + " WHERE root_comment_uid = :rootUid AND comment_level = 1 " + + " WHERE root_comment_uid = :rootUid AND comment_level = 1 AND sticky = 0 " + " GROUP BY c.uid " + " ORDER BY likes_total DESC, c.uid DESC) cl " + " WHERE (cl.likes_total = :like AND cl.uid < :lastUid ) " @@ -245,4 +244,81 @@ } return new TreeSet(); } + + @Override + public SortedSet getStickyThreads(final Long rootTopicId, Integer sortBy, String extraSortParam, Integer userId) { + + if (ICommentService.SORT_BY_LIKE.equals(sortBy)) { + return getStickyByThreadIdLikes(rootTopicId, sortBy, extraSortParam, userId); + } else { + return getStickyByThreadIdNewestFirst(rootTopicId, sortBy, userId); + } + + } + + private static final String SQL_QUERY_FIND_STICKY_BY_UID = "SELECT uid FROM lams_comment" + + " WHERE root_comment_uid = :rootUid AND comment_level = 1 AND sticky = 1 ORDER BY uid DESC"; + + @SuppressWarnings({"unchecked" }) + private SortedSet getStickyByThreadIdNewestFirst(final Long rootTopicId, Integer sortBy, Integer userId) { + + // the search to get to the top level is quite light, so get just the uids + // then build a complete set. + List threadUidList = (List) getSession(). + createSQLQuery(SQL_QUERY_FIND_STICKY_BY_UID) + .setLong("rootUid", rootTopicId) + .list(); + + if (threadUidList != null && threadUidList.size() > 0) { + SQLQuery query = getSession().createSQLQuery(SQL_QUERY_FIND_NEXT_THREAD_MESSAGES); + query.addEntity("comment", Comment.class) + .addScalar("likes_total", IntegerType.INSTANCE) + .addScalar("user_vote", IntegerType.INSTANCE) + .setLong("userId", userId != null ? userId : 0) + .setParameterList("threadIds", threadUidList); + List results = query.list(); + return upgradeComments(results, sortBy); + } + return new TreeSet(); + } + + private static final String SQL_QUERY_FIND_STICKY_BY_LIKES = "SELECT c.*, COALESCE(SUM(l.vote),0) likes_total, l2.vote user_vote" + + " FROM lams_comment c " + + " LEFT JOIN lams_comment_likes l ON c.uid = l.comment_uid " + + " LEFT JOIN lams_comment_likes l2 ON c.uid = l2.comment_uid AND l2.user_id=:userId " + + " WHERE root_comment_uid = :rootUid AND comment_level = 1 AND c.sticky = 1 " + + " GROUP BY c.uid " + + " ORDER BY likes_total DESC, c.uid DESC"; + + @SuppressWarnings({ "unchecked" }) + private SortedSet getStickyByThreadIdLikes(final Long rootTopicId, Integer sortBy, String extraSortParam, Integer userId) { + + List topThreadObjects = (List) getSession().createSQLQuery(SQL_QUERY_FIND_STICKY_BY_LIKES) + .addEntity("comment", Comment.class) + .addScalar("likes_total", IntegerType.INSTANCE) + .addScalar("user_vote", IntegerType.INSTANCE) + .setLong("rootUid", rootTopicId) + .setLong("userId", userId != null ? userId : 0) + .list(); + + if (topThreadObjects != null && topThreadObjects.size() > 0) { + // build the list of uids + List threadUidList = new ArrayList(); + for ( Object[] rawObject : topThreadObjects ) { + Comment comment = (Comment) rawObject[0]; + threadUidList.add(comment.getUid()); + } + SQLQuery query = getSession().createSQLQuery(SQL_QUERY_FIND_NEXT_THREAD_MESSAGES_REPLIES_ONLY); + query.addEntity("comment", Comment.class) + .addScalar("likes_total", IntegerType.INSTANCE) + .addScalar("user_vote", IntegerType.INSTANCE) + .setLong("userId", userId != null ? userId : 0) + .setParameterList("threadIds", threadUidList); + List results = query.list(); + topThreadObjects.addAll(results); + return upgradeComments(topThreadObjects, sortBy); + } + return new TreeSet(); + } + } Index: lams_common/src/java/org/lamsfoundation/lams/comments/service/CommentService.java =================================================================== diff -u -rd3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_common/src/java/org/lamsfoundation/lams/comments/service/CommentService.java (.../CommentService.java) (revision d3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746) +++ lams_common/src/java/org/lamsfoundation/lams/comments/service/CommentService.java (.../CommentService.java) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -78,7 +78,23 @@ SortedSet comments = commentDAO.getNextThreadByThreadId(rootTopic.getUid(), lastThreadMessageUid, pageSize, sortBy, extraSortParam, userId); return getSortedCommentDTO(comments); } - + + @Override + public List getTopicStickyThread(Long externalId, Integer externalType, String externalSignature, + Integer sortBy, String extraSortParam, Integer userId) { + + // hidden root of all the threads! + Comment rootTopic = commentDAO.getRootTopic(externalId, externalType, externalSignature); + + // first time through - no root topic. + if ( rootTopic == null ) { + return new ArrayList(); + } + + SortedSet comments = commentDAO.getStickyThreads(rootTopic.getUid(), sortBy, extraSortParam, userId); + return getSortedCommentDTO(comments); + } + private List getSortedCommentDTO(SortedSet comments) { List msgDtoList = new ArrayList(); @@ -215,6 +231,19 @@ } } + public Comment updateSticky(Long commentUid, Boolean newSticky) { + + Comment comment = commentDAO.getById(commentUid); + if ( comment != null ) { + comment.setSticky(newSticky); + commentDAO.saveOrUpdate(comment); + return comment; + } else { + log.error("Unable to update comment as comment not found. Comment uid "+commentUid + +" new sticky "+newSticky); + return null; + } + } public CommentDTO getComment(Long commentUid){ Comment comment = commentDAO.getById(commentUid); return comment != null ? CommentDTO.getCommentDTO(comment) : null; Index: lams_common/src/java/org/lamsfoundation/lams/comments/service/ICommentService.java =================================================================== diff -u -rd3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746 -r11360fc3bf2b7ed6ea197873e1b67dbf87d64d33 --- lams_common/src/java/org/lamsfoundation/lams/comments/service/ICommentService.java (.../ICommentService.java) (revision d3c9d3f03c16e8f7025d7b2bfe84e68af4fc0746) +++ lams_common/src/java/org/lamsfoundation/lams/comments/service/ICommentService.java (.../ICommentService.java) (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -37,10 +37,15 @@ public static final Integer SORT_BY_LIKE = 1; - /** Gets the comments for a tool, based on the tool session and the tool's id. Allows for paging */ + /** Gets the comments for a tool, based on the tool session and the tool's id. Allows for paging. + * Will not include the sticky - get them using getTopicStickyThread() */ List getTopicThread(Long externalId, Integer externalType, String externalSignature, Long lastMsgSeqId, Integer pageSize, Integer sortBy, String extraSortParam, Integer userId); + /** Gets all the sticky comments for a tool, based on the tool session and the tool's id */ + List getTopicStickyThread(Long externalId, Integer externalType, String externalSignature, + Integer sortBy, String extraSortParam, Integer userId); + /** Saves a comment - either creating a whole tree one if there is no parent or saving under the given parent. */ Comment createReply(Long parentId, String replyText, User user); Comment createReply(Comment parent, String replyText, User user); @@ -62,6 +67,9 @@ /** Update the body in a comment, and update the modified time, who by, etc, etc */ Comment updateComment(Long commentUid, String newBody, User user, boolean makeAuditEntry); + /** Update the sticky flag for a comment */ + Comment updateSticky(Long commentUid, Boolean newSticky); + /** Update the like list for Comment commentUid by likeVote. Returns true if like/dislike added. */ boolean addLike(Long commentUid, User user, Integer likeVote); Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040061.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040061.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040061.sql (revision 11360fc3bf2b7ed6ea197873e1b67dbf87d64d33) @@ -0,0 +1,10 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; + +-- LDEV-3756 Noticeboard comments: set thread to top +ALTER TABLE lams_comment +ADD COLUMN sticky SMALLINT(6) NULL DEFAULT 0, +ADD INDEX IX_comment_level_sticky (comment_level ASC, sticky ASC); + +COMMIT; +SET AUTOCOMMIT = 1; \ No newline at end of file